@composurecdk/dynamodb 0.11.2 → 0.12.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.
package/README.md CHANGED
@@ -109,11 +109,14 @@ createFunctionBuilder()
109
109
  | `read` | `GetItem`, `Query`, `Scan`, `BatchGetItem`, … `DescribeTable` | `Decrypt`, `DescribeKey` |
110
110
  | `write` | `PutItem`, `UpdateItem`, `DeleteItem`, `BatchWriteItem`, `DescribeTable` | `read`'s, plus `Encrypt`, `ReEncrypt*`, `GenerateDataKey*` |
111
111
  | `put` | `PutItem` | as `write` |
112
+ | `update` | `UpdateItem` | as `write` |
112
113
  | `readWrite` | `read`'s and `write`'s | as `write` |
113
114
  | `fullAccess` | `dynamodb:*` | as `write` |
114
115
 
115
116
  `put` is for a write-once store: its grantee may add items but never update or delete them. It leaves out `BatchWriteItem`, which can delete.
116
117
 
118
+ `update` is for a grantee that changes existing items but must never delete them — a worker moving a record's status, beside a separate writer granted `put`. IAM cannot stop an `UpdateItem` on a missing key from creating the item, so guard each call with a condition expression such as `attribute_exists(id)`.
119
+
117
120
  Each capability grants the table's customer-managed key, when it has one, in the grantee's identity policy, so a grant stands alone. A key built by [`@composurecdk/kms`](../kms/README.md) keeps CDK's default key policy, which delegates to IAM, so that is enough within the account. Two limits: on a `TableV2` with replicas only the primary Region's key is granted, not a replica's; and a key in another account needs its key policy to allow the grantee.
118
121
 
119
122
  ## DynamoDB Streams
