@flipboxlabs/aws-audit-sdk 1.1.1 → 1.1.3
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 +2 -2
- package/dist/audits.d.ts.map +1 -1
- package/dist/audits.js +1 -3
- package/dist/batch/batch-processor.d.ts.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -6
- package/dist/events/batch-handler.d.ts.map +1 -1
- package/dist/events/batch-handler.js +1 -1
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/middleware/middy.d.ts.map +1 -1
- package/dist/repository.d.ts +28 -0
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +94 -17
- package/dist/repository.utils.d.ts.map +1 -1
- package/dist/schema/audit.d.ts.map +1 -1
- package/dist/schema/common.d.ts.map +1 -1
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -2
- package/dist/schema/log.d.ts.map +1 -1
- package/dist/schema/log.js +2 -6
- package/dist/schema/model.d.ts.map +1 -1
- package/dist/schema/model.js +1 -1
- package/dist/schema/service.d.ts.map +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +9 -31
- package/dist/test-config.d.ts +6 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +0 -7
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -19
- package/package.json +28 -35
package/README.md
CHANGED
|
@@ -13,8 +13,8 @@ pnpm add @flipboxlabs/aws-audit-sdk
|
|
|
13
13
|
## Usage
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import { Audits, defineAuditConfig } from
|
|
17
|
-
import { logAudits } from
|
|
16
|
+
import { Audits, defineAuditConfig } from "@flipboxlabs/aws-audit-sdk";
|
|
17
|
+
import { logAudits } from "@flipboxlabs/aws-audit-sdk/middleware";
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
## Features
|
package/dist/audits.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audits.d.ts","sourceRoot":"","sources":["../src/audits.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAM1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhF;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI;
|
|
1
|
+
{"version":3,"file":"audits.d.ts","sourceRoot":"","sources":["../src/audits.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAM1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhF;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI;IACjD;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,MAAM,EAAE,CAAC,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,WAAW,IAAI,IAAI,CAC3D,aAAa,EACb,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAClC,GAAG;IACF,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QAClC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QAClC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,CAAC;IACF,SAAS,CAAC,EACN,KAAK,CAAC;QACJ,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QAClC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,CAAC,GACF,GAAG,CAAC;QACF,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;QAClC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACtB,CAAC,CAAC;CACR,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,MAAM,CAAC,CAAC,SAAS,WAAW;;IACvC;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAW;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAE/B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAS;IAWzB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAA4B;IAEhD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAI;IAE3B;;;;;;;OAOG;gBACgB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAU5C;;;;OAIG;IACH,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAI7B;;;;;;;;;;OAUG;IACI,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAmBnD;;;;;;;;;;;;;;;OAeG;IACI,mBAAmB,IAAI,IAAI;IAsBlC;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAWlB;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IASpB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;CAUpB"}
|
package/dist/audits.js
CHANGED
|
@@ -128,9 +128,7 @@ export class Audits {
|
|
|
128
128
|
this.config.schemas.resourceReference.parse(item.source);
|
|
129
129
|
}
|
|
130
130
|
if (item.resources) {
|
|
131
|
-
const resources = item.resources instanceof Set
|
|
132
|
-
? Array.from(item.resources)
|
|
133
|
-
: item.resources;
|
|
131
|
+
const resources = item.resources instanceof Set ? Array.from(item.resources) : item.resources;
|
|
134
132
|
for (const resource of resources) {
|
|
135
133
|
this.config.schemas.resourceReference.parse(resource);
|
|
136
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/batch/batch-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/batch/batch-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,KAAK,EACV,yBAAyB,EACzB,eAAe,EACf,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,kBAAkB,CAAC;AAO9D;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,mBAAmB,CAAC,MAAM,SAAS,yBAAyB,CAAE,SAAQ,cAAc;IAU7F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,aAAa;IAVjG;;;;;;OAMG;gBAED,SAAS,EAAE,MAAM,OAAO,SAAS,EACxB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,aAAa;IAKjG;;;;;;;;;;;;;OAaG;IACI,cAAc,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,GAAG,wBAAwB,GACzC,eAAe;IAuBlB;;;;;;;;;;;;;OAaG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,eAAe;CAuBrE"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;YAkB1D;QACZ,GAAG,oBAAM;QACT,YAAY,6BAAe;KAC5B;EAEJ;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
package/dist/config.js
CHANGED
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAE7C;;GAEG;AACH,KAAK,UAAU,GAAG;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAE7C;;GAEG;AACH,KAAK,UAAU,GAAG;IAChB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IAEZ,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,KAAK,SAAS,GAAG,UAAU,GAAG;IAC5B,yCAAyC;IACzC,GAAG,EAAE;QACH,qCAAqC;QACrC,MAAM,EAAE,MAAM,CAAC;QACf,qBAAqB;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,QAAQ;IACnB,oCAAoC;;QAElC,6DAA6D;iCAC7C,UAAU;QAC1B,4CAA4C;gCAC7B,SAAS;;IAE1B,mCAAmC;;QAEjC,4BAA4B;;QAE5B,uBAAuB;;QAGvB,yCAAyC;;QAEzC,oCAAoC;;QAGpC,yCAAyC;;QAEzC,oCAAoC;;QAGpC,6BAA6B;;QAE7B,8BAA8B;;;IAGhC,4BAA4B;;QAE1B,+DAA+D;;QAE/D,gEAAgE;;QAGhE,gDAAgD;;QAEhD,iDAAiD;;;IAGnD,8BAA8B;;QAE5B,2DAA2D;;;CAGrD,CAAC;AA0CX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW;IACtB,wCAAwC;;QAEtC,8DAA8D;iCAC9C,UAAU;QAC1B,6CAA6C;gCAC9B,SAAS;;IAE1B,yCAAyC;;IAEzC,wDAAwD;;QAEtD,yDAAyD;;QAEzD,8CAA8C;;;CAGxC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -89,9 +89,7 @@ function buildDynamoDBName(config = {
|
|
|
89
89
|
env: String(process.env.ENVIRONMENT),
|
|
90
90
|
service: process.env.SERVICE,
|
|
91
91
|
}) {
|
|
92
|
-
return [`${config.env.toUpperCase()}`, config.service, "Audit"]
|
|
93
|
-
.filter(Boolean)
|
|
94
|
-
.join("-");
|
|
92
|
+
return [`${config.env.toUpperCase()}`, config.service, "Audit"].filter(Boolean).join("-");
|
|
95
93
|
}
|
|
96
94
|
/**
|
|
97
95
|
* Builds a DynamoDB table ARN from service name and AWS configuration.
|
|
@@ -163,9 +161,7 @@ function buildEventBridgeName(config = {
|
|
|
163
161
|
env: String(process.env.ENVIRONMENT),
|
|
164
162
|
service: process.env.SERVICE,
|
|
165
163
|
}) {
|
|
166
|
-
return [`${config.env.toUpperCase()}`, config.service, "Audit"]
|
|
167
|
-
.filter(Boolean)
|
|
168
|
-
.join("-");
|
|
164
|
+
return [`${config.env.toUpperCase()}`, config.service, "Audit"].filter(Boolean).join("-");
|
|
169
165
|
}
|
|
170
166
|
/**
|
|
171
167
|
* Builds an EventBridge bus ARN from service name and AWS configuration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-handler.d.ts","sourceRoot":"","sources":["../../src/events/batch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"batch-handler.d.ts","sourceRoot":"","sources":["../../src/events/batch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAQrC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB;;;;;OAKG;gBAEgB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB;IAG5C;;;;;;;;;;;;;;;;OAgBG;IACU,SAAS,CACpB,OAAO,EAAE,qBAAqB,EAAE,EAChC,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgBlC;;;;;;;;;;;;OAYG;YACW,kBAAkB;CAsBjC"}
|
package/dist/events/bus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IAStB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY;IAR1C;;;;;OAKG;gBAED,MAAM,EAAE,MAAM,EACK,OAAO,GAAE,YAM3B;IAGH;;;;;;;;;OASG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IAQlD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,QAAQ,CACnB,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EACzB,WAAW,CAAC,EAAE,qBAAqB,EAAE,GACpC,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAUnC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,KAAK,wBAAwB,EAC7B,oBAAoB,EACpB,QAAQ,EACR,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,WAAW,EACX,OAAO,EACP,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middy.d.ts","sourceRoot":"","sources":["../../src/middleware/middy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"middy.d.ts","sourceRoot":"","sources":["../../src/middleware/middy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,KAAK,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,QAAA,MAAM,SAAS,GAAI,SAAS,SAAS,KAAG,iBAoDvC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/repository.d.ts
CHANGED
|
@@ -197,6 +197,34 @@ export declare class AuditRepository<C extends AuditConfig> {
|
|
|
197
197
|
* ```
|
|
198
198
|
*/
|
|
199
199
|
upsertBatch(items: Array<UpsertAuditInput>): Promise<boolean>;
|
|
200
|
+
/**
|
|
201
|
+
* Upserts a single audit record with atomic attempt tracking.
|
|
202
|
+
*
|
|
203
|
+
* Uses DynamoDB UpdateItem with conditional expressions to:
|
|
204
|
+
* - Create a new item if it doesn't exist (with attempts = [currentAttempt])
|
|
205
|
+
* - Append to existing attempts array if item exists
|
|
206
|
+
* - Preserve original createdAt timestamp on updates
|
|
207
|
+
*
|
|
208
|
+
* This is atomic and race-condition safe for retry tracking.
|
|
209
|
+
*
|
|
210
|
+
* @param item - The audit record to upsert
|
|
211
|
+
* @param currentAttempt - The current attempt to append
|
|
212
|
+
* @returns The attempt number (1 for new items, incremented for existing)
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* const attemptNumber = await repository.upsertItem(
|
|
217
|
+
* { operation: 'processPayment', status: 'success', ... },
|
|
218
|
+
* { number: 1, status: 'success', at: '2024-01-01T00:00:00Z' }
|
|
219
|
+
* );
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
upsertItem(item: UpsertAuditInput, currentAttempt: {
|
|
223
|
+
number: number;
|
|
224
|
+
status: string;
|
|
225
|
+
error?: unknown;
|
|
226
|
+
at: string;
|
|
227
|
+
}): Promise<number>;
|
|
200
228
|
/**
|
|
201
229
|
* Lists audit records for a specific resource with pagination.
|
|
202
230
|
*
|
package/dist/repository.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
|
package/dist/repository.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { BatchWriteItemCommand, DynamoDBClient, GetItemCommand, QueryCommand, } from "@aws-sdk/client-dynamodb";
|
|
1
|
+
import { BatchWriteItemCommand, DynamoDBClient, GetItemCommand, QueryCommand, UpdateItemCommand, } from "@aws-sdk/client-dynamodb";
|
|
2
2
|
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";
|
|
3
3
|
import { DynamoDB } from "./constants.js";
|
|
4
|
-
import { decodeNextPageToken, encodeNextPageToken
|
|
4
|
+
import { decodeNextPageToken, encodeNextPageToken } from "./repository.utils.js";
|
|
5
5
|
import { AuditListItemPayloadSchema, AuditPayloadSchema, AuditSchema, } from "./schema/audit.js";
|
|
6
6
|
import { PaginationCollectionSchema } from "./schema/model.js";
|
|
7
7
|
import { AuditStorageSchema } from "./schema/storage.js";
|
|
@@ -104,9 +104,7 @@ export class AuditRepository {
|
|
|
104
104
|
convertClassInstanceToMap: true,
|
|
105
105
|
}),
|
|
106
106
|
}));
|
|
107
|
-
return item
|
|
108
|
-
? this.transformItem(unmarshall(item))
|
|
109
|
-
: undefined;
|
|
107
|
+
return item ? this.transformItem(unmarshall(item)) : undefined;
|
|
110
108
|
}
|
|
111
109
|
catch (error) {
|
|
112
110
|
this.logger.error("Unable to find audit item in the repository", {
|
|
@@ -189,6 +187,93 @@ export class AuditRepository {
|
|
|
189
187
|
}))));
|
|
190
188
|
return true;
|
|
191
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Upserts a single audit record with atomic attempt tracking.
|
|
192
|
+
*
|
|
193
|
+
* Uses DynamoDB UpdateItem with conditional expressions to:
|
|
194
|
+
* - Create a new item if it doesn't exist (with attempts = [currentAttempt])
|
|
195
|
+
* - Append to existing attempts array if item exists
|
|
196
|
+
* - Preserve original createdAt timestamp on updates
|
|
197
|
+
*
|
|
198
|
+
* This is atomic and race-condition safe for retry tracking.
|
|
199
|
+
*
|
|
200
|
+
* @param item - The audit record to upsert
|
|
201
|
+
* @param currentAttempt - The current attempt to append
|
|
202
|
+
* @returns The attempt number (1 for new items, incremented for existing)
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```typescript
|
|
206
|
+
* const attemptNumber = await repository.upsertItem(
|
|
207
|
+
* { operation: 'processPayment', status: 'success', ... },
|
|
208
|
+
* { number: 1, status: 'success', at: '2024-01-01T00:00:00Z' }
|
|
209
|
+
* );
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
async upsertItem(item, currentAttempt) {
|
|
213
|
+
const now = new Date();
|
|
214
|
+
const payload = AuditStorageSchema.parse({
|
|
215
|
+
createdAt: now,
|
|
216
|
+
...item,
|
|
217
|
+
updatedAt: now,
|
|
218
|
+
});
|
|
219
|
+
const primaryKey = this.constructPrimaryKey({
|
|
220
|
+
tenantId: payload.tenantId,
|
|
221
|
+
id: payload.id,
|
|
222
|
+
resourceType: payload.target.type,
|
|
223
|
+
app: payload.target.app,
|
|
224
|
+
});
|
|
225
|
+
const secondaryKeys = this.constructSecondaryKeys(payload);
|
|
226
|
+
const ttlAttribute = this.constructTTLAttribute(DEFAULT_TTL);
|
|
227
|
+
const expressionAttributeNames = {};
|
|
228
|
+
const expressionAttributeValues = {
|
|
229
|
+
":emptyList": [],
|
|
230
|
+
":newAttempt": [currentAttempt],
|
|
231
|
+
};
|
|
232
|
+
const setClauses = [
|
|
233
|
+
"#attempts = list_append(if_not_exists(#attempts, :emptyList), :newAttempt)",
|
|
234
|
+
"#createdAt = if_not_exists(#createdAt, :createdAt)",
|
|
235
|
+
];
|
|
236
|
+
expressionAttributeNames["#attempts"] = "attempts";
|
|
237
|
+
expressionAttributeNames["#createdAt"] = "createdAt";
|
|
238
|
+
// Add all payload fields dynamically
|
|
239
|
+
const allFields = {
|
|
240
|
+
...payload,
|
|
241
|
+
...secondaryKeys,
|
|
242
|
+
ttl: ttlAttribute.ttl,
|
|
243
|
+
};
|
|
244
|
+
// Fields that need special handling (already in setClauses)
|
|
245
|
+
const specialFields = new Set(["attempts", "createdAt"]);
|
|
246
|
+
for (const [key, value] of Object.entries(allFields)) {
|
|
247
|
+
if (value === undefined)
|
|
248
|
+
continue;
|
|
249
|
+
expressionAttributeNames[`#${key}`] = key;
|
|
250
|
+
expressionAttributeValues[`:${key}`] = value;
|
|
251
|
+
if (!specialFields.has(key)) {
|
|
252
|
+
setClauses.push(`#${key} = :${key}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const result = await this.client.send(new UpdateItemCommand({
|
|
256
|
+
TableName: DynamoDB.Table.Name(),
|
|
257
|
+
Key: marshall(primaryKey, {
|
|
258
|
+
removeUndefinedValues: true,
|
|
259
|
+
convertEmptyValues: true,
|
|
260
|
+
convertClassInstanceToMap: true,
|
|
261
|
+
}),
|
|
262
|
+
UpdateExpression: `SET ${setClauses.join(", ")}`,
|
|
263
|
+
ExpressionAttributeNames: expressionAttributeNames,
|
|
264
|
+
ExpressionAttributeValues: marshall(expressionAttributeValues, {
|
|
265
|
+
removeUndefinedValues: true,
|
|
266
|
+
convertEmptyValues: true,
|
|
267
|
+
convertClassInstanceToMap: true,
|
|
268
|
+
}),
|
|
269
|
+
ReturnValues: "ALL_NEW",
|
|
270
|
+
}));
|
|
271
|
+
if (!result.Attributes) {
|
|
272
|
+
throw new Error("UpdateItem did not return attributes");
|
|
273
|
+
}
|
|
274
|
+
const updated = unmarshall(result.Attributes);
|
|
275
|
+
return updated.attempts.length;
|
|
276
|
+
}
|
|
192
277
|
/**
|
|
193
278
|
* Lists audit records for a specific resource with pagination.
|
|
194
279
|
*
|
|
@@ -243,9 +328,7 @@ export class AuditRepository {
|
|
|
243
328
|
return PaginationCollectionSchema(AuditPayloadSchema).parse({
|
|
244
329
|
items: items?.map((i) => this.transformListItem(unmarshall(i))),
|
|
245
330
|
pagination: {
|
|
246
|
-
nextToken: lastEvaluatedKey
|
|
247
|
-
? encodeNextPageToken(unmarshall(lastEvaluatedKey))
|
|
248
|
-
: undefined,
|
|
331
|
+
nextToken: lastEvaluatedKey ? encodeNextPageToken(unmarshall(lastEvaluatedKey)) : undefined,
|
|
249
332
|
},
|
|
250
333
|
});
|
|
251
334
|
}
|
|
@@ -324,9 +407,7 @@ export class AuditRepository {
|
|
|
324
407
|
return PaginationCollectionSchema(AuditPayloadSchema).parse({
|
|
325
408
|
items: items?.map((i) => this.transformTraceListItem(unmarshall(i))),
|
|
326
409
|
pagination: {
|
|
327
|
-
nextToken: lastEvaluatedKey
|
|
328
|
-
? encodeNextPageToken(unmarshall(lastEvaluatedKey))
|
|
329
|
-
: undefined,
|
|
410
|
+
nextToken: lastEvaluatedKey ? encodeNextPageToken(unmarshall(lastEvaluatedKey)) : undefined,
|
|
330
411
|
},
|
|
331
412
|
});
|
|
332
413
|
}
|
|
@@ -342,9 +423,7 @@ export class AuditRepository {
|
|
|
342
423
|
constructPrimaryKey({ tenantId, app, id, resourceType, }) {
|
|
343
424
|
const pkBase = `${app}.${resourceType}`;
|
|
344
425
|
return {
|
|
345
|
-
[DynamoDB.Keys.PARTITION_KEY]: (tenantId
|
|
346
|
-
? `${tenantId}#${pkBase}`
|
|
347
|
-
: pkBase),
|
|
426
|
+
[DynamoDB.Keys.PARTITION_KEY]: (tenantId ? `${tenantId}#${pkBase}` : pkBase),
|
|
348
427
|
[DynamoDB.Keys.SORT_KEY]: `${id}`,
|
|
349
428
|
};
|
|
350
429
|
}
|
|
@@ -385,9 +464,7 @@ export class AuditRepository {
|
|
|
385
464
|
* @internal
|
|
386
465
|
*/
|
|
387
466
|
constructGSI1_SS({ tenantId, app, id, resourceType, resourceId, }) {
|
|
388
|
-
const pkBase = [`${app}.${resourceType}`, resourceId]
|
|
389
|
-
.filter(Boolean)
|
|
390
|
-
.join("#");
|
|
467
|
+
const pkBase = [`${app}.${resourceType}`, resourceId].filter(Boolean).join("#");
|
|
391
468
|
return {
|
|
392
469
|
[DynamoDB.Keys.GSI1_SS_PARTITION_KEY]: (tenantId
|
|
393
470
|
? `${tenantId}#${pkBase}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.utils.d.ts","sourceRoot":"","sources":["../src/repository.utils.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"repository.utils.d.ts","sourceRoot":"","sources":["../src/repository.utils.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAgB/F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAuBpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/schema/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMtB,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAa,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/schema/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMtB,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAa,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAa,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAI5B;;;;;GAKG;AACH,eAAO,MAAM,IAAI;;;;CAIP,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAOvD;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;EAAgC,CAAC;AAc1D;;;GAGG;AACH,QAAA,MAAM,uBAAuB;;;;iBAI3B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEzE;;;GAGG;AACH,QAAA,MAAM,wBAAwB;;;;iBAE5B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE3E;;;GAGG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAI5B;;;;;GAKG;AACH,eAAO,MAAM,IAAI;;;;CAIP,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAOvD;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;EAAgC,CAAC;AAc1D;;;GAGG;AACH,QAAA,MAAM,uBAAuB;;;;iBAI3B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEzE;;;GAGG;AACH,QAAA,MAAM,wBAAwB;;;;iBAE5B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE3E;;;GAGG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAsChF,eAAO,MAAM,oBAAoB,kHAEG,CAAC;AAErC;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,oHAEqC,CAAC;AAEvE;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;iBASxB,CAAC;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BrB,CAAC"}
|
package/dist/schema/index.d.ts
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export * from "./audit.js";
|
|
22
|
-
export { type AdditionalResource, type AnyTier, type ResourceReference, Tier
|
|
23
|
-
export { type AnyStatus, createTypedLogAuditSchema, type LogAuditInput, Status
|
|
22
|
+
export { type AdditionalResource, type AnyTier, type ResourceReference, Tier } from "./common.js";
|
|
23
|
+
export { type AnyStatus, createTypedLogAuditSchema, type LogAuditInput, Status } from "./log.js";
|
|
24
24
|
export * from "./model.js";
|
|
25
25
|
export * from "./service.js";
|
|
26
26
|
export * from "./storage.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,iBAAiB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,KAAK,SAAS,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACjG,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
package/dist/schema/index.js
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export * from "./audit.js";
|
|
22
|
-
export { Tier
|
|
23
|
-
export { createTypedLogAuditSchema, Status
|
|
22
|
+
export { Tier } from "./common.js";
|
|
23
|
+
export { createTypedLogAuditSchema, Status } from "./log.js";
|
|
24
24
|
export * from "./model.js";
|
|
25
25
|
export * from "./service.js";
|
|
26
26
|
export * from "./storage.js";
|
package/dist/schema/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/schema/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,UAAU,aAAiC,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;EAAgC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAAa,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;iBAOlC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;;;;iBAEnC,CAAC;AAEH;;;;;GAKG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAehF;;;GAGG;AACH,eAAO,MAAM,aAAa,6GAA6C,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/schema/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,UAAU,aAAiC,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;EAAgC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAAa,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;iBAOlC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;;;;iBAEnC,CAAC;AAEH;;;;;GAKG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAehF;;;GAGG;AACH,eAAO,MAAM,aAAa,6GAA6C,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqC9B,CAAC;AAEH;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;IACpB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;IACnB,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC;CAClB,CAAC,EACF,uBAAuB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;kBA0B3B"}
|
package/dist/schema/log.js
CHANGED
|
@@ -125,9 +125,7 @@ export const _BaseLogAuditSchema = z.object({
|
|
|
125
125
|
error: z
|
|
126
126
|
.union([z.string(), z.instanceof(Error)])
|
|
127
127
|
.optional()
|
|
128
|
-
.pipe(z.transform((e) => e instanceof Error
|
|
129
|
-
? JSON.stringify(e, Object.getOwnPropertyNames(e))
|
|
130
|
-
: e)),
|
|
128
|
+
.pipe(z.transform((e) => e instanceof Error ? JSON.stringify(e, Object.getOwnPropertyNames(e)) : e)),
|
|
131
129
|
});
|
|
132
130
|
/**
|
|
133
131
|
* Creates a LogAuditSchema with typed app and resourceType schemas.
|
|
@@ -172,8 +170,6 @@ export function createTypedLogAuditSchema(resourceReferenceSchema) {
|
|
|
172
170
|
error: z
|
|
173
171
|
.union([z.string(), z.instanceof(Error)])
|
|
174
172
|
.optional()
|
|
175
|
-
.pipe(z.transform((e) => e instanceof Error
|
|
176
|
-
? JSON.stringify(e, Object.getOwnPropertyNames(e))
|
|
177
|
-
: e)),
|
|
173
|
+
.pipe(z.transform((e) => e instanceof Error ? JSON.stringify(e, Object.getOwnPropertyNames(e)) : e)),
|
|
178
174
|
});
|
|
179
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/schema/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB;;;;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/schema/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB;;;;iBAUjC,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEvE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB;;;iBAK3B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC;;iBAGlE,CAAC;AAEL;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,KAAK,EAAE,CAAC,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,0BAA0B,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC;;;;;;iBAI5E,CAAC;AAEL;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC"}
|
package/dist/schema/model.js
CHANGED
|
@@ -25,7 +25,7 @@ export const EventBridgeEventSchema = z.object({
|
|
|
25
25
|
detail: z
|
|
26
26
|
.union([z.string(), z.record(z.string(), z.any())])
|
|
27
27
|
.optional()
|
|
28
|
-
.pipe(z.transform((val) => typeof val === "object" ? JSON.stringify(val) : val)),
|
|
28
|
+
.pipe(z.transform((val) => (typeof val === "object" ? JSON.stringify(val) : val))),
|
|
29
29
|
});
|
|
30
30
|
/**
|
|
31
31
|
* Schema for pagination parameters in list queries.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/schema/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAI5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAU5B,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/schema/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAI5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAU5B,CAAC;AAEH;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,4BAA4B,CAC1C,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC;IACpB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;IACnB,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC;CAClB,CAAC,EACF,uBAAuB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAc3B"}
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AuditEventBus } from "./events/bus.js";
|
|
2
2
|
import { AuditRepository } from "./repository.js";
|
|
3
|
-
import { createTypedUpsertAuditSchema
|
|
3
|
+
import { createTypedUpsertAuditSchema } from "./schema/service.js";
|
|
4
4
|
/**
|
|
5
5
|
* High-level service for managing audit records with typed App and ResourceType.
|
|
6
6
|
*
|
|
@@ -128,35 +128,11 @@ export class AuditService {
|
|
|
128
128
|
error: item.error,
|
|
129
129
|
at: now,
|
|
130
130
|
};
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
app: item.target.app,
|
|
137
|
-
resourceType: item.target.type,
|
|
138
|
-
tenantId: item.tenantId,
|
|
139
|
-
});
|
|
140
|
-
if (existing) {
|
|
141
|
-
// Append to existing attempts array
|
|
142
|
-
const existingAttempts = existing.attempts ?? [];
|
|
143
|
-
currentAttempt.number = existingAttempts.length + 1;
|
|
144
|
-
item.attempts = [...existingAttempts, currentAttempt];
|
|
145
|
-
// Preserve original createdAt
|
|
146
|
-
item.createdAt = existing.createdAt.toISOString();
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
item.attempts = [currentAttempt];
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Audit doesn't exist, this is the first attempt
|
|
154
|
-
item.attempts = [currentAttempt];
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
item.attempts = [currentAttempt];
|
|
159
|
-
}
|
|
131
|
+
// Upsert main item with atomic attempt tracking
|
|
132
|
+
// This handles both new items and retries in a single atomic operation
|
|
133
|
+
const attemptNumber = await this.storage.upsertItem(item, currentAttempt);
|
|
134
|
+
currentAttempt.number = attemptNumber;
|
|
135
|
+
// Build batch for related resource items (these don't need retry tracking)
|
|
160
136
|
const batch = Array.from(item.resources || [])
|
|
161
137
|
.filter((resource) => !!resource.id)
|
|
162
138
|
.map((resource) => ({
|
|
@@ -172,7 +148,9 @@ export class AuditService {
|
|
|
172
148
|
error: undefined,
|
|
173
149
|
attempts: undefined,
|
|
174
150
|
}));
|
|
175
|
-
|
|
151
|
+
if (batch.length > 0) {
|
|
152
|
+
await this.storage.upsertBatch(batch);
|
|
153
|
+
}
|
|
176
154
|
await this.events?.upserted([item]);
|
|
177
155
|
}
|
|
178
156
|
/**
|
package/dist/test-config.d.ts
CHANGED
|
@@ -9,20 +9,20 @@ export declare const testConfig: {
|
|
|
9
9
|
readonly resourceTypes: readonly ["Unknown", "User", "Order"];
|
|
10
10
|
} & {
|
|
11
11
|
schemas: {
|
|
12
|
-
app: import("zod").ZodEnum<{
|
|
12
|
+
app: import("zod/v4").ZodEnum<{
|
|
13
13
|
[x: string]: string;
|
|
14
14
|
}>;
|
|
15
|
-
resourceType: import("zod").ZodEnum<{
|
|
15
|
+
resourceType: import("zod/v4").ZodEnum<{
|
|
16
16
|
[x: string]: string;
|
|
17
17
|
}>;
|
|
18
|
-
resourceReference: import("zod").ZodObject<{
|
|
19
|
-
app: import("zod").ZodEnum<{
|
|
18
|
+
resourceReference: import("zod/v4").ZodObject<{
|
|
19
|
+
app: import("zod/v4").ZodEnum<{
|
|
20
20
|
[x: string]: string;
|
|
21
21
|
}>;
|
|
22
|
-
type: import("zod").ZodEnum<{
|
|
22
|
+
type: import("zod/v4").ZodEnum<{
|
|
23
23
|
[x: string]: string;
|
|
24
24
|
}>;
|
|
25
|
-
id: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
25
|
+
id: import("zod/v4").ZodOptional<import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber]>>;
|
|
26
26
|
}, import("zod/v4/core").$strip>;
|
|
27
27
|
};
|
|
28
28
|
_types: {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;AAEnF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -5,13 +5,6 @@ import type { DynamoDBRecord, KinesisStreamRecord, SQSRecord } from "aws-lambda"
|
|
|
5
5
|
import type { MessageWithAuditOverride } from "./batch/batch-processor.js";
|
|
6
6
|
import type { LogAuditInput } from "./schema/log.js";
|
|
7
7
|
import type { EventBridgeEvent } from "./schema/model.js";
|
|
8
|
-
/**
|
|
9
|
-
* Generates a random UUID for use as a trace identifier.
|
|
10
|
-
*
|
|
11
|
-
* @returns A random UUID string
|
|
12
|
-
* @deprecated Not currently used - consider using X-Ray trace IDs instead
|
|
13
|
-
*/
|
|
14
|
-
export declare function generateTraceId(): string;
|
|
15
8
|
/**
|
|
16
9
|
* Generates a unique, time-sortable audit ID using KSUID.
|
|
17
10
|
*
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGjF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAqBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,aAAa,EACpB,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAWf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAIf;AAED;;GAEG;AACH,KAAK,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,CAMzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,OAAO,GAAG,wBAAwB,GAC1C,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,OAAO,SAAS,EACjC,MAAM,EAAE,yBAAyB,GAChC,gBAAgB,GAAG,SAAS,CAK9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAQrF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO5E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,OAAO,SAAS,EACjC,MAAM,EAAE,SAAS,GAAG,mBAAmB,GAAG,cAAc,GACvD,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAElD"}
|
package/dist/utils.js
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { EventType } from "@aws-lambda-powertools/batch";
|
|
3
2
|
import KSUID from "ksuid";
|
|
4
3
|
import merge from "lodash.merge";
|
|
5
|
-
/**
|
|
6
|
-
* Generates a random UUID for use as a trace identifier.
|
|
7
|
-
*
|
|
8
|
-
* @returns A random UUID string
|
|
9
|
-
* @deprecated Not currently used - consider using X-Ray trace IDs instead
|
|
10
|
-
*/
|
|
11
|
-
export function generateTraceId() {
|
|
12
|
-
return randomUUID();
|
|
13
|
-
}
|
|
14
4
|
/**
|
|
15
5
|
* Generates a unique, time-sortable audit ID using KSUID.
|
|
16
6
|
*
|
|
@@ -157,19 +147,13 @@ export function normalizeEventBridgetInput(input) {
|
|
|
157
147
|
export function extractOverridesFromBatchProcessor(message) {
|
|
158
148
|
if (message && typeof message === "object") {
|
|
159
149
|
// Get the root message
|
|
160
|
-
const rootMessage = "message" in message && typeof message.message === "string"
|
|
161
|
-
? message.message
|
|
162
|
-
: undefined;
|
|
150
|
+
const rootMessage = "message" in message && typeof message.message === "string" ? message.message : undefined;
|
|
163
151
|
// Is there an audit override?
|
|
164
152
|
if ("_audit" in message) {
|
|
165
|
-
const auditOverrides = message._audit && typeof message._audit === "object"
|
|
166
|
-
? message._audit
|
|
167
|
-
: {};
|
|
153
|
+
const auditOverrides = message._audit && typeof message._audit === "object" ? message._audit : {};
|
|
168
154
|
return {
|
|
169
155
|
...auditOverrides,
|
|
170
|
-
message: [rootMessage, auditOverrides?.message]
|
|
171
|
-
.filter(Boolean)
|
|
172
|
-
.join(" "),
|
|
156
|
+
message: [rootMessage, auditOverrides?.message].filter(Boolean).join(" "),
|
|
173
157
|
};
|
|
174
158
|
}
|
|
175
159
|
if (rootMessage) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flipboxlabs/aws-audit-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "AWS Audit SDK - Core SDK for audit logging and event management",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"audit",
|
|
7
|
+
"aws",
|
|
8
|
+
"dynamodb",
|
|
9
|
+
"eventbridge",
|
|
10
|
+
"lambda",
|
|
11
|
+
"logging",
|
|
12
|
+
"serverless"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/flipboxlabs/aws-audit#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/flipboxlabs/aws-audit/issues"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/flipboxlabs/aws-audit.git",
|
|
22
|
+
"directory": "sdk"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md"
|
|
27
|
+
],
|
|
5
28
|
"type": "module",
|
|
6
29
|
"main": "./dist/index.js",
|
|
7
30
|
"exports": {
|
|
@@ -22,10 +45,6 @@
|
|
|
22
45
|
"import": "./dist/middleware/middy.js"
|
|
23
46
|
}
|
|
24
47
|
},
|
|
25
|
-
"files": [
|
|
26
|
-
"dist",
|
|
27
|
-
"README.md"
|
|
28
|
-
],
|
|
29
48
|
"dependencies": {
|
|
30
49
|
"@aws-lambda-powertools/batch": "^2.32.0",
|
|
31
50
|
"@aws-lambda-powertools/commons": "^2.32.0",
|
|
@@ -42,44 +61,18 @@
|
|
|
42
61
|
"@types/aws-lambda": "^8.10.156",
|
|
43
62
|
"@types/lodash.merge": "^4.6.9",
|
|
44
63
|
"@types/node": "^22.15.0",
|
|
45
|
-
"@vitest/coverage-v8": "^2.1.1",
|
|
46
64
|
"ts-node": "^10.9.2",
|
|
47
65
|
"typescript": "^5.9.3",
|
|
48
|
-
"
|
|
66
|
+
"vite-plus": "latest"
|
|
49
67
|
},
|
|
50
68
|
"engines": {
|
|
51
69
|
"node": ">=24"
|
|
52
70
|
},
|
|
53
|
-
"repository": {
|
|
54
|
-
"type": "git",
|
|
55
|
-
"url": "git+https://github.com/flipboxlabs/aws-audit.git",
|
|
56
|
-
"directory": "sdk"
|
|
57
|
-
},
|
|
58
|
-
"bugs": {
|
|
59
|
-
"url": "https://github.com/flipboxlabs/aws-audit/issues"
|
|
60
|
-
},
|
|
61
|
-
"homepage": "https://github.com/flipboxlabs/aws-audit#readme",
|
|
62
|
-
"license": "MIT",
|
|
63
|
-
"keywords": [
|
|
64
|
-
"aws",
|
|
65
|
-
"audit",
|
|
66
|
-
"logging",
|
|
67
|
-
"eventbridge",
|
|
68
|
-
"dynamodb",
|
|
69
|
-
"lambda",
|
|
70
|
-
"serverless"
|
|
71
|
-
],
|
|
72
71
|
"scripts": {
|
|
73
72
|
"build": "tsc -p ./tsconfig.build.json",
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"format": "npx biome format",
|
|
78
|
-
"format:fix": "npx biome format --fix",
|
|
79
|
-
"pre-commit": "pnpm run check-types && pnpm run format && pnpm run lint",
|
|
80
|
-
"test": "vitest run",
|
|
81
|
-
"test:watch": "vitest",
|
|
82
|
-
"test:coverage": "vitest run --coverage"
|
|
73
|
+
"test": "vp test run",
|
|
74
|
+
"test:watch": "vp test",
|
|
75
|
+
"test:coverage": "vp test run --coverage"
|
|
83
76
|
},
|
|
84
77
|
"types": "./dist/index.d.ts"
|
|
85
78
|
}
|