@cloud-copilot/iam-expand 0.1.0

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.
Files changed (84) hide show
  1. package/LICENSE.txt +674 -0
  2. package/README.md +269 -0
  3. package/dist/cjs/cli.d.ts +3 -0
  4. package/dist/cjs/cli.d.ts.map +1 -0
  5. package/dist/cjs/cli.js +76 -0
  6. package/dist/cjs/cli.js.map +1 -0
  7. package/dist/cjs/cli_utils.d.ts +27 -0
  8. package/dist/cjs/cli_utils.d.ts.map +1 -0
  9. package/dist/cjs/cli_utils.js +69 -0
  10. package/dist/cjs/cli_utils.js.map +1 -0
  11. package/dist/cjs/expand.d.ts +69 -0
  12. package/dist/cjs/expand.d.ts.map +1 -0
  13. package/dist/cjs/expand.js +118 -0
  14. package/dist/cjs/expand.js.map +1 -0
  15. package/dist/cjs/index.d.ts +2 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +18 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/package.json +3 -0
  20. package/dist/cjs/stdin.d.ts +7 -0
  21. package/dist/cjs/stdin.d.ts.map +1 -0
  22. package/dist/cjs/stdin.js +34 -0
  23. package/dist/cjs/stdin.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +67 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/cli_utils.d.ts +27 -0
  29. package/dist/cli_utils.d.ts.map +1 -0
  30. package/dist/cli_utils.js +57 -0
  31. package/dist/cli_utils.js.map +1 -0
  32. package/dist/cli_utils.test.d.ts +2 -0
  33. package/dist/cli_utils.test.d.ts.map +1 -0
  34. package/dist/cli_utils.test.js +90 -0
  35. package/dist/cli_utils.test.js.map +1 -0
  36. package/dist/esm/cli.d.ts +3 -0
  37. package/dist/esm/cli.d.ts.map +1 -0
  38. package/dist/esm/cli.js +74 -0
  39. package/dist/esm/cli.js.map +1 -0
  40. package/dist/esm/cli_utils.d.ts +27 -0
  41. package/dist/esm/cli_utils.d.ts.map +1 -0
  42. package/dist/esm/cli_utils.js +63 -0
  43. package/dist/esm/cli_utils.js.map +1 -0
  44. package/dist/esm/expand.d.ts +69 -0
  45. package/dist/esm/expand.d.ts.map +1 -0
  46. package/dist/esm/expand.js +114 -0
  47. package/dist/esm/expand.js.map +1 -0
  48. package/dist/esm/index.d.ts +2 -0
  49. package/dist/esm/index.d.ts.map +1 -0
  50. package/dist/esm/index.js +2 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/package.json +3 -0
  53. package/dist/esm/stdin.d.ts +7 -0
  54. package/dist/esm/stdin.d.ts.map +1 -0
  55. package/dist/esm/stdin.js +31 -0
  56. package/dist/esm/stdin.js.map +1 -0
  57. package/dist/expand.d.ts +55 -0
  58. package/dist/expand.d.ts.map +1 -0
  59. package/dist/expand.js +94 -0
  60. package/dist/expand.js.map +1 -0
  61. package/dist/expand.test.d.ts +2 -0
  62. package/dist/expand.test.d.ts.map +1 -0
  63. package/dist/expand.test.js +382 -0
  64. package/dist/expand.test.js.map +1 -0
  65. package/dist/index.d.ts +2 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +18 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/stdin.d.ts +7 -0
  70. package/dist/stdin.d.ts.map +1 -0
  71. package/dist/stdin.js +35 -0
  72. package/dist/stdin.js.map +1 -0
  73. package/package.json +33 -0
  74. package/postbuild.sh +13 -0
  75. package/src/cli.ts +82 -0
  76. package/src/cli_utils.test.ts +131 -0
  77. package/src/cli_utils.ts +78 -0
  78. package/src/expand.test.ts +523 -0
  79. package/src/expand.ts +185 -0
  80. package/src/index.ts +1 -0
  81. package/src/stdin.ts +34 -0
  82. package/tsconfig.cjs.json +11 -0
  83. package/tsconfig.esm.json +14 -0
  84. package/tsconfig.json +22 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./expand.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Read from stdin until the stream ends, timeout, or an error occurs
