New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

serverless-dynamodb-autoscaling

Package Overview
Dependencies
Maintainers
1
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

serverless-dynamodb-autoscaling - npm Package Compare versions

Comparing version 0.5.1 to 0.6.0

coverage/lcov-report/src/aws/name.ts.html

11

coverage/coverage-final.json

@@ -1,6 +0,7 @@

{"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":10},"end":{"line":4,"column":27}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":17},"end":{"line":6,"column":40}},"5":{"start":{"line":7,"column":15},"end":{"line":7,"column":36}},"6":{"start":{"line":8,"column":17},"end":{"line":8,"column":40}},"7":{"start":{"line":9,"column":13},"end":{"line":13,"column":1}},"8":{"start":{"line":19,"column":8},"end":{"line":19,"column":37}},"9":{"start":{"line":20,"column":8},"end":{"line":22,"column":10}},"10":{"start":{"line":28,"column":8},"end":{"line":28,"column":61}},"11":{"start":{"line":34,"column":8},"end":{"line":34,"column":56}},"12":{"start":{"line":40,"column":8},"end":{"line":40,"column":60}},"13":{"start":{"line":41,"column":8},"end":{"line":41,"column":68}},"14":{"start":{"line":42,"column":8},"end":{"line":42,"column":77}},"15":{"start":{"line":43,"column":8},"end":{"line":43,"column":82}},"16":{"start":{"line":44,"column":8},"end":{"line":44,"column":87}},"17":{"start":{"line":45,"column":8},"end":{"line":45,"column":75}},"18":{"start":{"line":46,"column":8},"end":{"line":46,"column":86}},"19":{"start":{"line":52,"column":8},"end":{"line":63,"column":10}},"20":{"start":{"line":69,"column":26},"end":{"line":69,"column":28}},"21":{"start":{"line":70,"column":24},"end":{"line":70,"column":45}},"22":{"start":{"line":71,"column":22},"end":{"line":71,"column":37}},"23":{"start":{"line":72,"column":21},"end":{"line":72,"column":42}},"24":{"start":{"line":74,"column":8},"end":{"line":74,"column":143}},"25":{"start":{"line":76,"column":8},"end":{"line":76,"column":73}},"26":{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},"27":{"start":{"line":79,"column":12},"end":{"line":81,"column":197}},"28":{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},"29":{"start":{"line":85,"column":12},"end":{"line":87,"column":202}},"30":{"start":{"line":89,"column":8},"end":{"line":89,"column":25}},"31":{"start":{"line":95,"column":24},"end":{"line":95,"column":26}},"32":{"start":{"line":96,"column":29},"end":{"line":96,"column":31}},"33":{"start":{"line":97,"column":24},"end":{"line":97,"column":52}},"34":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"35":{"start":{"line":99,"column":12},"end":{"line":99,"column":32}},"36":{"start":{"line":101,"column":8},"end":{"line":105,"column":11}},"37":{"start":{"line":102,"column":28},"end":{"line":102,"column":133}},"38":{"start":{"line":102,"column":83},"end":{"line":102,"column":132}},"39":{"start":{"line":103,"column":12},"end":{"line":103,"column":50}},"40":{"start":{"line":104,"column":12},"end":{"line":104,"column":76}},"41":{"start":{"line":104,"column":51},"end":{"line":104,"column":74}},"42":{"start":{"line":106,"column":8},"end":{"line":106,"column":25}},"43":{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},"44":{"start":{"line":113,"column":12},"end":{"line":113,"column":26}},"45":{"start":{"line":115,"column":8},"end":{"line":115,"column":37}},"46":{"start":{"line":121,"column":8},"end":{"line":121,"column":317}},"47":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"48":{"start":{"line":121,"column":122},"end":{"line":121,"column":315}},"49":{"start":{"line":121,"column":170},"end":{"line":121,"column":314}},"50":{"start":{"line":121,"column":221},"end":{"line":121,"column":313}},"51":{"start":{"line":124,"column":8},"end":{"line":124,"column":378}},"52":{"start":{"line":124,"column":44},"end":{"line":124,"column":59}},"53":{"start":{"line":124,"column":72},"end":{"line":124,"column":145}},"54":{"start":{"line":124,"column":158},"end":{"line":124,"column":172}},"55":{"start":{"line":124,"column":185},"end":{"line":124,"column":271}},"56":{"start":{"line":124,"column":288},"end":{"line":124,"column":376}},"57":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":4},"end":{"line":18,"column":5}},"loc":{"start":{"line":18,"column":28},"end":{"line":23,"column":5}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":15},"end":{"line":29,"column":5}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":4},"end":{"line":33,"column":5}},"loc":{"start":{"line":33,"column":21},"end":{"line":35,"column":5}},"line":33},"3":{"name":"(anonymous_3)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":15},"end":{"line":47,"column":5}},"line":39},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":5}},"loc":{"start":{"line":51,"column":21},"end":{"line":64,"column":5}},"line":51},"5":{"name":"(anonymous_5)","decl":{"start":{"line":68,"column":4},"end":{"line":68,"column":5}},"loc":{"start":{"line":68,"column":36},"end":{"line":90,"column":5}},"line":68},"6":{"name":"(anonymous_6)","decl":{"start":{"line":94,"column":4},"end":{"line":94,"column":5}},"loc":{"start":{"line":94,"column":28},"end":{"line":107,"column":5}},"line":94},"7":{"name":"(anonymous_7)","decl":{"start":{"line":101,"column":24},"end":{"line":101,"column":25}},"loc":{"start":{"line":101,"column":35},"end":{"line":105,"column":9}},"line":101},"8":{"name":"(anonymous_8)","decl":{"start":{"line":102,"column":69},"end":{"line":102,"column":70}},"loc":{"start":{"line":102,"column":83},"end":{"line":102,"column":132}},"line":102},"9":{"name":"(anonymous_9)","decl":{"start":{"line":104,"column":41},"end":{"line":104,"column":42}},"loc":{"start":{"line":104,"column":51},"end":{"line":104,"column":74}},"line":104},"10":{"name":"(anonymous_10)","decl":{"start":{"line":111,"column":4},"end":{"line":111,"column":5}},"loc":{"start":{"line":111,"column":20},"end":{"line":116,"column":5}},"line":111},"11":{"name":"(anonymous_11)","decl":{"start":{"line":120,"column":4},"end":{"line":120,"column":5}},"loc":{"start":{"line":120,"column":14},"end":{"line":122,"column":5}},"line":120},"12":{"name":"(anonymous_12)","decl":{"start":{"line":121,"column":57},"end":{"line":121,"column":58}},"loc":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"line":121},"13":{"name":"(anonymous_13)","decl":{"start":{"line":121,"column":110},"end":{"line":121,"column":111}},"loc":{"start":{"line":121,"column":122},"end":{"line":121,"column":315}},"line":121},"14":{"name":"(anonymous_14)","decl":{"start":{"line":121,"column":159},"end":{"line":121,"column":160}},"loc":{"start":{"line":121,"column":170},"end":{"line":121,"column":314}},"line":121},"15":{"name":"(anonymous_15)","decl":{"start":{"line":121,"column":207},"end":{"line":121,"column":208}},"loc":{"start":{"line":121,"column":221},"end":{"line":121,"column":313}},"line":121},"16":{"name":"(anonymous_16)","decl":{"start":{"line":123,"column":4},"end":{"line":123,"column":5}},"loc":{"start":{"line":123,"column":28},"end":{"line":125,"column":5}},"line":123},"17":{"name":"(anonymous_17)","decl":{"start":{"line":124,"column":38},"end":{"line":124,"column":39}},"loc":{"start":{"line":124,"column":44},"end":{"line":124,"column":59}},"line":124},"18":{"name":"(anonymous_18)","decl":{"start":{"line":124,"column":66},"end":{"line":124,"column":67}},"loc":{"start":{"line":124,"column":72},"end":{"line":124,"column":145}},"line":124},"19":{"name":"(anonymous_19)","decl":{"start":{"line":124,"column":152},"end":{"line":124,"column":153}},"loc":{"start":{"line":124,"column":158},"end":{"line":124,"column":172}},"line":124},"20":{"name":"(anonymous_20)","decl":{"start":{"line":124,"column":179},"end":{"line":124,"column":180}},"loc":{"start":{"line":124,"column":185},"end":{"line":124,"column":271}},"line":124},"21":{"name":"(anonymous_21)","decl":{"start":{"line":124,"column":279},"end":{"line":124,"column":280}},"loc":{"start":{"line":124,"column":288},"end":{"line":124,"column":376}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":54,"column":25},"end":{"line":54,"column":87}},"type":"cond-expr","locations":[{"start":{"line":54,"column":62},"end":{"line":54,"column":81}},{"start":{"line":54,"column":84},"end":{"line":54,"column":87}}],"line":54},"1":{"loc":{"start":{"line":54,"column":25},"end":{"line":54,"column":59}},"type":"binary-expr","locations":[{"start":{"line":54,"column":25},"end":{"line":54,"column":36}},{"start":{"line":54,"column":40},"end":{"line":54,"column":59}}],"line":54},"2":{"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":85}},"type":"cond-expr","locations":[{"start":{"line":55,"column":62},"end":{"line":55,"column":81}},{"start":{"line":55,"column":84},"end":{"line":55,"column":85}}],"line":55},"3":{"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":59}},"type":"binary-expr","locations":[{"start":{"line":55,"column":25},"end":{"line":55,"column":36}},{"start":{"line":55,"column":40},"end":{"line":55,"column":59}}],"line":55},"4":{"loc":{"start":{"line":56,"column":23},"end":{"line":56,"column":82}},"type":"cond-expr","locations":[{"start":{"line":56,"column":58},"end":{"line":56,"column":75}},{"start":{"line":56,"column":78},"end":{"line":56,"column":82}}],"line":56},"5":{"loc":{"start":{"line":56,"column":23},"end":{"line":56,"column":55}},"type":"binary-expr","locations":[{"start":{"line":56,"column":23},"end":{"line":56,"column":34}},{"start":{"line":56,"column":38},"end":{"line":56,"column":55}}],"line":56},"6":{"loc":{"start":{"line":59,"column":25},"end":{"line":59,"column":90}},"type":"cond-expr","locations":[{"start":{"line":59,"column":64},"end":{"line":59,"column":84}},{"start":{"line":59,"column":87},"end":{"line":59,"column":90}}],"line":59},"7":{"loc":{"start":{"line":59,"column":25},"end":{"line":59,"column":61}},"type":"binary-expr","locations":[{"start":{"line":59,"column":25},"end":{"line":59,"column":37}},{"start":{"line":59,"column":41},"end":{"line":59,"column":61}}],"line":59},"8":{"loc":{"start":{"line":60,"column":25},"end":{"line":60,"column":88}},"type":"cond-expr","locations":[{"start":{"line":60,"column":64},"end":{"line":60,"column":84}},{"start":{"line":60,"column":87},"end":{"line":60,"column":88}}],"line":60},"9":{"loc":{"start":{"line":60,"column":25},"end":{"line":60,"column":61}},"type":"binary-expr","locations":[{"start":{"line":60,"column":25},"end":{"line":60,"column":37}},{"start":{"line":60,"column":41},"end":{"line":60,"column":61}}],"line":60},"10":{"loc":{"start":{"line":61,"column":23},"end":{"line":61,"column":85}},"type":"cond-expr","locations":[{"start":{"line":61,"column":60},"end":{"line":61,"column":78}},{"start":{"line":61,"column":81},"end":{"line":61,"column":85}}],"line":61},"11":{"loc":{"start":{"line":61,"column":23},"end":{"line":61,"column":57}},"type":"binary-expr","locations":[{"start":{"line":61,"column":23},"end":{"line":61,"column":35}},{"start":{"line":61,"column":39},"end":{"line":61,"column":57}}],"line":61},"12":{"loc":{"start":{"line":74,"column":107},"end":{"line":74,"column":139}},"type":"cond-expr","locations":[{"start":{"line":74,"column":116},"end":{"line":74,"column":133}},{"start":{"line":74,"column":137},"end":{"line":74,"column":139}}],"line":74},"13":{"loc":{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":82,"column":9}},{"start":{"line":78,"column":8},"end":{"line":82,"column":9}}],"line":78},"14":{"loc":{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":88,"column":9}},{"start":{"line":84,"column":8},"end":{"line":88,"column":9}}],"line":84},"15":{"loc":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},{"start":{"line":98,"column":8},"end":{"line":100,"column":9}}],"line":98},"16":{"loc":{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},"type":"if","locations":[{"start":{"line":112,"column":8},"end":{"line":114,"column":9}},{"start":{"line":112,"column":8},"end":{"line":114,"column":9}}],"line":112},"17":{"loc":{"start":{"line":112,"column":12},"end":{"line":112,"column":46}},"type":"binary-expr","locations":[{"start":{"line":112,"column":12},"end":{"line":112,"column":16}},{"start":{"line":112,"column":20},"end":{"line":112,"column":46}}],"line":112},"18":{"loc":{"start":{"line":115,"column":16},"end":{"line":115,"column":26}},"type":"binary-expr","locations":[{"start":{"line":115,"column":16},"end":{"line":115,"column":20}},{"start":{"line":115,"column":24},"end":{"line":115,"column":26}}],"line":115},"19":{"loc":{"start":{"line":121,"column":69},"end":{"line":121,"column":100}},"type":"binary-expr","locations":[{"start":{"line":121,"column":69},"end":{"line":121,"column":82}},{"start":{"line":121,"column":86},"end":{"line":121,"column":100}}],"line":121}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":1,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":5,"44":1,"45":4,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":5,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[0,1],"7":[1,1],"8":[1,0],"9":[1,1],"10":[0,1],"11":[1,1],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[1,4],"17":[5,4],"18":[4,1],"19":[0,0]},"inputSourceMap":{"version":3,"file":"plugin.js","sourceRoot":"","sources":["plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import * as assert from 'assert'\nimport * as _ from 'lodash'\nimport * as util from 'util'\n\nimport Policy from './aws/policy'\nimport Role from './aws/role'\nimport Target from './aws/target'\n\nconst text = {\n INVALID_CONFIGURATION: 'Invalid serverless configuration',\n NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',\n ONLY_AWS_SUPPORT: 'Only supported for AWS provicer'\n}\n\nclass Plugin {\n public hooks: {}\n\n /**\n * Constructur\n */\n constructor (private serverless: Serverless) {\n this.hooks = {\n 'deploy:compileEvents': this.beforeDeployResources.bind(this)\n }\n }\n\n /**\n * Get the current stage name\n */\n private getStage(): string {\n return this.serverless.getProvider('aws').getStage()\n }\n\n /**\n * Get the current service name\n */\n private getServiceName(): string {\n return this.serverless.service.getServiceName()\n }\n\n /**\n * Validate the request and check if configuration is available\n */\n private validate(): void {\n assert(this.serverless, text.INVALID_CONFIGURATION)\n assert(this.serverless.service, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name === 'aws', text.ONLY_AWS_SUPPORT)\n\n assert(this.serverless.service.custom, text.NO_AUTOSCALING_CONFIG)\n assert(this.serverless.service.custom.capacities, text.NO_AUTOSCALING_CONFIG)\n }\n\n /**\n * Parse configuration and fill up with default values when needed\n */\n private defaults(config: Capacity): { read: CapacityConfiguration, write: CapacityConfiguration } {\n return {\n read: {\n maximum: config.read && config.read.maximum ? config.read.maximum : 200,\n minimum: config.read && config.read.minimum ? config.read.minimum : 5,\n usage: config.read && config.read.usage ? config.read.usage : 0.75\n },\n write: {\n maximum: config.write && config.write.maximum ? config.write.maximum : 200,\n minimum: config.write && config.write.minimum ? config.write.minimum : 5,\n usage: config.write && config.write.usage ? config.write.usage : 0.75\n }\n }\n }\n\n /**\n * Create CloudFormation resources for table (and optional index)\n */\n private resources(table: string, index: string, config: Capacity): any[] {\n const resources = []\n const service = this.getServiceName()\n const stage = this.getStage()\n const data = this.defaults(config)\n\n // Start processing configuration\n this.serverless.cli.log(\n util.format(' - Building configuration for resource \"table/%s%s\"', table, (index ? ('/index/' + index) : ''))\n )\n\n // Add role to manage Auto Scaling policies\n resources.push(new Role(service, table, index, stage))\n\n // Only add Auto Scaling for read capacity if configuration set is available\n if (config.read) {\n resources.push(\n // ScaleIn/ScaleOut values are fix to 60% usage\n new Policy(service, table, data.read.usage * 100, true, 60, 60, index, stage),\n new Target(service, table, data.read.minimum, data.read.maximum, true, index, stage)\n )\n }\n\n // Only add Auto Scaling for write capacity if configuration set is available\n if (config.write) {\n resources.push(\n // ScaleIn/ScaleOut values are fix to 60% usage\n new Policy(service, table, data.write.usage * 100, false, 60, 60, index, stage),\n new Target(service, table, data.write.minimum, data.write.maximum, false, index, stage)\n )\n }\n\n return resources\n }\n\n /**\n * Generate CloudFormation resources for DynamoDB table and indexes\n */\n private generate(table: string, config: Capacity) {\n let resources: any[] = []\n let lastRessources: any[] = []\n\n const indexes = this.normalize(config.index)\n if (!config.indexOnly) {\n indexes.unshift('') // Horrible solution\n }\n\n indexes.forEach(\n (index: string) => {\n const current = this.resources(table, index, config).map(\n (resource: any) => resource.setDependencies(lastRessources).toJSON()\n )\n\n resources = resources.concat(current)\n lastRessources = current.map((item: any) => Object.keys(item).pop())\n }\n )\n\n return resources\n }\n\n /**\n * Check if parameter is defined and return as array if only a string is provided\n */\n private normalize(data: string|string[]): string[] {\n if (data && data.constructor !== Array) {\n return [ data as string ]\n }\n\n return (data as string[] || []).slice(0)\n }\n\n /**\n * Process the provided configuration\n */\n private process() {\n this.serverless.service.custom.capacities.filter(\n (config: Capacity) => !!config.read || !!config.write\n ).forEach(\n (config: Capacity) => this.normalize(config.table).forEach(\n (table: string) => this.generate(table, config).forEach(\n (resource: string) => _.merge(\n this.serverless.service.provider.compiledCloudFormationTemplate.Resources,\n resource\n )\n )\n )\n )\n }\n\n private beforeDeployResources(): Promise<any> {\n return Promise.resolve().then(\n () => this.validate()\n ).then(\n () => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …'))\n ).then(\n () => this.process()\n ).then(\n () => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!'))\n ).catch(\n (err: Error) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message))\n )\n }\n}\n\nmodule.exports = Plugin\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"7170c1b9e29b6f8fd8be8ce3e31aa9193fa98b6d"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/names.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/names.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"3":{"start":{"line":6,"column":4},"end":{"line":6,"column":56}},"4":{"start":{"line":8,"column":0},"end":{"line":8,"column":22}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":73}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":28}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":130}},"8":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"9":{"start":{"line":18,"column":4},"end":{"line":18,"column":108}},"10":{"start":{"line":20,"column":0},"end":{"line":20,"column":32}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":106}},"12":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"13":{"start":{"line":26,"column":4},"end":{"line":26,"column":129}},"14":{"start":{"line":28,"column":0},"end":{"line":28,"column":24}},"15":{"start":{"line":30,"column":4},"end":{"line":30,"column":88}},"16":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"17":{"start":{"line":34,"column":4},"end":{"line":34,"column":106}},"18":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}}},"fnMap":{"0":{"name":"clean","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":14}},"loc":{"start":{"line":5,"column":22},"end":{"line":7,"column":1}},"line":5},"1":{"name":"truncate","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":17}},"loc":{"start":{"line":9,"column":25},"end":{"line":11,"column":1}},"line":9},"2":{"name":"policyScale","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":57},"end":{"line":15,"column":1}},"line":13},"3":{"name":"policyRole","decl":{"start":{"line":17,"column":9},"end":{"line":17,"column":19}},"loc":{"start":{"line":17,"column":50},"end":{"line":19,"column":1}},"line":17},"4":{"name":"dimension","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":18}},"loc":{"start":{"line":21,"column":32},"end":{"line":23,"column":1}},"line":21},"5":{"name":"target","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":15}},"loc":{"start":{"line":25,"column":52},"end":{"line":27,"column":1}},"line":25},"6":{"name":"metric","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":15}},"loc":{"start":{"line":29,"column":22},"end":{"line":31,"column":1}},"line":29},"7":{"name":"role","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":13}},"loc":{"start":{"line":33,"column":44},"end":{"line":35,"column":1}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":11},"end":{"line":10,"column":72}},"type":"cond-expr","locations":[{"start":{"line":10,"column":32},"end":{"line":10,"column":37}},{"start":{"line":10,"column":40},"end":{"line":10,"column":72}}],"line":10},"1":{"loc":{"start":{"line":14,"column":71},"end":{"line":14,"column":94}},"type":"cond-expr","locations":[{"start":{"line":14,"column":78},"end":{"line":14,"column":84}},{"start":{"line":14,"column":87},"end":{"line":14,"column":94}}],"line":14},"2":{"loc":{"start":{"line":14,"column":103},"end":{"line":14,"column":114}},"type":"binary-expr","locations":[{"start":{"line":14,"column":103},"end":{"line":14,"column":108}},{"start":{"line":14,"column":112},"end":{"line":14,"column":114}}],"line":14},"3":{"loc":{"start":{"line":14,"column":116},"end":{"line":14,"column":127}},"type":"binary-expr","locations":[{"start":{"line":14,"column":116},"end":{"line":14,"column":121}},{"start":{"line":14,"column":125},"end":{"line":14,"column":127}}],"line":14},"4":{"loc":{"start":{"line":18,"column":81},"end":{"line":18,"column":92}},"type":"binary-expr","locations":[{"start":{"line":18,"column":81},"end":{"line":18,"column":86}},{"start":{"line":18,"column":90},"end":{"line":18,"column":92}}],"line":18},"5":{"loc":{"start":{"line":18,"column":94},"end":{"line":18,"column":105}},"type":"binary-expr","locations":[{"start":{"line":18,"column":94},"end":{"line":18,"column":99}},{"start":{"line":18,"column":103},"end":{"line":18,"column":105}}],"line":18},"6":{"loc":{"start":{"line":22,"column":54},"end":{"line":22,"column":79}},"type":"cond-expr","locations":[{"start":{"line":22,"column":62},"end":{"line":22,"column":69}},{"start":{"line":22,"column":72},"end":{"line":22,"column":79}}],"line":22},"7":{"loc":{"start":{"line":22,"column":81},"end":{"line":22,"column":104}},"type":"cond-expr","locations":[{"start":{"line":22,"column":88},"end":{"line":22,"column":94}},{"start":{"line":22,"column":97},"end":{"line":22,"column":104}}],"line":22},"8":{"loc":{"start":{"line":26,"column":70},"end":{"line":26,"column":93}},"type":"cond-expr","locations":[{"start":{"line":26,"column":77},"end":{"line":26,"column":83}},{"start":{"line":26,"column":86},"end":{"line":26,"column":93}}],"line":26},"9":{"loc":{"start":{"line":26,"column":102},"end":{"line":26,"column":113}},"type":"binary-expr","locations":[{"start":{"line":26,"column":102},"end":{"line":26,"column":107}},{"start":{"line":26,"column":111},"end":{"line":26,"column":113}}],"line":26},"10":{"loc":{"start":{"line":26,"column":115},"end":{"line":26,"column":126}},"type":"binary-expr","locations":[{"start":{"line":26,"column":115},"end":{"line":26,"column":120}},{"start":{"line":26,"column":124},"end":{"line":26,"column":126}}],"line":26},"11":{"loc":{"start":{"line":30,"column":62},"end":{"line":30,"column":85}},"type":"cond-expr","locations":[{"start":{"line":30,"column":69},"end":{"line":30,"column":75}},{"start":{"line":30,"column":78},"end":{"line":30,"column":85}}],"line":30},"12":{"loc":{"start":{"line":34,"column":79},"end":{"line":34,"column":90}},"type":"binary-expr","locations":[{"start":{"line":34,"column":79},"end":{"line":34,"column":84}},{"start":{"line":34,"column":88},"end":{"line":34,"column":90}}],"line":34},"13":{"loc":{"start":{"line":34,"column":92},"end":{"line":34,"column":103}},"type":"binary-expr","locations":[{"start":{"line":34,"column":92},"end":{"line":34,"column":97}},{"start":{"line":34,"column":101},"end":{"line":34,"column":103}}],"line":34}},"s":{"0":5,"1":5,"2":5,"3":46,"4":5,"5":46,"6":5,"7":10,"8":5,"9":3,"10":5,"11":6,"12":5,"13":12,"14":5,"15":6,"16":5,"17":10,"18":5},"f":{"0":46,"1":46,"2":10,"3":3,"4":6,"5":12,"6":6,"7":10},"b":{"0":[44,2],"1":[5,5],"2":[10,10],"3":[10,10],"4":[3,3],"5":[3,3],"6":[0,6],"7":[3,3],"8":[6,6],"9":[12,12],"10":[12,12],"11":[3,3],"12":[10,9],"13":[10,9]},"inputSourceMap":{"version":3,"file":"names.js","sourceRoot":"","sources":["names.ts"],"names":[],"mappings":";;AAAA,2BAA0B;AAC1B,6BAA4B;AAE5B,eAAsB,KAAa;IACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAA;AACrD,CAAC;AAFD,sBAEC;AAED,kBAAyB,KAAa;IACpC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAFD,4BAEC;AAED,qBAA4B,OAAe,EAAE,KAAa,EAAE,IAAa,EAAE,KAAc,EAAE,KAAc;IACvG,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,+BAA+B,EAC/B,OAAO,EACP,IAAI,GAAG,MAAM,GAAG,OAAO,EACvB,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAXD,kCAWC;AAED,oBAA2B,OAAe,EAAE,KAAa,EAAE,KAAc,EAAE,KAAc;IACvF,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,kCAAkC,EAClC,OAAO,EACP,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAVD,gCAUC;AAED,mBAA0B,IAAa,EAAE,KAAc;IACrD,MAAM,CAAC,IAAI,CAAC,MAAM,CAChB,6BAA6B,EAC7B,KAAK,GAAG,OAAO,GAAG,OAAO,EACzB,IAAI,GAAG,MAAM,GAAG,OAAO,CACxB,CAAA;AACH,CAAC;AAND,8BAMC;AAED,gBAAuB,OAAe,EAAE,KAAa,EAAE,IAAa,EAAE,KAAc,EAAE,KAAc;IAClG,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,8BAA8B,EAC9B,OAAO,EACP,IAAI,GAAG,MAAM,GAAG,OAAO,EACvB,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAXD,wBAWC;AAED,gBAAuB,IAAa;IAClC,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,+BAA+B,EAC/B,IAAI,GAAG,MAAM,GAAG,OAAO,CACxB,CACF,CAAA;AACH,CAAC;AAPD,wBAOC;AAED,cAAqB,OAAe,EAAE,KAAa,EAAE,KAAc,EAAE,KAAc;IACjF,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,MAAM,CACT,gCAAgC,EAChC,OAAO,EACP,KAAK,EACL,KAAK,IAAI,EAAE,EACX,KAAK,IAAI,EAAE,CACZ,CACF,CAAA;AACH,CAAC;AAVD,oBAUC","sourcesContent":["import * as md5 from 'md5'\nimport * as util from 'util'\n\nexport function clean(input: string): string {\n return truncate(input.replace(/[^a-z0-9+]+/gi, ''))\n}\n\nexport function truncate(input: string): string {\n return input.length <= 64 ? input : input.substr(0, 32) + md5(input)\n}\n\nexport function policyScale(service: string, table: string, read: boolean, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sTable%sScalingPolicy-%s%s%s',\n service,\n read ? 'Read' : 'Write',\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function policyRole(service: string, table: string, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sDynamoDBAutoscalePolicy-%s%s%s',\n service,\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function dimension(read: boolean, index: boolean): string {\n return util.format(\n 'dynamodb:%s:%sCapacityUnits',\n index ? 'index' : 'table',\n read ? 'Read' : 'Write'\n )\n}\n\nexport function target(service: string, table: string, read: boolean, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sAutoScalingTarget%s-%s%s%s',\n service,\n read ? 'Read' : 'Write',\n table,\n index || '',\n stage || ''\n )\n )\n}\n\nexport function metric(read: boolean): string {\n return clean(\n util.format(\n 'DynamoDB%sCapacityUtilization',\n read ? 'Read' : 'Write'\n )\n )\n}\n\nexport function role(service: string, table: string, index?: string, stage?: string): string {\n return clean(\n util.format(\n '%sDynamoDBAutoscaleRole-%s%s%s',\n service,\n table,\n index || '',\n stage || ''\n )\n )\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"0d93213574d24db41d9121240e66c091e4f986ca"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":25}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":31}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":33}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":27}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":27}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":31}},"11":{"start":{"line":15,"column":8},"end":{"line":15,"column":65}},"12":{"start":{"line":18,"column":8},"end":{"line":18,"column":33}},"13":{"start":{"line":19,"column":8},"end":{"line":19,"column":20}},"14":{"start":{"line":22,"column":27},"end":{"line":22,"column":50}},"15":{"start":{"line":23,"column":32},"end":{"line":23,"column":110}},"16":{"start":{"line":24,"column":27},"end":{"line":24,"column":100}},"17":{"start":{"line":25,"column":29},"end":{"line":25,"column":79}},"18":{"start":{"line":26,"column":8},"end":{"line":44,"column":10}},"19":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":78},"end":{"line":16,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":26},"end":{"line":20,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":4},"end":{"line":21,"column":5}},"loc":{"start":{"line":21,"column":13},"end":{"line":45,"column":5}},"line":21}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":0,"13":0,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2},"f":{"0":2,"1":0,"2":2},"b":{},"inputSourceMap":{"version":3,"file":"policy.js","sourceRoot":"","sources":["policy.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAIE,YACU,OAAe,EACf,KAAa,EACb,KAAa,EACb,IAAa,EACb,OAAe,EACf,QAAgB,EAChB,KAAa,EACb,KAAa;QAPb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAS;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAChB,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QAXf,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,4CAA4C,CAAA;IAW/D,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACtG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAE5F,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAExE,MAAM,CAAC;YACL,CAAC,eAAe,CAAC,EAAE;gBACjB,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,UAAU,EAAE,eAAe;oBAC3B,UAAU,EAAE,uBAAuB;oBACnC,eAAe,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;oBACpC,wCAAwC,EAAE;wBACxC,6BAA6B,EAAE;4BAC7B,oBAAoB,EAAE,UAAU;yBACjC;wBACD,eAAe,EAAE,IAAI,CAAC,OAAO;wBAC7B,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,WAAW,EAAE,IAAI,CAAC,KAAK;qBACxB;iBACF;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAhDD,yBAgDC","sourcesContent":["import * as names from './names'\n\nexport default class Policy {\n private dependencies: string[] = []\n private type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'\n\n constructor (\n private service: string,\n private table: string,\n private value: number,\n private read: boolean,\n private scaleIn: number,\n private scaleOut: number,\n private index: string,\n private stage: string\n ) { }\n\n public setDependencies(list: string[]): Policy {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const nameMetric = names.metric(this.read)\n const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage)\n const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)\n\n const dependencies = [this.table, nameTarget ].concat(this.dependencies)\n\n return {\n [nameScalePolicy]: {\n DependsOn: dependencies,\n Properties: {\n PolicyName: nameScalePolicy,\n PolicyType: 'TargetTrackingScaling',\n ScalingTargetId: { Ref: nameTarget },\n TargetTrackingScalingPolicyConfiguration: {\n PredefinedMetricSpecification: {\n PredefinedMetricType: nameMetric\n },\n ScaleInCooldown: this.scaleIn,\n ScaleOutCooldown: this.scaleOut,\n TargetValue: this.value\n }\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"334829cadced5fc00817e52fc02bf8cb14aa93aa"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":27}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":31}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":37}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":36}},"9":{"start":{"line":13,"column":8},"end":{"line":25,"column":10}},"10":{"start":{"line":28,"column":8},"end":{"line":28,"column":33}},"11":{"start":{"line":29,"column":8},"end":{"line":29,"column":20}},"12":{"start":{"line":32,"column":25},"end":{"line":32,"column":85}},"13":{"start":{"line":33,"column":31},"end":{"line":33,"column":97}},"14":{"start":{"line":34,"column":29},"end":{"line":34,"column":67}},"15":{"start":{"line":35,"column":26},"end":{"line":37,"column":9}},"16":{"start":{"line":38,"column":25},"end":{"line":40,"column":9}},"17":{"start":{"line":41,"column":8},"end":{"line":67,"column":10}},"18":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":46},"end":{"line":26,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":4},"end":{"line":27,"column":5}},"loc":{"start":{"line":27,"column":26},"end":{"line":30,"column":5}},"line":27},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":5}},"loc":{"start":{"line":31,"column":13},"end":{"line":68,"column":5}},"line":31}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":0,"11":0,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2},"f":{"0":2,"1":0,"2":2},"b":{},"inputSourceMap":{"version":3,"file":"role.js","sourceRoot":"","sources":["role.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAkBE,YACU,OAAe,EACf,KAAa,EACb,KAAa,EACb,KAAa;QAHb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QArBf,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,gBAAgB,CAAA;QAC/B,YAAO,GAAW,YAAY,CAAA;QAC9B,YAAO,GAAG;YAChB,UAAU,EAAE;gBACV,2BAA2B;gBAC3B,2BAA2B;gBAC3B,yBAAyB;gBACzB,gCAAgC;gBAChC,0BAA0B;aAC3B;YACD,QAAQ,EAAE;gBACR,wBAAwB;gBACxB,sBAAsB;aACvB;SACF,CAAA;IAOG,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAEzF,MAAM,YAAY,GAAG,CAAE,IAAI,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,uCAAuC;SACjD,CAAA;QACD,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,CAAE,EAAE,EAAE,CAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAE,CAAE;SACzG,CAAA;QAED,MAAM,CAAC;YACL,CAAC,QAAQ,CAAC,EAAE;gBACV,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,SAAS,EAAE;4BACT,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE;yBACpE;wBACD,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB;oBACD,QAAQ,EAAE;wBACR;4BACE,cAAc,EAAE;gCACd,SAAS,EAAE;oCACT,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;oCACnE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;iCACvE;gCACD,OAAO,EAAE,IAAI,CAAC,OAAO;6BACtB;4BACD,UAAU,EAAE,cAAc;yBAC3B;qBACF;oBACD,QAAQ,EAAE,QAAQ;iBACnB;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAvED,uBAuEC","sourcesContent":["import * as names from './names'\n\nexport default class Role {\n private dependencies: string[] = []\n private type: string = 'AWS::IAM::Role'\n private version: string = '2012-10-17'\n private actions = {\n CloudWatch: [\n 'cloudwatch:PutMetricAlarm',\n 'cloudwatch:DescribeAlarms',\n 'cloudwatch:DeleteAlarms',\n 'cloudwatch:GetMetricStatistics',\n 'cloudwatch:SetAlarmState'\n ],\n DynamoDB: [\n 'dynamodb:DescribeTable',\n 'dynamodb:UpdateTable'\n ]\n }\n\n constructor (\n private service: string,\n private table: string,\n private index: string,\n private stage: string\n ) { }\n\n public setDependencies(list: string[]): Role {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const nameRole = names.role(this.service, this.table, this.index, this.stage)\n const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage)\n\n const dependencies = [ this.table ].concat(this.dependencies)\n const principal = {\n Service: 'application-autoscaling.amazonaws.com'\n }\n const resource = {\n 'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table } ] ]\n }\n\n return {\n [nameRole]: {\n DependsOn: dependencies,\n Properties: {\n AssumeRolePolicyDocument: {\n Statement: [\n { Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal }\n ],\n Version: this.version\n },\n Policies: [\n {\n PolicyDocument: {\n Statement: [\n { Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },\n { Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource }\n ],\n Version: this.version\n },\n PolicyName: namePolicyRole\n }\n ],\n RoleName: nameRole\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"d1cc4e5acd6e9476f96e0953fb03434f80c6089a"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":27}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":23}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":25}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":27}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":27}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":31}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":66}},"11":{"start":{"line":17,"column":8},"end":{"line":17,"column":33}},"12":{"start":{"line":18,"column":8},"end":{"line":18,"column":20}},"13":{"start":{"line":21,"column":25},"end":{"line":21,"column":56}},"14":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":49}},"16":{"start":{"line":25,"column":27},"end":{"line":25,"column":100}},"17":{"start":{"line":26,"column":25},"end":{"line":26,"column":85}},"18":{"start":{"line":27,"column":30},"end":{"line":27,"column":70}},"19":{"start":{"line":28,"column":29},"end":{"line":28,"column":77}},"20":{"start":{"line":29,"column":8},"end":{"line":42,"column":10}},"21":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":62},"end":{"line":15,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":26},"end":{"line":19,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":13},"end":{"line":43,"column":5}},"line":20}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},{"start":{"line":22,"column":8},"end":{"line":24,"column":9}}],"line":22}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":0,"12":0,"13":2,"14":2,"15":0,"16":2,"17":2,"18":2,"19":2,"20":2,"21":2},"f":{"0":2,"1":0,"2":2},"b":{"0":[0,2]},"inputSourceMap":{"version":3,"file":"target.js","sourceRoot":"","sources":["target.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAEhC;IAIE,YACU,OAAe,EACf,KAAa,EACb,GAAW,EACX,GAAW,EACX,IAAa,EACb,KAAc,EACd,KAAc;QANd,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,QAAG,GAAH,GAAG,CAAQ;QACX,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAS;QACd,UAAK,GAAL,KAAK,CAAS;QAVhB,iBAAY,GAAa,EAAE,CAAA;QAC3B,SAAI,GAAW,6CAA6C,CAAA;IAUhE,CAAC;IAEE,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;IAEM,MAAM;QACX,MAAM,QAAQ,GAAG,CAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAE,CAAA;QAElD,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7E,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAE9D,MAAM,YAAY,GAAG,CAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEvE,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAE,EAAE,EAAE,QAAQ,CAAE,EAAE;oBAC5C,OAAO,EAAE,EAAE,YAAY,EAAE,CAAE,QAAQ,EAAE,KAAK,CAAE,EAAE;oBAC9C,iBAAiB,EAAE,aAAa;oBAChC,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAhDD,yBAgDC","sourcesContent":["import * as names from './names'\n\nexport default class Target {\n private dependencies: string[] = []\n private type: string = 'AWS::ApplicationAutoScaling::ScalableTarget'\n\n constructor (\n private service: string,\n private table: string,\n private min: number,\n private max: number,\n private read: boolean,\n private index?: string,\n private stage?: string\n ) { }\n\n public setDependencies(list: string[]): Target {\n this.dependencies = list\n\n return this\n }\n\n public toJSON(): any {\n const resource = [ 'table/', { Ref: this.table } ]\n\n if (this.index) {\n resource.push('/index/', this.index)\n }\n\n const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)\n const nameRole = names.role(this.service, this.table, this.index, this.stage)\n const nameDimension = names.dimension(this.read, !!this.index)\n\n const dependencies = [ this.table, nameRole ].concat(this.dependencies)\n\n return {\n [nameTarget]: {\n DependsOn: dependencies,\n Properties: {\n MaxCapacity: this.max,\n MinCapacity: this.min,\n ResourceId: { 'Fn::Join': [ '', resource ] },\n RoleARN: { 'Fn::GetAtt': [ nameRole, 'Arn' ] },\n ScalableDimension: nameDimension,\n ServiceNamespace: 'dynamodb'\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"73f5453518bcaa2f508bf4120400b124ba2bfa72"}
{"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/plugin.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":10},"end":{"line":4,"column":27}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"4":{"start":{"line":6,"column":17},"end":{"line":6,"column":40}},"5":{"start":{"line":7,"column":15},"end":{"line":7,"column":36}},"6":{"start":{"line":8,"column":17},"end":{"line":8,"column":40}},"7":{"start":{"line":9,"column":13},"end":{"line":17,"column":1}},"8":{"start":{"line":23,"column":8},"end":{"line":23,"column":37}},"9":{"start":{"line":24,"column":8},"end":{"line":26,"column":10}},"10":{"start":{"line":32,"column":8},"end":{"line":32,"column":61}},"11":{"start":{"line":38,"column":8},"end":{"line":38,"column":56}},"12":{"start":{"line":44,"column":8},"end":{"line":44,"column":62}},"13":{"start":{"line":50,"column":8},"end":{"line":50,"column":60}},"14":{"start":{"line":51,"column":8},"end":{"line":51,"column":68}},"15":{"start":{"line":52,"column":8},"end":{"line":52,"column":77}},"16":{"start":{"line":53,"column":8},"end":{"line":53,"column":82}},"17":{"start":{"line":54,"column":8},"end":{"line":54,"column":87}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":75}},"19":{"start":{"line":56,"column":8},"end":{"line":56,"column":86}},"20":{"start":{"line":62,"column":8},"end":{"line":73,"column":10}},"21":{"start":{"line":79,"column":21},"end":{"line":79,"column":42}},"22":{"start":{"line":80,"column":24},"end":{"line":86,"column":9}},"23":{"start":{"line":88,"column":8},"end":{"line":88,"column":107}},"24":{"start":{"line":90,"column":26},"end":{"line":92,"column":9}},"25":{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},"26":{"start":{"line":95,"column":12},"end":{"line":95,"column":76}},"27":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"28":{"start":{"line":99,"column":12},"end":{"line":99,"column":77}},"29":{"start":{"line":101,"column":8},"end":{"line":101,"column":25}},"30":{"start":{"line":104,"column":8},"end":{"line":107,"column":10}},"31":{"start":{"line":113,"column":24},"end":{"line":113,"column":26}},"32":{"start":{"line":114,"column":29},"end":{"line":114,"column":31}},"33":{"start":{"line":115,"column":24},"end":{"line":115,"column":52}},"34":{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},"35":{"start":{"line":117,"column":12},"end":{"line":117,"column":32}},"36":{"start":{"line":119,"column":8},"end":{"line":123,"column":11}},"37":{"start":{"line":120,"column":28},"end":{"line":120,"column":133}},"38":{"start":{"line":120,"column":83},"end":{"line":120,"column":132}},"39":{"start":{"line":121,"column":12},"end":{"line":121,"column":50}},"40":{"start":{"line":122,"column":12},"end":{"line":122,"column":76}},"41":{"start":{"line":122,"column":51},"end":{"line":122,"column":74}},"42":{"start":{"line":124,"column":8},"end":{"line":124,"column":25}},"43":{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},"44":{"start":{"line":131,"column":12},"end":{"line":131,"column":26}},"45":{"start":{"line":133,"column":8},"end":{"line":133,"column":37}},"46":{"start":{"line":139,"column":8},"end":{"line":139,"column":317}},"47":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"48":{"start":{"line":139,"column":122},"end":{"line":139,"column":315}},"49":{"start":{"line":139,"column":170},"end":{"line":139,"column":314}},"50":{"start":{"line":139,"column":221},"end":{"line":139,"column":313}},"51":{"start":{"line":142,"column":8},"end":{"line":142,"column":298}},"52":{"start":{"line":142,"column":44},"end":{"line":142,"column":59}},"53":{"start":{"line":142,"column":72},"end":{"line":142,"column":124}},"54":{"start":{"line":142,"column":137},"end":{"line":142,"column":151}},"55":{"start":{"line":142,"column":164},"end":{"line":142,"column":215}},"56":{"start":{"line":142,"column":232},"end":{"line":142,"column":296}},"57":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":4},"end":{"line":22,"column":5}},"loc":{"start":{"line":22,"column":28},"end":{"line":27,"column":5}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":4},"end":{"line":31,"column":5}},"loc":{"start":{"line":31,"column":15},"end":{"line":33,"column":5}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":4},"end":{"line":37,"column":5}},"loc":{"start":{"line":37,"column":21},"end":{"line":39,"column":5}},"line":37},"3":{"name":"(anonymous_3)","decl":{"start":{"line":43,"column":4},"end":{"line":43,"column":5}},"loc":{"start":{"line":43,"column":16},"end":{"line":45,"column":5}},"line":43},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":15},"end":{"line":57,"column":5}},"line":49},"5":{"name":"(anonymous_5)","decl":{"start":{"line":61,"column":4},"end":{"line":61,"column":5}},"loc":{"start":{"line":61,"column":21},"end":{"line":74,"column":5}},"line":61},"6":{"name":"(anonymous_6)","decl":{"start":{"line":78,"column":4},"end":{"line":78,"column":5}},"loc":{"start":{"line":78,"column":36},"end":{"line":102,"column":5}},"line":78},"7":{"name":"(anonymous_7)","decl":{"start":{"line":103,"column":4},"end":{"line":103,"column":5}},"loc":{"start":{"line":103,"column":44},"end":{"line":108,"column":5}},"line":103},"8":{"name":"(anonymous_8)","decl":{"start":{"line":112,"column":4},"end":{"line":112,"column":5}},"loc":{"start":{"line":112,"column":28},"end":{"line":125,"column":5}},"line":112},"9":{"name":"(anonymous_9)","decl":{"start":{"line":119,"column":24},"end":{"line":119,"column":25}},"loc":{"start":{"line":119,"column":35},"end":{"line":123,"column":9}},"line":119},"10":{"name":"(anonymous_10)","decl":{"start":{"line":120,"column":69},"end":{"line":120,"column":70}},"loc":{"start":{"line":120,"column":83},"end":{"line":120,"column":132}},"line":120},"11":{"name":"(anonymous_11)","decl":{"start":{"line":122,"column":41},"end":{"line":122,"column":42}},"loc":{"start":{"line":122,"column":51},"end":{"line":122,"column":74}},"line":122},"12":{"name":"(anonymous_12)","decl":{"start":{"line":129,"column":4},"end":{"line":129,"column":5}},"loc":{"start":{"line":129,"column":20},"end":{"line":134,"column":5}},"line":129},"13":{"name":"(anonymous_13)","decl":{"start":{"line":138,"column":4},"end":{"line":138,"column":5}},"loc":{"start":{"line":138,"column":14},"end":{"line":140,"column":5}},"line":138},"14":{"name":"(anonymous_14)","decl":{"start":{"line":139,"column":57},"end":{"line":139,"column":58}},"loc":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"line":139},"15":{"name":"(anonymous_15)","decl":{"start":{"line":139,"column":110},"end":{"line":139,"column":111}},"loc":{"start":{"line":139,"column":122},"end":{"line":139,"column":315}},"line":139},"16":{"name":"(anonymous_16)","decl":{"start":{"line":139,"column":159},"end":{"line":139,"column":160}},"loc":{"start":{"line":139,"column":170},"end":{"line":139,"column":314}},"line":139},"17":{"name":"(anonymous_17)","decl":{"start":{"line":139,"column":207},"end":{"line":139,"column":208}},"loc":{"start":{"line":139,"column":221},"end":{"line":139,"column":313}},"line":139},"18":{"name":"(anonymous_18)","decl":{"start":{"line":141,"column":4},"end":{"line":141,"column":5}},"loc":{"start":{"line":141,"column":28},"end":{"line":143,"column":5}},"line":141},"19":{"name":"(anonymous_19)","decl":{"start":{"line":142,"column":38},"end":{"line":142,"column":39}},"loc":{"start":{"line":142,"column":44},"end":{"line":142,"column":59}},"line":142},"20":{"name":"(anonymous_20)","decl":{"start":{"line":142,"column":66},"end":{"line":142,"column":67}},"loc":{"start":{"line":142,"column":72},"end":{"line":142,"column":124}},"line":142},"21":{"name":"(anonymous_21)","decl":{"start":{"line":142,"column":131},"end":{"line":142,"column":132}},"loc":{"start":{"line":142,"column":137},"end":{"line":142,"column":151}},"line":142},"22":{"name":"(anonymous_22)","decl":{"start":{"line":142,"column":158},"end":{"line":142,"column":159}},"loc":{"start":{"line":142,"column":164},"end":{"line":142,"column":215}},"line":142},"23":{"name":"(anonymous_23)","decl":{"start":{"line":142,"column":223},"end":{"line":142,"column":224}},"loc":{"start":{"line":142,"column":232},"end":{"line":142,"column":296}},"line":142}},"branchMap":{"0":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":87}},"type":"cond-expr","locations":[{"start":{"line":64,"column":62},"end":{"line":64,"column":81}},{"start":{"line":64,"column":84},"end":{"line":64,"column":87}}],"line":64},"1":{"loc":{"start":{"line":64,"column":25},"end":{"line":64,"column":59}},"type":"binary-expr","locations":[{"start":{"line":64,"column":25},"end":{"line":64,"column":36}},{"start":{"line":64,"column":40},"end":{"line":64,"column":59}}],"line":64},"2":{"loc":{"start":{"line":65,"column":25},"end":{"line":65,"column":85}},"type":"cond-expr","locations":[{"start":{"line":65,"column":62},"end":{"line":65,"column":81}},{"start":{"line":65,"column":84},"end":{"line":65,"column":85}}],"line":65},"3":{"loc":{"start":{"line":65,"column":25},"end":{"line":65,"column":59}},"type":"binary-expr","locations":[{"start":{"line":65,"column":25},"end":{"line":65,"column":36}},{"start":{"line":65,"column":40},"end":{"line":65,"column":59}}],"line":65},"4":{"loc":{"start":{"line":66,"column":23},"end":{"line":66,"column":82}},"type":"cond-expr","locations":[{"start":{"line":66,"column":58},"end":{"line":66,"column":75}},{"start":{"line":66,"column":78},"end":{"line":66,"column":82}}],"line":66},"5":{"loc":{"start":{"line":66,"column":23},"end":{"line":66,"column":55}},"type":"binary-expr","locations":[{"start":{"line":66,"column":23},"end":{"line":66,"column":34}},{"start":{"line":66,"column":38},"end":{"line":66,"column":55}}],"line":66},"6":{"loc":{"start":{"line":69,"column":25},"end":{"line":69,"column":90}},"type":"cond-expr","locations":[{"start":{"line":69,"column":64},"end":{"line":69,"column":84}},{"start":{"line":69,"column":87},"end":{"line":69,"column":90}}],"line":69},"7":{"loc":{"start":{"line":69,"column":25},"end":{"line":69,"column":61}},"type":"binary-expr","locations":[{"start":{"line":69,"column":25},"end":{"line":69,"column":37}},{"start":{"line":69,"column":41},"end":{"line":69,"column":61}}],"line":69},"8":{"loc":{"start":{"line":70,"column":25},"end":{"line":70,"column":88}},"type":"cond-expr","locations":[{"start":{"line":70,"column":64},"end":{"line":70,"column":84}},{"start":{"line":70,"column":87},"end":{"line":70,"column":88}}],"line":70},"9":{"loc":{"start":{"line":70,"column":25},"end":{"line":70,"column":61}},"type":"binary-expr","locations":[{"start":{"line":70,"column":25},"end":{"line":70,"column":37}},{"start":{"line":70,"column":41},"end":{"line":70,"column":61}}],"line":70},"10":{"loc":{"start":{"line":71,"column":23},"end":{"line":71,"column":85}},"type":"cond-expr","locations":[{"start":{"line":71,"column":60},"end":{"line":71,"column":78}},{"start":{"line":71,"column":81},"end":{"line":71,"column":85}}],"line":71},"11":{"loc":{"start":{"line":71,"column":23},"end":{"line":71,"column":57}},"type":"binary-expr","locations":[{"start":{"line":71,"column":23},"end":{"line":71,"column":35}},{"start":{"line":71,"column":39},"end":{"line":71,"column":57}}],"line":71},"12":{"loc":{"start":{"line":88,"column":71},"end":{"line":88,"column":103}},"type":"cond-expr","locations":[{"start":{"line":88,"column":80},"end":{"line":88,"column":97}},{"start":{"line":88,"column":101},"end":{"line":88,"column":103}}],"line":88},"13":{"loc":{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},"type":"if","locations":[{"start":{"line":94,"column":8},"end":{"line":96,"column":9}},{"start":{"line":94,"column":8},"end":{"line":96,"column":9}}],"line":94},"14":{"loc":{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":100,"column":9}},{"start":{"line":98,"column":8},"end":{"line":100,"column":9}}],"line":98},"15":{"loc":{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},"type":"if","locations":[{"start":{"line":116,"column":8},"end":{"line":118,"column":9}},{"start":{"line":116,"column":8},"end":{"line":118,"column":9}}],"line":116},"16":{"loc":{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},"type":"if","locations":[{"start":{"line":130,"column":8},"end":{"line":132,"column":9}},{"start":{"line":130,"column":8},"end":{"line":132,"column":9}}],"line":130},"17":{"loc":{"start":{"line":130,"column":12},"end":{"line":130,"column":46}},"type":"binary-expr","locations":[{"start":{"line":130,"column":12},"end":{"line":130,"column":16}},{"start":{"line":130,"column":20},"end":{"line":130,"column":46}}],"line":130},"18":{"loc":{"start":{"line":133,"column":16},"end":{"line":133,"column":26}},"type":"binary-expr","locations":[{"start":{"line":133,"column":16},"end":{"line":133,"column":20}},{"start":{"line":133,"column":24},"end":{"line":133,"column":26}}],"line":133},"19":{"loc":{"start":{"line":139,"column":69},"end":{"line":139,"column":100}},"type":"binary-expr","locations":[{"start":{"line":139,"column":69},"end":{"line":139,"column":82}},{"start":{"line":139,"column":86},"end":{"line":139,"column":100}}],"line":139}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":2,"9":2,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":1,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":5,"44":1,"45":4,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1},"f":{"0":2,"1":0,"2":0,"3":0,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":5,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[0,1],"7":[1,1],"8":[1,0],"9":[1,1],"10":[0,1],"11":[1,1],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[1,4],"17":[5,4],"18":[4,1],"19":[0,0]},"inputSourceMap":{"version":3,"file":"plugin.js","sourceRoot":"","sources":["plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import * as assert from 'assert'\nimport * as _ from 'lodash'\nimport * as util from 'util'\n\nimport Policy from './aws/policy'\nimport Role from './aws/role'\nimport Target from './aws/target'\n\nconst text = {\n CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!',\n CLI_RESOURCE: ' - Building configuration for resource \"table/%s%s\"',\n CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!',\n CLI_START: 'Configure DynamoDB Auto Scaling …',\n INVALID_CONFIGURATION: 'Invalid serverless configuration',\n NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',\n ONLY_AWS_SUPPORT: 'Only supported for AWS provicer'\n}\n\ninterface Defaults {\n read: CapacityConfiguration,\n write: CapacityConfiguration\n}\n\nclass Plugin {\n public hooks: {}\n\n /**\n * Constructur\n */\n constructor (private serverless: Serverless) {\n this.hooks = {\n 'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this)\n }\n }\n\n /**\n * Get the current stage name\n */\n private getStage(): string {\n return this.serverless.getProvider('aws').getStage()\n }\n\n /**\n * Get the current service name\n */\n private getServiceName(): string {\n return this.serverless.service.getServiceName()\n }\n\n /**\n * Get the current service region\n */\n private getRegion(): string {\n return this.serverless.getProvider('aws').getRegion()\n }\n\n /**\n * Validate the request and check if configuration is available\n */\n private validate(): void {\n assert(this.serverless, text.INVALID_CONFIGURATION)\n assert(this.serverless.service, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name, text.INVALID_CONFIGURATION)\n assert(this.serverless.service.provider.name === 'aws', text.ONLY_AWS_SUPPORT)\n\n assert(this.serverless.service.custom, text.NO_AUTOSCALING_CONFIG)\n assert(this.serverless.service.custom.capacities, text.NO_AUTOSCALING_CONFIG)\n }\n\n /**\n * Parse configuration and fill up with default values when needed\n */\n private defaults(config: Capacity): Defaults {\n return {\n read: {\n maximum: config.read && config.read.maximum ? config.read.maximum : 200,\n minimum: config.read && config.read.minimum ? config.read.minimum : 5,\n usage: config.read && config.read.usage ? config.read.usage : 0.75\n },\n write: {\n maximum: config.write && config.write.maximum ? config.write.maximum : 200,\n minimum: config.write && config.write.minimum ? config.write.minimum : 5,\n usage: config.write && config.write.usage ? config.write.usage : 0.75\n }\n }\n }\n\n /**\n * Create CloudFormation resources for table (and optional index)\n */\n private resources(table: string, index: string, config: Capacity): any[] {\n const data = this.defaults(config)\n\n const options: Options = {\n index,\n region: this.getRegion(),\n service: this.getServiceName(),\n stage: this.getStage(),\n table\n }\n\n // Start processing configuration\n this.serverless.cli.log(\n util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : ''))\n )\n\n // Add role to manage Auto Scaling policies\n const resources: any[] = [\n new Role(options)\n ]\n\n // Only add Auto Scaling for read capacity if configuration set is available\n if (!!config.read) {\n resources.push(...this.getPolicyAndTarget(options, data, true))\n }\n\n // Only add Auto Scaling for write capacity if configuration set is available\n if (!!config.write) {\n resources.push(...this.getPolicyAndTarget(options, data, false))\n }\n\n return resources\n }\n\n private getPolicyAndTarget(options: Options, data: Defaults, read: boolean): any[] {\n return [\n new Policy(options, false, data.read.usage * 100, 60, 60),\n new Target(options, false, data.read.minimum, data.read.maximum)\n ]\n }\n\n /**\n * Generate CloudFormation resources for DynamoDB table and indexes\n */\n private generate(table: string, config: Capacity) {\n let resources: any[] = []\n let lastRessources: any[] = []\n\n const indexes = this.normalize(config.index)\n if (!config.indexOnly) {\n indexes.unshift('') // Horrible solution\n }\n\n indexes.forEach(\n (index: string) => {\n const current = this.resources(table, index, config).map(\n (resource: any) => resource.setDependencies(lastRessources).toJSON()\n )\n\n resources = resources.concat(current)\n lastRessources = current.map((item: any) => Object.keys(item).pop())\n }\n )\n\n return resources\n }\n\n /**\n * Check if parameter is defined and return as array if only a string is provided\n */\n private normalize(data: string|string[]): string[] {\n if (data && data.constructor !== Array) {\n return [ data as string ]\n }\n\n return (data as string[] || []).slice(0)\n }\n\n /**\n * Process the provided configuration\n */\n private process() {\n this.serverless.service.custom.capacities.filter(\n (config: Capacity) => !!config.read || !!config.write\n ).forEach(\n (config: Capacity) => this.normalize(config.table).forEach(\n (table: string) => this.generate(table, config).forEach(\n (resource: string) => _.merge(\n this.serverless.service.provider.compiledCloudFormationTemplate.Resources,\n resource\n )\n )\n )\n )\n }\n\n private beforeDeployResources(): Promise<any> {\n return Promise.resolve().then(\n () => this.validate()\n ).then(\n () => this.serverless.cli.log(util.format(text.CLI_START))\n ).then(\n () => this.process()\n ).then(\n () => this.serverless.cli.log(util.format(text.CLI_DONE))\n ).catch(\n (err: Error) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message))\n )\n }\n}\n\nmodule.exports = Plugin\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"f26d3fd7dcc13f88042fbf091da3df70140e0634"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/name.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/name.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"3":{"start":{"line":5,"column":13},"end":{"line":12,"column":1}},"4":{"start":{"line":14,"column":4},"end":{"line":14,"column":56}},"5":{"start":{"line":17,"column":4},"end":{"line":17,"column":73}},"6":{"start":{"line":20,"column":4},"end":{"line":20,"column":56}},"7":{"start":{"line":24,"column":8},"end":{"line":24,"column":31}},"8":{"start":{"line":27,"column":8},"end":{"line":27,"column":33}},"9":{"start":{"line":30,"column":8},"end":{"line":30,"column":34}},"10":{"start":{"line":33,"column":8},"end":{"line":33,"column":33}},"11":{"start":{"line":36,"column":8},"end":{"line":36,"column":34}},"12":{"start":{"line":39,"column":8},"end":{"line":39,"column":38}},"13":{"start":{"line":42,"column":8},"end":{"line":42,"column":39}},"14":{"start":{"line":45,"column":8},"end":{"line":45,"column":50}},"15":{"start":{"line":48,"column":21},"end":{"line":48,"column":66}},"16":{"start":{"line":49,"column":8},"end":{"line":49,"column":74}},"17":{"start":{"line":52,"column":8},"end":{"line":52,"column":44}},"18":{"start":{"line":55,"column":8},"end":{"line":55,"column":71}},"19":{"start":{"line":58,"column":8},"end":{"line":58,"column":76}},"20":{"start":{"line":61,"column":8},"end":{"line":61,"column":72}},"21":{"start":{"line":64,"column":8},"end":{"line":68,"column":19}},"22":{"start":{"line":71,"column":8},"end":{"line":71,"column":36}},"23":{"start":{"line":74,"column":8},"end":{"line":79,"column":32}},"24":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}}},"fnMap":{"0":{"name":"clean","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":14}},"loc":{"start":{"line":13,"column":22},"end":{"line":15,"column":1}},"line":13},"1":{"name":"truncate","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":17}},"loc":{"start":{"line":16,"column":25},"end":{"line":18,"column":1}},"line":16},"2":{"name":"ucfirst","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":16}},"loc":{"start":{"line":19,"column":23},"end":{"line":21,"column":1}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":25},"end":{"line":25,"column":5}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":17},"end":{"line":28,"column":5}},"line":26},"5":{"name":"(anonymous_5)","decl":{"start":{"line":29,"column":4},"end":{"line":29,"column":5}},"loc":{"start":{"line":29,"column":18},"end":{"line":31,"column":5}},"line":29},"6":{"name":"(anonymous_6)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":5}},"loc":{"start":{"line":32,"column":17},"end":{"line":34,"column":5}},"line":32},"7":{"name":"(anonymous_7)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":5}},"loc":{"start":{"line":35,"column":18},"end":{"line":37,"column":5}},"line":35},"8":{"name":"(anonymous_8)","decl":{"start":{"line":38,"column":4},"end":{"line":38,"column":5}},"loc":{"start":{"line":38,"column":22},"end":{"line":40,"column":5}},"line":38},"9":{"name":"(anonymous_9)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":5}},"loc":{"start":{"line":41,"column":23},"end":{"line":43,"column":5}},"line":41},"10":{"name":"(anonymous_10)","decl":{"start":{"line":44,"column":4},"end":{"line":44,"column":5}},"loc":{"start":{"line":44,"column":17},"end":{"line":46,"column":5}},"line":44},"11":{"name":"(anonymous_11)","decl":{"start":{"line":47,"column":4},"end":{"line":47,"column":5}},"loc":{"start":{"line":47,"column":20},"end":{"line":50,"column":5}},"line":47},"12":{"name":"(anonymous_12)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":5}},"loc":{"start":{"line":51,"column":11},"end":{"line":53,"column":5}},"line":51},"13":{"name":"(anonymous_13)","decl":{"start":{"line":54,"column":4},"end":{"line":54,"column":5}},"loc":{"start":{"line":54,"column":17},"end":{"line":56,"column":5}},"line":54},"14":{"name":"(anonymous_14)","decl":{"start":{"line":57,"column":4},"end":{"line":57,"column":5}},"loc":{"start":{"line":57,"column":22},"end":{"line":59,"column":5}},"line":57},"15":{"name":"(anonymous_15)","decl":{"start":{"line":60,"column":4},"end":{"line":60,"column":5}},"loc":{"start":{"line":60,"column":17},"end":{"line":62,"column":5}},"line":60},"16":{"name":"(anonymous_16)","decl":{"start":{"line":63,"column":4},"end":{"line":63,"column":5}},"loc":{"start":{"line":63,"column":25},"end":{"line":69,"column":5}},"line":63},"17":{"name":"(anonymous_17)","decl":{"start":{"line":70,"column":4},"end":{"line":70,"column":5}},"loc":{"start":{"line":70,"column":13},"end":{"line":72,"column":5}},"line":70},"18":{"name":"(anonymous_18)","decl":{"start":{"line":73,"column":4},"end":{"line":73,"column":5}},"loc":{"start":{"line":73,"column":13},"end":{"line":80,"column":5}},"line":73}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":11},"end":{"line":17,"column":72}},"type":"cond-expr","locations":[{"start":{"line":17,"column":32},"end":{"line":17,"column":37}},{"start":{"line":17,"column":40},"end":{"line":17,"column":72}}],"line":17},"1":{"loc":{"start":{"line":48,"column":21},"end":{"line":48,"column":66}},"type":"cond-expr","locations":[{"start":{"line":48,"column":49},"end":{"line":48,"column":56}},{"start":{"line":48,"column":59},"end":{"line":48,"column":66}}],"line":48},"2":{"loc":{"start":{"line":49,"column":49},"end":{"line":49,"column":72}},"type":"cond-expr","locations":[{"start":{"line":49,"column":56},"end":{"line":49,"column":62}},{"start":{"line":49,"column":65},"end":{"line":49,"column":72}}],"line":49},"3":{"loc":{"start":{"line":55,"column":45},"end":{"line":55,"column":68}},"type":"cond-expr","locations":[{"start":{"line":55,"column":52},"end":{"line":55,"column":58}},{"start":{"line":55,"column":61},"end":{"line":55,"column":68}}],"line":55},"4":{"loc":{"start":{"line":58,"column":50},"end":{"line":58,"column":73}},"type":"cond-expr","locations":[{"start":{"line":58,"column":57},"end":{"line":58,"column":63}},{"start":{"line":58,"column":66},"end":{"line":58,"column":73}}],"line":58},"5":{"loc":{"start":{"line":61,"column":46},"end":{"line":61,"column":69}},"type":"cond-expr","locations":[{"start":{"line":61,"column":53},"end":{"line":61,"column":59}},{"start":{"line":61,"column":62},"end":{"line":61,"column":69}}],"line":61},"6":{"loc":{"start":{"line":66,"column":12},"end":{"line":66,"column":52}},"type":"cond-expr","locations":[{"start":{"line":66,"column":19},"end":{"line":66,"column":45}},{"start":{"line":66,"column":48},"end":{"line":66,"column":52}}],"line":66}},"s":{"0":5,"1":5,"2":5,"3":5,"4":38,"5":38,"6":120,"7":9,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":5,"15":5,"16":5,"17":7,"18":10,"19":8,"20":8,"21":30,"22":30,"23":30,"24":5},"f":{"0":38,"1":38,"2":120,"3":9,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":5,"11":5,"12":7,"13":10,"14":8,"15":8,"16":30,"17":30,"18":30},"b":{"0":[30,8],"1":[2,3],"2":[1,4],"3":[5,5],"4":[4,4],"5":[4,4],"6":[30,0]},"inputSourceMap":{"version":3,"file":"name.js","sourceRoot":"","sources":["name.ts"],"names":[],"mappings":"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","sourcesContent":["import * as md5 from 'md5'\nimport * as util from 'util'\n\nconst TEXT = {\n DIMENSION: 'dynamodb:%s:%sCapacityUnits',\n METRIC: 'DynamoDB%sCapacityUtilization',\n POLICYROLE: 'DynamoDBAutoscalePolicy',\n POLICYSCALE: 'TableScalingPolicy-%s',\n ROLE: 'DynamoDBAutoscaleRole',\n TARGET: 'AutoScalingTarget-%s'\n}\n\nfunction clean(input: string): string {\n return truncate(input.replace(/[^a-z0-9+]+/gi, ''))\n}\n\nfunction truncate(input: string): string {\n return input.length <= 64 ? input : input.substr(0, 32) + md5(input)\n}\n\nfunction ucfirst(data: string): string {\n return data.charAt(0).toUpperCase() + data.slice(1)\n}\n\nexport default class Name {\n constructor(private options: Options) { }\n\n public metricRead(): string {\n return this.metric(true)\n }\n\n public metricWrite(): string {\n return this.metric(false)\n }\n\n public targetRead(): string {\n return this.target(true)\n }\n\n public targetWrite(): string {\n return this.target(false)\n }\n\n public policyScaleRead(): string {\n return this.policyScale(true)\n }\n\n public policyScaleWrite(): string {\n return this.policyScale(false)\n }\n\n public policyRole(): string {\n return clean(\n this.build(TEXT.POLICYROLE)\n )\n }\n\n public dimension(read: boolean): string {\n const type = this.options.index === '' ? 'table' : 'index'\n\n return util.format(TEXT.DIMENSION, type, read ? 'Read' : 'Write')\n }\n\n public role(): string {\n return clean(this.build(TEXT.ROLE))\n }\n\n public target(read: boolean): string {\n return clean(\n this.build(TEXT.TARGET, read ? 'Read' : 'Write')\n )\n }\n\n public policyScale(read: boolean): string {\n return clean(\n this.build(TEXT.POLICYSCALE, read ? 'Read' : 'Write')\n )\n }\n\n public metric(read: boolean): string {\n return clean(\n util.format(TEXT.METRIC, read ? 'Read' : 'Write')\n )\n }\n\n private build(data: string, ...args: string[]): string {\n return [\n this.prefix(),\n args ? util.format(data, ...args) : data,\n this.suffix()\n ].join('')\n }\n\n private prefix(): string {\n return this.options.service\n }\n\n private suffix(): string {\n return [\n this.options.table,\n this.options.index,\n this.options.stage,\n this.options.region\n ].map(\n ucfirst\n ).join('')\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"3e0a046b61f949a099d35fe6a39fd7f9750ad030"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/policy.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":25}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":31}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":33}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":65}},"8":{"start":{"line":14,"column":37},"end":{"line":14,"column":64}},"9":{"start":{"line":15,"column":27},"end":{"line":15,"column":59}},"10":{"start":{"line":16,"column":23},"end":{"line":16,"column":50}},"11":{"start":{"line":17,"column":26},"end":{"line":17,"column":80}},"12":{"start":{"line":18,"column":8},"end":{"line":36,"column":10}},"13":{"start":{"line":39,"column":0},"end":{"line":39,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":57},"end":{"line":12,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":13},"end":{"line":37,"column":5}},"line":13}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2},"f":{"0":2,"1":2},"b":{},"inputSourceMap":{"version":3,"file":"policy.js","sourceRoot":"","sources":["policy.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,YAA4B,SAAQ,kBAAQ;IAG1C,YACE,OAAgB,EACR,IAAa,EACb,KAAa,EACb,OAAe,EACf,QAAgB;QACtB,KAAK,CAAC,OAAO,CAAC,CAAA;QAJR,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,aAAQ,GAAR,QAAQ,CAAQ;QAPT,SAAI,GAAW,4CAA4C,CAAA;IAQzD,CAAC;IAEb,MAAM;QACX,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE1C,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE1E,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS;gBACT,UAAU,EAAE;oBACV,UAAU;oBACV,UAAU,EAAE,uBAAuB;oBACnC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;oBAChC,wCAAwC,EAAE;wBACxC,6BAA6B,EAAE;4BAC7B,oBAAoB;yBACrB;wBACD,eAAe,EAAE,IAAI,CAAC,OAAO;wBAC7B,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,WAAW,EAAE,IAAI,CAAC,KAAK;qBACxB;iBACF;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAtCD,yBAsCC","sourcesContent":["import Resource from './resource'\n\nexport default class Policy extends Resource {\n private readonly type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'\n\n constructor (\n options: Options,\n private read: boolean,\n private value: number,\n private scaleIn: number,\n private scaleOut: number\n ) { super(options) }\n\n public toJSON(): any {\n const PredefinedMetricType = this.name.metric(this.read)\n const PolicyName = this.name.policyScale(this.read)\n const Target = this.name.target(this.read)\n\n const DependsOn = [ this.options.table, Target ].concat(this.dependencies)\n\n return {\n [PolicyName]: {\n DependsOn,\n Properties: {\n PolicyName,\n PolicyType: 'TargetTrackingScaling',\n ScalingTargetId: { Ref: Target },\n TargetTrackingScalingPolicyConfiguration: {\n PredefinedMetricSpecification: {\n PredefinedMetricType\n },\n ScaleInCooldown: this.scaleIn,\n ScaleOutCooldown: this.scaleOut,\n TargetValue: this.value\n }\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"545a804283946c5337ac2ce2db558ff164ef3bf3"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/resource.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/resource.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":31}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":31}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":48}},"5":{"start":{"line":11,"column":8},"end":{"line":11,"column":33}},"6":{"start":{"line":12,"column":8},"end":{"line":12,"column":20}},"7":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":25},"end":{"line":9,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":4},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":26},"end":{"line":13,"column":5}},"line":10}},"branchMap":{},"s":{"0":4,"1":4,"2":6,"3":6,"4":6,"5":0,"6":0,"7":4},"f":{"0":6,"1":0},"b":{},"inputSourceMap":{"version":3,"file":"resource.js","sourceRoot":"","sources":["resource.ts"],"names":[],"mappings":";;AAAA,iCAAyB;AAEzB;IAIE,YAAsB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAH5B,iBAAY,GAAa,EAAE,CAAA;QAInC,IAAI,CAAC,IAAI,GAAG,IAAI,cAAI,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IAEM,eAAe,CAAC,IAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAExB,MAAM,CAAC,IAAI,CAAA;IACb,CAAC;CACF;AAbD,2BAaC","sourcesContent":["import Name from './name'\n\nexport default class Resource {\n protected dependencies: string[] = []\n protected name: Name\n\n constructor(protected options: Options) {\n this.name = new Name(options)\n }\n\n public setDependencies(list: string[]): Resource {\n this.dependencies = list\n\n return this\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6e9b94b6575337f0101086babf22c8900a92e9ad"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/role.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":37}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":36}},"5":{"start":{"line":9,"column":8},"end":{"line":21,"column":10}},"6":{"start":{"line":24,"column":25},"end":{"line":24,"column":41}},"7":{"start":{"line":25,"column":27},"end":{"line":25,"column":49}},"8":{"start":{"line":26,"column":26},"end":{"line":26,"column":72}},"9":{"start":{"line":27,"column":26},"end":{"line":27,"column":42}},"10":{"start":{"line":28,"column":24},"end":{"line":28,"column":36}},"11":{"start":{"line":29,"column":21},"end":{"line":29,"column":30}},"12":{"start":{"line":30,"column":8},"end":{"line":56,"column":10}},"13":{"start":{"line":59,"column":8},"end":{"line":61,"column":10}},"14":{"start":{"line":64,"column":8},"end":{"line":66,"column":10}},"15":{"start":{"line":69,"column":0},"end":{"line":69,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":25},"end":{"line":22,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":13},"end":{"line":57,"column":5}},"line":23},"2":{"name":"(anonymous_2)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":5}},"loc":{"start":{"line":58,"column":15},"end":{"line":62,"column":5}},"line":58},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":4},"end":{"line":63,"column":5}},"loc":{"start":{"line":63,"column":16},"end":{"line":67,"column":5}},"line":63}},"branchMap":{},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2},"f":{"0":2,"1":2,"2":2,"3":2},"b":{},"inputSourceMap":{"version":3,"file":"role.js","sourceRoot":"","sources":["role.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,UAA0B,SAAQ,kBAAQ;IAiBxC,YACE,OAAgB;QACd,KAAK,CAAC,OAAO,CAAC,CAAA;QAlBD,SAAI,GAAW,gBAAgB,CAAA;QAC/B,YAAO,GAAW,YAAY,CAAA;QAC9B,YAAO,GAAG;YACzB,UAAU,EAAE;gBACV,2BAA2B;gBAC3B,2BAA2B;gBAC3B,yBAAyB;gBACzB,gCAAgC;gBAChC,0BAA0B;aAC3B;YACD,QAAQ,EAAE;gBACR,wBAAwB;gBACxB,sBAAsB;aACvB;SACF,CAAA;IAIkB,CAAC;IAEb,MAAM;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;QAEzC,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,MAAM,CAAC;YACL,CAAC,QAAQ,CAAC,EAAE;gBACV,SAAS;gBACT,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,SAAS,EAAE;4BACT,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;yBACzD;wBACD,OAAO;qBACR;oBACD,QAAQ,EAAE;wBACR;4BACE,cAAc,EAAE;gCACd,SAAS,EAAE;oCACT,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;oCACnE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;iCAC9E;gCACD,OAAO;6BACR;4BACD,UAAU;yBACX;qBACF;oBACD,QAAQ;iBACT;gBACD,IAAI;aACL;SACF,CAAA;IACH,CAAC;IAEO,QAAQ;QACd,MAAM,CAAC;YACL,UAAU,EAAE,CAAE,EAAE,EAAE,CAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAE,CAAE;SACjH,CAAA;IACH,CAAC;IAEO,SAAS;QACf,MAAM,CAAC;YACL,OAAO,EAAE,uCAAuC;SACjD,CAAA;IACH,CAAC;CACF;AAtED,uBAsEC","sourcesContent":["import Resource from './resource'\n\nexport default class Role extends Resource {\n private readonly type: string = 'AWS::IAM::Role'\n private readonly version: string = '2012-10-17'\n private readonly actions = {\n CloudWatch: [\n 'cloudwatch:PutMetricAlarm',\n 'cloudwatch:DescribeAlarms',\n 'cloudwatch:DeleteAlarms',\n 'cloudwatch:GetMetricStatistics',\n 'cloudwatch:SetAlarmState'\n ],\n DynamoDB: [\n 'dynamodb:DescribeTable',\n 'dynamodb:UpdateTable'\n ]\n }\n\n constructor (\n options: Options\n ) { super(options) }\n\n public toJSON(): any {\n const RoleName = this.name.role()\n const PolicyName = this.name.policyRole()\n\n const DependsOn = [ this.options.table ].concat(this.dependencies)\n const Principal = this.principal()\n const Version = this.version\n const Type = this.type\n\n return {\n [RoleName]: {\n DependsOn,\n Properties: {\n AssumeRolePolicyDocument: {\n Statement: [\n { Action: 'sts:AssumeRole', Effect: 'Allow', Principal }\n ],\n Version\n },\n Policies: [\n {\n PolicyDocument: {\n Statement: [\n { Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },\n { Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() }\n ],\n Version\n },\n PolicyName\n }\n ],\n RoleName\n },\n Type\n }\n }\n }\n\n private resource(): {} {\n return {\n 'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table } ] ]\n }\n }\n\n private principal(): {} {\n return {\n Service: 'application-autoscaling.amazonaws.com'\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"edb65fc0b18e4b810041c2a604a42e71f0ae8240"}
,"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts": {"path":"/home/ubuntu/serverless-dynamodb-autoscaling/src/aws/target.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"2":{"start":{"line":6,"column":8},"end":{"line":6,"column":23}},"3":{"start":{"line":7,"column":8},"end":{"line":7,"column":25}},"4":{"start":{"line":8,"column":8},"end":{"line":8,"column":23}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":23}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":66}},"7":{"start":{"line":13,"column":25},"end":{"line":13,"column":64}},"8":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":57}},"10":{"start":{"line":17,"column":27},"end":{"line":17,"column":54}},"11":{"start":{"line":18,"column":25},"end":{"line":18,"column":41}},"12":{"start":{"line":19,"column":30},"end":{"line":19,"column":60}},"13":{"start":{"line":20,"column":26},"end":{"line":20,"column":82}},"14":{"start":{"line":21,"column":8},"end":{"line":34,"column":10}},"15":{"start":{"line":37,"column":0},"end":{"line":37,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":11,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":13},"end":{"line":35,"column":5}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":16,"column":9}},{"start":{"line":14,"column":8},"end":{"line":16,"column":9}}],"line":14}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2},"f":{"0":2,"1":2},"b":{"0":[2,0]},"inputSourceMap":{"version":3,"file":"target.js","sourceRoot":"","sources":["target.ts"],"names":[],"mappings":";;AAAA,yCAAiC;AAEjC,YAA4B,SAAQ,kBAAQ;IAG1C,YACE,OAAgB,EACR,IAAa,EACb,GAAW,EACX,GAAW;QACjB,KAAK,CAAC,OAAO,CAAC,CAAA;QAHR,SAAI,GAAJ,IAAI,CAAS;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,QAAG,GAAH,GAAG,CAAQ;QANJ,SAAI,GAAG,6CAA6C,CAAA;IAOlD,CAAC;IAEb,MAAM;QACX,MAAM,QAAQ,GAAG,CAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAE,CAAA;QAE1D,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAE5E,MAAM,CAAC;YACL,CAAC,UAAU,CAAC,EAAE;gBACZ,SAAS;gBACT,UAAU,EAAE;oBACV,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,WAAW,EAAE,IAAI,CAAC,GAAG;oBACrB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAE,EAAE,EAAE,QAAQ,CAAE,EAAE;oBAC5C,OAAO,EAAE,EAAE,YAAY,EAAE,CAAE,QAAQ,EAAE,KAAK,CAAE,EAAE;oBAC9C,iBAAiB,EAAE,aAAa;oBAChC,gBAAgB,EAAE,UAAU;iBAC7B;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAA;IACH,CAAC;CACF;AAtCD,yBAsCC","sourcesContent":["import Resource from './resource'\n\nexport default class Target extends Resource {\n private readonly type = 'AWS::ApplicationAutoScaling::ScalableTarget'\n\n constructor (\n options: Options,\n private read: boolean,\n private min: number,\n private max: number\n ) { super(options) }\n\n public toJSON(): any {\n const resource = [ 'table/', { Ref: this.options.table } ]\n\n if (this.options.index !== '') {\n resource.push('/index/', this.options.index)\n }\n\n const nameTarget = this.name.target(this.read)\n const nameRole = this.name.role()\n const nameDimension = this.name.dimension(this.read)\n\n const DependsOn = [ this.options.table, nameRole ].concat(this.dependencies)\n\n return {\n [nameTarget]: {\n DependsOn,\n Properties: {\n MaxCapacity: this.max,\n MinCapacity: this.min,\n ResourceId: { 'Fn::Join': [ '', resource ] },\n RoleARN: { 'Fn::GetAtt': [ nameRole, 'Arn' ] },\n ScalableDimension: nameDimension,\n ServiceNamespace: 'dynamodb'\n },\n Type: this.type\n }\n }\n }\n}\n"]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6430f1da987204abff506fa77fde439acdfb1757"}
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const names = require("./names");
class Policy {
constructor(service, table, value, read, scaleIn, scaleOut, index, stage) {
this.service = service;
this.table = table;
const resource_1 = require("./resource");
class Policy extends resource_1.default {
constructor(options, read, value, scaleIn, scaleOut) {
super(options);
this.read = read;
this.value = value;
this.read = read;
this.scaleIn = scaleIn;
this.scaleOut = scaleOut;
this.index = index;
this.stage = stage;
this.dependencies = [];
this.type = 'AWS::ApplicationAutoScaling::ScalingPolicy';
}
setDependencies(list) {
this.dependencies = list;
return this;
}
toJSON() {
const nameMetric = names.metric(this.read);
const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage);
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage);
const dependencies = [this.table, nameTarget].concat(this.dependencies);
const PredefinedMetricType = this.name.metric(this.read);
const PolicyName = this.name.policyScale(this.read);
const Target = this.name.target(this.read);
const DependsOn = [this.options.table, Target].concat(this.dependencies);
return {
[nameScalePolicy]: {
DependsOn: dependencies,
[PolicyName]: {
DependsOn,
Properties: {
PolicyName: nameScalePolicy,
PolicyName,
PolicyType: 'TargetTrackingScaling',
ScalingTargetId: { Ref: nameTarget },
ScalingTargetId: { Ref: Target },
TargetTrackingScalingPolicyConfiguration: {
PredefinedMetricSpecification: {
PredefinedMetricType: nameMetric
PredefinedMetricType
},

@@ -37,0 +29,0 @@ ScaleInCooldown: this.scaleIn,

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const names = require("./names");
class Role {
constructor(service, table, index, stage) {
this.service = service;
this.table = table;
this.index = index;
this.stage = stage;
this.dependencies = [];
const resource_1 = require("./resource");
class Role extends resource_1.default {
constructor(options) {
super(options);
this.type = 'AWS::IAM::Role';

@@ -27,25 +23,18 @@ this.version = '2012-10-17';

}
setDependencies(list) {
this.dependencies = list;
return this;
}
toJSON() {
const nameRole = names.role(this.service, this.table, this.index, this.stage);
const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage);
const dependencies = [this.table].concat(this.dependencies);
const principal = {
Service: 'application-autoscaling.amazonaws.com'
};
const resource = {
'Fn::Join': ['', ['arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table }]]
};
const RoleName = this.name.role();
const PolicyName = this.name.policyRole();
const DependsOn = [this.options.table].concat(this.dependencies);
const Principal = this.principal();
const Version = this.version;
const Type = this.type;
return {
[nameRole]: {
DependsOn: dependencies,
[RoleName]: {
DependsOn,
Properties: {
AssumeRolePolicyDocument: {
Statement: [
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal }
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal }
],
Version: this.version
Version
},

@@ -57,17 +46,27 @@ Policies: [

{ Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource }
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() }
],
Version: this.version
Version
},
PolicyName: namePolicyRole
PolicyName
}
],
RoleName: nameRole
RoleName
},
Type: this.type
Type
}
};
}
resource() {
return {
'Fn::Join': ['', ['arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table }]]
};
}
principal() {
return {
Service: 'application-autoscaling.amazonaws.com'
};
}
}
exports.default = Role;
//# sourceMappingURL=role.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const names = require("./names");
class Target {
constructor(service, table, min, max, read, index, stage) {
this.service = service;
this.table = table;
const resource_1 = require("./resource");
class Target extends resource_1.default {
constructor(options, read, min, max) {
super(options);
this.read = read;
this.min = min;
this.max = max;
this.read = read;
this.index = index;
this.stage = stage;
this.dependencies = [];
this.type = 'AWS::ApplicationAutoScaling::ScalableTarget';
}
setDependencies(list) {
this.dependencies = list;
return this;
}
toJSON() {
const resource = ['table/', { Ref: this.table }];
if (this.index) {
resource.push('/index/', this.index);
const resource = ['table/', { Ref: this.options.table }];
if (this.options.index !== '') {
resource.push('/index/', this.options.index);
}
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage);
const nameRole = names.role(this.service, this.table, this.index, this.stage);
const nameDimension = names.dimension(this.read, !!this.index);
const dependencies = [this.table, nameRole].concat(this.dependencies);
const nameTarget = this.name.target(this.read);
const nameRole = this.name.role();
const nameDimension = this.name.dimension(this.read);
const DependsOn = [this.options.table, nameRole].concat(this.dependencies);
return {
[nameTarget]: {
DependsOn: dependencies,
DependsOn,
Properties: {

@@ -33,0 +25,0 @@ MaxCapacity: this.max,

@@ -10,2 +10,6 @@ "use strict";

const text = {
CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!',
CLI_RESOURCE: ' - Building configuration for resource "table/%s%s"',
CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!',
CLI_START: 'Configure DynamoDB Auto Scaling …',
INVALID_CONFIGURATION: 'Invalid serverless configuration',

@@ -22,3 +26,3 @@ NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',

this.hooks = {
'deploy:compileEvents': this.beforeDeployResources.bind(this)
'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this)
};

@@ -39,2 +43,8 @@ }

/**
* Get the current service region
*/
getRegion() {
return this.serverless.getProvider('aws').getRegion();
}
/**
* Validate the request and check if configuration is available

@@ -72,24 +82,32 @@ */

resources(table, index, config) {
const resources = [];
const service = this.getServiceName();
const stage = this.getStage();
const data = this.defaults(config);
const options = {
index,
region: this.getRegion(),
service: this.getServiceName(),
stage: this.getStage(),
table
};
// Start processing configuration
this.serverless.cli.log(util.format(' - Building configuration for resource "table/%s%s"', table, (index ? ('/index/' + index) : '')));
this.serverless.cli.log(util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : '')));
// Add role to manage Auto Scaling policies
resources.push(new role_1.default(service, table, index, stage));
const resources = [
new role_1.default(options)
];
// Only add Auto Scaling for read capacity if configuration set is available
if (config.read) {
resources.push(
// ScaleIn/ScaleOut values are fix to 60% usage
new policy_1.default(service, table, data.read.usage * 100, true, 60, 60, index, stage), new target_1.default(service, table, data.read.minimum, data.read.maximum, true, index, stage));
if (!!config.read) {
resources.push(...this.getPolicyAndTarget(options, data, true));
}
// Only add Auto Scaling for write capacity if configuration set is available
if (config.write) {
resources.push(
// ScaleIn/ScaleOut values are fix to 60% usage
new policy_1.default(service, table, data.write.usage * 100, false, 60, 60, index, stage), new target_1.default(service, table, data.write.minimum, data.write.maximum, false, index, stage));
if (!!config.write) {
resources.push(...this.getPolicyAndTarget(options, data, false));
}
return resources;
}
getPolicyAndTarget(options, data, read) {
return [
new policy_1.default(options, false, data.read.usage * 100, 60, 60),
new target_1.default(options, false, data.read.minimum, data.read.maximum)
];
}
/**

@@ -128,3 +146,3 @@ * Generate CloudFormation resources for DynamoDB table and indexes

beforeDeployResources() {
return Promise.resolve().then(() => this.validate()).then(() => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …'))).then(() => this.process()).then(() => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!'))).catch((err) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message)));
return Promise.resolve().then(() => this.validate()).then(() => this.serverless.cli.log(util.format(text.CLI_START))).then(() => this.process()).then(() => this.serverless.cli.log(util.format(text.CLI_DONE))).catch((err) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message)));
}

@@ -131,0 +149,0 @@ }

{
"name": "serverless-dynamodb-autoscaling",
"description": "Serverless Plugin for Amazon DynamoDB Auto Scaling.",
"version": "0.5.1",
"homepage": "https://sbstjn.com/serverless-dynamodb-auto-scaling-with-cloudformation.html",
"version": "0.6.0",
"main": "dist/plugin.js",

@@ -9,5 +10,7 @@ "scripts": {

"test:cover": "jest --coverage",
"test:watch": "jest --watch",
"coveralls": "cat ./coverage/lcov.info | coveralls",
"lint": "tslint {src,test}/**/*.ts",
"build": "tsc"
"build": "tsc",
"build:watch": "tsc --watch"
},

@@ -34,13 +37,14 @@ "keywords": [

},
"homepage": "https://github.com/sbstjn/serverless-dynamodb-autoscaling",
"devDependencies": {
"@types/jest": "^20.0.5",
"@types/lodash": "^4.14.71",
"@types/md5": "^2.1.32",
"@types/node": "^8.0.19",
"coveralls": "^2.13.1",
"dot-json": "^1.0.3",
"jasmine-data-provider": "^2.2.0",
"jest": "^20.0.4",
"serverless-types": "^0.0.1",
"ts-jest": "^20.0.7",
"tslint": "^5.5.0",
"@types/md5": "^2.1.32",
"@types/lodash": "^4.14.71",
"typescript": "^2.4.2"

@@ -47,0 +51,0 @@ },

@@ -74,2 +74,6 @@ # ⚡️ Serverless Plugin for DynamoDB Auto Scaling

### Breaking Changes
*There have been multiple breaking changes regarding CloudFormation resource names in the past. If you end up with an error, that your CloudFormation Stack cannot be updated, try to remove the `custom > capacities` configuration from your `serverless.yml` file and deploy the service without any Auto Scaling configuration. After that, just re-add your previous configuration and deploy your service again.*
## DynamoDB

@@ -121,1 +125,16 @@

To make sure you have a pleasant experience, please read the [code of conduct](CODE_OF_CONDUCT.md). It outlines core values and beliefs and will make working together a happier experience.
### Local Development
If you plan to change the TypeScript files and link the package to another project, use the `link` and `build` yarn commands:
```
$ > yarn link
$ > yarn build:watch # or "yarn build"
```
Use your local build of the package in another project:
```
$ > yarn link serverless-dynamodb-autoscaling
```

@@ -1,41 +0,31 @@

import * as names from './names'
import Resource from './resource'
export default class Policy {
private dependencies: string[] = []
private type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'
export default class Policy extends Resource {
private readonly type: string = 'AWS::ApplicationAutoScaling::ScalingPolicy'
constructor (
private service: string,
private table: string,
options: Options,
private read: boolean,
private value: number,
private read: boolean,
private scaleIn: number,
private scaleOut: number,
private index: string,
private stage: string
) { }
private scaleOut: number
) { super(options) }
public setDependencies(list: string[]): Policy {
this.dependencies = list
return this
}
public toJSON(): any {
const nameMetric = names.metric(this.read)
const nameScalePolicy = names.policyScale(this.service, this.table, this.read, this.index, this.stage)
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)
const PredefinedMetricType = this.name.metric(this.read)
const PolicyName = this.name.policyScale(this.read)
const Target = this.name.target(this.read)
const dependencies = [this.table, nameTarget ].concat(this.dependencies)
const DependsOn = [ this.options.table, Target ].concat(this.dependencies)
return {
[nameScalePolicy]: {
DependsOn: dependencies,
[PolicyName]: {
DependsOn,
Properties: {
PolicyName: nameScalePolicy,
PolicyName,
PolicyType: 'TargetTrackingScaling',
ScalingTargetId: { Ref: nameTarget },
ScalingTargetId: { Ref: Target },
TargetTrackingScalingPolicyConfiguration: {
PredefinedMetricSpecification: {
PredefinedMetricType: nameMetric
PredefinedMetricType
},

@@ -42,0 +32,0 @@ ScaleInCooldown: this.scaleIn,

@@ -1,8 +0,7 @@

import * as names from './names'
import Resource from './resource'
export default class Role {
private dependencies: string[] = []
private type: string = 'AWS::IAM::Role'
private version: string = '2012-10-17'
private actions = {
export default class Role extends Resource {
private readonly type: string = 'AWS::IAM::Role'
private readonly version: string = '2012-10-17'
private readonly actions = {
CloudWatch: [

@@ -22,35 +21,23 @@ 'cloudwatch:PutMetricAlarm',

constructor (
private service: string,
private table: string,
private index: string,
private stage: string
) { }
options: Options
) { super(options) }
public setDependencies(list: string[]): Role {
this.dependencies = list
return this
}
public toJSON(): any {
const nameRole = names.role(this.service, this.table, this.index, this.stage)
const namePolicyRole = names.policyRole(this.service, this.table, this.index, this.stage)
const RoleName = this.name.role()
const PolicyName = this.name.policyRole()
const dependencies = [ this.table ].concat(this.dependencies)
const principal = {
Service: 'application-autoscaling.amazonaws.com'
}
const resource = {
'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.table } ] ]
}
const DependsOn = [ this.options.table ].concat(this.dependencies)
const Principal = this.principal()
const Version = this.version
const Type = this.type
return {
[nameRole]: {
DependsOn: dependencies,
[RoleName]: {
DependsOn,
Properties: {
AssumeRolePolicyDocument: {
Statement: [
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: principal }
{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal }
],
Version: this.version
Version
},

@@ -62,15 +49,27 @@ Policies: [

{ Action: this.actions.CloudWatch, Effect: 'Allow', Resource: '*' },
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: resource }
{ Action: this.actions.DynamoDB, Effect: 'Allow', Resource: this.resource() }
],
Version: this.version
Version
},
PolicyName: namePolicyRole
PolicyName
}
],
RoleName: nameRole
RoleName
},
Type: this.type
Type
}
}
}
private resource(): {} {
return {
'Fn::Join': [ '', [ 'arn:aws:dynamodb:*:', { Ref: 'AWS::AccountId' }, ':table/', { Ref: this.options.table } ] ]
}
}
private principal(): {} {
return {
Service: 'application-autoscaling.amazonaws.com'
}
}
}

@@ -1,39 +0,29 @@

import * as names from './names'
import Resource from './resource'
export default class Target {
private dependencies: string[] = []
private type: string = 'AWS::ApplicationAutoScaling::ScalableTarget'
export default class Target extends Resource {
private readonly type = 'AWS::ApplicationAutoScaling::ScalableTarget'
constructor (
private service: string,
private table: string,
options: Options,
private read: boolean,
private min: number,
private max: number,
private read: boolean,
private index?: string,
private stage?: string
) { }
private max: number
) { super(options) }
public setDependencies(list: string[]): Target {
this.dependencies = list
return this
}
public toJSON(): any {
const resource = [ 'table/', { Ref: this.table } ]
const resource = [ 'table/', { Ref: this.options.table } ]
if (this.index) {
resource.push('/index/', this.index)
if (this.options.index !== '') {
resource.push('/index/', this.options.index)
}
const nameTarget = names.target(this.service, this.table, this.read, this.index, this.stage)
const nameRole = names.role(this.service, this.table, this.index, this.stage)
const nameDimension = names.dimension(this.read, !!this.index)
const nameTarget = this.name.target(this.read)
const nameRole = this.name.role()
const nameDimension = this.name.dimension(this.read)
const dependencies = [ this.table, nameRole ].concat(this.dependencies)
const DependsOn = [ this.options.table, nameRole ].concat(this.dependencies)
return {
[nameTarget]: {
DependsOn: dependencies,
DependsOn,
Properties: {

@@ -40,0 +30,0 @@ MaxCapacity: this.max,

@@ -10,2 +10,6 @@ import * as assert from 'assert'

const text = {
CLI_DONE: 'Added DynamoDB Auto Scaling to CloudFormation!',
CLI_RESOURCE: ' - Building configuration for resource "table/%s%s"',
CLI_SKIP: 'Skipping DynamoDB Auto Scaling: %s!',
CLI_START: 'Configure DynamoDB Auto Scaling …',
INVALID_CONFIGURATION: 'Invalid serverless configuration',

@@ -16,2 +20,7 @@ NO_AUTOSCALING_CONFIG: 'Not Auto Scaling configuration found',

interface Defaults {
read: CapacityConfiguration,
write: CapacityConfiguration
}
class Plugin {

@@ -25,3 +34,3 @@ public hooks: {}

this.hooks = {
'deploy:compileEvents': this.beforeDeployResources.bind(this)
'before:package:createDeploymentArtifacts': this.beforeDeployResources.bind(this)
}

@@ -45,2 +54,9 @@ }

/**
* Get the current service region
*/
private getRegion(): string {
return this.serverless.getProvider('aws').getRegion()
}
/**
* Validate the request and check if configuration is available

@@ -62,3 +78,3 @@ */

*/
private defaults(config: Capacity): { read: CapacityConfiguration, write: CapacityConfiguration } {
private defaults(config: Capacity): Defaults {
return {

@@ -82,31 +98,30 @@ read: {

private resources(table: string, index: string, config: Capacity): any[] {
const resources = []
const service = this.getServiceName()
const stage = this.getStage()
const data = this.defaults(config)
const options: Options = {
index,
region: this.getRegion(),
service: this.getServiceName(),
stage: this.getStage(),
table
}
// Start processing configuration
this.serverless.cli.log(
util.format(' - Building configuration for resource "table/%s%s"', table, (index ? ('/index/' + index) : ''))
util.format(text.CLI_RESOURCE, table, (index ? ('/index/' + index) : ''))
)
// Add role to manage Auto Scaling policies
resources.push(new Role(service, table, index, stage))
const resources: any[] = [
new Role(options)
]
// Only add Auto Scaling for read capacity if configuration set is available
if (config.read) {
resources.push(
// ScaleIn/ScaleOut values are fix to 60% usage
new Policy(service, table, data.read.usage * 100, true, 60, 60, index, stage),
new Target(service, table, data.read.minimum, data.read.maximum, true, index, stage)
)
if (!!config.read) {
resources.push(...this.getPolicyAndTarget(options, data, true))
}
// Only add Auto Scaling for write capacity if configuration set is available
if (config.write) {
resources.push(
// ScaleIn/ScaleOut values are fix to 60% usage
new Policy(service, table, data.write.usage * 100, false, 60, 60, index, stage),
new Target(service, table, data.write.minimum, data.write.maximum, false, index, stage)
)
if (!!config.write) {
resources.push(...this.getPolicyAndTarget(options, data, false))
}

@@ -117,2 +132,9 @@

private getPolicyAndTarget(options: Options, data: Defaults, read: boolean): any[] {
return [
new Policy(options, false, data.read.usage * 100, 60, 60),
new Target(options, false, data.read.minimum, data.read.maximum)
]
}
/**

@@ -177,9 +199,9 @@ * Generate CloudFormation resources for DynamoDB table and indexes

).then(
() => this.serverless.cli.log(util.format('Configure DynamoDB Auto Scaling …'))
() => this.serverless.cli.log(util.format(text.CLI_START))
).then(
() => this.process()
).then(
() => this.serverless.cli.log(util.format('Added DynamoDB Auto Scaling to CloudFormation!'))
() => this.serverless.cli.log(util.format(text.CLI_DONE))
).catch(
(err: Error) => this.serverless.cli.log(util.format('Skipping DynamoDB Auto Scaling: %s!', err.message))
(err: Error) => this.serverless.cli.log(util.format(text.CLI_SKIP, err.message))
)

@@ -186,0 +208,0 @@ }

@@ -1,2 +0,1 @@

import * as names from '../../src/aws/names'
import Policy from '../../src/aws/policy'

@@ -6,17 +5,17 @@

it('creates CF resource for read capacity', () => {
const p = new Policy('', 'my-table-name', 75, true, 60, 70)
const p = new Policy({
index: '',
region: '',
service: '',
stage: '',
table: 'MyTableResource'
}, true, 75, 60, 70)
const j = p.toJSON()
expect(j).toHaveProperty(names.policyScale('', 'my-table-name', true))
expect(j).toHaveProperty('TableScalingPolicyReadMyTableResource')
const d = j[names.policyScale('', 'my-table-name', true)]
const d = j.TableScalingPolicyReadMyTableResource
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalingPolicy')
expect(d).toHaveProperty('Properties.PolicyName', names.policyScale('', 'my-table-name', true))
expect(d).toHaveProperty('Properties.PolicyType', 'TargetTrackingScaling')
expect(d).toHaveProperty('Properties.ScalingTargetId', { Ref: names.target('', 'my-table-name', true) })
expect(d).toHaveProperty(
'Properties.TargetTrackingScalingPolicyConfiguration.PredefinedMetricSpecification.PredefinedMetricType',
names.metric(true)
)

@@ -31,24 +30,24 @@ const c = d.Properties.TargetTrackingScalingPolicyConfiguration

it('creates CF resource for write capacity', () => {
const p = new Policy('', 'my-table-name', 15, false, 60, 70)
const p = new Policy({
index: '',
region: '',
service: '',
stage: '',
table: 'MyTableResource'
}, false, 10, 20, 30)
const j = p.toJSON()
expect(j).toHaveProperty(names.policyScale('', 'my-table-name', false))
expect(j).toHaveProperty('TableScalingPolicyWriteMyTableResource')
const d = j[names.policyScale('', 'my-table-name', false)]
const d = j.TableScalingPolicyWriteMyTableResource
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalingPolicy')
expect(d).toHaveProperty('Properties.PolicyName', names.policyScale('', 'my-table-name', false))
expect(d).toHaveProperty('Properties.PolicyType', 'TargetTrackingScaling')
expect(d).toHaveProperty('Properties.ScalingTargetId', { Ref: names.target('', 'my-table-name', false) })
expect(d).toHaveProperty(
'Properties.TargetTrackingScalingPolicyConfiguration.PredefinedMetricSpecification.PredefinedMetricType',
names.metric(false)
)
const c = d.Properties.TargetTrackingScalingPolicyConfiguration
expect(c).toHaveProperty('ScaleInCooldown', 60)
expect(c).toHaveProperty('ScaleOutCooldown', 70)
expect(c).toHaveProperty('TargetValue', 15)
expect(c).toHaveProperty('ScaleInCooldown', 20)
expect(c).toHaveProperty('ScaleOutCooldown', 30)
expect(c).toHaveProperty('TargetValue', 10)
})
})

@@ -1,2 +0,1 @@

import * as names from '../../src/aws/names'
import Role from '../../src/aws/role'

@@ -6,26 +5,28 @@

it('creates CF resource', () => {
const r = new Role('', 'my-table-name')
const r = new Role({
index: 'index',
region: 'region',
service: 'service',
stage: 'stage',
table: 'MyTableResource'
})
const j = r.toJSON()
expect(j).toHaveProperty(names.role('', 'my-table-name'))
const d = j[names.role('', 'my-table-name')]
expect(d).toHaveProperty('Type', 'AWS::IAM::Role')
expect(d).toHaveProperty('Properties.RoleName', 'DynamoDBAutoscaleRolemytablename')
expect(j).toHaveProperty('serviceDynamoDBAutoscaleRoleMyTableResourceIndexStageRegion')
})
it('truncates role name if needed', () => {
const r = new Role('service', 'my-table-name-with-some-extra-long-string-information-added-to-the-end')
const r = new Role({
index: 'index',
region: 'region',
service: 'service-with-a-long-name-to-force-truncation',
stage: 'stage',
table: 'MyTableResource'
})
const j = r.toJSON()
const n = 'serviceDynamoDBAutoscaleRolemyta941c3679150ea9fa409846dd3c00ec13'
expect(j).toHaveProperty(n)
const d = j[n]
expect(d.Properties.RoleName.length).toBe(64)
expect(d).toHaveProperty('Properties.RoleName', n)
expect(j).toHaveProperty('servicewithalongnametoforcetrunc81d5364e64588e2b095c450722c20a24')
})
})

@@ -1,2 +0,1 @@

import * as names from '../../src/aws/names'
import Target from '../../src/aws/target'

@@ -6,34 +5,31 @@

it('creates CF resource for read capacity', () => {
const t = new Target('', 'my-table-name', 4, 100, true)
const t = new Target({
index: 'index',
region: 'region',
service: 'service',
stage: 'stage',
table: 'MyTableResource'
}, true, 10, 100)
const j = t.toJSON()
expect(j).toHaveProperty(names.target('', 'my-table-name', true))
expect(j).toHaveProperty('serviceAutoScalingTargetReadMyTableResourceIndexStageRegion')
const d = j[names.target('', 'my-table-name', true)]
const d = j.serviceAutoScalingTargetReadMyTableResourceIndexStageRegion
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalableTarget')
expect(d).toHaveProperty('Properties.MinCapacity', 4)
expect(d).toHaveProperty('Properties.MinCapacity', 10)
expect(d).toHaveProperty('Properties.MaxCapacity', 100)
expect(d).toHaveProperty('Properties.ScalableDimension', names.dimension(true))
expect(d).toHaveProperty('Properties.ServiceNamespace', 'dynamodb')
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt')
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt', [ names.role('', 'my-table-name'), 'Arn' ])
})
it('creates CF resource for write capacity', () => {
const t = new Target('', 'my-table-name', 100, 2000, false)
const j = t.toJSON()
it('creates CF resource for false capacity', () => {
const t = new Target({
index: 'index',
region: 'region',
service: 'service',
stage: 'stage',
table: 'MyTableResource'
}, false, 10, 100)
expect(j).toHaveProperty(names.target('', 'my-table-name', false))
const d = j[names.target('', 'my-table-name', false)]
expect(d).toHaveProperty('Type', 'AWS::ApplicationAutoScaling::ScalableTarget')
expect(d).toHaveProperty('Properties.MinCapacity', 100)
expect(d).toHaveProperty('Properties.MaxCapacity', 2000)
expect(d).toHaveProperty('Properties.ScalableDimension', names.dimension(false))
expect(d).toHaveProperty('Properties.ServiceNamespace', 'dynamodb')
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt')
expect(d).toHaveProperty('Properties.RoleARN.Fn::GetAtt', [ names.role('', 'my-table-name'), 'Arn' ])
expect(t.toJSON()).toHaveProperty('serviceAutoScalingTargetWriteMyTableResourceIndexStageRegion')
})
})

@@ -1,3 +0,1 @@

'use strict'
import * as Plugin from '../src/plugin'

@@ -4,0 +2,0 @@

@@ -19,7 +19,5 @@ {

"src/**/*",
"vendor/**/*"
],
"exclude": [
"node_modules/**/*"
"vendor/**/*",
"node_modules/serverless-types/**/*"
]
}

@@ -14,1 +14,20 @@ declare interface Capacity {

}
declare interface Options {
index: string
region: string
service: string
stage: string
table: string
}
/**
* Merged with empty default Serverless.Service.Custom declaration
*/
declare namespace Serverless {
namespace Service {
interface Custom {
capacities: Capacity[]
}
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc