@cloud-copilot/iam-convert 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # iam-convert: Convert JSON Policy Documents to Markdown
2
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/cli)](LICENSE.txt)
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
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', 'cdk-ts']
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":"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"}
@@ -1,10 +1,14 @@
1
1
  import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { CdkTypescriptConverter } from './converters/cdkTypescript.js';
3
+ import { CloudFormationConverter } from './converters/cloudFormation.js';
2
4
  import { TerraformConverter } from './converters/terraform.js';
3
5
  declare const converters: {
4
6
  /**
5
7
  * Convert to Terraform
6
8
  */
7
9
  tf: typeof TerraformConverter;
10
+ cf: typeof CloudFormationConverter;
11
+ 'cdk-ts': typeof CdkTypescriptConverter;
8
12
  };
9
13
  /**
10
14
  * 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,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG;;;;CAIJ,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,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.convert = convert;
4
+ const cdkTypescript_js_1 = require("./converters/cdkTypescript.js");
5
+ const cloudFormation_js_1 = require("./converters/cloudFormation.js");
4
6
  const terraform_js_1 = require("./converters/terraform.js");
5
7
  const defaults_js_1 = require("./defaults.js");
6
8
  const StringBuffer_js_1 = require("./util/StringBuffer.js");
@@ -8,7 +10,9 @@ const converters = {
8
10
  /**
9
11
  * Convert to Terraform
10
12
  */
11
- tf: terraform_js_1.TerraformConverter
13
+ tf: terraform_js_1.TerraformConverter,
14
+ cf: cloudFormation_js_1.CloudFormationConverter,
15
+ 'cdk-ts': cdkTypescript_js_1.CdkTypescriptConverter
12
16
  };
