@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 +1 -1
- package/dist/cjs/cli.js +2 -2
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/convert.d.ts +4 -0
- package/dist/cjs/convert.d.ts.map +1 -1
- package/dist/cjs/convert.js +5 -1
- package/dist/cjs/convert.js.map +1 -1
- package/dist/cjs/converters/cdkTypescript.d.ts +30 -0
- package/dist/cjs/converters/cdkTypescript.d.ts.map +1 -0
- package/dist/cjs/converters/cdkTypescript.js +212 -0
- package/dist/cjs/converters/cdkTypescript.js.map +1 -0
- 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 +4 -0
- package/dist/esm/convert.d.ts.map +1 -1
- package/dist/esm/convert.js +5 -1
- package/dist/esm/convert.js.map +1 -1
- package/dist/esm/converters/cdkTypescript.d.ts +30 -0
- package/dist/esm/converters/cdkTypescript.d.ts.map +1 -0
- package/dist/esm/converters/cdkTypescript.js +208 -0
- package/dist/esm/converters/cdkTypescript.js.map +1 -0
- 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', '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,
|
|
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,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
|
|
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"}
|
package/dist/cjs/convert.js
CHANGED
|
@@ -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
|
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":";;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":"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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', '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,
|
|
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":"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"}
|
package/dist/esm/convert.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/esm/convert.js
CHANGED
|
@@ -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
|
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,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":"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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,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.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.
|
|
59
|
+
"@cloud-copilot/iam-policy": "^0.1.14"
|
|
60
60
|
},
|
|
61
61
|
"prettier": "@cloud-copilot/prettier-config",
|
|
62
62
|
"release": {
|