3
+ *
4
+ * @returns the string input from stdin
5
+ */
6
+ export declare function readStdin(readWait: number | undefined): Promise<string>;
7
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/stdin.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B7E"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readStdin = readStdin;
4
+ const process_1 = require("process");
5
+ /**
6
+ * Read from stdin until the stream ends, timeout, or an error occurs
7
+ *
8
+ * @returns the string input from stdin
9
+ */
10
+ async function readStdin(readWait) {
11
+ return new Promise((resolve, reject) => {
12
+ // If the input is not a TTY, we are most likely receiving data from a pipe.
13
+ const definitelyReceivingData = !process.stdin.isTTY;
14
+ if (!readWait || readWait <= 0) {
15
+ readWait = definitelyReceivingData ? 10_000 : 20;
16
+ }
17
+ let data = '';
18
+ setTimeout(() => {
19
+ if (data.length === 0) {
20
+ resolve(data);
21
+ }
22
+ }, readWait);
23
+ process_1.stdin.on('data', (chunk) => {
24
+ data += chunk;
25
+ });
26
+ process_1.stdin.on('end', () => {
27
+ resolve(data);
28
+ });
29
+ process_1.stdin.on('error', (err) => {
30
+ reject(err);
31
+ });
32
+ });
33
+ }
34
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/stdin.ts"],"names":[],"mappings":";;AAMA,8BA2BC;AAjCD,qCAAgC;AAChC;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAAC,QAA4B;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,4EAA4E;QAC5E,MAAM,uBAAuB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAA;QACpD,IAAG,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;QAClD,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,UAAU,CAAC,GAAG,EAAE;YACd,IAAG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,CAAA;YACf,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAA;QAEZ,eAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,eAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,eAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const iam_data_1 = require("@cloud-copilot/iam-data");
5
+ const cli_utils_1 = require("./cli_utils");
6
+ const expand_1 = require("./expand");
7
+ function expandAndPrint(actionStrings, options) {
8
+ try {
9
+ const result = (0, expand_1.expandIamActions)(actionStrings, options);
10
+ for (const action of result) {
11
+ console.log(action);
12
+ }
13
+ }
14
+ catch (e) {
15
+ console.error(e.message);
16
+ process.exit(1);
17
+ }
18
+ }
19
+ function printUsage() {
20
+ console.log('No arguments provided');
21
+ console.log('Usage:');
22
+ console.log(' expand-iam-actions [options] [action1] [action2] ...');
23
+ console.log(' <input from stdout> | expand-iam-actions');
24
+ console.log('Action Expanding Options:');
25
+ console.log(' --distinct: Remove duplicate actions');
26
+ console.log(' --sort: Sort the actions');
27
+ console.log(' --expand-asterik: Expand the * action to all actions');
28
+ console.log(' --expand-service-asterik: Expand service:* to all actions for that service');
29
+ console.log(' --error-on-missing-service: Throw an error if a service is not found');
30
+ console.log(' --error-on-invalid-format: Throw an error if the action string is not in the correct format');
31
+ console.log('CLI Behavior Options:');
32
+ console.log(' --show-data-version: Print the version of the iam-data package being used and exit');
33
+ console.log(' --input-wait-time: Millisenconds to wait for input from stdin before timing out. Example: --input-wait-time=10_000');
34
+ process.exit(1);
35
+ }
36
+ const args = process.argv.slice(2); // Ignore the first two elements
37
+ const actionStrings = [];
38
+ const optionStrings = [];
39
+ for (const arg of args) {
40
+ if (arg.startsWith('--')) {
41
+ optionStrings.push(arg);
42
+ }
43
+ else {
44
+ actionStrings.push(arg);
45
+ }
46
+ }
47
+ async function run() {
48
+ const options = (0, cli_utils_1.convertOptions)(optionStrings);
49
+ if (options.showDataVersion) {
50
+ console.log(`@cloud-copilot/iam-data version: ${(0, iam_data_1.getVersion)()}`);
51
+ return;
52
+ }
53
+ if (actionStrings.length === 0) {
54
+ const otherActions = await (0, cli_utils_1.parseStdInActions)();
55
+ actionStrings.push(...otherActions);
56
+ }
57
+ if (actionStrings.length > 0) {
58
+ expandAndPrint(actionStrings, options);
59
+ return;
60
+ }
61
+ printUsage();
62
+ }
63
+ run().catch((e) => {
64
+ console.error(e);
65
+ process.exit(1);
66
+ }).then(() => process.exit(0)).finally(() => { });
67
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ExpandIamActionsOptions } from "./expand";
2
+ interface CliOptions extends ExpandIamActionsOptions {
3
+ showDataVersion: boolean;
4
+ waitTime: string;
5
+ }
6
+ /**
7
+ * Convert a dash-case string to camelCase
8
+ * @param str the string to convert
9
+ * @returns the camelCase string
10
+ */
11
+ export declare function dashToCamelCase(str: string): string;
12
+ /**
13
+ * Convert an array of option strings to an object
14
+ *
15
+ * @param optionArgs the array of option strings to convert
16
+ * @returns the object representation of the options
17
+ */
18
+ export declare function convertOptions(optionArgs: string[]): Partial<CliOptions>;
19
+ export declare function extractActionsFromLineOfInput(line: string): string[];
20
+ /**
21
+ * Parse the actions from stdin
22
+ *
23
+ * @returns an array of strings from stdin
24
+ */
25
+ export declare function parseStdInActions(): Promise<string[]>;
26
+ export {};
27
+ //# sourceMappingURL=cli_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAGnD,UAAU,UAAW,SAAQ,uBAAuB;IAClD,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAexE;AAGD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAS3D"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dashToCamelCase = dashToCamelCase;
4
+ exports.convertOptions = convertOptions;
5
+ exports.extractActionsFromLineOfInput = extractActionsFromLineOfInput;
6
+ exports.parseStdInActions = parseStdInActions;
7
+ const stdin_1 = require("./stdin");
8
+ /**
9
+ * Convert a dash-case string to camelCase
10
+ * @param str the string to convert
11
+ * @returns the camelCase string
12
+ */
13
+ function dashToCamelCase(str) {
14
+ str = str.substring(2);
15
+ return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
16
+ }
17
+ /**
18
+ * Convert an array of option strings to an object
19
+ *
20
+ * @param optionArgs the array of option strings to convert
21
+ * @returns the object representation of the options
22
+ */
23
+ function convertOptions(optionArgs) {
24
+ // const options: Record<string, string | boolean> = {} ;
25
+ // for(const option of optionArgs) {
26
+ // let key: string = option
27
+ // let value: boolean | string = false
28
+ // console.log(key, value)
29
+ // if(option.includes('=')) {
30
+ // [key,value] = option.split('=')
31
+ // }
32
+ // options[dashToCamelCase(key)] = value
33
+ // }
34
+ return {};
35
+ }
36
+ const actionPattern = /\:?([a-zA-Z0-9]+:[a-zA-Z0-9*]+)/g;
37
+ function extractActionsFromLineOfInput(line) {
38
+ const matches = line.matchAll(actionPattern);
39
+ return Array.from(matches)
40
+ .filter((match) => !match[0].startsWith('arn:') && !match[0].startsWith(':'))
41
+ .map((match) => match[1]);
42
+ }
43
+ /**
44
+ * Parse the actions from stdin
45
+ *
46
+ * @returns an array of strings from stdin
47
+ */
48
+ async function parseStdInActions() {
49
+ const data = await (0, stdin_1.readStdin)(undefined);
50
+ if (data.length === 0) {
51
+ return [];
52
+ }
53
+ const lines = data.split('\n');
54
+ const actions = lines.flatMap(line => extractActionsFromLineOfInput(line));
55
+ return actions;
56
+ }
57
+ //# sourceMappingURL=cli_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.js","sourceRoot":"","sources":["../src/cli_utils.ts"],"names":[],"mappings":";;AAcA,0CAGC;AAQD,wCAeC;AAGD,sEAMC;AAOD,8CASC;AA/DD,mCAAoC;AAOpC;;;;GAIG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACtB,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,UAAoB;IACjD,yDAAyD;IAEzD,oCAAoC;IACpC,6BAA6B;IAC7B,wCAAwC;IACxC,4BAA4B;IAC5B,+BAA+B;IAC/B,sCAAsC;IACtC,MAAM;IAEN,0CAA0C;IAC1C,IAAI;IAEJ,OAAO,EAAS,CAAA;AAClB,CAAC;AAED,MAAM,aAAa,GAAG,kCAAkC,CAAC;AACzD,SAAgB,6BAA6B,CAAC,IAAY;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAE5C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;SACb,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,iBAAiB;IACrC,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAA;IACvC,IAAG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1E,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli_utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.test.d.ts","sourceRoot":"","sources":["../src/cli_utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const stdin_1 = require("./stdin");
4
+ jest.mock('./stdin');
5
+ const mockReadStdin = stdin_1.readStdin;
6
+ const cli_utils_1 = require("./cli_utils");
7
+ beforeEach(() => {
8
+ jest.resetAllMocks();
9
+ });
10
+ const extractScenarios = [
11
+ { input: ' s3:Get* ', expected: ['s3:Get*'] },
12
+ { input: ' s3:Get* s3:Put* ', expected: ['s3:Get*', 's3:Put*'] },
13
+ { input: ' "s3:Get*", "s3:Put*"', expected: ['s3:Get*', 's3:Put*'] },
14
+ { input: ' `s3:Get*`, `s3:Put*`', expected: ['s3:Get*', 's3:Put*'] },
15
+ { input: ` 's3:Get*', 's3:Put*'`, expected: ['s3:Get*', 's3:Put*'] },
16
+ { input: `s3:Get*, s3:Put*`, expected: ['s3:Get*', 's3:Put*'] },
17
+ { input: "s3:Put*", expected: ['s3:Put*'] },
18
+ { input: ":s3:Put*", expected: [] },
19
+ { input: 'arn:aws:apigateway:*::/apis', expected: [] },
20
+ { input: 'hamburger', expected: [] },
21
+ ];
22
+ const dashToCamelCaseScenarios = [
23
+ { input: "--distinct", expected: "distinct" },
24
+ { input: "--sort", expected: "sort" },
25
+ { input: "--expand-asterik", expected: "expandAsterik" },
26
+ { input: "--expand-service-asterik", expected: "expandServiceAsterik" },
27
+ { input: "--error-on-missing-service", expected: "errorOnMissingService" },
28
+ { input: "--error-on-invalid-format", expected: "errorOnInvalidFormat" },
29
+ { input: "--show-data-version", expected: "showDataVersion" },
30
+ ];
31
+ describe('cli_utils', () => {
32
+ describe('extractActionsFromLineOfInput', () => {
33
+ extractScenarios.forEach((scenario, index) => {
34
+ it(`should return for scenario ${index}: ${scenario.input} `, () => {
35
+ // Given the input
36
+ const input = scenario.input;
37
+ // When the actions are extracted
38
+ const result = (0, cli_utils_1.extractActionsFromLineOfInput)(input);
39
+ // Then I should get the expected result
40
+ expect(result).toEqual(scenario.expected);
41
+ });
42
+ });
43
+ });
44
+ describe('dashToCamelCase', () => {
45
+ dashToCamelCaseScenarios.forEach((scenario, index) => {
46
+ it(`should return for scenario ${index}: ${scenario.input} `, () => {
47
+ // Given the input
48
+ const input = scenario.input;
49
+ // When the input is converted
50
+ const result = (0, cli_utils_1.dashToCamelCase)(input);
51
+ // Then I should get the expected result
52
+ expect(result).toEqual(scenario.expected);
53
+ });
54
+ });
55
+ });
56
+ describe('convertOptions', () => {
57
+ it.only('should convert the options to keys on an object', () => {
58
+ // Given options as an array of strings
59
+ const optionArgs = ['--distinct', '--sort', '--something-cool', '--key-with-value=10'];
60
+ // When the options are converted
61
+ const result = (0, cli_utils_1.convertOptions)(optionArgs);
62
+ // Then each option should be a key on the object
63
+ expect(result).toEqual({
64
+ distinct: true,
65
+ sort: true,
66
+ somethingCool: true,
67
+ keyWithValue: "10",
68
+ });
69
+ });
70
+ });
71
+ describe('parseStdInActions', () => {
72
+ it('should return an empty array if no data is provided', async () => {
73
+ // Given no data is provided
74
+ mockReadStdin.mockResolvedValue('');
75
+ // When the actions are parsed
76
+ const result = await (0, cli_utils_1.parseStdInActions)();
77
+ // Then I should get an empty array
78
+ expect(result).toEqual([]);
79
+ });
80
+ it('should return an array of actions from the data', async () => {
81
+ // Given there is data with actions in multiple lines
82
+ mockReadStdin.mockResolvedValue('s3:GetObject\ns3:PutObject\ns3:DeleteObject\n');
83
+ // When the actions are parsed
84
+ const result = await (0, cli_utils_1.parseStdInActions)();
85
+ // Then I should get the expected actions
86
+ expect(result).toEqual(['s3:GetObject', 's3:PutObject', 's3:DeleteObject']);
87
+ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=cli_utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.test.js","sourceRoot":"","sources":["../src/cli_utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import { iamDataVersion } from "@cloud-copilot/iam-data";
3
+ import { convertOptions, parseStdInActions } from "./cli_utils.js";
4
+ import { expandIamActions } from "./expand.js";
5
+ const commandName = 'iam-expand';
6
+ function expandAndPrint(actionStrings, options) {
7
+ try {
8
+ const result = expandIamActions(actionStrings, options);
9
+ for (const action of result) {
10
+ console.log(action);
11
+ }
12
+ }
13
+ catch (e) {
14
+ console.error(e.message);
15
+ process.exit(1);
16
+ }
17
+ }
18
+ function printUsage() {
19
+ console.log('No arguments provided or input from stdin.');
20
+ console.log('Usage:');
21
+ console.log(` ${commandName} [options] [action1] [action2] ...`);
22
+ console.log(` <input from stdout> | ${commandName} [options]`);
23
+ console.log('Action Expanding Options:');
24
+ console.log(' --distinct: Remove duplicate actions');
25
+ console.log(' --sort: Sort the actions');
26
+ console.log(' --expand-asterik: Expand the * action to all actions');
27
+ console.log(' --expand-service-asterik: Expand service:* to all actions for that service');
28
+ console.log(' --error-on-missing-service: Throw an error if a service is not found');
29
+ console.log(' --error-on-invalid-format: Throw an error if the action string is not in the correct format');
30
+ console.log(' --invalid-action-behavior: What to do when an invalid action is encountered:');
31
+ console.log(' --invalid-action-behavior=remove: Remove the invalid action');
32
+ console.log(' --invalid-action-behavior=include: Include the invalid action');
33
+ console.log(' --invalid-action-behavior=error: Throw an error if an invalid action is encountered');
34
+ console.log('CLI Behavior Options:');
35
+ console.log(' --show-data-version: Print the version of the iam-data package being used and exit');
36
+ console.log(' --read-wait-time: Millisenconds to wait for input from stdin before timing out.');
37
+ console.log(' Example: --read-wait-time=10_000');
38
+ process.exit(1);
39
+ }
40
+ const args = process.argv.slice(2); // Ignore the first two elements
41
+ const actionStrings = [];
42
+ const optionStrings = [];
43
+ for (const arg of args) {
44
+ if (arg.startsWith('--')) {
45
+ optionStrings.push(arg);
46
+ }
47
+ else {
48
+ actionStrings.push(arg);
49
+ }
50
+ }
51
+ async function run() {
52
+ const options = convertOptions(optionStrings);
53
+ if (options.showDataVersion) {
54
+ console.log(`@cloud-copilot/iam-data version: ${iamDataVersion()}`);
55
+ return;
56
+ }
57
+ if (actionStrings.length === 0) {
58
+ const otherActions = await parseStdInActions(options);
59
+ if (otherActions.length > 0 && options.expandAsterik) {
60
+ console.warn('Notice: --expand-asterik is not supported when reading from stdin, ignoring.');
61
+ }
62
+ actionStrings.push(...otherActions);
63
+ }
64
+ if (actionStrings.length > 0) {
65
+ expandAndPrint(actionStrings, options);
66
+ return;
67
+ }
68
+ printUsage();
69
+ }
70
+ run().catch((e) => {
71
+ console.error(e);
72
+ process.exit(1);
73
+ }).then(() => process.exit(0)).finally(() => { });
74
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ExpandIamActionsOptions } from "./expand.js";
2
+ interface CliOptions extends ExpandIamActionsOptions {
3
+ showDataVersion: boolean;
4
+ readWaitTime: string;
5
+ }
6
+ /**
7
+ * Convert a dash-case string to camelCase
8
+ * @param str the string to convert
9
+ * @returns the camelCase string
10
+ */
11
+ export declare function dashToCamelCase(str: string): string;
12
+ /**
13
+ * Convert an array of option strings to an object
14
+ *
15
+ * @param optionArgs the array of option strings to convert
16
+ * @returns the object representation of the options
17
+ */
18
+ export declare function convertOptions(optionArgs: string[]): Partial<CliOptions>;
19
+ export declare function extractActionsFromLineOfInput(line: string): string[];
20
+ /**
21
+ * Parse the actions from stdin
22
+ *
23
+ * @returns an array of strings from stdin
24
+ */
25
+ export declare function parseStdInActions(options: Partial<CliOptions>): Promise<string[]>;
26
+ export {};
27
+ //# sourceMappingURL=cli_utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.d.ts","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,aAAa,CAAC;AAG7E,UAAU,UAAW,SAAQ,uBAAuB;IAClD,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBxE;AAGD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWvF"}
@@ -0,0 +1,63 @@
1
+ import { InvalidActionBehavior } from "./expand.js";
2
+ import { readStdin } from "./stdin.js";
3
+ /**
4
+ * Convert a dash-case string to camelCase
5
+ * @param str the string to convert
6
+ * @returns the camelCase string
7
+ */
8
+ export function dashToCamelCase(str) {
9
+ str = str.substring(2);
10
+ return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
11
+ }
12
+ /**
13
+ * Convert an array of option strings to an object
14
+ *
15
+ * @param optionArgs the array of option strings to convert
16
+ * @returns the object representation of the options
17
+ */
18
+ export function convertOptions(optionArgs) {
19
+ const options = {};
20
+ for (const option of optionArgs) {
21
+ let key = option;
22
+ let value = true;
23
+ if (option.includes('=')) {
24
+ [key, value] = option.split('=');
25
+ }
26
+ options[dashToCamelCase(key)] = value;
27
+ }
28
+ if (typeof (options.invalidActionBehavior) === 'string') {
29
+ const behaviorString = options.invalidActionBehavior;
30
+ const cleanedInput = behaviorString.charAt(0).toUpperCase() + behaviorString.slice(1).toLowerCase();
31
+ const behavior = InvalidActionBehavior[cleanedInput];
32
+ if (behavior) {
33
+ options.invalidActionBehavior = behavior;
34
+ }
35
+ else {
36
+ delete options['invalidActionBehavior'];
37
+ }
38
+ }
39
+ return options;
40
+ }
41
+ const actionPattern = /\:?([a-zA-Z0-9]+:[a-zA-Z0-9*]+)/g;
42
+ export function extractActionsFromLineOfInput(line) {
43
+ const matches = line.matchAll(actionPattern);
44
+ return Array.from(matches)
45
+ .filter((match) => !match[0].startsWith('arn:') && !match[0].startsWith(':'))
46
+ .map((match) => match[1]);
47
+ }
48
+ /**
49
+ * Parse the actions from stdin
50
+ *
51
+ * @returns an array of strings from stdin
52
+ */
53
+ export async function parseStdInActions(options) {
54
+ const delay = options.readWaitTime ? parseInt(options.readWaitTime.replaceAll(/\D/g, '')) : undefined;
55
+ const data = await readStdin(delay);
56
+ if (data.length === 0) {
57
+ return [];
58
+ }
59
+ const lines = data.split('\n');
60
+ const actions = lines.flatMap(line => extractActionsFromLineOfInput(line));
61
+ return actions;
62
+ }
63
+ //# sourceMappingURL=cli_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli_utils.js","sourceRoot":"","sources":["../../src/cli_utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export declare enum InvalidActionBehavior {
2
+ Remove = "Remove",
3
+ Error = "Error",
4
+ Include = "Include"
5
+ }
6
+ /**
7
+ * Options for the expand function
8
+ *
9
+ */
10
+ export interface ExpandIamActionsOptions {
11
+ /**
12
+ * If true, a single `*` will be expanded to all actions for all services
13
+ * If false, a single `*` will be returned as is
14
+ * Default: false
15
+ */
16
+ expandAsterik: boolean;
17
+ /**
18
+ * If true, `service:*` will be expanded to all actions for that service
19
+ * If false, `service:*` will be returned as is
20
+ * Default: false
21
+ */
22
+ expandServiceAsterik: boolean;
23
+ /**
24
+ * If true, an error will be thrown if the action string is not in the correct format
25
+ * If false, an empty array will be returned
26
+ * Default: false
27
+ */
28
+ errorOnInvalidFormat: boolean;
29
+ /**
30
+ * If true, an error will be thrown if the service in the action string does not exist
31
+ * If false, an empty array will be returned
32
+ * Default: false
33
+ */
34
+ errorOnMissingService: boolean;
35
+ /**
36
+ * If true, only unique values will be returned, while maintaining order
37
+ * If false, all values will be returned, even if they are duplicates
38
+ * Default: false
39
+ */
40
+ distinct: boolean;
41
+ /**
42
+ * The behavior to use when an invalid action is encountered without wildcards
43
+ * @{InvalidActionBehavior.Remove} will remove the invalid action from the output
44
+ * @{InvalidActionBehavior.Error} will throw an error if an invalid action is encountered
45
+ * @{InvalidActionBehavior.Include} will include the invalid action in the output
46
+ *
47
+ * Default: InvalidActionBehavior.Remove
48
+ */
49
+ invalidActionBehavior: InvalidActionBehavior;
50
+ /**
51
+ * If true, the returned array will be sorted
52
+ * If false, the returned array will be in the order they were expanded
53
+ * Default: false
54
+ */
55
+ sort: boolean;
56
+ }
57
+ /**
58
+ * Expands an IAM action string that contains wildcards.
59
+ * If the action string contains no wildcards, it is returned as is.
60
+ * @see {@link ExpandIamActionsOptions} for options to customize behavior
61
+ *
62
+ * If any options are set to throw an error, the function will throw an error if validation fails for a single value.
63
+ *
64
+ * @param actionStringOrStrings An IAM action or array IAM action(s) that may contain wildcards
65
+ * @param overrideOptions Options to override the default behavior
66
+ * @returns An array of expanded action strings flattend to a single array
67
+ */
68
+ export declare function expandIamActions(actionStringOrStrings: string | string[], overrideOptions?: Partial<ExpandIamActionsOptions>): string[];
69
+ //# sourceMappingURL=expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/expand.ts"],"names":[],"mappings":"AAEA,oBAAY,qBAAqB;IAC/B,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAA;IAEtB;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAA;IAE7B;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAA;IAE7B;;;;OAIG;IACH,qBAAqB,EAAE,OAAO,CAAA;IAE9B;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;IAGjB;;;;;;;OAOG;IACH,qBAAqB,EAAE,qBAAqB,CAAA;IAE5C;;;;OAIG;IACH,IAAI,EAAE,OAAO,CAAA;CACd;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,MAAM,EAAE,CA8FvI"}