13
17
  /**
14
18
  * 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":";;AAwBA,0BAeC;AAtCD,oEAAsE;AACtE,sEAAwE;AACxE,4DAA8D;AAC9D,+CAA8C;AAC9C,4DAAqD;AAErD,MAAM,UAAU,GAAG;IACjB;;OAEG;IACH,EAAE,EAAE,iCAAkB;IACtB,EAAE,EAAE,2CAAuB;IAC3B,QAAQ,EAAE,yCAAsB;CACjC,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,30 @@
1
+ import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { StringBuffer } from '../util/StringBuffer.js';
3
+ import { Converter } from './converter.js';
4
+ /**
5
+ * Converts an IAM policy into TypeScript code that uses the AWS CDK (v2)
6
+ * to build a new iam.PolicyDocument with multiple iam.PolicyStatement objects.
7
+ */
8
+ export declare class CdkTypescriptConverter implements Converter {
9
+ convert(policy: Policy, sb: StringBuffer): void;
10
+ private convertActions;
11
+ private convertResources;
12
+ /**
13
+ * For Principals, we create new iam.Principal-based classes (e.g. ArnPrincipal, ServicePrincipal).
14
+ * If a wildcard is found, we can use `new iam.AnyPrincipal()` in the 'principals' array.
15
+ */
16
+ private convertPrincipals;
17
+ /**
18
+ * Collect conditions by operation & key, then output them as:
19
+ * conditions: {
20
+ * StringEquals: {
21
+ * "aws:username": "FoxMulder"
22
+ * },
23
+ * ForAnyValue:StringLike: {
24
+ * "s3:prefix": ["foo/*", "bar/*"]
25
+ * }
26
+ * }
27
+ */
28
+ private convertConditions;
29
+ }
30
+ //# sourceMappingURL=cdkTypescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdkTypescript.d.ts","sourceRoot":"","sources":["../../../src/converters/cdkTypescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,EAAuB,MAAM,2BAA2B,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY;IA2ExC,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,gBAAgB;IAkBxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;CA0D1B"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CdkTypescriptConverter = void 0;
4
+ /**
5
+ * Converts an IAM policy into TypeScript code that uses the AWS CDK (v2)
6
+ * to build a new iam.PolicyDocument with multiple iam.PolicyStatement objects.
7
+ */
8
+ class CdkTypescriptConverter {
9
+ convert(policy, sb) {
10
+ // sb.pushLine("import * as iam from 'aws-cdk-lib/aws-iam';")
11
+ // sb.pushLine('')
12
+ sb.pushLine('const policyDocument = new iam.PolicyDocument({');
13
+ sb.withIndent((docBuffer) => {
14
+ docBuffer.pushLine('statements: [');
15
+ docBuffer.withIndent((stmtsBuffer) => {
16
+ const statements = policy.statements();
17
+ statements.forEach((statement, idx) => {
18
+ stmtsBuffer.pushLine('new iam.PolicyStatement({');
19
+ stmtsBuffer.withIndent((stmtBuffer) => {
20
+ // Sid
21
+ if (statement.sid()) {
22
+ stmtBuffer.pushLine(`sid: "${statement.sid()}",`);
23
+ }
24
+ // Effect (Allow/Deny)
25
+ // if isDeny() is false, we assume ALLOW; adjust if you prefer a default of DENY
26
+ const effect = statement.isDeny() ? 'DENY' : 'ALLOW';
27
+ if (statement.effect()) {
28
+ stmtBuffer.pushLine(`effect: iam.Effect.${effect.toUpperCase()},`);
29
+ }
30
+ // Actions / NotActions
31
+ if (statement.isActionStatement()) {
32
+ this.convertActions(statement.actions(), 'actions', stmtBuffer);
33
+ }
34
+ else if (statement.isNotActionStatement()) {
35
+ // CDK also supports 'notActions'
36
+ this.convertActions(statement.notActions(), 'notActions', stmtBuffer);
37
+ }
38
+ // Resources / NotResources
39
+ if (statement.isResourceStatement()) {
40
+ this.convertResources(statement.resources(), 'resources', stmtBuffer);
41
+ }
42
+ else if (statement.isNotResourceStatement()) {
43
+ // CDK also supports 'notResources'
44
+ this.convertResources(statement.notResources(), 'notResources', stmtBuffer);
45
+ }
46
+ // Principals / NotPrincipals
47
+ if (statement.isPrincipalStatement()) {
48
+ this.convertPrincipals(statement.principals(), 'principals', statement.hasSingleWildcardPrincipal(), stmtBuffer);
49
+ }
50
+ else if (statement.isNotPrincipalStatement()) {
51
+ this.convertPrincipals(statement.notPrincipals(), 'notPrincipals', statement.hasSingleWildcardNotPrincipal(), stmtBuffer);
52
+ }
53
+ // Conditions
54
+ this.convertConditions(statement.conditions(), stmtBuffer);
55
+ });
56
+ if (idx === statements.length - 1) {
57
+ stmtsBuffer.pushLine('})');
58
+ }
59
+ else {
60
+ stmtsBuffer.pushLine('}),');
61
+ }
62
+ // If you don't want a trailing comma after the last one, you can check idx < length - 1, etc.
63
+ });
64
+ });
65
+ docBuffer.pushLine(']');
66
+ });
67
+ sb.pushLine('});');
68
+ }
69
+ convertActions(actions, propertyName, sb) {
70
+ if (!actions.length) {
71
+ return;
72
+ }
73
+ sb.pushLine(`${propertyName}: [`);
74
+ sb.withIndent((arrBuffer) => {
75
+ const lastIndex = actions.length - 1;
76
+ actions.forEach((action, index) => {
77
+ let actionString = `"${action.value()}"`;
78
+ if (index < lastIndex) {
79
+ actionString += ',';
80
+ }
81
+ arrBuffer.pushLine(actionString);
82
+ });
83
+ });
84
+ sb.pushLine('],');
85
+ }
86
+ convertResources(resources, propertyName, sb) {
87
+ if (!resources.length) {
88
+ return;
89
+ }
90
+ sb.pushLine(`${propertyName}: [`);
91
+ sb.withIndent((arrBuffer) => {
92
+ resources.forEach((res) => {
93
+ arrBuffer.pushLine(`"${res.value()}",`);
94
+ });
95
+ });
96
+ sb.pushLine('],');
97
+ }
98
+ /**
99
+ * For Principals, we create new iam.Principal-based classes (e.g. ArnPrincipal, ServicePrincipal).
100
+ * If a wildcard is found, we can use `new iam.AnyPrincipal()` in the 'principals' array.
101
+ */
102
+ convertPrincipals(principals, propertyName, hasSingleWildcard, sb) {
103
+ if (hasSingleWildcard) {
104
+ // If it is just "*", then new iam.AnyPrincipal()
105
+ sb.pushLine(`${propertyName}: [new iam.AnyPrincipal()],`);
106
+ return;
107
+ }
108
+ if (!principals.length) {
109
+ return;
110
+ }
111
+ sb.pushLine(`${propertyName}: [`);
112
+ sb.withIndent((arrBuffer) => {
113
+ principals.forEach((p) => {
114
+ const type = p.type(); // e.g. "AWS", "Service", "Federated", or "*"
115
+ const value = p.value();
116
+ let principalCtor = '';
117
+ if (type === 'AWS') {
118
+ // Usually indicates an ARN principal
119
+ principalCtor = `new iam.ArnPrincipal("${value}")`;
120
+ }
121
+ else if (type === 'Service') {
122
+ principalCtor = `new iam.ServicePrincipal("${value}")`;
123
+ }
124
+ else if (type === 'Federated') {
125
+ // e.g. new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {}, 'sts.amazonaws.com')
126
+ principalCtor = `new iam.FederatedPrincipal("${value}")`;
127
+ }
128
+ else if (type === 'CanonicalUser') {
129
+ principalCtor = `new iam.CanonicalUserPrincipal("${value}")`;
130
+ }
131
+ else {
132
+ // Fallback: treat as ArnPrincipal or something.
133
+ // Or you could switch to new iam.AccountPrincipal(value), depending on your usage.
134
+ principalCtor = `new iam.ArnPrincipal("${value}")`;
135
+ }
136
+ arrBuffer.pushLine(`${principalCtor},`);
137
+ });
138
+ });
139
+ sb.pushLine('],');
140
+ }
141
+ /**
142
+ * Collect conditions by operation & key, then output them as:
143
+ * conditions: {
144
+ * StringEquals: {
145
+ * "aws:username": "FoxMulder"
146
+ * },
147
+ * ForAnyValue:StringLike: {
148
+ * "s3:prefix": ["foo/*", "bar/*"]
149
+ * }
150
+ * }
151
+ */
152
+ convertConditions(conditions, sb) {
153
+ if (!conditions.length) {
154
+ return;
155
+ }
156
+ // Construct a nested object: { [operator]: { [key]: string | string[] } }
157
+ // If multiple Condition objects share the same operator or key, you can combine them.
158
+ const conditionMap = {};
159
+ for (const cond of conditions) {
160
+ const operator = cond.operation().value(); // e.g. 'StringEquals' or 'ForAnyValue:StringLike'
161
+ const conditionKey = cond.conditionKey(); // e.g. 'aws:username'
162
+ const values = cond.conditionValues(); // array of strings
163
+ if (!conditionMap[operator]) {
164
+ conditionMap[operator] = {};
165
+ }
166
+ // If the same operator + key appear multiple times, we can merge them into an array
167
+ if (!conditionMap[operator][conditionKey]) {
168
+ // If there's only 1 value, store it directly. If >1, store array:
169
+ conditionMap[operator][conditionKey] = values.length === 1 ? values[0] : values;
170
+ }
171
+ else {
172
+ // Already have something there; ensure it’s an array and push new values
173
+ const existing = conditionMap[operator][conditionKey];
174
+ if (Array.isArray(existing)) {
175
+ existing.push(...values);
176
+ }
177
+ else {
178
+ // Convert existing single string to array
179
+ conditionMap[operator][conditionKey] = [existing, ...values];
180
+ }
181
+ }
182
+ }
183
+ sb.pushLine('conditions: {');
184
+ sb.withIndent((condBuffer) => {
185
+ Object.entries(conditionMap).forEach(([op, keyMap]) => {
186
+ condBuffer.pushLine(`${op}: {`);
187
+ condBuffer.withIndent((opBuffer) => {
188
+ Object.entries(keyMap).forEach(([k, val]) => {
189
+ if (Array.isArray(val)) {
190
+ // Convert to TS array e.g. ["val1", "val2"]
191
+ opBuffer.pushLine(`"${k}": [`);
192
+ opBuffer.withIndent((arrBuffer) => {
193
+ val.forEach((v) => {
194
+ arrBuffer.pushLine(`"${v}",`);
195
+ });
196
+ });
197
+ opBuffer.pushLine('],');
198
+ }
199
+ else {
200
+ // Single string
201
+ opBuffer.pushLine(`"${k}": "${val}",`);
202
+ }
203
+ });
204
+ });
205
+ condBuffer.pushLine('},');
206
+ });
207
+ });
208
+ sb.pushLine('},');
209
+ }
210
+ }
211
+ exports.CdkTypescriptConverter = CdkTypescriptConverter;
212
+ //# sourceMappingURL=cdkTypescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdkTypescript.js","sourceRoot":"","sources":["../../../src/converters/cdkTypescript.ts"],"names":[],"mappings":"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"}
@@ -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":";;;AAIA,MAAa,uBAAuB;IAClC,OAAO,CAAC,MAAc,EAAE,EAAgB;QACtC,wCAAwC;QACxC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QAElC,mCAAmC;QACnC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAC9B,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,yCAAyC;YACzC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,KAAU,EAAE,EAAgB,EAAE,aAAsB;QACzE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACnB,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,+CAA+C;YAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC5B,4DAA4D;gBAC5D,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,4EAA4E;oBAC5E,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;gBACnD,CAAC;qBAAM,CAAC;oBACN,iCAAiC;oBACjC,8DAA8D;oBAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;oBACtC,KAAK;gBACP,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,eAAe;YACf,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YAED,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAA;YACpC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;YAEtC,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;YAE1D,IAAI,aAAa,EAAE,CAAC;gBAClB,EAAE,CAAC,MAAM,EAAE,CAAA;YACb,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;YAC3C,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,EAAE,CAAC,QAAQ,EAAE,CAAA;YACf,CAAC;YAED,OAAM;QACR,CAAC;QAED,oDAAoD;QACpD,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;IAEO,eAAe,CAAC,GAAW,EAAE,KAAU,EAAE,MAAoB;QACnE,+EAA+E;QAC/E,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACzE,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACxC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE;gBAChC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;YAChD,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAU;QAClC,OAAO,CACL,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,SAAS,CAC3B,CAAA;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAuC;QAC7D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,kEAAkE;YAClE,OAAO,IAAI,KAAK,GAAG,CAAA;QACrB,CAAC;QACD,oBAAoB;QACpB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IAED;;;;;OAKG;IACK,OAAO,CAAC,GAAW;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC;QAED,2CAA2C;QAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,sBAAsB;QACtB,OAAO,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;CACF;AArID,0DAqIC"}
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', 'cdk-ts']
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,14 @@
1
1
  import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { CdkTypescriptConverter } from './converters/cdkTypescript.js';
