@cloud-copilot/iam-convert 0.1.1 → 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 ADDED
@@ -0,0 +1,54 @@
1
+ # iam-convert: Convert JSON Policy Documents to Markdown
2
+
3
+ [![NPM Version](https://img.shields.io/npm/v/@cloud-copilot/iam-convert.svg?logo=nodedotjs)](https://www.npmjs.com/package/@cloud-copilot/iam-convert) [![License: AGPL v3](https://img.shields.io/github/license/cloud-copilot/iam-convert)](LICENSE.txt)
4
+
5
+ CLI and Node Library to convert JSON IAM Policy Documents to other formats for Infrastructure as Code.
6
+
7
+ ## Available Formats
8
+
9
+ - Terraform - an aws_iam_policy_document data source
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ # Install the CLI
15
+ npm install -g @cloud-copilot/iam-convert
16
+
17
+ ## Install the Node Library
18
+ npm install @cloud-copilot/iam-convert
19
+ ```
20
+
21
+ ## CLI Usage
22
+
23
+ ```bash
24
+ # Convert a JSON policy document to terraform and send to stdout
25
+ iam-convert --file path/to/policy.json
26
+
27
+ # Download a policy and convert it to terraform
28
+ curl "https://government-secrets.s3.amazonaws.com/secret-policy.json" | iam-convert > secret-policy.tf
29
+
30
+ # View all options
31
+ iam-convert --help
32
+ ```
33
+
34
+ ## Typescript/Javascript Usage
35
+
36
+ ```typescript
37
+ import { convert } from '@cloud-copilot/iam-convert'
38
+ import { loadPolicy } from '@cloud-copilot/iam-policy'
39
+
40
+ const policy = {
41
+ Version: '2012-10-17',
42
+ Statement: [
43
+ {
44
+ Effect: 'Allow',
45
+ Action: 's3:GetObject',
46
+ Resource: 'arn:aws:s3:::my-bucket/*'
47
+ }
48
+ ]
49
+ }
50
+
51
+ const terraformDataSource = convert(policy, 'tf')
52
+
53
+ console.log(terraformDataSource)
54
+ ```
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, 'tf', {
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
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,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,IAAA,eAAU,EAAC,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,IAAA,iBAAY,EAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,IAAA,eAAS,EAAC,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,IAAA,sBAAY,EAAC,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,IAAA,iCAAoB,EAAC,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,IAAA,uBAAU,EAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;IACtC,MAAM,MAAM,GAAG,IAAA,oBAAO,EAAC,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"}
@@ -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;;CAEJ,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"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":";;AAoBA,0BAeC;AAlCD,4DAA8D;AAC9D,+CAA8C;AAC9C,4DAAqD;AAErD,MAAM,UAAU,GAAG;IACjB;;OAEG;IACH,EAAE,EAAE,iCAAkB;CACvB,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"}
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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"}
@@ -1,5 +1,5 @@
1
- import { Policy } from "@cloud-copilot/iam-policy";
2
- import { StringBuffer } from "../util/StringBuffer.js";
1
+ import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { StringBuffer } from '../util/StringBuffer.js';
3
3
  export interface Converter {
4
4
  /**
5
5
  * Converts the given policy to a new format in the given StringBuffer
@@ -1 +1 @@
1
- {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACrD"}
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CACpD"}
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, 'tf', {
65
+ const result = convert(policy, format, {
66
66
  indentBy: cli.args.indentBy,
67
67
  lineSeparator: cli.args.lineSeparator == 'crlf' ? `\r\n` : undefined
68
68
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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;;CAEJ,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"}
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"}
@@ -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
@@ -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;CACvB,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"}
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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"}
@@ -1,5 +1,5 @@
1
- import { Policy } from "@cloud-copilot/iam-policy";
2
- import { StringBuffer } from "../util/StringBuffer.js";
1
+ import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { StringBuffer } from '../util/StringBuffer.js';
3
3
  export interface Converter {
4
4
  /**
5
5
  * Converts the given policy to a new format in the given StringBuffer
@@ -1 +1 @@
1
- {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACrD"}
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CACpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-copilot/iam-convert",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Convert AWS IAM JSON policies to other formats",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,14 +42,76 @@
42
42
  "homepage": "https://github.com/cloud-copilot/iam-convert#readme",
43
43
  "devDependencies": {
44
44
  "@cloud-copilot/prettier-config": "^0.1.1",
45
+ "@semantic-release/changelog": "^6.0.3",
46
+ "@semantic-release/commit-analyzer": "^13.0.1",
47
+ "@semantic-release/git": "^10.0.1",
48
+ "@semantic-release/github": "^11.0.1",
49
+ "@semantic-release/npm": "^12.0.1",
50
+ "@semantic-release/release-notes-generator": "^14.0.3",
45
51
  "@types/node": "^22.5.0",
46
52
  "@vitest/coverage-v8": "^2.0.5",
53
+ "semantic-release": "^24.2.1",
47
54
  "typescript": "^5.5.4",
48
55
  "vitest": "^2.0.5"
49
56
  },
50
57
  "dependencies": {
51
58
  "@cloud-copilot/cli": "^0.1.1",
52
- "@cloud-copilot/iam-policy": "^0.1.12"
59
+ "@cloud-copilot/iam-policy": "^0.1.14"
53
60
  },
54
- "prettier": "@cloud-copilot/prettier-config"
61
+ "prettier": "@cloud-copilot/prettier-config",
62
+ "release": {
63
+ "branches": [
64
+ "main"
65
+ ],
66
+ "plugins": [
67
+ [
68
+ "@semantic-release/commit-analyzer",
69
+ {
70
+ "releaseRules": [
71
+ {
72
+ "type": "feat",
73
+ "release": "patch"
74
+ },
75
+ {
76
+ "type": "fix",
77
+ "release": "patch"
78
+ },
79
+ {
80
+ "breaking": true,
81
+ "release": "patch"
82
+ },
83
+ {
84
+ "type": "*",
85
+ "release": "patch"
86
+ }
87
+ ]
88
+ }
89
+ ],
90
+ "@semantic-release/release-notes-generator",
91
+ "@semantic-release/changelog",
92
+ [
93
+ "@semantic-release/npm",
94
+ {
95
+ "npmPublish": true
96
+ }
97
+ ],
98
+ [
99
+ "@semantic-release/git",
100
+ {
101
+ "assets": [
102
+ "package.json",
103
+ "package-lock.json",
104
+ "CHANGELOG.md"
105
+ ],
106
+ "message": "chore(release): ${nextRelease.version} [skip ci]"
107
+ }
108
+ ],
109
+ [
110
+ "@semantic-release/github",
111
+ {
112
+ "assets": []
113
+ }
114
+ ]
115
+ ]
116
+ }
55
117
  }