@goldstack/utils-aws-lambda 0.1.4 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,38 @@
1
1
  # Goldstack AWS Lambda Tools
2
2
 
3
- This library provides a simple wrapper around the AWS CLI to deploy Lambdas.
3
+ This library provides a simple wrapper around the AWS CLI to deploy Lambdas and define Lambda infrastructure.
4
+
5
+ ## deployFunction
6
+
7
+ This function will deploy an AWS lambda. Note this function will either need Docker to be available locally or the AWS cli.
8
+
9
+ ```typescript
10
+ interface DeployFunctionParams {
11
+ lambdaPackageDir: string;
12
+ targetArchiveName?: string;
13
+ awsCredentials: AWS.Credentials;
14
+ region: string;
15
+ functionName: string;
16
+ }
17
+
18
+ function async deployFunction(
19
+ params: DeployFunctionParams
20
+ ): Promise<any> {}
21
+ ```
22
+
23
+ ## readLambdaConfig
24
+
25
+ This function will generate a configuration for AWS HTTP API Gateway based on `.ts` files in a folder. For more information, see [Goldstack Documentation - Defining Routes](https://docs.goldstack.party/docs/modules/lambda-api#defining-routes-1)
26
+
27
+ ```typescript
28
+ export interface LambdaConfig {
29
+ name: string;
30
+ type: RouteType;
31
+ absoluteFilePath: string;
32
+ relativeFilePath: string;
33
+ path: string;
34
+ route: string;
35
+ }
36
+
37
+ function readLambdaConfig(dir: string): LambdaConfig[] {}
38
+ ```
@@ -1,14 +1,14 @@
1
- export declare enum RouteType {
2
- DIR = "DIR",
3
- FUNCTION = "FUNCTION"
4
- }
5
- export interface LambdaConfig {
6
- name: string;
7
- type: RouteType;
8
- absoluteFilePath: string;
9
- relativeFilePath: string;
10
- path: string;
11
- route: string;
12
- }
13
- export declare function readLambdaConfig(dir: string): LambdaConfig[];
1
+ export declare enum RouteType {
2
+ DIR = "DIR",
3
+ FUNCTION = "FUNCTION"
4
+ }
5
+ export interface LambdaConfig {
6
+ name: string;
7
+ type: RouteType;
8
+ absoluteFilePath: string;
9
+ relativeFilePath: string;
10
+ path: string;
11
+ route: string;
12
+ }
13
+ export declare function readLambdaConfig(dir: string): LambdaConfig[];
14
14
  //# sourceMappingURL=collectLambdasFromFiles.d.ts.map
@@ -1,103 +1,103 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.readLambdaConfig = exports.RouteType = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = require("path");
9
- var RouteType;
10
- (function (RouteType) {
11
- RouteType["DIR"] = "DIR";
12
- RouteType["FUNCTION"] = "FUNCTION";
13
- })(RouteType = exports.RouteType || (exports.RouteType = {}));
14
- function readLambdaConfig(dir) {
15
- const result = readLambdaConfigImpl(dir, dir);
16
- if (!result.children) {
17
- throw new Error('Invalid directory ' + dir);
18
- }
19
- return flattenConfig(result.children).filter((e) => e.type === RouteType.FUNCTION);
20
- }
21
- exports.readLambdaConfig = readLambdaConfig;
22
- function flattenConfig(config) {
23
- const arr = [];
24
- for (const child of Object.entries(config)) {
25
- const newVal = { ...child[1] };
26
- newVal.children = undefined;
27
- arr.push(newVal);
28
- if (child[1].children) {
29
- arr.push(...flattenConfig(child[1].children));
30
- }
31
- }
32
- return arr;
33
- }
34
- function posixPath(pathstring) {
35
- return pathstring.split(path_1.sep).join(path_1.posix.sep);
36
- }
37
- function removeExtension(path) {
38
- return path.replace(/\.[^/.]+$/, '');
39
- }
40
- function makePath(configRoot, dir) {
41
- const path = removeExtension(posixPath((0, path_1.relative)(configRoot, dir)));
42
- if (path === '$index') {
43
- return '/';
44
- }
45
- if (path.indexOf('$index') !== -1) {
46
- let newPath = path.replace('$index', '');
47
- // API Gateway does not accept routes like /myroute/
48
- newPath = newPath.slice(0, newPath.length - 1);
49
- return `/${newPath}`;
50
- }
51
- if (path === '$default') {
52
- return '$default';
53
- }
54
- return `/${path}`;
55
- }
56
- function makeRoute(configRoot, dir) {
57
- const route = makePath(configRoot, dir);
58
- if (route === '$default') {
59
- return '$default';
60
- }
61
- return `ANY ${route}`;
62
- }
63
- function readLambdaConfigImpl(configRoot, dir) {
64
- const root = dir;
65
- const rootRoute = makeRoute(configRoot, dir);
66
- const configItem = {
67
- name: root,
68
- type: RouteType.DIR,
69
- absoluteFilePath: dir,
70
- path: makePath(configRoot, dir),
71
- relativeFilePath: (0, path_1.relative)(configRoot, dir),
72
- route: rootRoute,
73
- };
74
- const dirHandle = fs_1.default.opendirSync(dir);
75
- let dirEntry;
76
- while ((dirEntry = dirHandle.readSync()) !== null) {
77
- if (!configItem.children) {
78
- configItem.children = {};
79
- }
80
- const name = dirEntry.name;
81
- const fullPath = (0, path_1.resolve)(root, name);
82
- if (dirEntry.isDirectory()) {
83
- configItem.children[name] = readLambdaConfigImpl(configRoot, fullPath);
84
- }
85
- else if (dirEntry.isFile()) {
86
- const route = makeRoute(configRoot, fullPath);
87
- configItem.children[name] = {
88
- name: removeExtension(name),
89
- type: RouteType.FUNCTION,
90
- path: makePath(configRoot, fullPath),
91
- absoluteFilePath: fullPath,
92
- relativeFilePath: (0, path_1.relative)(configRoot, fullPath),
93
- route: route,
94
- };
95
- }
96
- else {
97
- continue;
98
- }
99
- }
100
- dirHandle.closeSync();
101
- return configItem;
102
- }
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readLambdaConfig = exports.RouteType = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = require("path");
9
+ var RouteType;
10
+ (function (RouteType) {
11
+ RouteType["DIR"] = "DIR";
12
+ RouteType["FUNCTION"] = "FUNCTION";
13
+ })(RouteType = exports.RouteType || (exports.RouteType = {}));
14
+ function readLambdaConfig(dir) {
15
+ const result = readLambdaConfigImpl(dir, dir);
16
+ if (!result.children) {
17
+ throw new Error('Invalid directory ' + dir);
18
+ }
19
+ return flattenConfig(result.children).filter((e) => e.type === RouteType.FUNCTION);
20
+ }
21
+ exports.readLambdaConfig = readLambdaConfig;
22
+ function flattenConfig(config) {
23
+ const arr = [];
24
+ for (const child of Object.entries(config)) {
25
+ const newVal = { ...child[1] };
26
+ newVal.children = undefined;
27
+ arr.push(newVal);
28
+ if (child[1].children) {
29
+ arr.push(...flattenConfig(child[1].children));
30
+ }
31
+ }
32
+ return arr;
33
+ }
34
+ function posixPath(pathstring) {
35
+ return pathstring.split(path_1.sep).join(path_1.posix.sep);
36
+ }
37
+ function removeExtension(path) {
38
+ return path.replace(/\.[^/.]+$/, '');
39
+ }
40
+ function makePath(configRoot, dir) {
41
+ const path = removeExtension(posixPath((0, path_1.relative)(configRoot, dir)));
42
+ if (path === '$index') {
43
+ return '/';
44
+ }
45
+ if (path.indexOf('$index') !== -1) {
46
+ let newPath = path.replace('$index', '');
47
+ // API Gateway does not accept routes like /myroute/
48
+ newPath = newPath.slice(0, newPath.length - 1);
49
+ return `/${newPath}`;
50
+ }
51
+ if (path === '$default') {
52
+ return '$default';
53
+ }
54
+ return `/${path}`;
55
+ }
56
+ function makeRoute(configRoot, dir) {
57
+ const route = makePath(configRoot, dir);
58
+ if (route === '$default') {
59
+ return '$default';
60
+ }
61
+ return `ANY ${route}`;
62
+ }
63
+ function readLambdaConfigImpl(configRoot, dir) {
64
+ const root = dir;
65
+ const rootRoute = makeRoute(configRoot, dir);
66
+ const configItem = {
67
+ name: root,
68
+ type: RouteType.DIR,
69
+ absoluteFilePath: dir,
70
+ path: makePath(configRoot, dir),
71
+ relativeFilePath: (0, path_1.relative)(configRoot, dir),
72
+ route: rootRoute,
73
+ };
74
+ const dirHandle = fs_1.default.opendirSync(dir);
75
+ let dirEntry;
76
+ while ((dirEntry = dirHandle.readSync()) !== null) {
77
+ if (!configItem.children) {
78
+ configItem.children = {};
79
+ }
80
+ const name = dirEntry.name;
81
+ const fullPath = (0, path_1.resolve)(root, name);
82
+ if (dirEntry.isDirectory()) {
83
+ configItem.children[name] = readLambdaConfigImpl(configRoot, fullPath);
84
+ }
85
+ else if (dirEntry.isFile()) {
86
+ const route = makeRoute(configRoot, fullPath);
87
+ configItem.children[name] = {
88
+ name: removeExtension(name),
89
+ type: RouteType.FUNCTION,
90
+ path: makePath(configRoot, fullPath),
91
+ absoluteFilePath: fullPath,
92
+ relativeFilePath: (0, path_1.relative)(configRoot, fullPath),
93
+ route: route,
94
+ };
95
+ }
96
+ else {
97
+ continue;
98
+ }
99
+ }
100
+ dirHandle.closeSync();
101
+ return configItem;
102
+ }
103
103
  //# sourceMappingURL=collectLambdasFromFiles.js.map
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=collectLambdasFromFiles.spec.d.ts.map
@@ -1,26 +1,26 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const assert_1 = __importDefault(require("assert"));
7
- const collectLambdasFromFiles_1 = require("./collectLambdasFromFiles");
8
- describe('Lambda utils', () => {
9
- const routes = (0, collectLambdasFromFiles_1.readLambdaConfig)('./testData/routes');
10
- it('Should obtain config from files', async () => {
11
- var _a, _b;
12
- (0, assert_1.default)(!!routes.find((e) => e.route === '$default'));
13
- (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /bird/abilities'));
14
- (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /'));
15
- (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /bird'));
16
- (0, assert_1.default)(((_a = routes.find((e) => e.route === 'ANY /bird')) === null || _a === void 0 ? void 0 : _a.relativeFilePath) ===
17
- 'bird.ts');
18
- (0, assert_1.default)(((_b = routes.find((e) => e.route === 'ANY /bird')) === null || _b === void 0 ? void 0 : _b.name) === 'bird');
19
- });
20
- it('Should be able to handle index files', async () => {
21
- // console.log(JSON.stringify(routes, null, 2));
22
- const indexRoute = routes.find((e) => e.route === 'ANY /dog');
23
- (0, assert_1.default)(indexRoute !== undefined);
24
- });
25
- });
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const collectLambdasFromFiles_1 = require("./collectLambdasFromFiles");
8
+ describe('Lambda utils', () => {
9
+ const routes = (0, collectLambdasFromFiles_1.readLambdaConfig)('./testData/routes');
10
+ it('Should obtain config from files', async () => {
11
+ var _a, _b;
12
+ (0, assert_1.default)(!!routes.find((e) => e.route === '$default'));
13
+ (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /bird/abilities'));
14
+ (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /'));
15
+ (0, assert_1.default)(!!routes.find((e) => e.route === 'ANY /bird'));
16
+ (0, assert_1.default)(((_a = routes.find((e) => e.route === 'ANY /bird')) === null || _a === void 0 ? void 0 : _a.relativeFilePath) ===
17
+ 'bird.ts');
18
+ (0, assert_1.default)(((_b = routes.find((e) => e.route === 'ANY /bird')) === null || _b === void 0 ? void 0 : _b.name) === 'bird');
19
+ });
20
+ it('Should be able to handle index files', async () => {
21
+ // console.log(JSON.stringify(routes, null, 2));
22
+ const indexRoute = routes.find((e) => e.route === 'ANY /dog');
23
+ (0, assert_1.default)(indexRoute !== undefined);
24
+ });
25
+ });
26
26
  //# sourceMappingURL=collectLambdasFromFiles.spec.js.map
@@ -1,6 +1,6 @@
1
- import { LambdaConfig } from './collectLambdasFromFiles';
2
- /**
3
- * Generates a valid function name for a route
4
- */
5
- export declare const generateFunctionName: (prefix: string | undefined, config: LambdaConfig) => string;
1
+ import { LambdaConfig } from './collectLambdasFromFiles';
2
+ /**
3
+ * Generates a valid function name for a route
4
+ */
5
+ export declare const generateFunctionName: (prefix: string | undefined, config: LambdaConfig) => string;
6
6
  //# sourceMappingURL=generateFunctionName.d.ts.map
@@ -1,42 +1,42 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateFunctionName = void 0;
4
- const santiseFunctionName = (input) => {
5
- return input
6
- .replace(/\//g, '-')
7
- .replace(/\$/g, '_')
8
- .replace(/\{/g, '_')
9
- .replace(/\}/g, '_')
10
- .replace(/\+/g, '_')
11
- .replace(/[^\w\-_]/gi, '_');
12
- };
13
- /**
14
- * Generates a valid function name for a route
15
- */
16
- const generateFunctionName = (prefix, config) => {
17
- let name = config.name;
18
- if (name === '$default') {
19
- // '$' is not a valid character in a lambda function name
20
- name = 'default_gateway_lambda_2281';
21
- }
22
- if (name === '$index') {
23
- name = 'index_root_lambda_4423';
24
- }
25
- name = santiseFunctionName(name);
26
- let pathPrefix = '';
27
- const segments = config.path.split('/');
28
- if (segments.length === 2 && name === 'index_root_lambda_4423') {
29
- pathPrefix = `${segments[1]}-`;
30
- }
31
- if (segments.length > 2) {
32
- segments.shift(); // remove first element since path starts with '/' and thus the first element is always ''
33
- segments.pop(); // remove the last element since that is the name of the function in the route
34
- pathPrefix = santiseFunctionName(segments.join('-'));
35
- pathPrefix = `${pathPrefix}-`;
36
- }
37
- name = `${pathPrefix}${name}`;
38
- name = (`${prefix}-` || '') + name;
39
- return name;
40
- };
41
- exports.generateFunctionName = generateFunctionName;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateFunctionName = void 0;
4
+ const santiseFunctionName = (input) => {
5
+ return input
6
+ .replace(/\//g, '-')
7
+ .replace(/\$/g, '_')
8
+ .replace(/\{/g, '_')
9
+ .replace(/\}/g, '_')
10
+ .replace(/\+/g, '_')
11
+ .replace(/[^\w\-_]/gi, '_');
12
+ };
13
+ /**
14
+ * Generates a valid function name for a route
15
+ */
16
+ const generateFunctionName = (prefix, config) => {
17
+ let name = config.name;
18
+ if (name === '$default') {
19
+ // '$' is not a valid character in a lambda function name
20
+ name = 'default_gateway_lambda_2281';
21
+ }
22
+ if (name === '$index') {
23
+ name = 'index_root_lambda_4423';
24
+ }
25
+ name = santiseFunctionName(name);
26
+ let pathPrefix = '';
27
+ const segments = config.path.split('/');
28
+ if (segments.length === 2 && name === 'index_root_lambda_4423') {
29
+ pathPrefix = `${segments[1]}-`;
30
+ }
31
+ if (segments.length > 2) {
32
+ segments.shift(); // remove first element since path starts with '/' and thus the first element is always ''
33
+ segments.pop(); // remove the last element since that is the name of the function in the route
34
+ pathPrefix = santiseFunctionName(segments.join('-'));
35
+ pathPrefix = `${pathPrefix}-`;
36
+ }
37
+ name = `${pathPrefix}${name}`;
38
+ name = (`${prefix}-` || '') + name;
39
+ return name;
40
+ };
41
+ exports.generateFunctionName = generateFunctionName;
42
42
  //# sourceMappingURL=generateFunctionName.js.map
@@ -1,13 +1,13 @@
1
- export { readLambdaConfig } from './generate/collectLambdasFromFiles';
2
- export { generateFunctionName } from './generate/generateFunctionName';
3
- export type { LambdaConfig } from './generate/collectLambdasFromFiles';
4
- import AWS from 'aws-sdk';
5
- export interface DeployFunctionParams {
6
- lambdaPackageDir: string;
7
- targetArchiveName?: string;
8
- awsCredentials: AWS.Credentials;
9
- region: string;
10
- functionName: string;
11
- }
12
- export declare const deployFunction: (params: DeployFunctionParams) => Promise<any>;
1
+ export { readLambdaConfig } from './generate/collectLambdasFromFiles';
2
+ export { generateFunctionName } from './generate/generateFunctionName';
3
+ export type { LambdaConfig } from './generate/collectLambdasFromFiles';
4
+ import AWS from 'aws-sdk';
5
+ export interface DeployFunctionParams {
6
+ lambdaPackageDir: string;
7
+ targetArchiveName?: string;
8
+ awsCredentials: AWS.Credentials;
9
+ region: string;
10
+ functionName: string;
11
+ }
12
+ export declare const deployFunction: (params: DeployFunctionParams) => Promise<any>;
13
13
  //# sourceMappingURL=utilsAwsLambda.d.ts.map
@@ -1,51 +1,51 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deployFunction = exports.generateFunctionName = exports.readLambdaConfig = void 0;
4
- const utils_aws_cli_1 = require("@goldstack/utils-aws-cli");
5
- const utils_sh_1 = require("@goldstack/utils-sh");
6
- var collectLambdasFromFiles_1 = require("./generate/collectLambdasFromFiles");
7
- Object.defineProperty(exports, "readLambdaConfig", { enumerable: true, get: function () { return collectLambdasFromFiles_1.readLambdaConfig; } });
8
- var generateFunctionName_1 = require("./generate/generateFunctionName");
9
- Object.defineProperty(exports, "generateFunctionName", { enumerable: true, get: function () { return generateFunctionName_1.generateFunctionName; } });
10
- const deployFunction = async (params) => {
11
- const targetArchive = params.targetArchiveName || `lambda-${new Date().getTime()}.zip`;
12
- await (0, utils_sh_1.rmSafe)(targetArchive);
13
- await (0, utils_sh_1.zip)({
14
- directory: params.lambdaPackageDir,
15
- target: targetArchive,
16
- mode: 511,
17
- });
18
- const deployResult = await (0, utils_aws_cli_1.awsCli)({
19
- credentials: params.awsCredentials,
20
- region: params.region,
21
- options: {
22
- silent: true,
23
- },
24
- command: `lambda update-function-code --function-name ${params.functionName} --zip-file fileb://${targetArchive}`,
25
- });
26
- if (!params.targetArchiveName) {
27
- await (0, utils_sh_1.rmSafe)(targetArchive);
28
- }
29
- // wait until lambda becomes active
30
- let counter = 0;
31
- let state = '';
32
- while (counter < 20 && state !== 'Active') {
33
- const res = await (0, utils_aws_cli_1.awsCli)({
34
- credentials: params.awsCredentials,
35
- region: params.region,
36
- options: {
37
- silent: true,
38
- },
39
- command: `lambda get-function --function-name ${params.functionName}`,
40
- });
41
- const data = JSON.parse(res);
42
- state = data.Configuration.State;
43
- counter++;
44
- }
45
- if (counter >= 20) {
46
- throw new Error(`Function was still in state '${state}' after deployment`);
47
- }
48
- return JSON.parse(deployResult);
49
- };
50
- exports.deployFunction = deployFunction;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deployFunction = exports.generateFunctionName = exports.readLambdaConfig = void 0;
4
+ const utils_aws_cli_1 = require("@goldstack/utils-aws-cli");
5
+ const utils_sh_1 = require("@goldstack/utils-sh");
6
+ var collectLambdasFromFiles_1 = require("./generate/collectLambdasFromFiles");
7
+ Object.defineProperty(exports, "readLambdaConfig", { enumerable: true, get: function () { return collectLambdasFromFiles_1.readLambdaConfig; } });
8
+ var generateFunctionName_1 = require("./generate/generateFunctionName");
9
+ Object.defineProperty(exports, "generateFunctionName", { enumerable: true, get: function () { return generateFunctionName_1.generateFunctionName; } });
10
+ const deployFunction = async (params) => {
11
+ const targetArchive = params.targetArchiveName || `lambda-${new Date().getTime()}.zip`;
12
+ await (0, utils_sh_1.rmSafe)(targetArchive);
13
+ await (0, utils_sh_1.zip)({
14
+ directory: params.lambdaPackageDir,
15
+ target: targetArchive,
16
+ mode: 511,
17
+ });
18
+ const deployResult = await (0, utils_aws_cli_1.awsCli)({
19
+ credentials: params.awsCredentials,
20
+ region: params.region,
21
+ options: {
22
+ silent: true,
23
+ },
24
+ command: `lambda update-function-code --function-name ${params.functionName} --zip-file fileb://${targetArchive}`,
25
+ });
26
+ if (!params.targetArchiveName) {
27
+ await (0, utils_sh_1.rmSafe)(targetArchive);
28
+ }
29
+ // wait until lambda becomes active
30
+ let counter = 0;
31
+ let state = '';
32
+ while (counter < 20 && state !== 'Active') {
33
+ const res = await (0, utils_aws_cli_1.awsCli)({
34
+ credentials: params.awsCredentials,
35
+ region: params.region,
36
+ options: {
37
+ silent: true,
38
+ },
39
+ command: `lambda get-function --function-name ${params.functionName}`,
40
+ });
41
+ const data = JSON.parse(res);
42
+ state = data.Configuration.State;
43
+ counter++;
44
+ }
45
+ if (counter >= 20) {
46
+ throw new Error(`Function was still in state '${state}' after deployment`);
47
+ }
48
+ return JSON.parse(deployResult);
49
+ };
50
+ exports.deployFunction = deployFunction;
51
51
  //# sourceMappingURL=utilsAwsLambda.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goldstack/utils-aws-lambda",
3
- "version": "0.1.4",
3
+ "version": "0.1.8",
4
4
  "description": "Utilities for deploying AWS Lambda functions",
5
5
  "keywords": [
6
6
  "goldstack",
@@ -42,7 +42,7 @@
42
42
  "version:apply:force": "yarn version $@ && yarn version apply"
43
43
  },
44
44
  "dependencies": {
45
- "@goldstack/utils-aws-cli": "0.3.35",
45
+ "@goldstack/utils-aws-cli": "0.3.37",
46
46
  "@goldstack/utils-log": "0.2.9",
47
47
  "@goldstack/utils-sh": "0.4.22",
48
48
  "aws-sdk": "2.1001.0"