3
+ import { CloudFormationConverter } from './converters/cloudFormation.js';
2
4
  import { TerraformConverter } from './converters/terraform.js';
3
5
  declare const converters: {
4
6
  /**
5
7
  * Convert to Terraform
6
8
  */
7
9
  tf: typeof TerraformConverter;
10
+ cf: typeof CloudFormationConverter;
11
+ 'cdk-ts': typeof CdkTypescriptConverter;
8
12
  };
9
13
  /**
10
14
  * 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,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAI9D,QAAA,MAAM,UAAU;IACd;;OAEG;;;;CAIJ,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,5 @@
1
+ import { CdkTypescriptConverter } from './converters/cdkTypescript.js';
2
+ import { CloudFormationConverter } from './converters/cloudFormation.js';
1
3
  import { TerraformConverter } from './converters/terraform.js';
2
4
  import { defaultOptions } from './defaults.js';
3
5
  import { StringBuffer } from './util/StringBuffer.js';
@@ -5,7 +7,9 @@ const converters = {
5
7
  /**
6
8
  * Convert to Terraform
7
9
  */
8
- tf: TerraformConverter
10
+ tf: TerraformConverter,
11
+ cf: CloudFormationConverter,
12
+ 'cdk-ts': CdkTypescriptConverter
9
13
  };
