@composurecdk/iam 0.7.0 → 0.8.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 (63) hide show
  1. package/dist/commonjs/index.d.ts.map +1 -0
  2. package/dist/commonjs/index.js +16 -0
  3. package/dist/commonjs/index.js.map +1 -0
  4. package/dist/commonjs/managed-policy-builder.d.ts.map +1 -0
  5. package/dist/commonjs/managed-policy-builder.js +45 -0
  6. package/dist/commonjs/managed-policy-builder.js.map +1 -0
  7. package/dist/commonjs/package.json +3 -0
  8. package/dist/commonjs/role-builder.d.ts.map +1 -0
  9. package/dist/commonjs/role-builder.js +78 -0
  10. package/dist/commonjs/role-builder.js.map +1 -0
  11. package/dist/commonjs/role-defaults.d.ts.map +1 -0
  12. package/dist/commonjs/role-defaults.js +24 -0
  13. package/dist/commonjs/role-defaults.js.map +1 -0
  14. package/dist/commonjs/service-role-builder.d.ts.map +1 -0
  15. package/dist/commonjs/service-role-builder.js +30 -0
  16. package/dist/commonjs/service-role-builder.js.map +1 -0
  17. package/dist/commonjs/statement-builder.d.ts.map +1 -0
  18. package/dist/commonjs/statement-builder.js +158 -0
  19. package/dist/commonjs/statement-builder.js.map +1 -0
  20. package/dist/esm/index.d.ts +6 -0
  21. package/dist/esm/index.d.ts.map +1 -0
  22. package/dist/esm/index.js.map +1 -0
  23. package/dist/esm/managed-policy-builder.d.ts +62 -0
  24. package/dist/esm/managed-policy-builder.d.ts.map +1 -0
  25. package/dist/esm/managed-policy-builder.js.map +1 -0
  26. package/dist/esm/package.json +3 -0
  27. package/dist/esm/role-builder.d.ts +113 -0
  28. package/dist/esm/role-builder.d.ts.map +1 -0
  29. package/dist/esm/role-builder.js.map +1 -0
  30. package/dist/esm/role-defaults.d.ts +8 -0
  31. package/dist/esm/role-defaults.d.ts.map +1 -0
  32. package/dist/esm/role-defaults.js.map +1 -0
  33. package/dist/esm/service-role-builder.d.ts +24 -0
  34. package/dist/esm/service-role-builder.d.ts.map +1 -0
  35. package/dist/esm/service-role-builder.js.map +1 -0
  36. package/dist/esm/statement-builder.d.ts +83 -0
  37. package/dist/esm/statement-builder.d.ts.map +1 -0
  38. package/dist/esm/statement-builder.js.map +1 -0
  39. package/package.json +35 -17
  40. package/dist/index.d.ts.map +0 -1
  41. package/dist/index.js.map +0 -1
  42. package/dist/managed-policy-builder.d.ts.map +0 -1
  43. package/dist/managed-policy-builder.js.map +0 -1
  44. package/dist/role-builder.d.ts.map +0 -1
  45. package/dist/role-builder.js.map +0 -1
  46. package/dist/role-defaults.d.ts.map +0 -1
  47. package/dist/role-defaults.js.map +0 -1
  48. package/dist/service-role-builder.d.ts.map +0 -1
  49. package/dist/service-role-builder.js.map +0 -1
  50. package/dist/statement-builder.d.ts.map +0 -1
  51. package/dist/statement-builder.js.map +0 -1
  52. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  53. /package/dist/{managed-policy-builder.d.ts → commonjs/managed-policy-builder.d.ts} +0 -0
  54. /package/dist/{role-builder.d.ts → commonjs/role-builder.d.ts} +0 -0
  55. /package/dist/{role-defaults.d.ts → commonjs/role-defaults.d.ts} +0 -0
  56. /package/dist/{service-role-builder.d.ts → commonjs/service-role-builder.d.ts} +0 -0
  57. /package/dist/{statement-builder.d.ts → commonjs/statement-builder.d.ts} +0 -0
  58. /package/dist/{index.js → esm/index.js} +0 -0
  59. /package/dist/{managed-policy-builder.js → esm/managed-policy-builder.js} +0 -0
  60. /package/dist/{role-builder.js → esm/role-builder.js} +0 -0
  61. /package/dist/{role-defaults.js → esm/role-defaults.js} +0 -0
  62. /package/dist/{service-role-builder.js → esm/service-role-builder.js} +0 -0
  63. /package/dist/{statement-builder.js → esm/statement-builder.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WildcardResourceError = exports.StatementBuilder = exports.createStatementBuilder = exports.createServiceRoleBuilder = exports.createManagedPolicyBuilder = exports.ROLE_DEFAULTS = exports.createRoleBuilder = void 0;
4
+ var role_builder_js_1 = require("./role-builder.js");
5
+ Object.defineProperty(exports, "createRoleBuilder", { enumerable: true, get: function () { return role_builder_js_1.createRoleBuilder; } });
6
+ var role_defaults_js_1 = require("./role-defaults.js");
7
+ Object.defineProperty(exports, "ROLE_DEFAULTS", { enumerable: true, get: function () { return role_defaults_js_1.ROLE_DEFAULTS; } });
8
+ var managed_policy_builder_js_1 = require("./managed-policy-builder.js");
9
+ Object.defineProperty(exports, "createManagedPolicyBuilder", { enumerable: true, get: function () { return managed_policy_builder_js_1.createManagedPolicyBuilder; } });
10
+ var service_role_builder_js_1 = require("./service-role-builder.js");
11
+ Object.defineProperty(exports, "createServiceRoleBuilder", { enumerable: true, get: function () { return service_role_builder_js_1.createServiceRoleBuilder; } });
12
+ var statement_builder_js_1 = require("./statement-builder.js");
13
+ Object.defineProperty(exports, "createStatementBuilder", { enumerable: true, get: function () { return statement_builder_js_1.createStatementBuilder; } });
14
+ Object.defineProperty(exports, "StatementBuilder", { enumerable: true, get: function () { return statement_builder_js_1.StatementBuilder; } });
15
+ Object.defineProperty(exports, "WildcardResourceError", { enumerable: true, get: function () { return statement_builder_js_1.WildcardResourceError; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAK2B;AAJzB,oHAAA,iBAAiB,OAAA;AAKnB,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,yEAKqC;AAJnC,uIAAA,0BAA0B,OAAA;AAK5B,qEAAqE;AAA5D,mIAAA,wBAAwB,OAAA;AACjC,+DAIgC;AAH9B,8HAAA,sBAAsB,OAAA;AACtB,wHAAA,gBAAgB,OAAA;AAChB,6HAAA,qBAAqB,OAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-policy-builder.d.ts","sourceRoot":"","sources":["../../src/managed-policy-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AAE9F,cAAM,oBAAqB,YAAW,SAAS,CAAC,0BAA0B,CAAC;;IACzE,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAM;IAG/C;;;;;;OAMG;IACH,aAAa,CAAC,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GAAG,IAAI;IAKvE,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAIhD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,0BAA0B;CAajE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAGlE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createManagedPolicyBuilder = createManagedPolicyBuilder;
4
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
5
+ const core_1 = require("@composurecdk/core");
6
+ const statement_builder_js_1 = require("./statement-builder.js");
7
+ class ManagedPolicyBuilder {
8
+ props = {};
9
+ #extraStatements = [];
10
+ /**
11
+ * Append policy statements to the managed policy.
12
+ *
13
+ * Accepts either {@link PolicyStatement} or {@link StatementBuilder}.
14
+ * Statement builders are resolved during {@link build} so wildcard-resource
15
+ * validation runs at the composition boundary.
16
+ */
17
+ addStatements(statements) {
18
+ this.#extraStatements.push(...statements);
19
+ return this;
20
+ }
21
+ /** @internal — see ADR-0005. */
22
+ [core_1.COPY_STATE](target) {
23
+ target.#extraStatements.push(...this.#extraStatements);
24
+ }
25
+ build(scope, id) {
26
+ const resolvedExtras = this.#extraStatements.map((s) => s instanceof statement_builder_js_1.StatementBuilder ? s.build() : s);
27
+ const mergedProps = {
28
+ ...this.props,
29
+ statements: [...(this.props.statements ?? []), ...resolvedExtras],
30
+ };
31
+ const policy = new aws_iam_1.ManagedPolicy(scope, id, mergedProps);
32
+ return { policy };
33
+ }
34
+ }
35
+ /**
36
+ * Creates a new {@link IManagedPolicyBuilder} for configuring an AWS IAM
37
+ * customer-managed policy.
38
+ *
39
+ * @returns A fluent builder for a customer-managed policy.
40
+ */
41
+ function createManagedPolicyBuilder() {
42
+ // eslint-disable-next-line composurecdk/builder-must-be-tagged -- AWS::IAM::ManagedPolicy has no Tags property
43
+ return (0, core_1.Builder)(ManagedPolicyBuilder);
44
+ }
45
+ //# sourceMappingURL=managed-policy-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-policy-builder.js","sourceRoot":"","sources":["../../src/managed-policy-builder.ts"],"names":[],"mappings":";;AAqFA,gEAGC;AAxFD,iDAA8F;AAE9F,6CAAwF;AACxF,iEAA0D;AAwC1D,MAAM,oBAAoB;IACxB,KAAK,GAAuC,EAAE,CAAC;IACtC,gBAAgB,GAA2C,EAAE,CAAC;IAEvE;;;;;;OAMG;IACH,aAAa,CAAC,UAAkD;QAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAA4B;QACvC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrD,CAAC,YAAY,uCAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;QAEF,MAAM,WAAW,GAAuB;YACtC,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC;SAClE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,uBAAa,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B;IACxC,+GAA+G;IAC/G,OAAO,IAAA,cAAO,EAAkD,oBAAoB,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-builder.d.ts","sourceRoot":"","sources":["../../src/role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,IAAI,EACJ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC9E;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAOzE,cAAM,WAAY,YAAW,SAAS,CAAC,iBAAiB,CAAC;;IACvD,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAM;IAGtC;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GACjD,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIvC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,iBAAiB;CA8C9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAEhD"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRoleBuilder = createRoleBuilder;
4
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
5
+ const core_1 = require("@composurecdk/core");
6
+ const cloudformation_1 = require("@composurecdk/cloudformation");
7
+ const role_defaults_js_1 = require("./role-defaults.js");
8
+ const statement_builder_js_1 = require("./statement-builder.js");
9
+ class RoleBuilder {
10
+ props = {};
11
+ #inlinePolicies = [];
12
+ /**
13
+ * Append an inline policy to the role, embedded in the underlying
14
+ * `AWS::IAM::Role` resource's `Policies` array. The policy name becomes
15
+ * the key under which the resulting {@link PolicyDocument} appears in
16
+ * {@link RoleBuilderResult.inlinePolicies}.
17
+ *
18
+ * Accepts either {@link PolicyStatement} instances or
19
+ * {@link StatementBuilder}s (which are built lazily during {@link build}
20
+ * so that wildcard-resource validation runs at the composition boundary
21
+ * rather than at configuration time).
22
+ */
23
+ addInlinePolicyStatements(name, statements) {
24
+ this.#inlinePolicies.push({ name, statements });
25
+ return this;
26
+ }
27
+ /** @internal — see ADR-0005. */
28
+ [core_1.COPY_STATE](target) {
29
+ target.#inlinePolicies.push(...this.#inlinePolicies);
30
+ }
31
+ build(scope, id, context = {}) {
32
+ const { permissionsBoundary, assumedBy, inlinePolicies: propsInlinePolicies, ...rest } = this.props;
33
+ if (!assumedBy) {
34
+ throw new Error(`RoleBuilder "${id}": assumedBy(...) must be called before build(). ` +
35
+ `An IAM role requires a trust policy principal.`);
36
+ }
37
+ const resolvedBoundary = permissionsBoundary
38
+ ? (0, core_1.resolve)(permissionsBoundary, context)
39
+ : undefined;
40
+ const addedInlinePolicies = {};
41
+ for (const entry of this.#inlinePolicies) {
42
+ const resolvedStatements = entry.statements.map((s) => s instanceof statement_builder_js_1.StatementBuilder ? s.build() : s);
43
+ addedInlinePolicies[entry.name] = new aws_iam_1.PolicyDocument({ statements: resolvedStatements });
44
+ }
45
+ const mergedInlinePolicies = {
46
+ ...(propsInlinePolicies ?? {}),
47
+ ...addedInlinePolicies,
48
+ };
49
+ const mergedProps = {
50
+ ...role_defaults_js_1.ROLE_DEFAULTS,
51
+ ...rest,
52
+ assumedBy,
53
+ ...(Object.keys(mergedInlinePolicies).length > 0
54
+ ? { inlinePolicies: mergedInlinePolicies }
55
+ : {}),
56
+ ...(resolvedBoundary ? { permissionsBoundary: resolvedBoundary } : {}),
57
+ };
58
+ const role = new aws_iam_1.Role(scope, id, mergedProps);
59
+ return { role, inlinePolicies: addedInlinePolicies };
60
+ }
61
+ }
62
+ /**
63
+ * Creates a new {@link IRoleBuilder} for configuring an AWS IAM role.
64
+ *
65
+ * @returns A fluent builder for an AWS IAM role.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const role = createRoleBuilder()
70
+ * .assumedBy(new ServicePrincipal("lambda.amazonaws.com"))
71
+ * .description("Lambda execution role")
72
+ * .build(stack, "LambdaRole");
73
+ * ```
74
+ */
75
+ function createRoleBuilder() {
76
+ return (0, cloudformation_1.taggedBuilder)(RoleBuilder);
77
+ }
78
+ //# sourceMappingURL=role-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-builder.js","sourceRoot":"","sources":["../../src/role-builder.ts"],"names":[],"mappings":";;AAwLA,8CAEC;AA1LD,iDAM6B;AAE7B,6CAA0F;AAC1F,iEAAkF;AAClF,yDAAmD;AACnD,iEAA0D;AAoF1D,MAAM,WAAW;IACf,KAAK,GAA8B,EAAE,CAAC;IAC7B,eAAe,GAAwB,EAAE,CAAC;IAEnD;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAY,EACZ,UAAkD;QAElD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAAmB;QAC9B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU,EAAE,UAAkC,EAAE;QACvE,MAAM,EACJ,mBAAmB,EACnB,SAAS,EACT,cAAc,EAAE,mBAAmB,EACnC,GAAG,IAAI,EACR,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gBAAgB,EAAE,mDAAmD;gBACnE,gDAAgD,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,mBAAmB;YAC1C,CAAC,CAAC,IAAA,cAAO,EAAC,mBAAmB,EAAE,OAAO,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,mBAAmB,GAAmC,EAAE,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,YAAY,uCAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;YACF,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,wBAAc,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,oBAAoB,GAAmC;YAC3D,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;YAC9B,GAAG,mBAAmB;SACvB,CAAC;QAEF,MAAM,WAAW,GAAc;YAC7B,GAAG,gCAAa;YAChB,GAAG,IAAI;YACP,SAAS;YACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC;gBAC9C,CAAC,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,cAAI,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACvD,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,IAAA,8BAAa,EAAgC,WAAW,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-defaults.d.ts","sourceRoot":"","sources":["../../src/role-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,SAAS,CAa5C,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ROLE_DEFAULTS = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ /**
6
+ * Secure, AWS-recommended defaults applied to every IAM role built with
7
+ * {@link createRoleBuilder}. Each property can be individually overridden
8
+ * via the builder's fluent API.
9
+ */
10
+ exports.ROLE_DEFAULTS = {
11
+ /**
12
+ * Cap the session duration to one hour by default.
13
+ *
14
+ * Short-lived credentials reduce the blast radius of leaked or misused
15
+ * role sessions. Callers that genuinely need longer sessions (for
16
+ * example, long-running batch jobs that assume the role once) should
17
+ * override via {@link IRoleBuilder.maxSessionDuration}.
18
+ *
19
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/sec_permissions_define_guardrails.html
20
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
21
+ */
22
+ maxSessionDuration: aws_cdk_lib_1.Duration.hours(1),
23
+ };
24
+ //# sourceMappingURL=role-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-defaults.js","sourceRoot":"","sources":["../../src/role-defaults.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAGvC;;;;GAIG;AACU,QAAA,aAAa,GAAuB;IAC/C;;;;;;;;;;OAUG;IACH,kBAAkB,EAAE,sBAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;CACtC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-role-builder.d.ts","sourceRoot":"","sources":["../../src/service-role-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,CAE/E"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServiceRoleBuilder = createServiceRoleBuilder;
4
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
5
+ const role_builder_js_1 = require("./role-builder.js");
6
+ /**
7
+ * Creates a pre-configured {@link IRoleBuilder} whose trust policy allows
8
+ * the given AWS service principal to assume the role.
9
+ *
10
+ * Thin sugar over {@link createRoleBuilder} for the most common role shape:
11
+ * a service-assumable role (Lambda, EC2, Budgets, etc.) with no extra
12
+ * trust-policy conditions. Any property set by the caller afterwards
13
+ * (including `assumedBy`) still wins, because the underlying builder
14
+ * simply records the last value written.
15
+ *
16
+ * @param servicePrincipal - The service identifier, e.g.
17
+ * `"lambda.amazonaws.com"` or `"budgets.amazonaws.com"`.
18
+ * @returns A role builder with `assumedBy` preset to the given service.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const role = createServiceRoleBuilder("lambda.amazonaws.com")
23
+ * .description("Execution role for StopEC2 Lambda")
24
+ * .addInlinePolicyStatements("StopEC2", [ ... ]);
25
+ * ```
26
+ */
27
+ function createServiceRoleBuilder(servicePrincipal) {
28
+ return (0, role_builder_js_1.createRoleBuilder)().assumedBy(new aws_iam_1.ServicePrincipal(servicePrincipal));
29
+ }
30
+ //# sourceMappingURL=service-role-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-role-builder.js","sourceRoot":"","sources":["../../src/service-role-builder.ts"],"names":[],"mappings":";;AAwBA,4DAEC;AA1BD,iDAAuD;AACvD,uDAAyE;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,wBAAwB,CAAC,gBAAwB;IAC/D,OAAO,IAAA,mCAAiB,GAAE,CAAC,SAAS,CAAC,IAAI,0BAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-builder.d.ts","sourceRoot":"","sources":["../../src/statement-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,UAAU,EACf,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,GAAG,CAAC,EAAE,MAAM;CAOzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAgB;;IAY3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAKZ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKnC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK1C,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK7C,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI;IAKrE;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,KAAK,UAAO,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,KAAK,IAAI,eAAe;CAuBzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatementBuilder = exports.WildcardResourceError = void 0;
4
+ exports.createStatementBuilder = createStatementBuilder;
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ /**
7
+ * Thrown when a {@link StatementBuilder} is built with an `Allow` effect and
8
+ * an unrestricted resource (`"*"`) without the caller having explicitly
9
+ * opted in via {@link StatementBuilder.allowWildcardResources}.
10
+ *
11
+ * Wildcard-resource allow statements grant the widest possible permission
12
+ * surface and should be an intentional choice, not an accident.
13
+ *
14
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/permissions-management.html
15
+ */
16
+ class WildcardResourceError extends Error {
17
+ constructor(sid) {
18
+ super(`PolicyStatement${sid ? ` "${sid}"` : ""} has Effect=Allow with a wildcard resource ("*"). ` +
19
+ `Scope the resources or call allowWildcardResources(true) to opt in explicitly.`);
20
+ this.name = "WildcardResourceError";
21
+ }
22
+ }
23
+ exports.WildcardResourceError = WildcardResourceError;
24
+ /**
25
+ * Fluent wrapper around the CDK {@link PolicyStatement}.
26
+ *
27
+ * Unlike other ComposureCDK builders this one is **not** a
28
+ * {@link Lifecycle} — a policy statement is inline data attached to a Role,
29
+ * ManagedPolicy, or resource policy rather than a standalone CDK construct,
30
+ * so there is nothing to attach to a scope.
31
+ *
32
+ * The builder exists to:
33
+ * - centralise least-privilege validation (wildcard-resource guard,
34
+ * {@link WildcardResourceError}),
35
+ * - give every consumer (Role, ManagedPolicy, SNS TopicPolicy, future
36
+ * SQS/S3 bucket policies) one fluent API,
37
+ * - remain interchangeable with raw {@link PolicyStatement} instances via
38
+ * {@link StatementBuilder.build}.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const stmt = createStatementBuilder()
43
+ * .sid("StopDevInstances")
44
+ * .allow()
45
+ * .actions(["ec2:StopInstances", "ec2:DescribeInstances"])
46
+ * .resources(["*"])
47
+ * .allowWildcardResources(true)
48
+ * .build();
49
+ * ```
50
+ */
51
+ class StatementBuilder {
52
+ #sid;
53
+ #effect = aws_iam_1.Effect.ALLOW;
54
+ #actions = [];
55
+ #notActions = [];
56
+ #resources = [];
57
+ #notResources = [];
58
+ #principals = [];
59
+ #notPrincipals = [];
60
+ #conditions;
61
+ #allowWildcardResources = false;
62
+ sid(sid) {
63
+ this.#sid = sid;
64
+ return this;
65
+ }
66
+ allow() {
67
+ this.#effect = aws_iam_1.Effect.ALLOW;
68
+ return this;
69
+ }
70
+ deny() {
71
+ this.#effect = aws_iam_1.Effect.DENY;
72
+ return this;
73
+ }
74
+ effect(effect) {
75
+ this.#effect = effect;
76
+ return this;
77
+ }
78
+ actions(actions) {
79
+ this.#actions = [...actions];
80
+ return this;
81
+ }
82
+ notActions(actions) {
83
+ this.#notActions = [...actions];
84
+ return this;
85
+ }
86
+ resources(resources) {
87
+ this.#resources = [...resources];
88
+ return this;
89
+ }
90
+ notResources(resources) {
91
+ this.#notResources = [...resources];
92
+ return this;
93
+ }
94
+ principals(principals) {
95
+ this.#principals = [...principals];
96
+ return this;
97
+ }
98
+ notPrincipals(principals) {
99
+ this.#notPrincipals = [...principals];
100
+ return this;
101
+ }
102
+ conditions(conditions) {
103
+ this.#conditions = { ...conditions };
104
+ return this;
105
+ }
106
+ /**
107
+ * Opt in to Effect=Allow statements with wildcard resources (`"*"`).
108
+ *
109
+ * The builder rejects wildcard resources by default to surface
110
+ * least-privilege violations; call this to acknowledge that the
111
+ * statement genuinely needs unrestricted scope (for example actions
112
+ * such as `ec2:DescribeInstances` that do not support resource-level
113
+ * permissions).
114
+ *
115
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_actions-resources-contextkeys.html
116
+ */
117
+ allowWildcardResources(allow = true) {
118
+ this.#allowWildcardResources = allow;
119
+ return this;
120
+ }
121
+ /**
122
+ * Construct and return a {@link PolicyStatement} from the configured state.
123
+ *
124
+ * @throws {WildcardResourceError} when the statement is an Allow with a
125
+ * wildcard resource and wildcard resources have not been opted in to.
126
+ */
127
+ build() {
128
+ if (this.#effect === aws_iam_1.Effect.ALLOW &&
129
+ !this.#allowWildcardResources &&
130
+ this.#resources.some((r) => r === "*")) {
131
+ throw new WildcardResourceError(this.#sid);
132
+ }
133
+ const props = {
134
+ sid: this.#sid,
135
+ effect: this.#effect,
136
+ actions: this.#actions.length > 0 ? this.#actions : undefined,
137
+ notActions: this.#notActions.length > 0 ? this.#notActions : undefined,
138
+ resources: this.#resources.length > 0 ? this.#resources : undefined,
139
+ notResources: this.#notResources.length > 0 ? this.#notResources : undefined,
140
+ principals: this.#principals.length > 0 ? this.#principals : undefined,
141
+ notPrincipals: this.#notPrincipals.length > 0 ? this.#notPrincipals : undefined,
142
+ conditions: this.#conditions,
143
+ };
144
+ return new aws_iam_1.PolicyStatement(props);
145
+ }
146
+ }
147
+ exports.StatementBuilder = StatementBuilder;
148
+ /**
149
+ * Creates a new {@link StatementBuilder} for configuring an IAM
150
+ * {@link PolicyStatement} with least-privilege guardrails.
151
+ *
152
+ * @returns A fluent builder that produces a {@link PolicyStatement} when
153
+ * {@link StatementBuilder.build} is called.
154
+ */
155
+ function createStatementBuilder() {
156
+ return new StatementBuilder();
157
+ }
158
+ //# sourceMappingURL=statement-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-builder.js","sourceRoot":"","sources":["../../src/statement-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { createRoleBuilder, type IRoleBuilder, type RoleBuilderProps, type RoleBuilderResult, } from "./role-builder.js";
2
+ export { ROLE_DEFAULTS } from "./role-defaults.js";
3
+ export { createManagedPolicyBuilder, type IManagedPolicyBuilder, type ManagedPolicyBuilderProps, type ManagedPolicyBuilderResult, } from "./managed-policy-builder.js";
4
+ export { createServiceRoleBuilder } from "./service-role-builder.js";
5
+ export { createStatementBuilder, StatementBuilder, WildcardResourceError, } from "./statement-builder.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,0BAA0B,GAI3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { ManagedPolicy, type ManagedPolicyProps, PolicyStatement } from "aws-cdk-lib/aws-iam";
2
+ import type { IConstruct } from "constructs";
3
+ import { COPY_STATE, type IBuilder, type Lifecycle } from "@composurecdk/core";
4
+ import { StatementBuilder } from "./statement-builder.js";
5
+ /**
6
+ * Configuration properties for the customer-managed IAM policy builder.
7
+ *
8
+ * Extends the CDK {@link ManagedPolicyProps} unchanged — the builder adds
9
+ * an {@link IManagedPolicyBuilder.addStatements | addStatements} method that
10
+ * accepts either {@link PolicyStatement} or {@link StatementBuilder}.
11
+ */
12
+ export type ManagedPolicyBuilderProps = ManagedPolicyProps;
13
+ /**
14
+ * The build output of an {@link IManagedPolicyBuilder}.
15
+ */
16
+ export interface ManagedPolicyBuilderResult {
17
+ /** The customer-managed policy created by the builder. */
18
+ policy: ManagedPolicy;
19
+ }
20
+ /**
21
+ * A fluent builder for configuring and creating an AWS IAM
22
+ * customer-managed policy.
23
+ *
24
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.ManagedPolicy.html
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const boundary = createManagedPolicyBuilder()
29
+ * .managedPolicyName("ops-boundary")
30
+ * .addStatements([
31
+ * createStatementBuilder()
32
+ * .allow()
33
+ * .actions(["s3:GetObject"])
34
+ * .resources(["arn:aws:s3:::my-bucket/*"]),
35
+ * ]);
36
+ * ```
37
+ */
38
+ export type IManagedPolicyBuilder = IBuilder<ManagedPolicyBuilderProps, ManagedPolicyBuilder>;
39
+ declare class ManagedPolicyBuilder implements Lifecycle<ManagedPolicyBuilderResult> {
40
+ #private;
41
+ props: Partial<ManagedPolicyBuilderProps>;
42
+ /**
43
+ * Append policy statements to the managed policy.
44
+ *
45
+ * Accepts either {@link PolicyStatement} or {@link StatementBuilder}.
46
+ * Statement builders are resolved during {@link build} so wildcard-resource
47
+ * validation runs at the composition boundary.
48
+ */
49
+ addStatements(statements: (PolicyStatement | StatementBuilder)[]): this;
50
+ /** @internal — see ADR-0005. */
51
+ [COPY_STATE](target: ManagedPolicyBuilder): void;
52
+ build(scope: IConstruct, id: string): ManagedPolicyBuilderResult;
53
+ }
54
+ /**
55
+ * Creates a new {@link IManagedPolicyBuilder} for configuring an AWS IAM
56
+ * customer-managed policy.
57
+ *
58
+ * @returns A fluent builder for a customer-managed policy.
59
+ */
60
+ export declare function createManagedPolicyBuilder(): IManagedPolicyBuilder;
61
+ export {};
62
+ //# sourceMappingURL=managed-policy-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-policy-builder.d.ts","sourceRoot":"","sources":["../../src/managed-policy-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AAE9F,cAAM,oBAAqB,YAAW,SAAS,CAAC,0BAA0B,CAAC;;IACzE,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAM;IAG/C;;;;;;OAMG;IACH,aAAa,CAAC,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GAAG,IAAI;IAKvE,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAIhD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,0BAA0B;CAajE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAGlE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-policy-builder.js","sourceRoot":"","sources":["../../src/managed-policy-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4C,MAAM,qBAAqB,CAAC;AAE9F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAiC,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAwC1D,MAAM,oBAAoB;IACxB,KAAK,GAAuC,EAAE,CAAC;IACtC,gBAAgB,GAA2C,EAAE,CAAC;IAEvE;;;;;;OAMG;IACH,aAAa,CAAC,UAAkD;QAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAA4B;QACvC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrD,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;QAEF,MAAM,WAAW,GAAuB;YACtC,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC;SAClE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B;IACxC,+GAA+G;IAC/G,OAAO,OAAO,CAAkD,oBAAoB,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,113 @@
1
+ import { type IManagedPolicy, PolicyDocument, PolicyStatement, Role, type RoleProps } from "aws-cdk-lib/aws-iam";
2
+ import type { IConstruct } from "constructs";
3
+ import { COPY_STATE, type Lifecycle, type Resolvable } from "@composurecdk/core";
4
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
5
+ import { StatementBuilder } from "./statement-builder.js";
6
+ /**
7
+ * Configuration properties for the IAM role builder.
8
+ *
9
+ * Extends the CDK {@link RoleProps} with builder-specific options for
10
+ * cross-component wiring: `permissionsBoundary` accepts a {@link Resolvable}
11
+ * so boundary policies built by sibling components can be referenced at
12
+ * configuration time.
13
+ */
14
+ export interface RoleBuilderProps extends Omit<RoleProps, "permissionsBoundary"> {
15
+ /**
16
+ * A permissions boundary that caps the maximum permissions this role
17
+ * can ever grant, regardless of inline or managed policies attached.
18
+ *
19
+ * Accepts a concrete {@link IManagedPolicy} or a {@link Resolvable} for
20
+ * cross-component wiring (e.g. `ref("boundary", r => r.policy)`).
21
+ *
22
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html
23
+ */
24
+ permissionsBoundary?: Resolvable<IManagedPolicy>;
25
+ }
26
+ /**
27
+ * The build output of an {@link IRoleBuilder}.
28
+ *
29
+ * Exposes every CDK construct the builder creates so consumers can reference,
30
+ * extend, or attach additional policies to them.
31
+ */
32
+ export interface RoleBuilderResult {
33
+ /** The IAM role construct created by the builder. */
34
+ role: Role;
35
+ /**
36
+ * Inline {@link PolicyDocument}s created for each
37
+ * {@link IRoleBuilder.addInlinePolicyStatements} call, keyed by the
38
+ * policy name supplied to the call.
39
+ *
40
+ * The documents are embedded in the underlying `AWS::IAM::Role`
41
+ * resource via the native `Policies` array — no separate
42
+ * `AWS::IAM::Policy` resources are created.
43
+ *
44
+ * Inline policies supplied directly via the native `inlinePolicies`
45
+ * prop on {@link RoleProps} do not appear in this map.
46
+ */
47
+ inlinePolicies: Record<string, PolicyDocument>;
48
+ }
49
+ /**
50
+ * A fluent builder for configuring and creating an AWS IAM role.
51
+ *
52
+ * Each configuration property from the CDK {@link RoleProps} is exposed as
53
+ * an overloaded method: call with a value to set it, or with no arguments
54
+ * to read the current value.
55
+ *
56
+ * The builder implements {@link Lifecycle}, so it can be used directly as a
57
+ * component in a {@link compose | composed system}. When built it creates
58
+ * an IAM role with well-architected defaults ({@link ROLE_DEFAULTS}) and
59
+ * returns a {@link RoleBuilderResult}.
60
+ *
61
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Role.html
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const role = createRoleBuilder()
66
+ * .assumedBy(new ServicePrincipal("lambda.amazonaws.com"))
67
+ * .description("Execution role for the budget remediation Lambda")
68
+ * .addInlinePolicyStatements("StopEC2", [
69
+ * createStatementBuilder()
70
+ * .allow()
71
+ * .actions(["ec2:StopInstances", "ec2:DescribeInstances"])
72
+ * .resources(["*"])
73
+ * .allowWildcardResources(true)
74
+ * .build(),
75
+ * ]);
76
+ * ```
77
+ */
78
+ export type IRoleBuilder = ITaggedBuilder<RoleBuilderProps, RoleBuilder>;
79
+ declare class RoleBuilder implements Lifecycle<RoleBuilderResult> {
80
+ #private;
81
+ props: Partial<RoleBuilderProps>;
82
+ /**
83
+ * Append an inline policy to the role, embedded in the underlying
84
+ * `AWS::IAM::Role` resource's `Policies` array. The policy name becomes
85
+ * the key under which the resulting {@link PolicyDocument} appears in
86
+ * {@link RoleBuilderResult.inlinePolicies}.
87
+ *
88
+ * Accepts either {@link PolicyStatement} instances or
89
+ * {@link StatementBuilder}s (which are built lazily during {@link build}
90
+ * so that wildcard-resource validation runs at the composition boundary
91
+ * rather than at configuration time).
92
+ */
93
+ addInlinePolicyStatements(name: string, statements: (PolicyStatement | StatementBuilder)[]): this;
94
+ /** @internal — see ADR-0005. */
95
+ [COPY_STATE](target: RoleBuilder): void;
96
+ build(scope: IConstruct, id: string, context?: Record<string, object>): RoleBuilderResult;
97
+ }
98
+ /**
99
+ * Creates a new {@link IRoleBuilder} for configuring an AWS IAM role.
100
+ *
101
+ * @returns A fluent builder for an AWS IAM role.
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * const role = createRoleBuilder()
106
+ * .assumedBy(new ServicePrincipal("lambda.amazonaws.com"))
107
+ * .description("Lambda execution role")
108
+ * .build(stack, "LambdaRole");
109
+ * ```
110
+ */
111
+ export declare function createRoleBuilder(): IRoleBuilder;
112
+ export {};
113
+ //# sourceMappingURL=role-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-builder.d.ts","sourceRoot":"","sources":["../../src/role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,IAAI,EACJ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC9E;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAOzE,cAAM,WAAY,YAAW,SAAS,CAAC,iBAAiB,CAAC;;IACvD,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAM;IAGtC;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GACjD,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIvC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,iBAAiB;CA8C9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAEhD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-builder.js","sourceRoot":"","sources":["../../src/role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,IAAI,GAEL,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAmB,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAoF1D,MAAM,WAAW;IACf,KAAK,GAA8B,EAAE,CAAC;IAC7B,eAAe,GAAwB,EAAE,CAAC;IAEnD;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAY,EACZ,UAAkD;QAElD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAmB;QAC9B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU,EAAE,UAAkC,EAAE;QACvE,MAAM,EACJ,mBAAmB,EACnB,SAAS,EACT,cAAc,EAAE,mBAAmB,EACnC,GAAG,IAAI,EACR,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gBAAgB,EAAE,mDAAmD;gBACnE,gDAAgD,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,mBAAmB;YAC1C,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,mBAAmB,GAAmC,EAAE,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;YACF,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,oBAAoB,GAAmC;YAC3D,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;YAC9B,GAAG,mBAAmB;SACvB,CAAC;QAEF,MAAM,WAAW,GAAc;YAC7B,GAAG,aAAa;YAChB,GAAG,IAAI;YACP,SAAS;YACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC;gBAC9C,CAAC,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACvD,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,aAAa,CAAgC,WAAW,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RoleProps } from "aws-cdk-lib/aws-iam";
2
+ /**
3
+ * Secure, AWS-recommended defaults applied to every IAM role built with
4
+ * {@link createRoleBuilder}. Each property can be individually overridden
5
+ * via the builder's fluent API.
6
+ */
7
+ export declare const ROLE_DEFAULTS: Partial<RoleProps>;
8
+ //# sourceMappingURL=role-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-defaults.d.ts","sourceRoot":"","sources":["../../src/role-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,SAAS,CAa5C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-defaults.js","sourceRoot":"","sources":["../../src/role-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C;;;;;;;;;;OAUG;IACH,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;CACtC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type IRoleBuilder } from "./role-builder.js";
2
+ /**
3
+ * Creates a pre-configured {@link IRoleBuilder} whose trust policy allows
4
+ * the given AWS service principal to assume the role.
5
+ *
6
+ * Thin sugar over {@link createRoleBuilder} for the most common role shape:
7
+ * a service-assumable role (Lambda, EC2, Budgets, etc.) with no extra
8
+ * trust-policy conditions. Any property set by the caller afterwards
9
+ * (including `assumedBy`) still wins, because the underlying builder
10
+ * simply records the last value written.
11
+ *
12
+ * @param servicePrincipal - The service identifier, e.g.
13
+ * `"lambda.amazonaws.com"` or `"budgets.amazonaws.com"`.
14
+ * @returns A role builder with `assumedBy` preset to the given service.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const role = createServiceRoleBuilder("lambda.amazonaws.com")
19
+ * .description("Execution role for StopEC2 Lambda")
20
+ * .addInlinePolicyStatements("StopEC2", [ ... ]);
21
+ * ```
22
+ */
23
+ export declare function createServiceRoleBuilder(servicePrincipal: string): IRoleBuilder;
24
+ //# sourceMappingURL=service-role-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-role-builder.d.ts","sourceRoot":"","sources":["../../src/service-role-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,CAE/E"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-role-builder.js","sourceRoot":"","sources":["../../src/service-role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,wBAAwB,CAAC,gBAAwB;IAC/D,OAAO,iBAAiB,EAAE,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { Effect, type IPrincipal, PolicyStatement } from "aws-cdk-lib/aws-iam";
2
+ /**
3
+ * Thrown when a {@link StatementBuilder} is built with an `Allow` effect and
4
+ * an unrestricted resource (`"*"`) without the caller having explicitly
5
+ * opted in via {@link StatementBuilder.allowWildcardResources}.
6
+ *
7
+ * Wildcard-resource allow statements grant the widest possible permission
8
+ * surface and should be an intentional choice, not an accident.
9
+ *
10
+ * @see https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/permissions-management.html
11
+ */
12
+ export declare class WildcardResourceError extends Error {
13
+ constructor(sid?: string);
14
+ }
15
+ /**
16
+ * Fluent wrapper around the CDK {@link PolicyStatement}.
17
+ *
18
+ * Unlike other ComposureCDK builders this one is **not** a
19
+ * {@link Lifecycle} — a policy statement is inline data attached to a Role,
20
+ * ManagedPolicy, or resource policy rather than a standalone CDK construct,
21
+ * so there is nothing to attach to a scope.
22
+ *
23
+ * The builder exists to:
24
+ * - centralise least-privilege validation (wildcard-resource guard,
25
+ * {@link WildcardResourceError}),
26
+ * - give every consumer (Role, ManagedPolicy, SNS TopicPolicy, future
27
+ * SQS/S3 bucket policies) one fluent API,
28
+ * - remain interchangeable with raw {@link PolicyStatement} instances via
29
+ * {@link StatementBuilder.build}.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const stmt = createStatementBuilder()
34
+ * .sid("StopDevInstances")
35
+ * .allow()
36
+ * .actions(["ec2:StopInstances", "ec2:DescribeInstances"])
37
+ * .resources(["*"])
38
+ * .allowWildcardResources(true)
39
+ * .build();
40
+ * ```
41
+ */
42
+ export declare class StatementBuilder {
43
+ #private;
44
+ sid(sid: string): this;
45
+ allow(): this;
46
+ deny(): this;
47
+ effect(effect: Effect): this;
48
+ actions(actions: string[]): this;
49
+ notActions(actions: string[]): this;
50
+ resources(resources: string[]): this;
51
+ notResources(resources: string[]): this;
52
+ principals(principals: IPrincipal[]): this;
53
+ notPrincipals(principals: IPrincipal[]): this;
54
+ conditions(conditions: Record<string, Record<string, unknown>>): this;
55
+ /**
56
+ * Opt in to Effect=Allow statements with wildcard resources (`"*"`).
57
+ *
58
+ * The builder rejects wildcard resources by default to surface
59
+ * least-privilege violations; call this to acknowledge that the
60
+ * statement genuinely needs unrestricted scope (for example actions
61
+ * such as `ec2:DescribeInstances` that do not support resource-level
62
+ * permissions).
63
+ *
64
+ * @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_actions-resources-contextkeys.html
65
+ */
66
+ allowWildcardResources(allow?: boolean): this;
67
+ /**
68
+ * Construct and return a {@link PolicyStatement} from the configured state.
69
+ *
70
+ * @throws {WildcardResourceError} when the statement is an Allow with a
71
+ * wildcard resource and wildcard resources have not been opted in to.
72
+ */
73
+ build(): PolicyStatement;
74
+ }
75
+ /**
76
+ * Creates a new {@link StatementBuilder} for configuring an IAM
77
+ * {@link PolicyStatement} with least-privilege guardrails.
78
+ *
79
+ * @returns A fluent builder that produces a {@link PolicyStatement} when
80
+ * {@link StatementBuilder.build} is called.
81
+ */
82
+ export declare function createStatementBuilder(): StatementBuilder;
83
+ //# sourceMappingURL=statement-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-builder.d.ts","sourceRoot":"","sources":["../../src/statement-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,UAAU,EACf,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,GAAG,CAAC,EAAE,MAAM;CAOzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAgB;;IAY3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAKZ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKnC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK1C,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK7C,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI;IAKrE;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,KAAK,UAAO,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,KAAK,IAAI,eAAe;CAuBzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement-builder.js","sourceRoot":"","sources":["../../src/statement-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,29 +1,22 @@
1
1
  {
2
2
  "name": "@composurecdk/iam",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Composable IAM role, policy, and statement builders with well-architected defaults",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/laazyj/composureCDK",
8
8
  "directory": "packages/iam"
9
9
  },
10
- "main": "./dist/index.js",
11
- "types": "./dist/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/index.js",
15
- "types": "./dist/index.d.ts"
16
- }
17
- },
18
10
  "files": [
19
11
  "dist",
20
12
  "README.md",
21
13
  "LICENSE"
22
14
  ],
23
15
  "scripts": {
24
- "clean": "rm -rf dist",
25
- "build": "tsc -p tsconfig.build.json",
16
+ "clean": "rm -rf dist .tshy .tshy-build",
17
+ "build": "tshy",
26
18
  "typecheck": "tsc --noEmit",
19
+ "check:exports": "attw --pack . --profile node16 && publint",
27
20
  "test": "vitest run --passWithNoTests",
28
21
  "test:watch": "vitest"
29
22
  },
@@ -34,17 +27,42 @@
34
27
  "access": "public"
35
28
  },
36
29
  "type": "module",
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "tshy": {
34
+ "exports": {
35
+ "./package.json": "./package.json",
36
+ ".": "./src/index.ts"
37
+ }
38
+ },
37
39
  "peerDependencies": {
38
- "@composurecdk/cloudformation": "^0.7.0",
39
- "@composurecdk/core": "^0.7.0",
40
+ "@composurecdk/cloudformation": "^0.8.0",
41
+ "@composurecdk/core": "^0.8.0",
40
42
  "aws-cdk-lib": "^2.0.0",
41
43
  "constructs": "^10.0.0"
42
44
  },
43
45
  "devDependencies": {
44
- "@types/node": "^25.6.0",
45
- "aws-cdk-lib": "^2.250.0",
46
+ "@types/node": "^25.9.1",
47
+ "aws-cdk-lib": "^2.257.0",
46
48
  "constructs": "^10.6.0",
47
49
  "typescript": "^6.0.3",
48
- "vitest": "^4.1.4"
49
- }
50
+ "vitest": "^4.1.7"
51
+ },
52
+ "exports": {
53
+ "./package.json": "./package.json",
54
+ ".": {
55
+ "import": {
56
+ "types": "./dist/esm/index.d.ts",
57
+ "default": "./dist/esm/index.js"
58
+ },
59
+ "require": {
60
+ "types": "./dist/commonjs/index.d.ts",
61
+ "default": "./dist/commonjs/index.js"
62
+ }
63
+ }
64
+ },
65
+ "main": "./dist/commonjs/index.js",
66
+ "types": "./dist/commonjs/index.d.ts",
67
+ "module": "./dist/esm/index.js"
50
68
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,0BAA0B,GAI3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-policy-builder.d.ts","sourceRoot":"","sources":["../src/managed-policy-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAW,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AAE9F,cAAM,oBAAqB,YAAW,SAAS,CAAC,0BAA0B,CAAC;;IACzE,KAAK,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAM;IAG/C;;;;;;OAMG;IACH,aAAa,CAAC,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GAAG,IAAI;IAKvE,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAIhD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,0BAA0B;CAajE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAGlE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-policy-builder.js","sourceRoot":"","sources":["../src/managed-policy-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4C,MAAM,qBAAqB,CAAC;AAE9F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAiC,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAwC1D,MAAM,oBAAoB;IACxB,KAAK,GAAuC,EAAE,CAAC;IACtC,gBAAgB,GAA2C,EAAE,CAAC;IAEvE;;;;;;OAMG;IACH,aAAa,CAAC,UAAkD;QAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAA4B;QACvC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrD,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;QAEF,MAAM,WAAW,GAAuB;YACtC,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC;SAClE,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B;IACxC,+GAA+G;IAC/G,OAAO,OAAO,CAAkD,oBAAoB,CAAC,CAAC;AACxF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-builder.d.ts","sourceRoot":"","sources":["../src/role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,IAAI,EACJ,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAW,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC9E;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAOzE,cAAM,WAAY,YAAW,SAAS,CAAC,iBAAiB,CAAC;;IACvD,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAM;IAGtC;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,eAAe,GAAG,gBAAgB,CAAC,EAAE,GACjD,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIvC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,iBAAiB;CA8C9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAEhD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-builder.js","sourceRoot":"","sources":["../src/role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,IAAI,GAEL,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAkB,OAAO,EAAmB,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAoF1D,MAAM,WAAW;IACf,KAAK,GAA8B,EAAE,CAAC;IAC7B,eAAe,GAAwB,EAAE,CAAC;IAEnD;;;;;;;;;;OAUG;IACH,yBAAyB,CACvB,IAAY,EACZ,UAAkD;QAElD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAmB;QAC9B,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU,EAAE,UAAkC,EAAE;QACvE,MAAM,EACJ,mBAAmB,EACnB,SAAS,EACT,cAAc,EAAE,mBAAmB,EACnC,GAAG,IAAI,EACR,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gBAAgB,EAAE,mDAAmD;gBACnE,gDAAgD,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,mBAAmB;YAC1C,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,mBAAmB,GAAmC,EAAE,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;YACF,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,oBAAoB,GAAmC;YAC3D,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;YAC9B,GAAG,mBAAmB;SACvB,CAAC;QAEF,MAAM,WAAW,GAAc;YAC7B,GAAG,aAAa;YAChB,GAAG,IAAI;YACP,SAAS;YACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,CAAC;gBAC9C,CAAC,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACvD,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,aAAa,CAAgC,WAAW,CAAC,CAAC;AACnE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-defaults.d.ts","sourceRoot":"","sources":["../src/role-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,SAAS,CAa5C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-defaults.js","sourceRoot":"","sources":["../src/role-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C;;;;;;;;;;OAUG;IACH,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;CACtC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-role-builder.d.ts","sourceRoot":"","sources":["../src/service-role-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,CAE/E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-role-builder.js","sourceRoot":"","sources":["../src/service-role-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,wBAAwB,CAAC,gBAAwB;IAC/D,OAAO,iBAAiB,EAAE,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-builder.d.ts","sourceRoot":"","sources":["../src/statement-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,UAAU,EACf,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,GAAG,CAAC,EAAE,MAAM;CAOzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,gBAAgB;;IAY3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI;IAKZ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKnC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK1C,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI;IAK7C,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI;IAKrE;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,KAAK,UAAO,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,KAAK,IAAI,eAAe;CAuBzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-builder.js","sourceRoot":"","sources":["../src/statement-builder.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes