@cloud-copilot/iam-convert 0.1.1

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.
Files changed (68) hide show
  1. package/LICENSE.txt +661 -0
  2. package/dist/cjs/cli.d.ts +3 -0
  3. package/dist/cjs/cli.d.ts.map +1 -0
  4. package/dist/cjs/cli.js +80 -0
  5. package/dist/cjs/cli.js.map +1 -0
  6. package/dist/cjs/convert.d.ts +22 -0
  7. package/dist/cjs/convert.d.ts.map +1 -0
  8. package/dist/cjs/convert.js +31 -0
  9. package/dist/cjs/convert.js.map +1 -0
  10. package/dist/cjs/converters/converter.d.ts +12 -0
  11. package/dist/cjs/converters/converter.d.ts.map +1 -0
  12. package/dist/cjs/converters/converter.js +3 -0
  13. package/dist/cjs/converters/converter.js.map +1 -0
  14. package/dist/cjs/converters/terraform.d.ts +14 -0
  15. package/dist/cjs/converters/terraform.d.ts.map +1 -0
  16. package/dist/cjs/converters/terraform.js +150 -0
  17. package/dist/cjs/converters/terraform.js.map +1 -0
  18. package/dist/cjs/defaults.d.ts +5 -0
  19. package/dist/cjs/defaults.d.ts.map +1 -0
  20. package/dist/cjs/defaults.js +8 -0
  21. package/dist/cjs/defaults.js.map +1 -0
  22. package/dist/cjs/index.d.ts +2 -0
  23. package/dist/cjs/index.d.ts.map +1 -0
  24. package/dist/cjs/index.js +6 -0
  25. package/dist/cjs/index.js.map +1 -0
  26. package/dist/cjs/package.json +3 -0
  27. package/dist/cjs/util/StringBuffer.d.ts +36 -0
  28. package/dist/cjs/util/StringBuffer.d.ts.map +1 -0
  29. package/dist/cjs/util/StringBuffer.js +58 -0
  30. package/dist/cjs/util/StringBuffer.js.map +1 -0
  31. package/dist/cjs/util/json.d.ts +8 -0
  32. package/dist/cjs/util/json.d.ts.map +1 -0
  33. package/dist/cjs/util/json.js +18 -0
  34. package/dist/cjs/util/json.js.map +1 -0
  35. package/dist/esm/cli.d.ts +3 -0
  36. package/dist/esm/cli.d.ts.map +1 -0
  37. package/dist/esm/cli.js +78 -0
  38. package/dist/esm/cli.js.map +1 -0
  39. package/dist/esm/convert.d.ts +22 -0
  40. package/dist/esm/convert.d.ts.map +1 -0
  41. package/dist/esm/convert.js +28 -0
  42. package/dist/esm/convert.js.map +1 -0
  43. package/dist/esm/converters/converter.d.ts +12 -0
  44. package/dist/esm/converters/converter.d.ts.map +1 -0
  45. package/dist/esm/converters/converter.js +2 -0
  46. package/dist/esm/converters/converter.js.map +1 -0
  47. package/dist/esm/converters/terraform.d.ts +14 -0
  48. package/dist/esm/converters/terraform.d.ts.map +1 -0
  49. package/dist/esm/converters/terraform.js +146 -0
  50. package/dist/esm/converters/terraform.js.map +1 -0
  51. package/dist/esm/defaults.d.ts +5 -0
  52. package/dist/esm/defaults.d.ts.map +1 -0
  53. package/dist/esm/defaults.js +5 -0
  54. package/dist/esm/defaults.js.map +1 -0
  55. package/dist/esm/index.d.ts +2 -0
  56. package/dist/esm/index.d.ts.map +1 -0
  57. package/dist/esm/index.js +2 -0
  58. package/dist/esm/index.js.map +1 -0
  59. package/dist/esm/package.json +3 -0
  60. package/dist/esm/util/StringBuffer.d.ts +36 -0
  61. package/dist/esm/util/StringBuffer.d.ts.map +1 -0
  62. package/dist/esm/util/StringBuffer.js +52 -0
  63. package/dist/esm/util/StringBuffer.js.map +1 -0
  64. package/dist/esm/util/json.d.ts +8 -0
  65. package/dist/esm/util/json.d.ts.map +1 -0
  66. package/dist/esm/util/json.js +15 -0
  67. package/dist/esm/util/json.js.map +1 -0
  68. package/package.json +55 -0
@@ -0,0 +1,22 @@
1
+ import { Policy } from '@cloud-copilot/iam-policy';
2
+ import { TerraformConverter } from './converters/terraform.js';
3
+ declare const converters: {
4
+ /**
5
+ * Convert to Terraform
6
+ */
7
+ tf: typeof TerraformConverter;
8
+ };
9
+ /**
10
+ * Convert a policy to a string in the specified format
11
+ *
12
+ * @param policy the policy to convert, it is assumed to be valid
13
+ * @param format the format to convert to
14
+ * @param options optional options for the conversion
15
+ * @returns the policy as a string converted to the specified format
16
+ */
17
+ export declare function convert(policy: Policy, format: keyof typeof converters, options?: {
18
+ indentBy?: string;
19
+ lineSeparator?: string;
20
+ }): string;
21
+ export {};
22
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,28 @@
1
+ import { TerraformConverter } from './converters/terraform.js';
2
+ import { defaultOptions } from './defaults.js';
3
+ import { StringBuffer } from './util/StringBuffer.js';
4
+ const converters = {
5
+ /**
6
+ * Convert to Terraform
7
+ */
8
+ tf: TerraformConverter
9
+ };
10
+ /**
11
+ * Convert a policy to a string in the specified format
12
+ *
13
+ * @param policy the policy to convert, it is assumed to be valid
14
+ * @param format the format to convert to
15
+ * @param options optional options for the conversion
16
+ * @returns the policy as a string converted to the specified format
17
+ */
18
+ export function convert(policy, format, options) {
19
+ if (!converters[format]) {
20
+ throw new Error(`Unsupported format: ${format}`);
21
+ }
22
+ options = { ...defaultOptions, ...(options || {}) };
23
+ const converter = new converters[format]();
24
+ const stringBuffer = new StringBuffer(options.indentBy, options.lineSeparator);
25
+ converter.convert(policy, stringBuffer);
26
+ return stringBuffer.toString();
27
+ }
28
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ import { Policy } from "@cloud-copilot/iam-policy";
2
+ import { StringBuffer } from "../util/StringBuffer.js";
3
+ export interface Converter {
4
+ /**
5
+ * Converts the given policy to a new format in the given StringBuffer
6
+ *
7
+ * @param policy the policy to convert
8
+ * @param buffer the buffer to write the result to
9
+ */
10
+ convert(policy: Policy, buffer: StringBuffer): void;
11
+ }
12
+ //# sourceMappingURL=converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../../../src/converters/converter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
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 to a Terraform aws_iam_policy_document data object.
6
+ */
7
+ export declare class TerraformConverter implements Converter {
8
+ convert(policy: Policy, stringBuffer: StringBuffer): void;
9
+ private convertActions;
10
+ private convertResources;
11
+ private convertPrincipals;
12
+ private convertConditions;
13
+ }
14
+ //# sourceMappingURL=terraform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../../src/converters/terraform.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;;GAEG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAoElD,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iBAAiB;IAqDzB,OAAO,CAAC,iBAAiB;CAuB1B"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Converts an IAM policy to a Terraform aws_iam_policy_document data object.
3
+ */
4
+ export class TerraformConverter {
5
+ convert(policy, stringBuffer) {
6
+ stringBuffer.pushLine(`data "aws_iam_policy_document" "policy" {`);
7
+ stringBuffer.withIndent((policyBuffer) => {
8
+ if (policy.version() && policy.version() !== '2012-10-17') {
9
+ policyBuffer.pushLine(`version = "${policy.version()}"`);
10
+ }
11
+ for (const statement of policy.statements()) {
12
+ policyBuffer.pushLine(`statement {`);
13
+ policyBuffer.withIndent((statementBuffer) => {
14
+ if (statement.sid()) {
15
+ statementBuffer.pushLine(`sid = "${statement.sid()}"`);
16
+ statementBuffer.pushLine('');
17
+ }
18
+ if (statement.isDeny()) {
19
+ statementBuffer.pushLine(`effect = "Deny"`);
20
+ }
21
+ if (statement.isActionStatement()) {
22
+ statementBuffer.pushLine(`actions = [`);
23
+ this.convertActions(statement.actions(), statementBuffer);
24
+ statementBuffer.pushLine(`]`);
25
+ }
26
+ if (statement.isNotActionStatement()) {
27
+ statementBuffer.pushLine(`not_actions = [`);
28
+ this.convertActions(statement.notActions(), statementBuffer);
29
+ statementBuffer.pushLine(`]`);
30
+ }
31
+ if (statement.isResourceStatement()) {
32
+ statementBuffer.pushLine(`resources = [`);
33
+ this.convertResources(statement.resources(), statementBuffer);
34
+ statementBuffer.pushLine(`]`);
35
+ }
36
+ if (statement.isNotResourceStatement()) {
37
+ statementBuffer.pushLine(`not_resources = [`);
38
+ this.convertResources(statement.notResources(), statementBuffer);
39
+ statementBuffer.pushLine(`]`);
40
+ }
41
+ if (statement.isPrincipalStatement()) {
42
+ this.convertPrincipals(statement.principals(), 'principals', statement.hasSingleWildcardPrincipal(), statementBuffer);
43
+ }
44
+ if (statement.isNotPrincipalStatement()) {
45
+ this.convertPrincipals(statement.notPrincipals(), 'not_principals', statement.hasSingleWildcardNotPrincipal(), statementBuffer);
46
+ }
47
+ this.convertConditions(statement.conditions(), statementBuffer);
48
+ });
49
+ stringBuffer.pushLine(`}`);
50
+ }
51
+ });
52
+ stringBuffer.indent();
53
+ stringBuffer.unindent();
54
+ stringBuffer.pushLine(`}`);
55
+ return;
56
+ }
57
+ convertActions(actions, statementBuffer) {
58
+ const actionCount = actions.length;
59
+ statementBuffer.withIndent((actionsBuffer) => {
60
+ actions.forEach((action, index) => {
61
+ let actionString = `"${action.value()}"`;
62
+ if (actionCount > 1 && index < actionCount - 1) {
63
+ actionString += ',';
64
+ }
65
+ actionsBuffer.pushLine(actionString);
66
+ });
67
+ });
68
+ }
69
+ convertResources(resources, statementBuffer) {
70
+ const resourceCount = resources.length;
71
+ statementBuffer.withIndent((resourcesBuffer) => {
72
+ resources.forEach((resource, index) => {
73
+ let resourceString = `"${resource.value()}"`;
74
+ if (resourceCount > 1 && index < resourceCount - 1) {
75
+ resourceString += ',';
76
+ }
77
+ resourcesBuffer.pushLine(resourceString);
78
+ });
79
+ });
80
+ }
81
+ convertPrincipals(principals, principalType, hasSingleWildcard, statementBuffer) {
82
+ if (hasSingleWildcard) {
83
+ statementBuffer.pushLine(`${principalType} {`);
84
+ statementBuffer.withIndent((principalBuffer) => {
85
+ principalBuffer.pushLine(`type = "*"`);
86
+ principalBuffer.pushLine(`identifiers = "*"`);
87
+ });
88
+ statementBuffer.pushLine(`}`);
89
+ statementBuffer.pushLine('');
90
+ return;
91
+ }
92
+ const principalsByType = principals.reduce((acc, principal) => {
93
+ const type = principal.type();
94
+ if (!acc[type]) {
95
+ acc[type] = [];
96
+ }
97
+ acc[type].push(principal);
98
+ return acc;
99
+ }, {});
100
+ for (const type in principalsByType) {
101
+ statementBuffer.pushLine(`${principalType} {`);
102
+ statementBuffer.withIndent((principalBuffer) => {
103
+ principalBuffer.pushLine(`type = "${type}"`);
104
+ principalBuffer.pushLine(`identifiers = [`);
105
+ const principalsForType = principalsByType[type];
106
+ const principalCount = principalsForType.length;
107
+ principalBuffer.withIndent((identifiersBuffer) => {
108
+ principalsForType.forEach((principal, index) => {
109
+ let identifierString = `"${principal.value()}"`;
110
+ if (principalCount > 1 && index < principalCount - 1) {
111
+ identifierString += ',';
112
+ }
113
+ identifiersBuffer.pushLine(identifierString);
114
+ });
115
+ });
116
+ principalBuffer.pushLine(`]`);
117
+ });
118
+ statementBuffer.pushLine(`}`);
119
+ statementBuffer.pushLine('');
120
+ }
121
+ }
122
+ convertConditions(conditions, statementBuffer) {
123
+ for (const condition of conditions) {
124
+ statementBuffer.pushLine(`condition {`);
125
+ statementBuffer.withIndent((conditionBuffer) => {
126
+ conditionBuffer.pushLine(`test = "${condition.operation().value()}"`);
127
+ conditionBuffer.pushLine(`variable = "${condition.conditionKey()}"`);
128
+ conditionBuffer.pushLine(`values = [`);
129
+ const numberOfValues = condition.conditionValues().length;
130
+ conditionBuffer.withIndent((valuesBuffer) => {
131
+ condition.conditionValues().forEach((value, index) => {
132
+ let valueString = `"${value}"`;
133
+ if (numberOfValues > 1 && index < numberOfValues - 1) {
134
+ valueString += ',';
135
+ }
136
+ valuesBuffer.pushLine(valueString);
137
+ });
138
+ });
139
+ conditionBuffer.pushLine(']');
140
+ });
141
+ statementBuffer.pushLine('}');
142
+ statementBuffer.pushLine('');
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=terraform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../src/converters/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const defaultOptions: {
2
+ indentBy: string;
3
+ lineSeparator: string;
4
+ };
5
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;CAG1B,CAAA"}
@@ -0,0 +1,5 @@
1
+ export const defaultOptions = {
2
+ indentBy: ' ',
3
+ lineSeparator: '\n'
4
+ };
5
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,IAAI;CACpB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { convert } from './convert.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { convert } from './convert.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,36 @@
1
+ export declare class StringBuffer {
2
+ private buffer;
3
+ private indentLevel;
4
+ private indentBy;
5
+ private lineSeparator;
6
+ constructor(indentBy?: string, lineSeparator?: string);
7
+ /**
8
+ * Executes a callback the indent level increased by one level
9
+ */
10
+ withIndent(callback: (buffer: StringBuffer) => void): void;
11
+ /**
12
+ * Adds a new line to the buffer
13
+ * @param text the text to add
14
+ */
15
+ pushLine(text: string): void;
16
+ /**
17
+ * Increases the indent level
18
+ */
19
+ indent(): void;
20
+ /**
21
+ * Decreases the indent level
22
+ */
23
+ unindent(): void;
24
+ /**
25
+ * Create the final string from the buffer
26
+ * @returns the final string of each line joined by a new line
27
+ */
28
+ toString(): string;
29
+ /**
30
+ * Get the current buffer contents
31
+ *
32
+ * @returns the string array of buffer contents
33
+ */
34
+ getBuffer(): string[];
35
+ }
36
+ //# sourceMappingURL=StringBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringBuffer.d.ts","sourceRoot":"","sources":["../../../src/util/StringBuffer.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAQ;gBAEV,QAAQ,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;IAK5D;;OAEG;IACI,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAMjE;;;OAGG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACI,MAAM,IAAI,IAAI;IAIrB;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIzB;;;;OAIG;IACI,SAAS,IAAI,MAAM,EAAE;CAG7B"}
@@ -0,0 +1,52 @@
1
+ export class StringBuffer {
2
+ constructor(indentBy, lineSeparator) {
3
+ this.buffer = [];
4
+ this.indentLevel = 0;
5
+ this.indentBy = indentBy ?? ' ';
6
+ this.lineSeparator = lineSeparator ?? '\n';
7
+ }
8
+ /**
9
+ * Executes a callback the indent level increased by one level
10
+ */
11
+ withIndent(callback) {
12
+ this.indent();
13
+ callback(this);
14
+ this.unindent();
15
+ }
16
+ /**
17
+ * Adds a new line to the buffer
18
+ * @param text the text to add
19
+ */
20
+ pushLine(text) {
21
+ const indent = this.indentBy.repeat(this.indentLevel);
22
+ this.buffer.push(indent + text);
23
+ }
24
+ /**
25
+ * Increases the indent level
26
+ */
27
+ indent() {
28
+ this.indentLevel++;
29
+ }
30
+ /**
31
+ * Decreases the indent level
32
+ */
33
+ unindent() {
34
+ this.indentLevel = Math.max(this.indentLevel - 1, 0);
35
+ }
36
+ /**
37
+ * Create the final string from the buffer
38
+ * @returns the final string of each line joined by a new line
39
+ */
40
+ toString() {
41
+ return this.buffer.join(this.lineSeparator);
42
+ }
43
+ /**
44
+ * Get the current buffer contents
45
+ *
46
+ * @returns the string array of buffer contents
47
+ */
48
+ getBuffer() {
49
+ return this.buffer;
50
+ }
51
+ }
52
+ //# sourceMappingURL=StringBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringBuffer.js","sourceRoot":"","sources":["../../../src/util/StringBuffer.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAY;IAMvB,YAAmB,QAAiB,EAAE,aAAsB;QALpD,WAAM,GAAa,EAAE,CAAA;QACrB,gBAAW,GAAG,CAAC,CAAA;QAKrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAA;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,IAAI,CAAA;IAC5C,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,QAAwC;QACxD,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,IAAY;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACjC,CAAC;IAED;;OAEG;IACI,MAAM;QACX,IAAI,CAAC,WAAW,EAAE,CAAA;IACpB,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACtD,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IAED;;;;OAIG;IACI,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Try to parse a string as JSON. If the string is not valid JSON, return undefined.
3
+ *
4
+ * @param input the string to parse
5
+ * @returns the parsed JSON or undefined if the input is not valid JSON
6
+ */
7
+ export declare function tryParseJson(input: string): any | undefined;
8
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/util/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAM3D"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Try to parse a string as JSON. If the string is not valid JSON, return undefined.
3
+ *
4
+ * @param input the string to parse
5
+ * @returns the parsed JSON or undefined if the input is not valid JSON
6
+ */
7
+ export function tryParseJson(input) {
8
+ try {
9
+ return JSON.parse(input);
10
+ }
11
+ catch (e) {
12
+ return undefined;
13
+ }
14
+ }
15
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/util/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@cloud-copilot/iam-convert",
3
+ "version": "0.1.1",
4
+ "description": "Convert AWS IAM JSON policies to other formats",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/cloud-copilot/iam-convert.git"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/**/*"
17
+ ],
18
+ "types": "dist/cjs/index.d.ts",
19
+ "bin": {
20
+ "iam-convert": "dist/esm/cli.js"
21
+ },
22
+ "scripts": {
23
+ "build": "npx tsc -p tsconfig.cjs.json && npx tsc -p tsconfig.esm.json && ./postbuild.sh",
24
+ "clean": "rm -rf dist",
25
+ "test": "npx vitest --run --coverage",
26
+ "release": "npm run clean && npm run build && npm run test && npm run format-check && npm publish",
27
+ "format": "npx prettier --write src/",
28
+ "format-check": "npx prettier --check src/"
29
+ },
30
+ "keywords": [
31
+ "AWS",
32
+ "IAM",
33
+ "terraform",
34
+ "cloudformation",
35
+ "cdk"
36
+ ],
37
+ "author": "David Kerber <dave@cloudcopilot.io>",
38
+ "license": "AGPL-3.0-or-later",
39
+ "bugs": {
40
+ "url": "https://github.com/cloud-copilot/iam-convert/issues"
41
+ },
42
+ "homepage": "https://github.com/cloud-copilot/iam-convert#readme",
43
+ "devDependencies": {
44
+ "@cloud-copilot/prettier-config": "^0.1.1",
45
+ "@types/node": "^22.5.0",
46
+ "@vitest/coverage-v8": "^2.0.5",
47
+ "typescript": "^5.5.4",
48
+ "vitest": "^2.0.5"
49
+ },
50
+ "dependencies": {
51
+ "@cloud-copilot/cli": "^0.1.1",
52
+ "@cloud-copilot/iam-policy": "^0.1.12"
53
+ },
54
+ "prettier": "@cloud-copilot/prettier-config"
55
+ }