10
14
  /**
11
15
  * 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,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,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;IAC3B,QAAQ,EAAE,sBAAsB;CACjC,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,30 @@
1
+ import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { StringBuffer } from '../util/StringBuffer.js';
3
+ import { Converter } from './converter.js';
4
+ /**
5
+ * Converts an IAM policy into TypeScript code that uses the AWS CDK (v2)
6
+ * to build a new iam.PolicyDocument with multiple iam.PolicyStatement objects.
7
+ */
8
+ export declare class CdkTypescriptConverter implements Converter {
9
+ convert(policy: Policy, sb: StringBuffer): void;
10
+ private convertActions;
11
+ private convertResources;
12
+ /**
13
+ * For Principals, we create new iam.Principal-based classes (e.g. ArnPrincipal, ServicePrincipal).
14
+ * If a wildcard is found, we can use `new iam.AnyPrincipal()` in the 'principals' array.
15
+ */
16
+ private convertPrincipals;
17
+ /**
18
+ * Collect conditions by operation & key, then output them as:
19
+ * conditions: {
20
+ * StringEquals: {
21
+ * "aws:username": "FoxMulder"
22
+ * },
23
+ * ForAnyValue:StringLike: {
24
+ * "s3:prefix": ["foo/*", "bar/*"]
25
+ * }
26
+ * }
27
+ */
28
+ private convertConditions;
29
+ }
30
+ //# sourceMappingURL=cdkTypescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdkTypescript.d.ts","sourceRoot":"","sources":["../../../src/converters/cdkTypescript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,EAAuB,MAAM,2BAA2B,CAAA;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IACtD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY;IA2ExC,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,gBAAgB;IAkBxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;CA0D1B"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Converts an IAM policy into TypeScript code that uses the AWS CDK (v2)
3
+ * to build a new iam.PolicyDocument with multiple iam.PolicyStatement objects.
4
+ */
5
+ export class CdkTypescriptConverter {
6
+ convert(policy, sb) {
7
+ // sb.pushLine("import * as iam from 'aws-cdk-lib/aws-iam';")
8
+ // sb.pushLine('')
9
+ sb.pushLine('const policyDocument = new iam.PolicyDocument({');
10
+ sb.withIndent((docBuffer) => {
11
+ docBuffer.pushLine('statements: [');
12
+ docBuffer.withIndent((stmtsBuffer) => {
13
+ const statements = policy.statements();
14
+ statements.forEach((statement, idx) => {
15
+ stmtsBuffer.pushLine('new iam.PolicyStatement({');
16
+ stmtsBuffer.withIndent((stmtBuffer) => {
17
+ // Sid
18
+ if (statement.sid()) {
19
+ stmtBuffer.pushLine(`sid: "${statement.sid()}",`);
20
+ }
21
+ // Effect (Allow/Deny)
22
+ // if isDeny() is false, we assume ALLOW; adjust if you prefer a default of DENY
23
+ const effect = statement.isDeny() ? 'DENY' : 'ALLOW';
24
+ if (statement.effect()) {
25
+ stmtBuffer.pushLine(`effect: iam.Effect.${effect.toUpperCase()},`);
26
+ }
27
+ // Actions / NotActions
28
+ if (statement.isActionStatement()) {
29
+ this.convertActions(statement.actions(), 'actions', stmtBuffer);
30
+ }
31
+ else if (statement.isNotActionStatement()) {
32
+ // CDK also supports 'notActions'
33
+ this.convertActions(statement.notActions(), 'notActions', stmtBuffer);
34
+ }
35
+ // Resources / NotResources
36
+ if (statement.isResourceStatement()) {
37
+ this.convertResources(statement.resources(), 'resources', stmtBuffer);
38
+ }
39
+ else if (statement.isNotResourceStatement()) {
40
+ // CDK also supports 'notResources'
41
+ this.convertResources(statement.notResources(), 'notResources', stmtBuffer);
42
+ }
43
+ // Principals / NotPrincipals
44
+ if (statement.isPrincipalStatement()) {
45
+ this.convertPrincipals(statement.principals(), 'principals', statement.hasSingleWildcardPrincipal(), stmtBuffer);
46
+ }
47
+ else if (statement.isNotPrincipalStatement()) {
48
+ this.convertPrincipals(statement.notPrincipals(), 'notPrincipals', statement.hasSingleWildcardNotPrincipal(), stmtBuffer);
49
+ }
50
+ // Conditions
51
+ this.convertConditions(statement.conditions(), stmtBuffer);
52
+ });
53
+ if (idx === statements.length - 1) {
54
+ stmtsBuffer.pushLine('})');
55
+ }
56
+ else {
57
+ stmtsBuffer.pushLine('}),');
58
+ }
59
+ // If you don't want a trailing comma after the last one, you can check idx < length - 1, etc.
60
+ });
61
+ });
62
+ docBuffer.pushLine(']');
63
+ });
64
+ sb.pushLine('});');
65
+ }
66
+ convertActions(actions, propertyName, sb) {
67
+ if (!actions.length) {
68
+ return;
69
+ }
70
+ sb.pushLine(`${propertyName}: [`);
71
+ sb.withIndent((arrBuffer) => {
72
+ const lastIndex = actions.length - 1;
73
+ actions.forEach((action, index) => {
74
+ let actionString = `"${action.value()}"`;
75
+ if (index < lastIndex) {
76
+ actionString += ',';
77
+ }
78
+ arrBuffer.pushLine(actionString);
79
+ });
80
+ });
81
+ sb.pushLine('],');
82
+ }
83
+ convertResources(resources, propertyName, sb) {
84
+ if (!resources.length) {
85
+ return;
86
+ }
87
+ sb.pushLine(`${propertyName}: [`);
88
+ sb.withIndent((arrBuffer) => {
89
+ resources.forEach((res) => {
90
+ arrBuffer.pushLine(`"${res.value()}",`);
91
+ });
92
+ });
93
+ sb.pushLine('],');
94
+ }
95
+ /**
96
+ * For Principals, we create new iam.Principal-based classes (e.g. ArnPrincipal, ServicePrincipal).
97
+ * If a wildcard is found, we can use `new iam.AnyPrincipal()` in the 'principals' array.
98
+ */
99
+ convertPrincipals(principals, propertyName, hasSingleWildcard, sb) {
100
+ if (hasSingleWildcard) {
101
+ // If it is just "*", then new iam.AnyPrincipal()
102
+ sb.pushLine(`${propertyName}: [new iam.AnyPrincipal()],`);
103
+ return;
104
+ }
105
+ if (!principals.length) {
106
+ return;
107
+ }
108
+ sb.pushLine(`${propertyName}: [`);
109
+ sb.withIndent((arrBuffer) => {
110
+ principals.forEach((p) => {
111
+ const type = p.type(); // e.g. "AWS", "Service", "Federated", or "*"
112
+ const value = p.value();
113
+ let principalCtor = '';
114
+ if (type === 'AWS') {
115
+ // Usually indicates an ARN principal
116
+ principalCtor = `new iam.ArnPrincipal("${value}")`;
117
+ }
118
+ else if (type === 'Service') {
119
+ principalCtor = `new iam.ServicePrincipal("${value}")`;
120
+ }
121
+ else if (type === 'Federated') {
122
+ // e.g. new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {}, 'sts.amazonaws.com')
123
+ principalCtor = `new iam.FederatedPrincipal("${value}")`;
124
+ }
125
+ else if (type === 'CanonicalUser') {
126
+ principalCtor = `new iam.CanonicalUserPrincipal("${value}")`;
127
+ }
128
+ else {
129
+ // Fallback: treat as ArnPrincipal or something.
130
+ // Or you could switch to new iam.AccountPrincipal(value), depending on your usage.
131
+ principalCtor = `new iam.ArnPrincipal("${value}")`;
132
+ }
133
+ arrBuffer.pushLine(`${principalCtor},`);
134
+ });
135
+ });
136
+ sb.pushLine('],');
137
+ }
138
+ /**
139
+ * Collect conditions by operation & key, then output them as:
140
+ * conditions: {
141
+ * StringEquals: {
142
+ * "aws:username": "FoxMulder"
143
+ * },
144
+ * ForAnyValue:StringLike: {
145
+ * "s3:prefix": ["foo/*", "bar/*"]
146
+ * }
147
+ * }
148
+ */
149
+ convertConditions(conditions, sb) {
150
+ if (!conditions.length) {
151
+ return;
152
+ }
153
+ // Construct a nested object: { [operator]: { [key]: string | string[] } }
154
+ // If multiple Condition objects share the same operator or key, you can combine them.
155
+ const conditionMap = {};
156
+ for (const cond of conditions) {
157
+ const operator = cond.operation().value(); // e.g. 'StringEquals' or 'ForAnyValue:StringLike'
158
+ const conditionKey = cond.conditionKey(); // e.g. 'aws:username'
159
+ const values = cond.conditionValues(); // array of strings
160
+ if (!conditionMap[operator]) {
161
+ conditionMap[operator] = {};
162
+ }
163
+ // If the same operator + key appear multiple times, we can merge them into an array
164
+ if (!conditionMap[operator][conditionKey]) {
165
+ // If there's only 1 value, store it directly. If >1, store array:
166
+ conditionMap[operator][conditionKey] = values.length === 1 ? values[0] : values;
167
+ }
168
+ else {
169
+ // Already have something there; ensure it’s an array and push new values
170
+ const existing = conditionMap[operator][conditionKey];
171
+ if (Array.isArray(existing)) {
172
+ existing.push(...values);
173
+ }
174
+ else {
175
+ // Convert existing single string to array
176
+ conditionMap[operator][conditionKey] = [existing, ...values];
177
+ }
178
+ }
179
+ }
180
+ sb.pushLine('conditions: {');
181
+ sb.withIndent((condBuffer) => {
182
+ Object.entries(conditionMap).forEach(([op, keyMap]) => {
183
+ condBuffer.pushLine(`${op}: {`);
184
+ condBuffer.withIndent((opBuffer) => {
185
+ Object.entries(keyMap).forEach(([k, val]) => {
186
+ if (Array.isArray(val)) {
187
+ // Convert to TS array e.g. ["val1", "val2"]
188
+ opBuffer.pushLine(`"${k}": [`);
189
+ opBuffer.withIndent((arrBuffer) => {
190
+ val.forEach((v) => {
191
+ arrBuffer.pushLine(`"${v}",`);
192
+ });
193
+ });
194
+ opBuffer.pushLine('],');
195
+ }
196
+ else {
197
+ // Single string
198
+ opBuffer.pushLine(`"${k}": "${val}",`);
199
+ }
200
+ });
201
+ });
202
+ condBuffer.pushLine('},');
203
+ });
204
+ });
205
+ sb.pushLine('},');
206
+ }
207
+ }
208
+ //# sourceMappingURL=cdkTypescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdkTypescript.js","sourceRoot":"","sources":["../../../src/converters/cdkTypescript.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IACjC,OAAO,CAAC,MAAc,EAAE,EAAgB;QACtC,6DAA6D;QAC7D,kBAAkB;QAElB,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAA;QAC9D,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;YACnC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE;gBACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;gBACtC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE;oBACpC,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAA;oBACjD,WAAW,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,EAAE;wBACpC,MAAM;wBACN,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;4BACpB,UAAU,CAAC,QAAQ,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;wBACnD,CAAC;wBAED,sBAAsB;wBACtB,gFAAgF;wBAEhF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;wBACpD,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;4BACvB,UAAU,CAAC,QAAQ,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;wBACpE,CAAC;wBAED,uBAAuB;wBACvB,IAAI,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;4BAClC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;wBACjE,CAAC;6BAAM,IAAI,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;4BAC5C,iCAAiC;4BACjC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;wBACvE,CAAC;wBAED,2BAA2B;wBAC3B,IAAI,SAAS,CAAC,mBAAmB,EAAE,EAAE,CAAC;4BACpC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;wBACvE,CAAC;6BAAM,IAAI,SAAS,CAAC,sBAAsB,EAAE,EAAE,CAAC;4BAC9C,mCAAmC;4BACnC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,CAAA;wBAC7E,CAAC;wBAED,6BAA6B;wBAC7B,IAAI,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;4BACrC,IAAI,CAAC,iBAAiB,CACpB,SAAS,CAAC,UAAU,EAAE,EACtB,YAAY,EACZ,SAAS,CAAC,0BAA0B,EAAE,EACtC,UAAU,CACX,CAAA;wBACH,CAAC;6BAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,EAAE,CAAC;4BAC/C,IAAI,CAAC,iBAAiB,CACpB,SAAS,CAAC,aAAa,EAAE,EACzB,eAAe,EACf,SAAS,CAAC,6BAA6B,EAAE,EACzC,UAAU,CACX,CAAA;wBACH,CAAC;wBAED,aAAa;wBACb,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,CAAA;oBAC5D,CAAC,CAAC,CAAA;oBAEF,IAAI,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBAC5B,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;oBAC7B,CAAC;oBACD,8FAA8F;gBAChG,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YACF,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAEO,cAAc,CACpB,OAAiB,EACjB,YAAsC,EACtC,EAAgB;QAEhB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAA;QACjC,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;YACpC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAChC,IAAI,YAAY,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAA;gBACxC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;oBACtB,YAAY,IAAI,GAAG,CAAA;gBACrB,CAAC;gBACD,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAClC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAEO,gBAAgB,CACtB,SAAqB,EACrB,YAA0C,EAC1C,EAAgB;QAEhB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QAED,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAA;QACjC,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,SAAS,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAED;;;OAGG;IACK,iBAAiB,CACvB,UAAuB,EACvB,YAA4C,EAC5C,iBAA0B,EAC1B,EAAgB;QAEhB,IAAI,iBAAiB,EAAE,CAAC;YACtB,iDAAiD;YACjD,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,6BAA6B,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QAED,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAA;QACjC,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,6CAA6C;gBACnE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;gBAEvB,IAAI,aAAa,GAAG,EAAE,CAAA;gBACtB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACnB,qCAAqC;oBACrC,aAAa,GAAG,yBAAyB,KAAK,IAAI,CAAA;gBACpD,CAAC;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,aAAa,GAAG,6BAA6B,KAAK,IAAI,CAAA;gBACxD,CAAC;qBAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChC,6FAA6F;oBAC7F,aAAa,GAAG,+BAA+B,KAAK,IAAI,CAAA;gBAC1D,CAAC;qBAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;oBACpC,aAAa,GAAG,mCAAmC,KAAK,IAAI,CAAA;gBAC9D,CAAC;qBAAM,CAAC;oBACN,gDAAgD;oBAChD,mFAAmF;oBACnF,aAAa,GAAG,yBAAyB,KAAK,IAAI,CAAA;gBACpD,CAAC;gBAED,SAAS,CAAC,QAAQ,CAAC,GAAG,aAAa,GAAG,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAED;;;;;;;;;;OAUG;IACK,iBAAiB,CAAC,UAAuB,EAAE,EAAgB;QACjE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QAED,0EAA0E;QAC1E,sFAAsF;QACtF,MAAM,YAAY,GAAsD,EAAE,CAAA;QAE1E,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAA,CAAC,kDAAkD;YAC5F,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA,CAAC,sBAAsB;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA,CAAC,mBAAmB;YACzD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;YAC7B,CAAC;YACD,oFAAoF;YACpF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1C,kEAAkE;gBAClE,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACjF,CAAC;iBAAM,CAAC;gBACN,yEAAyE;gBACzE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAA;gBACrD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAA;gBAC1B,CAAC;qBAAM,CAAC;oBACN,0CAA0C;oBAC1C,YAAY,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAA;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;QAED,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAC5B,EAAE,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,EAAE;YAC3B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;gBACpD,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC/B,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACjC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE;wBAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;4BACvB,4CAA4C;4BAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;4BAC9B,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;gCAChC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oCAChB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gCAC/B,CAAC,CAAC,CAAA;4BACJ,CAAC,CAAC,CAAA;4BACF,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;wBACzB,CAAC;6BAAM,CAAC;4BACN,gBAAgB;4BAChB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;wBACxC,CAAC;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;gBACF,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;CACF"}
@@ -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.2",
3
+ "version": "0.1.4",
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.12"
59
+ "@cloud-copilot/iam-policy": "^0.1.14"
60
60
  },
61
61
  "prettier": "@cloud-copilot/prettier-config",
62
62
  "release": {