@@ -25,6 +25,13 @@ export declare const tableGrants: {
25
25
  * because it can delete.
26
26
  */
27
27
  put: (table: Resolvable<ITable>) => Grant<IGrantable>;
28
+ /**
29
+ * Update existing items, and nothing else (`dynamodb:UpdateItem`) — for a
30
+ * grantee that changes items but must not create or delete them. An
31
+ * `UpdateItem` on a missing key creates the item, so pair it with a
32
+ * condition expression such as `attribute_exists(pk)`.
33
+ */
34
+ update: (table: Resolvable<ITable>) => Grant<IGrantable>;
28
35
  /** Combined read and write access. */
29
36
  readWrite: (table: Resolvable<ITable>) => Grant<IGrantable>;
30
37
  /** Full access to the table and its indexes (`dynamodb:*`). */
@@ -1 +1 @@
1
- {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,KAAK,EAAY,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsB3E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;IACtB,4DAA4D;kBA/BpD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAmC9C,wEAAwE;mBAnChE,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAuC9C;;;;OAIG;iBA3CK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAgD9C,sCAAsC;uBAhD9B,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAoD9C,+DAA+D;wBApDvD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;CAwD/C,CAAC"}
1
+ {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,KAAK,EAAY,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAgC3E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;IACtB,4DAA4D;kBAzCpD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IA6C9C,wEAAwE;mBA7ChE,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAiD9C;;;;OAIG;iBArDK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAuD9C;;;;;OAKG;oBA5DK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IA8D9C,sCAAsC;uBA9D9B,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAkE9C,+DAA+D;wBAlEvD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;CAsE/C,CAAC"}
@@ -17,6 +17,14 @@ const KEY_WRITE_ACTIONS = [
17
17
  "kms:ReEncrypt*",
18
18
  "kms:GenerateDataKey*",
19
19
  ];
20
+ /**
21
+ * A capability granting `action` alone, via `ITable.grant`, plus the key
22
+ * actions `write` grants — which `ITable.grant` does not add itself.
23
+ */
24
+ const itemWrite = (action) => capability((table, grantee) => {
25
+ table.grant(grantee, action);
26
+ table.encryptionKey?.grant(grantee, ...KEY_WRITE_ACTIONS);
27
+ });
20
28
  /**
21
29
  * Consumer-side grant helpers for a DynamoDB table. Pass one to a grantee
22
30
  * builder's `grant(...)` — e.g.
@@ -44,10 +52,14 @@ exports.tableGrants = {
44
52
  * whose writer must not update or delete. `BatchWriteItem` is left out
45
53
  * because it can delete.
46
54
  */
47
- put: capability((table, grantee) => {
48
- table.grant(grantee, "dynamodb:PutItem");
49
- table.encryptionKey?.grant(grantee, ...KEY_WRITE_ACTIONS);
50
- }),
55
+ put: itemWrite("dynamodb:PutItem"),
56
+ /**
57
+ * Update existing items, and nothing else (`dynamodb:UpdateItem`) — for a
58
+ * grantee that changes items but must not create or delete them. An
59
+ * `UpdateItem` on a missing key creates the item, so pair it with a
60
+ * condition expression such as `attribute_exists(pk)`.
61
+ */
62
+ update: itemWrite("dynamodb:UpdateItem"),
51
63
  /** Combined read and write access. */
52
64
  readWrite: capability((table, grantee) => {
53
65
  table.grantReadWriteData(grantee);
@@ -1 +1 @@
1
- {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":";;;AAEA,6CAA2E;AAE3E,8DAA8D;AAC9D,MAAM,UAAU,GACd,CAAC,KAAmD,EAAE,EAAE,CACxD,CAAC,KAAyB,EAAqB,EAAE,CAC/C,IAAA,eAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;CACvB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,wEAAwE;IACxE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;;;;OAIG;IACH,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACzC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":";;;AAEA,6CAA2E;AAE3E,8DAA8D;AAC9D,MAAM,UAAU,GACd,CAAC,KAAmD,EAAE,EAAE,CACxD,CAAC,KAAyB,EAAqB,EAAE,CAC/C,IAAA,eAAQ,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CACnC,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC5B,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,wEAAwE;IACxE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;;;;OAIG;IACH,GAAG,EAAE,SAAS,CAAC,kBAAkB,CAAC;IAClC;;;;;OAKG;IACH,MAAM,EAAE,SAAS,CAAC,qBAAqB,CAAC;IACxC,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;CACH,CAAC"}
@@ -25,6 +25,13 @@ export declare const tableGrants: {
25
25
  * because it can delete.
26
26
  */
27
27
  put: (table: Resolvable<ITable>) => Grant<IGrantable>;
28
+ /**
29
+ * Update existing items, and nothing else (`dynamodb:UpdateItem`) — for a
30
+ * grantee that changes items but must not create or delete them. An
31
+ * `UpdateItem` on a missing key creates the item, so pair it with a
32
+ * condition expression such as `attribute_exists(pk)`.
33
+ */
34
+ update: (table: Resolvable<ITable>) => Grant<IGrantable>;
28
35
  /** Combined read and write access. */
29
36
  readWrite: (table: Resolvable<ITable>) => Grant<IGrantable>;
30
37
  /** Full access to the table and its indexes (`dynamodb:*`). */
@@ -1 +1 @@
1
- {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,KAAK,EAAY,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsB3E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;IACtB,4DAA4D;kBA/BpD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAmC9C,wEAAwE;mBAnChE,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAuC9C;;;;OAIG;iBA3CK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAgD9C,sCAAsC;uBAhD9B,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAoD9C,+DAA+D;wBApDvD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;CAwD/C,CAAC"}
1
+ {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,KAAK,EAAY,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAgC3E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;IACtB,4DAA4D;kBAzCpD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IA6C9C,wEAAwE;mBA7ChE,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAiD9C;;;;OAIG;iBArDK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAuD9C;;;;;OAKG;oBA5DK,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IA8D9C,sCAAsC;uBA9D9B,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;IAkE9C,+DAA+D;wBAlEvD,UAAU,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,UAAU,CAAC;CAsE/C,CAAC"}
@@ -14,6 +14,14 @@ const KEY_WRITE_ACTIONS = [
14
14
  "kms:ReEncrypt*",
15
15
  "kms:GenerateDataKey*",
16
16
  ];
17
+ /**
18
+ * A capability granting `action` alone, via `ITable.grant`, plus the key
19
+ * actions `write` grants — which `ITable.grant` does not add itself.
20
+ */
21
+ const itemWrite = (action) => capability((table, grantee) => {
22
+ table.grant(grantee, action);
23
+ table.encryptionKey?.grant(grantee, ...KEY_WRITE_ACTIONS);
24
+ });
17
25
  /**
18
26
  * Consumer-side grant helpers for a DynamoDB table. Pass one to a grantee
19
27
  * builder's `grant(...)` — e.g.
@@ -41,10 +49,14 @@ export const tableGrants = {
41
49
  * whose writer must not update or delete. `BatchWriteItem` is left out
42
50
  * because it can delete.
43
51
  */
44
- put: capability((table, grantee) => {
45
- table.grant(grantee, "dynamodb:PutItem");
46
- table.encryptionKey?.grant(grantee, ...KEY_WRITE_ACTIONS);
47
- }),
52
+ put: itemWrite("dynamodb:PutItem"),
53
+ /**
54
+ * Update existing items, and nothing else (`dynamodb:UpdateItem`) — for a
55
+ * grantee that changes items but must not create or delete them. An
56
+ * `UpdateItem` on a missing key creates the item, so pair it with a
57
+ * condition expression such as `attribute_exists(pk)`.
58
+ */
59
+ update: itemWrite("dynamodb:UpdateItem"),
48
60
  /** Combined read and write access. */
49
61
  readWrite: capability((table, grantee) => {
50
62
  table.grantReadWriteData(grantee);
@@ -1 +1 @@
1
- {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,QAAQ,EAAmB,MAAM,oBAAoB,CAAC;AAE3E,8DAA8D;AAC9D,MAAM,UAAU,GACd,CAAC,KAAmD,EAAE,EAAE,CACxD,CAAC,KAAyB,EAAqB,EAAE,CAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;CACvB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,wEAAwE;IACxE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;;;;OAIG;IACH,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACzC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,QAAQ,EAAmB,MAAM,oBAAoB,CAAC;AAE3E,8DAA8D;AAC9D,MAAM,UAAU,GACd,CAAC,KAAmD,EAAE,EAAE,CACxD,CAAC,KAAyB,EAAqB,EAAE,CAC/C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CACnC,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC5B,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,wEAAwE;IACxE,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;;;;OAIG;IACH,GAAG,EAAE,SAAS,CAAC,kBAAkB,CAAC;IAClC;;;;;OAKG;IACH,MAAM,EAAE,SAAS,CAAC,qBAAqB,CAAC;IACxC,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,+DAA+D;IAC/D,UAAU,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;CACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@composurecdk/dynamodb",
3
- "version": "0.11.2",
3
+ "version": "0.12.1",
4
4
  "description": "Composable DynamoDB table builder with well-architected defaults",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,16 +40,16 @@
40
40
  }
41
41
  },
42
42
  "peerDependencies": {
43
- "@composurecdk/cloudformation": "^0.11.0",
44
- "@composurecdk/cloudwatch": "^0.11.0",
45
- "@composurecdk/core": "^0.11.0",
43
+ "@composurecdk/cloudformation": "^0.12.0",
44
+ "@composurecdk/cloudwatch": "^0.12.0",
45
+ "@composurecdk/core": "^0.12.0",
46
46
  "aws-cdk-lib": "^2.178.0",
47
47
  "constructs": "^10.0.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@composurecdk/cdk-testing": "*",
51
- "@types/node": "^26.6.5",
52
- "aws-cdk-lib": "^2.271.0",
51
+ "@types/node": "^26.6.6",
52
+ "aws-cdk-lib": "^2.275.0",
53
53
  "constructs": "^10.8.1",
54
54
  "typescript": "^6.0.3",
55
55
  "vitest": "^5.0.0"