@cloud-copilot/iam-convert 0.1.2 → 0.1.3
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 +1 -1
- package/dist/cjs/cli.js +2 -2
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/convert.d.ts +2 -0
- package/dist/cjs/convert.d.ts.map +1 -1
- package/dist/cjs/convert.js +3 -1
- package/dist/cjs/convert.js.map +1 -1
- package/dist/cjs/converters/cloudFormation.d.ts +28 -0
- package/dist/cjs/converters/cloudFormation.d.ts.map +1 -0
- package/dist/cjs/converters/cloudFormation.js +124 -0
- package/dist/cjs/converters/cloudFormation.js.map +1 -0
- package/dist/esm/cli.js +2 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/convert.d.ts +2 -0
- package/dist/esm/convert.d.ts.map +1 -1
- package/dist/esm/convert.js +3 -1
- package/dist/esm/convert.js.map +1 -1
- package/dist/esm/converters/cloudFormation.d.ts +28 -0
- package/dist/esm/converters/cloudFormation.d.ts.map +1 -0
- package/dist/esm/converters/cloudFormation.js +120 -0
- package/dist/esm/converters/cloudFormation.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# iam-convert: Convert JSON Policy Documents to Markdown
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@cloud-copilot/iam-convert) [](https://www.npmjs.com/package/@cloud-copilot/iam-convert) [](LICENSE.txt)
|
|
4
4
|
|
|
5
5
|
CLI and Node Library to convert JSON IAM Policy Documents to other formats for Infrastructure as Code.
|
|
6
6
|
|
package/dist/cjs/cli.js
CHANGED
|
@@ -23,7 +23,7 @@ async function run() {
|
|
|
23
23
|
description: 'The format to convert to',
|
|
24
24
|
type: 'enum',
|
|
25
25
|
values: 'single',
|
|
26
|
-
validValues: ['tf']
|
|
26
|
+
validValues: ['tf', 'cf']
|
|
27
27
|
},
|
|
28
28
|
file: {
|
|
29
29
|
description: 'A file to read the policy from. If not provided, stdin is used',
|
|
@@ -64,7 +64,7 @@ async function run() {
|
|
|
64
64
|
}
|
|
65
65
|
const policy = (0, iam_policy_1.loadPolicy)(json);
|
|
66
66
|
const format = cli.args.format || 'tf';
|
|
67
|
-
const result = (0, convert_js_1.convert)(policy,
|
|
67
|
+
const result = (0, convert_js_1.convert)(policy, format, {
|
|
68
68
|
indentBy: cli.args.indentBy,
|
|
69
69
|
lineSeparator: cli.args.lineSeparator == 'crlf' ? `\r\n` : undefined
|
|
70
70
|
});
|
package/dist/cjs/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";;;AAEA,4CAAiE;AACjE,0DAA4E;AAC5E,2BAA6C;AAC7C,6CAAsC;AACtC,4CAA6C;AAE7C,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,IAAA,uBAAiB,EAC3B,aAAa,EACb,EAAE,EACF;QACE,QAAQ,EAAE;YACR,WAAW,EACT,kFAAkF;YACpF,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;SACjB;QACD,aAAa,EAAE;YACb,WAAW,EACT,oGAAoG;YACtG,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;SAC5B;QACD,MAAM,EAAE;YACN,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/convert.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Policy } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { CloudFormationConverter } from './converters/cloudFormation.js';
|
|
2
3
|
import { TerraformConverter } from './converters/terraform.js';
|
|
3
4
|
declare const converters: {
|
|
4
5
|
/**
|
|
5
6
|
* Convert to Terraform
|
|
6
7
|
*/
|
|
7
8
|
tf: typeof TerraformConverter;
|
|
9
|
+
cf: typeof CloudFormationConverter;
|
|
8
10
|
};
|
|
9
11
|
/**
|
|
10
12
|
* Convert a policy to a string in the specified format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG;;;CAGJ,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,OAAO,UAAU,EAC/B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAWR"}
|
package/dist/cjs/convert.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.convert = convert;
|
|
4
|
+
const cloudFormation_js_1 = require("./converters/cloudFormation.js");
|
|
4
5
|
const terraform_js_1 = require("./converters/terraform.js");
|
|
5
6
|
const defaults_js_1 = require("./defaults.js");
|
|
6
7
|
const StringBuffer_js_1 = require("./util/StringBuffer.js");
|
|
@@ -8,7 +9,8 @@ const converters = {
|
|
|
8
9
|
/**
|
|
9
10
|
* Convert to Terraform
|
|
10
11
|
*/
|
|
11
|
-
tf: terraform_js_1.TerraformConverter
|
|
12
|
+
tf: terraform_js_1.TerraformConverter,
|
|
13
|
+
cf: cloudFormation_js_1.CloudFormationConverter
|
|
12
14
|
};
|
|
13
15
|
/**
|
|
14
16
|
* Convert a policy to a string in the specified format
|
package/dist/cjs/convert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":";;AAsBA,0BAeC;AApCD,sEAAwE;AACxE,4DAA8D;AAC9D,+CAA8C;AAC9C,4DAAqD;AAErD,MAAM,UAAU,GAAG;IACjB;;OAEG;IACH,EAAE,EAAE,iCAAkB;IACtB,EAAE,EAAE,2CAAuB;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CACrB,MAAc,EACd,MAA+B,EAC/B,OAAuD;IAEvD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,GAAG,EAAE,GAAG,4BAAc,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAA;IAEnD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAA;IAC1C,MAAM,YAAY,GAAG,IAAI,8BAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAC9E,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACvC,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Policy } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { StringBuffer } from '../util/StringBuffer.js';
|
|
3
|
+
import { Converter } from './converter.js';
|
|
4
|
+
export declare class CloudFormationConverter implements Converter {
|
|
5
|
+
convert(policy: Policy, sb: StringBuffer): void;
|
|
6
|
+
/**
|
|
7
|
+
* Recursively prints the given `value` (object, array, or scalar) as YAML lines
|
|
8
|
+
* using StringBuffer's pushLine/pushInline.
|
|
9
|
+
*/
|
|
10
|
+
private writeYamlValue;
|
|
11
|
+
private pushObjectValue;
|
|
12
|
+
/**
|
|
13
|
+
* Return true if `value` is null or a primitive (string/number/boolean).
|
|
14
|
+
*/
|
|
15
|
+
private isPrimitiveOrNull;
|
|
16
|
+
/**
|
|
17
|
+
* Convert primitive to a YAML-friendly string (quoted if it's a string).
|
|
18
|
+
*/
|
|
19
|
+
private stringifyScalar;
|
|
20
|
+
/**
|
|
21
|
+
* Stringify a key for YAML output. If it's a valid YAML key, return as-is.
|
|
22
|
+
*
|
|
23
|
+
* @param key the key to convert to a YAML key
|
|
24
|
+
* @returns the key as a valid YAML key
|
|
25
|
+
*/
|
|
26
|
+
private yamlKey;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cloudFormation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudFormation.d.ts","sourceRoot":"","sources":["../../../src/converters/cloudFormation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,qBAAa,uBAAwB,YAAW,SAAS;IACvD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY;IAYxC;;;OAGG;IACH,OAAO,CAAC,cAAc;IA0DtB,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAYhB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudFormationConverter = void 0;
|
|
4
|
+
class CloudFormationConverter {
|
|
5
|
+
convert(policy, sb) {
|
|
6
|
+
// Get the raw JS object from the policy
|
|
7
|
+
const policyJson = policy.toJSON();
|
|
8
|
+
// CloudFormation Resource skeleton
|
|
9
|
+
sb.pushLine('PolicyDocument:');
|
|
10
|
+
sb.withIndent((docBuffer) => {
|
|
11
|
+
// Recursively write the raw JSON as YAML
|
|
12
|
+
this.writeYamlValue(policyJson, docBuffer, false);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Recursively prints the given `value` (object, array, or scalar) as YAML lines
|
|
17
|
+
* using StringBuffer's pushLine/pushInline.
|
|
18
|
+
*/
|
|
19
|
+
writeYamlValue(value, sb, startWithDash) {
|
|
20
|
+
if (value === null) {
|
|
21
|
+
sb.pushLine('null');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
// For arrays, each element is an item: "- ..."
|
|
26
|
+
if (value.length === 0) {
|
|
27
|
+
sb.pushLine('[]');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
for (const element of value) {
|
|
31
|
+
// We'll figure out how to print the "element" of the array:
|
|
32
|
+
if (this.isPrimitiveOrNull(element)) {
|
|
33
|
+
// If it's just a scalar, we can put it on the same line, then finishLine().
|
|
34
|
+
sb.pushLine('- ' + this.stringifyScalar(element));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// It's either an object or array
|
|
38
|
+
// So we break to a new line, and then indent for its sub-keys
|
|
39
|
+
this.writeYamlValue(element, sb, true);
|
|
40
|
+
// })
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (typeof value === 'object') {
|
|
46
|
+
// Plain object
|
|
47
|
+
const keys = Object.keys(value);
|
|
48
|
+
if (keys.length === 0) {
|
|
49
|
+
sb.pushLine('{}');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const [firstKey, ...restKeys] = keys;
|
|
53
|
+
const dash = startWithDash ? '- ' : '';
|
|
54
|
+
this.pushObjectValue(dash + firstKey, value[firstKey], sb);
|
|
55
|
+
if (startWithDash) {
|
|
56
|
+
sb.indent();
|
|
57
|
+
}
|
|
58
|
+
for (const key of restKeys) {
|
|
59
|
+
this.pushObjectValue(key, value[key], sb);
|
|
60
|
+
}
|
|
61
|
+
if (startWithDash) {
|
|
62
|
+
sb.unindent();
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Otherwise it's a scalar (string, number, boolean)
|
|
67
|
+
sb.pushLine(this.stringifyScalar(value));
|
|
68
|
+
}
|
|
69
|
+
pushObjectValue(key, value, buffer) {
|
|
70
|
+
// We'll see if child is primitive. If so, we can do "key: scalar" on one line.
|
|
71
|
+
if (this.isPrimitiveOrNull(value)) {
|
|
72
|
+
buffer.pushLine(`${this.yamlKey(key)}: ${this.stringifyScalar(value)}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// child is object or array
|
|
76
|
+
buffer.pushLine(`${this.yamlKey(key)}:`);
|
|
77
|
+
buffer.withIndent((childBuffer) => {
|
|
78
|
+
this.writeYamlValue(value, childBuffer, false);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Return true if `value` is null or a primitive (string/number/boolean).
|
|
84
|
+
*/
|
|
85
|
+
isPrimitiveOrNull(value) {
|
|
86
|
+
return (value === null ||
|
|
87
|
+
typeof value === 'string' ||
|
|
88
|
+
typeof value === 'number' ||
|
|
89
|
+
typeof value === 'boolean');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Convert primitive to a YAML-friendly string (quoted if it's a string).
|
|
93
|
+
*/
|
|
94
|
+
stringifyScalar(value) {
|
|
95
|
+
if (value === null) {
|
|
96
|
+
return 'null';
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === 'string') {
|
|
99
|
+
// Wrap in quotes. (You could also single-quote, or skip if safe.)
|
|
100
|
+
return `"${value}"`;
|
|
101
|
+
}
|
|
102
|
+
// number or boolean
|
|
103
|
+
return String(value);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Stringify a key for YAML output. If it's a valid YAML key, return as-is.
|
|
107
|
+
*
|
|
108
|
+
* @param key the key to convert to a YAML key
|
|
109
|
+
* @returns the key as a valid YAML key
|
|
110
|
+
*/
|
|
111
|
+
yamlKey(key) {
|
|
112
|
+
if (key.startsWith('- ')) {
|
|
113
|
+
return '- ' + this.yamlKey(key.slice(2));
|
|
114
|
+
}
|
|
115
|
+
// If key is a valid YAML key, return as-is
|
|
116
|
+
if (/^[a-zA-Z0-9_]+$/.test(key)) {
|
|
117
|
+
return key;
|
|
118
|
+
}
|
|
119
|
+
// Otherwise, quote it
|
|
120
|
+
return `"${key}"`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.CloudFormationConverter = CloudFormationConverter;
|
|
124
|
+
//# sourceMappingURL=cloudFormation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudFormation.js","sourceRoot":"","sources":["../../../src/converters/cloudFormation.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/cli.js
CHANGED
|
@@ -21,7 +21,7 @@ async function run() {
|
|
|
21
21
|
description: 'The format to convert to',
|
|
22
22
|
type: 'enum',
|
|
23
23
|
values: 'single',
|
|
24
|
-
validValues: ['tf']
|
|
24
|
+
validValues: ['tf', 'cf']
|
|
25
25
|
},
|
|
26
26
|
file: {
|
|
27
27
|
description: 'A file to read the policy from. If not provided, stdin is used',
|
|
@@ -62,7 +62,7 @@ async function run() {
|
|
|
62
62
|
}
|
|
63
63
|
const policy = loadPolicy(json);
|
|
64
64
|
const format = cli.args.format || 'tf';
|
|
65
|
-
const result = convert(policy,
|
|
65
|
+
const result = convert(policy, format, {
|
|
66
66
|
indentBy: cli.args.indentBy,
|
|
67
67
|
lineSeparator: cli.args.lineSeparator == 'crlf' ? `\r\n` : undefined
|
|
68
68
|
});
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,iBAAiB,CAC3B,aAAa,EACb,EAAE,EACF;QACE,QAAQ,EAAE;YACR,WAAW,EACT,kFAAkF;YACpF,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;SACjB;QACD,aAAa,EAAE;YACb,WAAW,EACT,oGAAoG;YACtG,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;SAC5B;QACD,MAAM,EAAE;YACN,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,KAAK,UAAU,GAAG;IAChB,MAAM,GAAG,GAAG,iBAAiB,CAC3B,aAAa,EACb,EAAE,EACF;QACE,QAAQ,EAAE;YACR,WAAW,EACT,kFAAkF;YACpF,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;SACjB;QACD,aAAa,EAAE;YACb,WAAW,EACT,oGAAoG;YACtG,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;SAC5B;QACD,MAAM,EAAE;YACN,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;SAC1B;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,gEAAgE;YAC7E,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,QAAQ;SACjB;KACO,EACV;QACE,cAAc,EAAE,KAAK;KACtB,CACF,CAAA;IAED,IAAI,cAAc,GAAuB,SAAS,CAAA;IAElD,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAA;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;QAExC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CACX,uFAAuF,CACxF,CAAA;YACD,GAAG,CAAC,SAAS,EAAE,CAAA;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,cAAc,GAAG,KAAK,CAAA;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;QACxC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;QACrC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;QAC3B,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACrE,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,GAAG,EAAE;KACF,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC;KACD,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;KACd,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA"}
|
package/dist/esm/convert.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Policy } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { CloudFormationConverter } from './converters/cloudFormation.js';
|
|
2
3
|
import { TerraformConverter } from './converters/terraform.js';
|
|
3
4
|
declare const converters: {
|
|
4
5
|
/**
|
|
5
6
|
* Convert to Terraform
|
|
6
7
|
*/
|
|
7
8
|
tf: typeof TerraformConverter;
|
|
9
|
+
cf: typeof CloudFormationConverter;
|
|
8
10
|
};
|
|
9
11
|
/**
|
|
10
12
|
* Convert a policy to a string in the specified format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG;;;CAGJ,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,OAAO,UAAU,EAC/B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAWR"}
|
package/dist/esm/convert.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CloudFormationConverter } from './converters/cloudFormation.js';
|
|
1
2
|
import { TerraformConverter } from './converters/terraform.js';
|
|
2
3
|
import { defaultOptions } from './defaults.js';
|
|
3
4
|
import { StringBuffer } from './util/StringBuffer.js';
|
|
@@ -5,7 +6,8 @@ const converters = {
|
|
|
5
6
|
/**
|
|
6
7
|
* Convert to Terraform
|
|
7
8
|
*/
|
|
8
|
-
tf: TerraformConverter
|
|
9
|
+
tf: TerraformConverter,
|
|
10
|
+
cf: CloudFormationConverter
|
|
9
11
|
};
|
|
10
12
|
/**
|
|
11
13
|
* Convert a policy to a string in the specified format
|
package/dist/esm/convert.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,MAAM,UAAU,GAAG;IACjB;;OAEG;IACH,EAAE,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,MAAM,UAAU,GAAG;IACjB;;OAEG;IACH,EAAE,EAAE,kBAAkB;IACtB,EAAE,EAAE,uBAAuB;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CACrB,MAAc,EACd,MAA+B,EAC/B,OAAuD;IAEvD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAA;IAEnD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAA;IAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAC9E,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACvC,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Policy } from '@cloud-copilot/iam-policy';
|
|
2
|
+
import { StringBuffer } from '../util/StringBuffer.js';
|
|
3
|
+
import { Converter } from './converter.js';
|
|
4
|
+
export declare class CloudFormationConverter implements Converter {
|
|
5
|
+
convert(policy: Policy, sb: StringBuffer): void;
|
|
6
|
+
/**
|
|
7
|
+
* Recursively prints the given `value` (object, array, or scalar) as YAML lines
|
|
8
|
+
* using StringBuffer's pushLine/pushInline.
|
|
9
|
+
*/
|
|
10
|
+
private writeYamlValue;
|
|
11
|
+
private pushObjectValue;
|
|
12
|
+
/**
|
|
13
|
+
* Return true if `value` is null or a primitive (string/number/boolean).
|
|
14
|
+
*/
|
|
15
|
+
private isPrimitiveOrNull;
|
|
16
|
+
/**
|
|
17
|
+
* Convert primitive to a YAML-friendly string (quoted if it's a string).
|
|
18
|
+
*/
|
|
19
|
+
private stringifyScalar;
|
|
20
|
+
/**
|
|
21
|
+
* Stringify a key for YAML output. If it's a valid YAML key, return as-is.
|
|
22
|
+
*
|
|
23
|
+
* @param key the key to convert to a YAML key
|
|
24
|
+
* @returns the key as a valid YAML key
|
|
25
|
+
*/
|
|
26
|
+
private yamlKey;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cloudFormation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudFormation.d.ts","sourceRoot":"","sources":["../../../src/converters/cloudFormation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,qBAAa,uBAAwB,YAAW,SAAS;IACvD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY;IAYxC;;;OAGG;IACH,OAAO,CAAC,cAAc;IA0DtB,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;;;;OAKG;IACH,OAAO,CAAC,OAAO;CAYhB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export class CloudFormationConverter {
|
|
2
|
+
convert(policy, sb) {
|
|
3
|
+
// Get the raw JS object from the policy
|
|
4
|
+
const policyJson = policy.toJSON();
|
|
5
|
+
// CloudFormation Resource skeleton
|
|
6
|
+
sb.pushLine('PolicyDocument:');
|
|
7
|
+
sb.withIndent((docBuffer) => {
|
|
8
|
+
// Recursively write the raw JSON as YAML
|
|
9
|
+
this.writeYamlValue(policyJson, docBuffer, false);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Recursively prints the given `value` (object, array, or scalar) as YAML lines
|
|
14
|
+
* using StringBuffer's pushLine/pushInline.
|
|
15
|
+
*/
|
|
16
|
+
writeYamlValue(value, sb, startWithDash) {
|
|
17
|
+
if (value === null) {
|
|
18
|
+
sb.pushLine('null');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
// For arrays, each element is an item: "- ..."
|
|
23
|
+
if (value.length === 0) {
|
|
24
|
+
sb.pushLine('[]');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
for (const element of value) {
|
|
28
|
+
// We'll figure out how to print the "element" of the array:
|
|
29
|
+
if (this.isPrimitiveOrNull(element)) {
|
|
30
|
+
// If it's just a scalar, we can put it on the same line, then finishLine().
|
|
31
|
+
sb.pushLine('- ' + this.stringifyScalar(element));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// It's either an object or array
|
|
35
|
+
// So we break to a new line, and then indent for its sub-keys
|
|
36
|
+
this.writeYamlValue(element, sb, true);
|
|
37
|
+
// })
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === 'object') {
|
|
43
|
+
// Plain object
|
|
44
|
+
const keys = Object.keys(value);
|
|
45
|
+
if (keys.length === 0) {
|
|
46
|
+
sb.pushLine('{}');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const [firstKey, ...restKeys] = keys;
|
|
50
|
+
const dash = startWithDash ? '- ' : '';
|
|
51
|
+
this.pushObjectValue(dash + firstKey, value[firstKey], sb);
|
|
52
|
+
if (startWithDash) {
|
|
53
|
+
sb.indent();
|
|
54
|
+
}
|
|
55
|
+
for (const key of restKeys) {
|
|
56
|
+
this.pushObjectValue(key, value[key], sb);
|
|
57
|
+
}
|
|
58
|
+
if (startWithDash) {
|
|
59
|
+
sb.unindent();
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Otherwise it's a scalar (string, number, boolean)
|
|
64
|
+
sb.pushLine(this.stringifyScalar(value));
|
|
65
|
+
}
|
|
66
|
+
pushObjectValue(key, value, buffer) {
|
|
67
|
+
// We'll see if child is primitive. If so, we can do "key: scalar" on one line.
|
|
68
|
+
if (this.isPrimitiveOrNull(value)) {
|
|
69
|
+
buffer.pushLine(`${this.yamlKey(key)}: ${this.stringifyScalar(value)}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// child is object or array
|
|
73
|
+
buffer.pushLine(`${this.yamlKey(key)}:`);
|
|
74
|
+
buffer.withIndent((childBuffer) => {
|
|
75
|
+
this.writeYamlValue(value, childBuffer, false);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Return true if `value` is null or a primitive (string/number/boolean).
|
|
81
|
+
*/
|
|
82
|
+
isPrimitiveOrNull(value) {
|
|
83
|
+
return (value === null ||
|
|
84
|
+
typeof value === 'string' ||
|
|
85
|
+
typeof value === 'number' ||
|
|
86
|
+
typeof value === 'boolean');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert primitive to a YAML-friendly string (quoted if it's a string).
|
|
90
|
+
*/
|
|
91
|
+
stringifyScalar(value) {
|
|
92
|
+
if (value === null) {
|
|
93
|
+
return 'null';
|
|
94
|
+
}
|
|
95
|
+
if (typeof value === 'string') {
|
|
96
|
+
// Wrap in quotes. (You could also single-quote, or skip if safe.)
|
|
97
|
+
return `"${value}"`;
|
|
98
|
+
}
|
|
99
|
+
// number or boolean
|
|
100
|
+
return String(value);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Stringify a key for YAML output. If it's a valid YAML key, return as-is.
|
|
104
|
+
*
|
|
105
|
+
* @param key the key to convert to a YAML key
|
|
106
|
+
* @returns the key as a valid YAML key
|
|
107
|
+
*/
|
|
108
|
+
yamlKey(key) {
|
|
109
|
+
if (key.startsWith('- ')) {
|
|
110
|
+
return '- ' + this.yamlKey(key.slice(2));
|
|
111
|
+
}
|
|
112
|
+
// If key is a valid YAML key, return as-is
|
|
113
|
+
if (/^[a-zA-Z0-9_]+$/.test(key)) {
|
|
114
|
+
return key;
|
|
115
|
+
}
|
|
116
|
+
// Otherwise, quote it
|
|
117
|
+
return `"${key}"`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=cloudFormation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudFormation.js","sourceRoot":"","sources":["../../../src/converters/cloudFormation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloud-copilot/iam-convert",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Convert AWS IAM JSON policies to other formats",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@cloud-copilot/cli": "^0.1.1",
|
|
59
|
-
"@cloud-copilot/iam-policy": "^0.1.
|
|
59
|
+
"@cloud-copilot/iam-policy": "^0.1.14"
|
|
60
60
|
},
|
|
61
61
|
"prettier": "@cloud-copilot/prettier-config",
|
|
62
62
|
"release": {
|