@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.
- package/LICENSE.txt +674 -0
- package/README.md +269 -0
- package/dist/cjs/cli.d.ts +3 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +76 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/cli_utils.d.ts +27 -0
- package/dist/cjs/cli_utils.d.ts.map +1 -0
- package/dist/cjs/cli_utils.js +69 -0
- package/dist/cjs/cli_utils.js.map +1 -0
- package/dist/cjs/expand.d.ts +69 -0
- package/dist/cjs/expand.d.ts.map +1 -0
- package/dist/cjs/expand.js +118 -0
- package/dist/cjs/expand.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/stdin.d.ts +7 -0
- package/dist/cjs/stdin.d.ts.map +1 -0
- package/dist/cjs/stdin.js +34 -0
- package/dist/cjs/stdin.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +67 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli_utils.d.ts +27 -0
- package/dist/cli_utils.d.ts.map +1 -0
- package/dist/cli_utils.js +57 -0
- package/dist/cli_utils.js.map +1 -0
- package/dist/cli_utils.test.d.ts +2 -0
- package/dist/cli_utils.test.d.ts.map +1 -0
- package/dist/cli_utils.test.js +90 -0
- package/dist/cli_utils.test.js.map +1 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +74 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/cli_utils.d.ts +27 -0
- package/dist/esm/cli_utils.d.ts.map +1 -0
- package/dist/esm/cli_utils.js +63 -0
- package/dist/esm/cli_utils.js.map +1 -0
- package/dist/esm/expand.d.ts +69 -0
- package/dist/esm/expand.d.ts.map +1 -0
- package/dist/esm/expand.js +114 -0
- package/dist/esm/expand.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/stdin.d.ts +7 -0
- package/dist/esm/stdin.d.ts.map +1 -0
- package/dist/esm/stdin.js +31 -0
- package/dist/esm/stdin.js.map +1 -0
- package/dist/expand.d.ts +55 -0
- package/dist/expand.d.ts.map +1 -0
- package/dist/expand.js +94 -0
- package/dist/expand.js.map +1 -0
- package/dist/expand.test.d.ts +2 -0
- package/dist/expand.test.d.ts.map +1 -0
- package/dist/expand.test.js +382 -0
- package/dist/expand.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/stdin.d.ts +7 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +35 -0
- package/dist/stdin.js.map +1 -0
- package/package.json +33 -0
- package/postbuild.sh +13 -0
- package/src/cli.ts +82 -0
- package/src/cli_utils.test.ts +131 -0
- package/src/cli_utils.ts +78 -0
- package/src/expand.test.ts +523 -0
- package/src/expand.ts +185 -0
- package/src/index.ts +1 -0
- package/src/stdin.ts +34 -0
- package/tsconfig.cjs.json +11 -0
- package/tsconfig.esm.json +14 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/esm/cli.js
ADDED
|
@@ -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"}
|