@geekmidas/audit 0.1.0 → 0.2.0

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 (55) hide show
  1. package/dist/{Auditor-DrR0ImvJ.d.cts → Auditor-_Dn2dp8d.d.mts} +4 -1
  2. package/dist/Auditor-_Dn2dp8d.d.mts.map +1 -0
  3. package/dist/{Auditor-Xf4Tp63p.d.mts → Auditor-sW7YAJIA.d.cts} +4 -1
  4. package/dist/Auditor-sW7YAJIA.d.cts.map +1 -0
  5. package/dist/Auditor.d.cts +1 -1
  6. package/dist/Auditor.d.mts +1 -1
  7. package/dist/DefaultAuditor-BAVnNmRh.mjs.map +1 -1
  8. package/dist/{DefaultAuditor-3Q1zVd1b.d.mts → DefaultAuditor-BSYMwojG.d.cts} +3 -2
  9. package/dist/DefaultAuditor-BSYMwojG.d.cts.map +1 -0
  10. package/dist/{DefaultAuditor-BaZa4u_m.d.cts → DefaultAuditor-CYE-uAry.d.mts} +3 -2
  11. package/dist/DefaultAuditor-CYE-uAry.d.mts.map +1 -0
  12. package/dist/DefaultAuditor-JbZ_BQfh.cjs.map +1 -1
  13. package/dist/DefaultAuditor.d.cts +2 -2
  14. package/dist/DefaultAuditor.d.mts +2 -2
  15. package/dist/{cache-0AjJ0zis.d.cts → cache-2VI80Vao.d.mts} +3 -2
  16. package/dist/cache-2VI80Vao.d.mts.map +1 -0
  17. package/dist/cache-BbIl31RL.mjs.map +1 -1
  18. package/dist/{cache-DBbGcCEq.d.mts → cache-CDHqXqcl.d.cts} +3 -2
  19. package/dist/cache-CDHqXqcl.d.cts.map +1 -0
  20. package/dist/cache-l7jAptBl.cjs.map +1 -1
  21. package/dist/cache.d.cts +2 -2
  22. package/dist/cache.d.mts +2 -2
  23. package/dist/index.d.cts +2 -2
  24. package/dist/index.d.mts +2 -2
  25. package/dist/kysely.cjs.map +1 -1
  26. package/dist/kysely.d.cts +2 -1
  27. package/dist/kysely.d.cts.map +1 -0
  28. package/dist/kysely.d.mts +2 -1
  29. package/dist/kysely.d.mts.map +1 -0
  30. package/dist/kysely.mjs.map +1 -1
  31. package/dist/memory.cjs.map +1 -1
  32. package/dist/memory.d.cts +3 -2
  33. package/dist/memory.d.cts.map +1 -0
  34. package/dist/memory.d.mts +3 -2
  35. package/dist/memory.d.mts.map +1 -0
  36. package/dist/memory.mjs.map +1 -1
  37. package/dist/storage.d.cts +1 -1
  38. package/dist/storage.d.mts +1 -1
  39. package/dist/types.d.cts +1 -1
  40. package/dist/types.d.mts +1 -1
  41. package/package.json +3 -3
  42. package/src/Auditor.ts +121 -121
  43. package/src/DefaultAuditor.ts +91 -91
  44. package/src/__tests__/CacheAuditStorage.spec.ts +375 -375
  45. package/src/__tests__/DefaultAuditor.spec.ts +520 -462
  46. package/src/__tests__/InMemoryAuditStorage.spec.ts +311 -311
  47. package/src/__tests__/KyselyAuditStorage.integration.spec.ts +496 -496
  48. package/src/__tests__/KyselyAuditStorage.spec.ts +433 -433
  49. package/src/cache.ts +179 -179
  50. package/src/index.ts +14 -15
  51. package/src/kysely.ts +292 -292
  52. package/src/memory.ts +11 -11
  53. package/src/storage.ts +131 -131
  54. package/src/types.ts +73 -74
  55. package/tsconfig.json +9 -0
@@ -160,6 +160,7 @@ interface AuditStorage<TAuditAction extends AuditableAction<string, unknown> = A
160
160
  flush(trx?: unknown): Promise<void>;
161
161
  }, callback: () => Promise<T>, db?: unknown): Promise<T>;
162
162
  }
163
+ //# sourceMappingURL=storage.d.ts.map
163
164
  //#endregion
164
165
  //#region src/types.d.ts
165
166
  /**
@@ -418,6 +419,8 @@ interface Auditor<TAuditAction extends AuditableAction<string, unknown> = Audita
418
419
  */
419
420
  getTransaction(): TTransaction | undefined;
420
421
  }
422
+ //# sourceMappingURL=Auditor.d.ts.map
423
+
421
424
  //#endregion
422
425
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
423
- //# sourceMappingURL=Auditor-DrR0ImvJ.d.cts.map
426
+ //# sourceMappingURL=Auditor-_Dn2dp8d.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auditor-_Dn2dp8d.d.mts","names":[],"sources":["../src/storage.ts","../src/types.ts","../src/Auditor.ts"],"sourcesContent":[],"mappings":"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"}
@@ -160,6 +160,7 @@ interface AuditStorage<TAuditAction extends AuditableAction<string, unknown> = A
160
160
  flush(trx?: unknown): Promise<void>;
161
161
  }, callback: () => Promise<T>, db?: unknown): Promise<T>;
162
162
  }
163
+ //# sourceMappingURL=storage.d.ts.map
163
164
  //#endregion
164
165
  //#region src/types.d.ts
165
166
  /**
@@ -418,6 +419,8 @@ interface Auditor<TAuditAction extends AuditableAction<string, unknown> = Audita
418
419
  */
419
420
  getTransaction(): TTransaction | undefined;
420
421
  }
422
+ //# sourceMappingURL=Auditor.d.ts.map
423
+
421
424
  //#endregion
422
425
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
423
- //# sourceMappingURL=Auditor-Xf4Tp63p.d.mts.map
426
+ //# sourceMappingURL=Auditor-sW7YAJIA.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auditor-sW7YAJIA.d.cts","names":[],"sources":["../src/storage.ts","../src/types.ts","../src/Auditor.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { Auditor } from "./Auditor-DrR0ImvJ.cjs";
1
+ import { Auditor } from "./Auditor-sW7YAJIA.cjs";
2
2
  export { Auditor };
@@ -1,2 +1,2 @@
1
- import { Auditor } from "./Auditor-Xf4Tp63p.mjs";
1
+ import { Auditor } from "./Auditor-_Dn2dp8d.mjs";
2
2
  export { Auditor };
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultAuditor-BAVnNmRh.mjs","names":["config: DefaultAuditorConfig","type: TType","payload: ExtractAuditPayload<TAuditAction, TType>","options?: AuditOptions","record: AuditRecord","record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>","fullRecord: AuditRecord","trx?: TTransaction","trx: TTransaction","metadata: AuditMetadata"],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type { Auditor } from './Auditor';\nimport type { AuditStorage } from './storage';\nimport type {\n AuditActor,\n AuditMetadata,\n AuditOptions,\n AuditRecord,\n AuditableAction,\n ExtractAuditPayload,\n ExtractAuditType,\n} from './types';\n\n/**\n * Configuration for DefaultAuditor.\n */\nexport interface DefaultAuditorConfig {\n /** The actor performing audits (set at construction, immutable) */\n actor: AuditActor;\n /** Storage backend for persisting audits */\n storage: AuditStorage;\n /** Optional metadata to attach to all audits */\n metadata?: AuditMetadata;\n /** Optional custom ID generator (defaults to nanoid) */\n generateId?: () => string;\n}\n\n/**\n * Default implementation of the Auditor interface.\n * Collects audit records in memory and flushes to storage.\n *\n * @template TAuditAction - Union of all allowed audit action types\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * const auditor = new DefaultAuditor<AppAuditAction>({\n * actor: { id: 'user-123', type: 'user' },\n * storage: auditStorage,\n * metadata: { requestId: 'req-456', endpoint: '/users' },\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n *\n * // Flush inside transaction\n * await auditor.flush(trx);\n * ```\n */\nexport class DefaultAuditor<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TTransaction = unknown,\n> implements Auditor<TAuditAction, TTransaction>\n{\n readonly actor: AuditActor;\n private readonly storage: AuditStorage;\n private metadata?: AuditMetadata;\n private readonly generateId: () => string;\n private records: AuditRecord[] = [];\n private transaction?: TTransaction;\n\n constructor(config: DefaultAuditorConfig) {\n this.actor = config.actor;\n this.storage = config.storage;\n this.metadata = config.metadata;\n this.generateId = config.generateId ?? (() => nanoid());\n }\n\n audit<TType extends ExtractAuditType<TAuditAction>>(\n type: TType,\n payload: ExtractAuditPayload<TAuditAction, TType>,\n options?: AuditOptions,\n ): void {\n const record: AuditRecord = {\n id: this.generateId(),\n type,\n operation: options?.operation ?? 'CUSTOM',\n table: options?.table,\n entityId: options?.entityId,\n oldValues: options?.oldValues,\n newValues: options?.newValues,\n payload,\n timestamp: new Date(),\n actor: this.actor,\n metadata: this.metadata,\n };\n\n this.records.push(record);\n }\n\n record(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void {\n const fullRecord: AuditRecord = {\n ...record,\n id: this.generateId(),\n timestamp: new Date(),\n actor: this.actor,\n metadata: this.metadata\n ? { ...this.metadata, ...record.metadata }\n : record.metadata,\n };\n\n this.records.push(fullRecord);\n }\n\n getRecords(): AuditRecord[] {\n return [...this.records];\n }\n\n async flush(trx?: TTransaction): Promise<void> {\n if (this.records.length === 0) {\n return;\n }\n\n const recordsToFlush = [...this.records];\n this.records = [];\n\n // Use explicitly passed transaction, or fall back to stored transaction\n const transactionToUse = trx ?? this.transaction;\n await this.storage.write(recordsToFlush, transactionToUse);\n }\n\n setTransaction(trx: TTransaction): void {\n this.transaction = trx;\n }\n\n getTransaction(): TTransaction | undefined {\n return this.transaction;\n }\n\n clear(): void {\n this.records = [];\n }\n\n addMetadata(metadata: AuditMetadata): void {\n this.metadata = this.metadata\n ? { ...this.metadata, ...metadata }\n : metadata;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,iBAAb,MAOA;CACE,AAAS;CACT,AAAiB;CACjB,AAAQ;CACR,AAAiB;CACjB,AAAQ,UAAyB,CAAE;CACnC,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;AACvB,OAAK,aAAa,OAAO,eAAe,MAAM,QAAQ;CACvD;CAED,MACEC,MACAC,SACAC,SACM;EACN,MAAMC,SAAsB;GAC1B,IAAI,KAAK,YAAY;GACrB;GACA,WAAW,SAAS,aAAa;GACjC,OAAO,SAAS;GAChB,UAAU,SAAS;GACnB,WAAW,SAAS;GACpB,WAAW,SAAS;GACpB;GACA,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;EAChB;AAED,OAAK,QAAQ,KAAK,OAAO;CAC1B;CAED,OAAOC,QAA+D;EACpE,MAAMC,aAA0B;GAC9B,GAAG;GACH,IAAI,KAAK,YAAY;GACrB,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK,WACX;IAAE,GAAG,KAAK;IAAU,GAAG,OAAO;GAAU,IACxC,OAAO;EACZ;AAED,OAAK,QAAQ,KAAK,WAAW;CAC9B;CAED,aAA4B;AAC1B,SAAO,CAAC,GAAG,KAAK,OAAQ;CACzB;CAED,MAAM,MAAMC,KAAmC;AAC7C,MAAI,KAAK,QAAQ,WAAW,EAC1B;EAGF,MAAM,iBAAiB,CAAC,GAAG,KAAK,OAAQ;AACxC,OAAK,UAAU,CAAE;EAGjB,MAAM,mBAAmB,OAAO,KAAK;AACrC,QAAM,KAAK,QAAQ,MAAM,gBAAgB,iBAAiB;CAC3D;CAED,eAAeC,KAAyB;AACtC,OAAK,cAAc;CACpB;CAED,iBAA2C;AACzC,SAAO,KAAK;CACb;CAED,QAAc;AACZ,OAAK,UAAU,CAAE;CAClB;CAED,YAAYC,UAA+B;AACzC,OAAK,WAAW,KAAK,WACjB;GAAE,GAAG,KAAK;GAAU,GAAG;EAAU,IACjC;CACL;AACF"}
1
+ {"version":3,"file":"DefaultAuditor-BAVnNmRh.mjs","names":["config: DefaultAuditorConfig","type: TType","payload: ExtractAuditPayload<TAuditAction, TType>","options?: AuditOptions","record: AuditRecord","record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>","fullRecord: AuditRecord","trx?: TTransaction","trx: TTransaction","metadata: AuditMetadata"],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type { Auditor } from './Auditor';\nimport type { AuditStorage } from './storage';\nimport type {\n\tAuditActor,\n\tAuditableAction,\n\tAuditMetadata,\n\tAuditOptions,\n\tAuditRecord,\n\tExtractAuditPayload,\n\tExtractAuditType,\n} from './types';\n\n/**\n * Configuration for DefaultAuditor.\n */\nexport interface DefaultAuditorConfig {\n\t/** The actor performing audits (set at construction, immutable) */\n\tactor: AuditActor;\n\t/** Storage backend for persisting audits */\n\tstorage: AuditStorage;\n\t/** Optional metadata to attach to all audits */\n\tmetadata?: AuditMetadata;\n\t/** Optional custom ID generator (defaults to nanoid) */\n\tgenerateId?: () => string;\n}\n\n/**\n * Default implementation of the Auditor interface.\n * Collects audit records in memory and flushes to storage.\n *\n * @template TAuditAction - Union of all allowed audit action types\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * const auditor = new DefaultAuditor<AppAuditAction>({\n * actor: { id: 'user-123', type: 'user' },\n * storage: auditStorage,\n * metadata: { requestId: 'req-456', endpoint: '/users' },\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n *\n * // Flush inside transaction\n * await auditor.flush(trx);\n * ```\n */\nexport class DefaultAuditor<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTTransaction = unknown,\n> implements Auditor<TAuditAction, TTransaction>\n{\n\treadonly actor: AuditActor;\n\tprivate readonly storage: AuditStorage;\n\tprivate metadata?: AuditMetadata;\n\tprivate readonly generateId: () => string;\n\tprivate records: AuditRecord[] = [];\n\tprivate transaction?: TTransaction;\n\n\tconstructor(config: DefaultAuditorConfig) {\n\t\tthis.actor = config.actor;\n\t\tthis.storage = config.storage;\n\t\tthis.metadata = config.metadata;\n\t\tthis.generateId = config.generateId ?? (() => nanoid());\n\t}\n\n\taudit<TType extends ExtractAuditType<TAuditAction>>(\n\t\ttype: TType,\n\t\tpayload: ExtractAuditPayload<TAuditAction, TType>,\n\t\toptions?: AuditOptions,\n\t): void {\n\t\tconst record: AuditRecord = {\n\t\t\tid: this.generateId(),\n\t\t\ttype,\n\t\t\toperation: options?.operation ?? 'CUSTOM',\n\t\t\ttable: options?.table,\n\t\t\tentityId: options?.entityId,\n\t\t\toldValues: options?.oldValues,\n\t\t\tnewValues: options?.newValues,\n\t\t\tpayload,\n\t\t\ttimestamp: new Date(),\n\t\t\tactor: this.actor,\n\t\t\tmetadata: this.metadata,\n\t\t};\n\n\t\tthis.records.push(record);\n\t}\n\n\trecord(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void {\n\t\tconst fullRecord: AuditRecord = {\n\t\t\t...record,\n\t\t\tid: this.generateId(),\n\t\t\ttimestamp: new Date(),\n\t\t\tactor: this.actor,\n\t\t\tmetadata: this.metadata\n\t\t\t\t? { ...this.metadata, ...record.metadata }\n\t\t\t\t: record.metadata,\n\t\t};\n\n\t\tthis.records.push(fullRecord);\n\t}\n\n\tgetRecords(): AuditRecord[] {\n\t\treturn [...this.records];\n\t}\n\n\tasync flush(trx?: TTransaction): Promise<void> {\n\t\tif (this.records.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst recordsToFlush = [...this.records];\n\t\tthis.records = [];\n\n\t\t// Use explicitly passed transaction, or fall back to stored transaction\n\t\tconst transactionToUse = trx ?? this.transaction;\n\t\tawait this.storage.write(recordsToFlush, transactionToUse);\n\t}\n\n\tsetTransaction(trx: TTransaction): void {\n\t\tthis.transaction = trx;\n\t}\n\n\tgetTransaction(): TTransaction | undefined {\n\t\treturn this.transaction;\n\t}\n\n\tclear(): void {\n\t\tthis.records = [];\n\t}\n\n\taddMetadata(metadata: AuditMetadata): void {\n\t\tthis.metadata = this.metadata\n\t\t\t? { ...this.metadata, ...metadata }\n\t\t\t: metadata;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,iBAAb,MAOA;CACC,AAAS;CACT,AAAiB;CACjB,AAAQ;CACR,AAAiB;CACjB,AAAQ,UAAyB,CAAE;CACnC,AAAQ;CAER,YAAYA,QAA8B;AACzC,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;AACvB,OAAK,aAAa,OAAO,eAAe,MAAM,QAAQ;CACtD;CAED,MACCC,MACAC,SACAC,SACO;EACP,MAAMC,SAAsB;GAC3B,IAAI,KAAK,YAAY;GACrB;GACA,WAAW,SAAS,aAAa;GACjC,OAAO,SAAS;GAChB,UAAU,SAAS;GACnB,WAAW,SAAS;GACpB,WAAW,SAAS;GACpB;GACA,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;EACf;AAED,OAAK,QAAQ,KAAK,OAAO;CACzB;CAED,OAAOC,QAA+D;EACrE,MAAMC,aAA0B;GAC/B,GAAG;GACH,IAAI,KAAK,YAAY;GACrB,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK,WACZ;IAAE,GAAG,KAAK;IAAU,GAAG,OAAO;GAAU,IACxC,OAAO;EACV;AAED,OAAK,QAAQ,KAAK,WAAW;CAC7B;CAED,aAA4B;AAC3B,SAAO,CAAC,GAAG,KAAK,OAAQ;CACxB;CAED,MAAM,MAAMC,KAAmC;AAC9C,MAAI,KAAK,QAAQ,WAAW,EAC3B;EAGD,MAAM,iBAAiB,CAAC,GAAG,KAAK,OAAQ;AACxC,OAAK,UAAU,CAAE;EAGjB,MAAM,mBAAmB,OAAO,KAAK;AACrC,QAAM,KAAK,QAAQ,MAAM,gBAAgB,iBAAiB;CAC1D;CAED,eAAeC,KAAyB;AACvC,OAAK,cAAc;CACnB;CAED,iBAA2C;AAC1C,SAAO,KAAK;CACZ;CAED,QAAc;AACb,OAAK,UAAU,CAAE;CACjB;CAED,YAAYC,UAA+B;AAC1C,OAAK,WAAW,KAAK,WAClB;GAAE,GAAG,KAAK;GAAU,GAAG;EAAU,IACjC;CACH;AACD"}
@@ -1,4 +1,4 @@
1
- import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-Xf4Tp63p.mjs";
1
+ import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-sW7YAJIA.cjs";
2
2
 
3
3
  //#region src/DefaultAuditor.d.ts
4
4
 
@@ -53,6 +53,7 @@ declare class DefaultAuditor<TAuditAction extends AuditableAction<string, unknow
53
53
  clear(): void;
54
54
  addMetadata(metadata: AuditMetadata): void;
55
55
  }
56
+ //# sourceMappingURL=DefaultAuditor.d.ts.map
56
57
  //#endregion
57
58
  export { DefaultAuditor, DefaultAuditorConfig };
58
- //# sourceMappingURL=DefaultAuditor-3Q1zVd1b.d.mts.map
59
+ //# sourceMappingURL=DefaultAuditor-BSYMwojG.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultAuditor-BSYMwojG.d.cts","names":[],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":[],"mappings":";;;;AAgBA;;;AAIU,UAJO,oBAAA,CAIP;EAAY;EAEG,KAAA,EAJjB,UAIiB;EA0BZ;EAAc,OAAA,EA5BjB,YA4BiB;EAAA;EACU,QAAoB,CAAA,EA3B7C,aA2B6C;EAAe;EAKvC,UAAE,CAAA,EAAA,GAAA,GAAA,MAAA;;;;;;;;;;;;;;;;;;;AAAf;;;;cANP,oCACS,mCAAmC,qEAK5C,QAAQ,cAAc;kBAElB;;;;;;sBAOI;sBAOA,iBAAiB,qBAC9B,gBACG,oBAAoB,cAAc,kBACjC;iBAmBI,KAAK;gBAcN;cAII,eAAe;sBAab;oBAIF;;wBAQI"}
@@ -1,4 +1,4 @@
1
- import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-DrR0ImvJ.cjs";
1
+ import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-_Dn2dp8d.mjs";
2
2
 
3
3
  //#region src/DefaultAuditor.d.ts
4
4
 
@@ -53,6 +53,7 @@ declare class DefaultAuditor<TAuditAction extends AuditableAction<string, unknow
53
53
  clear(): void;
54
54
  addMetadata(metadata: AuditMetadata): void;
55
55
  }
56
+ //# sourceMappingURL=DefaultAuditor.d.ts.map
56
57
  //#endregion
57
58
  export { DefaultAuditor, DefaultAuditorConfig };
58
- //# sourceMappingURL=DefaultAuditor-BaZa4u_m.d.cts.map
59
+ //# sourceMappingURL=DefaultAuditor-CYE-uAry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultAuditor-CYE-uAry.d.mts","names":[],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":[],"mappings":";;;;AAgBA;;;AAIU,UAJO,oBAAA,CAIP;EAAY;EAEG,KAAA,EAJjB,UAIiB;EA0BZ;EAAc,OAAA,EA5BjB,YA4BiB;EAAA;EACU,QAAoB,CAAA,EA3B7C,aA2B6C;EAAe;EAKvC,UAAE,CAAA,EAAA,GAAA,GAAA,MAAA;;;;;;;;;;;;;;;;;;;AAAf;;;;cANP,oCACS,mCAAmC,qEAK5C,QAAQ,cAAc;kBAElB;;;;;;sBAOI;sBAOA,iBAAiB,qBAC9B,gBACG,oBAAoB,cAAc,kBACjC;iBAmBI,KAAK;gBAcN;cAII,eAAe;sBAab;oBAIF;;wBAQI"}
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultAuditor-JbZ_BQfh.cjs","names":["config: DefaultAuditorConfig","type: TType","payload: ExtractAuditPayload<TAuditAction, TType>","options?: AuditOptions","record: AuditRecord","record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>","fullRecord: AuditRecord","trx?: TTransaction","trx: TTransaction","metadata: AuditMetadata"],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type { Auditor } from './Auditor';\nimport type { AuditStorage } from './storage';\nimport type {\n AuditActor,\n AuditMetadata,\n AuditOptions,\n AuditRecord,\n AuditableAction,\n ExtractAuditPayload,\n ExtractAuditType,\n} from './types';\n\n/**\n * Configuration for DefaultAuditor.\n */\nexport interface DefaultAuditorConfig {\n /** The actor performing audits (set at construction, immutable) */\n actor: AuditActor;\n /** Storage backend for persisting audits */\n storage: AuditStorage;\n /** Optional metadata to attach to all audits */\n metadata?: AuditMetadata;\n /** Optional custom ID generator (defaults to nanoid) */\n generateId?: () => string;\n}\n\n/**\n * Default implementation of the Auditor interface.\n * Collects audit records in memory and flushes to storage.\n *\n * @template TAuditAction - Union of all allowed audit action types\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * const auditor = new DefaultAuditor<AppAuditAction>({\n * actor: { id: 'user-123', type: 'user' },\n * storage: auditStorage,\n * metadata: { requestId: 'req-456', endpoint: '/users' },\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n *\n * // Flush inside transaction\n * await auditor.flush(trx);\n * ```\n */\nexport class DefaultAuditor<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TTransaction = unknown,\n> implements Auditor<TAuditAction, TTransaction>\n{\n readonly actor: AuditActor;\n private readonly storage: AuditStorage;\n private metadata?: AuditMetadata;\n private readonly generateId: () => string;\n private records: AuditRecord[] = [];\n private transaction?: TTransaction;\n\n constructor(config: DefaultAuditorConfig) {\n this.actor = config.actor;\n this.storage = config.storage;\n this.metadata = config.metadata;\n this.generateId = config.generateId ?? (() => nanoid());\n }\n\n audit<TType extends ExtractAuditType<TAuditAction>>(\n type: TType,\n payload: ExtractAuditPayload<TAuditAction, TType>,\n options?: AuditOptions,\n ): void {\n const record: AuditRecord = {\n id: this.generateId(),\n type,\n operation: options?.operation ?? 'CUSTOM',\n table: options?.table,\n entityId: options?.entityId,\n oldValues: options?.oldValues,\n newValues: options?.newValues,\n payload,\n timestamp: new Date(),\n actor: this.actor,\n metadata: this.metadata,\n };\n\n this.records.push(record);\n }\n\n record(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void {\n const fullRecord: AuditRecord = {\n ...record,\n id: this.generateId(),\n timestamp: new Date(),\n actor: this.actor,\n metadata: this.metadata\n ? { ...this.metadata, ...record.metadata }\n : record.metadata,\n };\n\n this.records.push(fullRecord);\n }\n\n getRecords(): AuditRecord[] {\n return [...this.records];\n }\n\n async flush(trx?: TTransaction): Promise<void> {\n if (this.records.length === 0) {\n return;\n }\n\n const recordsToFlush = [...this.records];\n this.records = [];\n\n // Use explicitly passed transaction, or fall back to stored transaction\n const transactionToUse = trx ?? this.transaction;\n await this.storage.write(recordsToFlush, transactionToUse);\n }\n\n setTransaction(trx: TTransaction): void {\n this.transaction = trx;\n }\n\n getTransaction(): TTransaction | undefined {\n return this.transaction;\n }\n\n clear(): void {\n this.records = [];\n }\n\n addMetadata(metadata: AuditMetadata): void {\n this.metadata = this.metadata\n ? { ...this.metadata, ...metadata }\n : metadata;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,iBAAb,MAOA;CACE,AAAS;CACT,AAAiB;CACjB,AAAQ;CACR,AAAiB;CACjB,AAAQ,UAAyB,CAAE;CACnC,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;AACvB,OAAK,aAAa,OAAO,eAAe,MAAM,oBAAQ;CACvD;CAED,MACEC,MACAC,SACAC,SACM;EACN,MAAMC,SAAsB;GAC1B,IAAI,KAAK,YAAY;GACrB;GACA,WAAW,SAAS,aAAa;GACjC,OAAO,SAAS;GAChB,UAAU,SAAS;GACnB,WAAW,SAAS;GACpB,WAAW,SAAS;GACpB;GACA,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;EAChB;AAED,OAAK,QAAQ,KAAK,OAAO;CAC1B;CAED,OAAOC,QAA+D;EACpE,MAAMC,aAA0B;GAC9B,GAAG;GACH,IAAI,KAAK,YAAY;GACrB,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK,WACX;IAAE,GAAG,KAAK;IAAU,GAAG,OAAO;GAAU,IACxC,OAAO;EACZ;AAED,OAAK,QAAQ,KAAK,WAAW;CAC9B;CAED,aAA4B;AAC1B,SAAO,CAAC,GAAG,KAAK,OAAQ;CACzB;CAED,MAAM,MAAMC,KAAmC;AAC7C,MAAI,KAAK,QAAQ,WAAW,EAC1B;EAGF,MAAM,iBAAiB,CAAC,GAAG,KAAK,OAAQ;AACxC,OAAK,UAAU,CAAE;EAGjB,MAAM,mBAAmB,OAAO,KAAK;AACrC,QAAM,KAAK,QAAQ,MAAM,gBAAgB,iBAAiB;CAC3D;CAED,eAAeC,KAAyB;AACtC,OAAK,cAAc;CACpB;CAED,iBAA2C;AACzC,SAAO,KAAK;CACb;CAED,QAAc;AACZ,OAAK,UAAU,CAAE;CAClB;CAED,YAAYC,UAA+B;AACzC,OAAK,WAAW,KAAK,WACjB;GAAE,GAAG,KAAK;GAAU,GAAG;EAAU,IACjC;CACL;AACF"}
1
+ {"version":3,"file":"DefaultAuditor-JbZ_BQfh.cjs","names":["config: DefaultAuditorConfig","type: TType","payload: ExtractAuditPayload<TAuditAction, TType>","options?: AuditOptions","record: AuditRecord","record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>","fullRecord: AuditRecord","trx?: TTransaction","trx: TTransaction","metadata: AuditMetadata"],"sources":["../src/DefaultAuditor.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type { Auditor } from './Auditor';\nimport type { AuditStorage } from './storage';\nimport type {\n\tAuditActor,\n\tAuditableAction,\n\tAuditMetadata,\n\tAuditOptions,\n\tAuditRecord,\n\tExtractAuditPayload,\n\tExtractAuditType,\n} from './types';\n\n/**\n * Configuration for DefaultAuditor.\n */\nexport interface DefaultAuditorConfig {\n\t/** The actor performing audits (set at construction, immutable) */\n\tactor: AuditActor;\n\t/** Storage backend for persisting audits */\n\tstorage: AuditStorage;\n\t/** Optional metadata to attach to all audits */\n\tmetadata?: AuditMetadata;\n\t/** Optional custom ID generator (defaults to nanoid) */\n\tgenerateId?: () => string;\n}\n\n/**\n * Default implementation of the Auditor interface.\n * Collects audit records in memory and flushes to storage.\n *\n * @template TAuditAction - Union of all allowed audit action types\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * const auditor = new DefaultAuditor<AppAuditAction>({\n * actor: { id: 'user-123', type: 'user' },\n * storage: auditStorage,\n * metadata: { requestId: 'req-456', endpoint: '/users' },\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n *\n * // Flush inside transaction\n * await auditor.flush(trx);\n * ```\n */\nexport class DefaultAuditor<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTTransaction = unknown,\n> implements Auditor<TAuditAction, TTransaction>\n{\n\treadonly actor: AuditActor;\n\tprivate readonly storage: AuditStorage;\n\tprivate metadata?: AuditMetadata;\n\tprivate readonly generateId: () => string;\n\tprivate records: AuditRecord[] = [];\n\tprivate transaction?: TTransaction;\n\n\tconstructor(config: DefaultAuditorConfig) {\n\t\tthis.actor = config.actor;\n\t\tthis.storage = config.storage;\n\t\tthis.metadata = config.metadata;\n\t\tthis.generateId = config.generateId ?? (() => nanoid());\n\t}\n\n\taudit<TType extends ExtractAuditType<TAuditAction>>(\n\t\ttype: TType,\n\t\tpayload: ExtractAuditPayload<TAuditAction, TType>,\n\t\toptions?: AuditOptions,\n\t): void {\n\t\tconst record: AuditRecord = {\n\t\t\tid: this.generateId(),\n\t\t\ttype,\n\t\t\toperation: options?.operation ?? 'CUSTOM',\n\t\t\ttable: options?.table,\n\t\t\tentityId: options?.entityId,\n\t\t\toldValues: options?.oldValues,\n\t\t\tnewValues: options?.newValues,\n\t\t\tpayload,\n\t\t\ttimestamp: new Date(),\n\t\t\tactor: this.actor,\n\t\t\tmetadata: this.metadata,\n\t\t};\n\n\t\tthis.records.push(record);\n\t}\n\n\trecord(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void {\n\t\tconst fullRecord: AuditRecord = {\n\t\t\t...record,\n\t\t\tid: this.generateId(),\n\t\t\ttimestamp: new Date(),\n\t\t\tactor: this.actor,\n\t\t\tmetadata: this.metadata\n\t\t\t\t? { ...this.metadata, ...record.metadata }\n\t\t\t\t: record.metadata,\n\t\t};\n\n\t\tthis.records.push(fullRecord);\n\t}\n\n\tgetRecords(): AuditRecord[] {\n\t\treturn [...this.records];\n\t}\n\n\tasync flush(trx?: TTransaction): Promise<void> {\n\t\tif (this.records.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst recordsToFlush = [...this.records];\n\t\tthis.records = [];\n\n\t\t// Use explicitly passed transaction, or fall back to stored transaction\n\t\tconst transactionToUse = trx ?? this.transaction;\n\t\tawait this.storage.write(recordsToFlush, transactionToUse);\n\t}\n\n\tsetTransaction(trx: TTransaction): void {\n\t\tthis.transaction = trx;\n\t}\n\n\tgetTransaction(): TTransaction | undefined {\n\t\treturn this.transaction;\n\t}\n\n\tclear(): void {\n\t\tthis.records = [];\n\t}\n\n\taddMetadata(metadata: AuditMetadata): void {\n\t\tthis.metadata = this.metadata\n\t\t\t? { ...this.metadata, ...metadata }\n\t\t\t: metadata;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,iBAAb,MAOA;CACC,AAAS;CACT,AAAiB;CACjB,AAAQ;CACR,AAAiB;CACjB,AAAQ,UAAyB,CAAE;CACnC,AAAQ;CAER,YAAYA,QAA8B;AACzC,OAAK,QAAQ,OAAO;AACpB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;AACvB,OAAK,aAAa,OAAO,eAAe,MAAM,oBAAQ;CACtD;CAED,MACCC,MACAC,SACAC,SACO;EACP,MAAMC,SAAsB;GAC3B,IAAI,KAAK,YAAY;GACrB;GACA,WAAW,SAAS,aAAa;GACjC,OAAO,SAAS;GAChB,UAAU,SAAS;GACnB,WAAW,SAAS;GACpB,WAAW,SAAS;GACpB;GACA,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;EACf;AAED,OAAK,QAAQ,KAAK,OAAO;CACzB;CAED,OAAOC,QAA+D;EACrE,MAAMC,aAA0B;GAC/B,GAAG;GACH,IAAI,KAAK,YAAY;GACrB,2BAAW,IAAI;GACf,OAAO,KAAK;GACZ,UAAU,KAAK,WACZ;IAAE,GAAG,KAAK;IAAU,GAAG,OAAO;GAAU,IACxC,OAAO;EACV;AAED,OAAK,QAAQ,KAAK,WAAW;CAC7B;CAED,aAA4B;AAC3B,SAAO,CAAC,GAAG,KAAK,OAAQ;CACxB;CAED,MAAM,MAAMC,KAAmC;AAC9C,MAAI,KAAK,QAAQ,WAAW,EAC3B;EAGD,MAAM,iBAAiB,CAAC,GAAG,KAAK,OAAQ;AACxC,OAAK,UAAU,CAAE;EAGjB,MAAM,mBAAmB,OAAO,KAAK;AACrC,QAAM,KAAK,QAAQ,MAAM,gBAAgB,iBAAiB;CAC1D;CAED,eAAeC,KAAyB;AACvC,OAAK,cAAc;CACnB;CAED,iBAA2C;AAC1C,SAAO,KAAK;CACZ;CAED,QAAc;AACb,OAAK,UAAU,CAAE;CACjB;CAED,YAAYC,UAA+B;AAC1C,OAAK,WAAW,KAAK,WAClB;GAAE,GAAG,KAAK;GAAU,GAAG;EAAU,IACjC;CACH;AACD"}
@@ -1,3 +1,3 @@
1
- import "./Auditor-DrR0ImvJ.cjs";
2
- import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-BaZa4u_m.cjs";
1
+ import "./Auditor-sW7YAJIA.cjs";
2
+ import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-BSYMwojG.cjs";
3
3
  export { DefaultAuditor, DefaultAuditorConfig };
@@ -1,3 +1,3 @@
1
- import "./Auditor-Xf4Tp63p.mjs";
2
- import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-3Q1zVd1b.mjs";
1
+ import "./Auditor-_Dn2dp8d.mjs";
2
+ import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-CYE-uAry.mjs";
3
3
  export { DefaultAuditor, DefaultAuditorConfig };
@@ -1,4 +1,4 @@
1
- import { AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction } from "./Auditor-DrR0ImvJ.cjs";
1
+ import { AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction } from "./Auditor-_Dn2dp8d.mjs";
2
2
  import { Cache } from "@geekmidas/cache";
3
3
 
4
4
  //#region src/cache.d.ts
@@ -90,6 +90,7 @@ declare class CacheAuditStorage<TAuditAction extends AuditableAction<string, unk
90
90
  private deserializeRecord;
91
91
  private applyFilters;
92
92
  }
93
+ //# sourceMappingURL=cache.d.ts.map
93
94
  //#endregion
94
95
  export { CacheAuditStorage, CacheAuditStorageConfig };
95
- //# sourceMappingURL=cache-0AjJ0zis.d.cts.map
96
+ //# sourceMappingURL=cache-2VI80Vao.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-2VI80Vao.d.mts","names":[],"sources":["../src/cache.ts"],"sourcesContent":[],"mappings":";;;;;;AAOA;AAqDA;AAA8B,UArDb,uBAAA,CAqDa;EAAA;EACO,KAAoB,EApDjD,KAoDiD;EAAe;;;;;EA+CjC,MAAW,CAAA,EAAA,MAAA;EAAW;;;;EA+BlD,GAQkB,CAAA,EAAA,MAAA;;;;AAlFJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cALZ,uCACS,mCAAmC,6CAI5C,aAAa;;;;;sBAOL;;;;iBAUC,gBAAgB;;;;iBA0BhB,oBAAoB,QAAQ;;;;iBA8BvC,KAAK,yCACZ;;;;gBAQiB,QAAQ;;;;WAOb"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache-BbIl31RL.mjs","names":["config: CacheAuditStorageConfig","records: AuditRecord[]","newIds: string[]","options: AuditQueryOptions","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","id: string","validIds: string[]","record: AuditRecord","serialized: SerializedAuditRecord"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditRecord, AuditableAction } from './types';\n\n/**\n * Configuration for CacheAuditStorage.\n */\nexport interface CacheAuditStorageConfig {\n /** Cache instance to use for storage */\n cache: Cache;\n /**\n * Key prefix for audit records.\n * Records are stored as `${prefix}:${id}`.\n * @default 'audit'\n */\n prefix?: string;\n /**\n * TTL (time-to-live) in seconds for audit records.\n * If not set, records use the cache's default TTL.\n */\n ttl?: number;\n}\n\n/**\n * Cache-based audit storage implementation.\n * Uses any @geekmidas/cache implementation for storage.\n *\n * Best suited for:\n * - Development and testing\n * - Temporary audit logs that don't need persistence\n * - Applications with existing cache infrastructure\n * - Distributed systems needing shared audit state (with Redis/Upstash)\n *\n * Note: Query performance may degrade with large numbers of records\n * since filtering happens in memory after fetching all records.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { CacheAuditStorage } from '@geekmidas/audit/cache';\n * import { InMemoryCache } from '@geekmidas/cache/memory';\n * import { UpstashCache } from '@geekmidas/cache/upstash';\n *\n * // With in-memory cache (development/testing)\n * const storage = new CacheAuditStorage({\n * cache: new InMemoryCache(),\n * ttl: 86400, // 24 hours\n * });\n *\n * // With Upstash Redis (production)\n * const storage = new CacheAuditStorage({\n * cache: new UpstashCache({\n * url: process.env.UPSTASH_REDIS_URL,\n * token: process.env.UPSTASH_REDIS_TOKEN,\n * }),\n * ttl: 604800, // 7 days\n * });\n * ```\n */\nexport class CacheAuditStorage<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> implements AuditStorage<TAuditAction>\n{\n private readonly cache: Cache;\n private readonly prefix: string;\n private readonly ttl?: number;\n private readonly indexKey: string;\n\n constructor(config: CacheAuditStorageConfig) {\n this.cache = config.cache;\n this.prefix = config.prefix ?? 'audit';\n this.ttl = config.ttl;\n this.indexKey = `${this.prefix}:__index__`;\n }\n\n /**\n * Write audit records to cache.\n */\n async write(records: AuditRecord[]): Promise<void> {\n if (records.length === 0) {\n return;\n }\n\n // Get existing index\n const existingIds = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n const newIds: string[] = [];\n\n // Write each record\n for (const record of records) {\n const key = this.getRecordKey(record.id);\n // Serialize Date to ISO string for cache storage\n const serialized = this.serializeRecord(record);\n await this.cache.set(key, serialized, this.ttl);\n newIds.push(record.id);\n }\n\n // Update index with new IDs\n const updatedIds = [...existingIds, ...newIds];\n await this.cache.set(this.indexKey, updatedIds, this.ttl);\n }\n\n /**\n * Query audit records from cache.\n */\n async query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n const allRecords = await this.getAllRecords();\n let results = this.applyFilters(allRecords, options);\n\n // Ordering\n const orderBy = options.orderBy ?? 'timestamp';\n const orderDirection = options.orderDirection ?? 'desc';\n results.sort((a, b) => {\n const aValue = orderBy === 'timestamp' ? a.timestamp.getTime() : a.type;\n const bValue = orderBy === 'timestamp' ? b.timestamp.getTime() : b.type;\n if (aValue < bValue) return orderDirection === 'asc' ? -1 : 1;\n if (aValue > bValue) return orderDirection === 'asc' ? 1 : -1;\n return 0;\n });\n\n // Pagination\n if (options.offset !== undefined) {\n results = results.slice(options.offset);\n }\n if (options.limit !== undefined) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Count audit records matching filters.\n */\n async count(\n options: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n ): Promise<number> {\n const allRecords = await this.getAllRecords();\n return this.applyFilters(allRecords, options).length;\n }\n\n /**\n * Get all stored records (for testing/debugging).\n */\n async getRecords(): Promise<AuditRecord[]> {\n return this.getAllRecords();\n }\n\n /**\n * Clear all stored records.\n */\n async clear(): Promise<void> {\n const ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\n // Delete all records\n for (const id of ids) {\n await this.cache.delete(this.getRecordKey(id));\n }\n\n // Delete index\n await this.cache.delete(this.indexKey);\n }\n\n private getRecordKey(id: string): string {\n return `${this.prefix}:${id}`;\n }\n\n private async getAllRecords(): Promise<AuditRecord[]> {\n const ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n const records: AuditRecord[] = [];\n const validIds: string[] = [];\n\n for (const id of ids) {\n const key = this.getRecordKey(id);\n const serialized = await this.cache.get<SerializedAuditRecord>(key);\n if (serialized) {\n records.push(this.deserializeRecord(serialized));\n validIds.push(id);\n }\n }\n\n // Clean up index if some records expired\n if (validIds.length !== ids.length) {\n await this.cache.set(this.indexKey, validIds, this.ttl);\n }\n\n return records;\n }\n\n private serializeRecord(record: AuditRecord): SerializedAuditRecord {\n return {\n ...record,\n timestamp: record.timestamp.toISOString(),\n };\n }\n\n private deserializeRecord(serialized: SerializedAuditRecord): AuditRecord {\n return {\n ...serialized,\n timestamp: new Date(serialized.timestamp),\n };\n }\n\n private applyFilters(\n records: AuditRecord[],\n options: AuditQueryOptions,\n ): AuditRecord[] {\n return records.filter((record) => {\n // Type filter\n if (options.type !== undefined) {\n if (Array.isArray(options.type)) {\n if (!options.type.includes(record.type)) return false;\n } else {\n if (record.type !== options.type) return false;\n }\n }\n\n // Entity ID filter\n if (options.entityId !== undefined) {\n const entityId =\n typeof options.entityId === 'string'\n ? options.entityId\n : JSON.stringify(options.entityId);\n const recordEntityId =\n typeof record.entityId === 'string'\n ? record.entityId\n : JSON.stringify(record.entityId);\n if (recordEntityId !== entityId) return false;\n }\n\n // Table filter\n if (options.table !== undefined) {\n if (record.table !== options.table) return false;\n }\n\n // Actor ID filter\n if (options.actorId !== undefined) {\n if (record.actor?.id !== options.actorId) return false;\n }\n\n // Date range filters\n if (options.from !== undefined) {\n if (record.timestamp < options.from) return false;\n }\n if (options.to !== undefined) {\n if (record.timestamp > options.to) return false;\n }\n\n return true;\n });\n }\n}\n\n/**\n * Serialized version of AuditRecord for cache storage.\n * Dates are stored as ISO strings.\n */\ntype SerializedAuditRecord = Omit<AuditRecord, 'timestamp'> & {\n timestamp: string;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"cache-BbIl31RL.mjs","names":["config: CacheAuditStorageConfig","records: AuditRecord[]","newIds: string[]","options: AuditQueryOptions","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","id: string","validIds: string[]","record: AuditRecord","serialized: SerializedAuditRecord"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditableAction, AuditRecord } from './types';\n\n/**\n * Configuration for CacheAuditStorage.\n */\nexport interface CacheAuditStorageConfig {\n\t/** Cache instance to use for storage */\n\tcache: Cache;\n\t/**\n\t * Key prefix for audit records.\n\t * Records are stored as `${prefix}:${id}`.\n\t * @default 'audit'\n\t */\n\tprefix?: string;\n\t/**\n\t * TTL (time-to-live) in seconds for audit records.\n\t * If not set, records use the cache's default TTL.\n\t */\n\tttl?: number;\n}\n\n/**\n * Cache-based audit storage implementation.\n * Uses any @geekmidas/cache implementation for storage.\n *\n * Best suited for:\n * - Development and testing\n * - Temporary audit logs that don't need persistence\n * - Applications with existing cache infrastructure\n * - Distributed systems needing shared audit state (with Redis/Upstash)\n *\n * Note: Query performance may degrade with large numbers of records\n * since filtering happens in memory after fetching all records.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { CacheAuditStorage } from '@geekmidas/audit/cache';\n * import { InMemoryCache } from '@geekmidas/cache/memory';\n * import { UpstashCache } from '@geekmidas/cache/upstash';\n *\n * // With in-memory cache (development/testing)\n * const storage = new CacheAuditStorage({\n * cache: new InMemoryCache(),\n * ttl: 86400, // 24 hours\n * });\n *\n * // With Upstash Redis (production)\n * const storage = new CacheAuditStorage({\n * cache: new UpstashCache({\n * url: process.env.UPSTASH_REDIS_URL,\n * token: process.env.UPSTASH_REDIS_TOKEN,\n * }),\n * ttl: 604800, // 7 days\n * });\n * ```\n */\nexport class CacheAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> implements AuditStorage<TAuditAction>\n{\n\tprivate readonly cache: Cache;\n\tprivate readonly prefix: string;\n\tprivate readonly ttl?: number;\n\tprivate readonly indexKey: string;\n\n\tconstructor(config: CacheAuditStorageConfig) {\n\t\tthis.cache = config.cache;\n\t\tthis.prefix = config.prefix ?? 'audit';\n\t\tthis.ttl = config.ttl;\n\t\tthis.indexKey = `${this.prefix}:__index__`;\n\t}\n\n\t/**\n\t * Write audit records to cache.\n\t */\n\tasync write(records: AuditRecord[]): Promise<void> {\n\t\tif (records.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get existing index\n\t\tconst existingIds = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\t\tconst newIds: string[] = [];\n\n\t\t// Write each record\n\t\tfor (const record of records) {\n\t\t\tconst key = this.getRecordKey(record.id);\n\t\t\t// Serialize Date to ISO string for cache storage\n\t\t\tconst serialized = this.serializeRecord(record);\n\t\t\tawait this.cache.set(key, serialized, this.ttl);\n\t\t\tnewIds.push(record.id);\n\t\t}\n\n\t\t// Update index with new IDs\n\t\tconst updatedIds = [...existingIds, ...newIds];\n\t\tawait this.cache.set(this.indexKey, updatedIds, this.ttl);\n\t}\n\n\t/**\n\t * Query audit records from cache.\n\t */\n\tasync query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n\t\tconst allRecords = await this.getAllRecords();\n\t\tlet results = this.applyFilters(allRecords, options);\n\n\t\t// Ordering\n\t\tconst orderBy = options.orderBy ?? 'timestamp';\n\t\tconst orderDirection = options.orderDirection ?? 'desc';\n\t\tresults.sort((a, b) => {\n\t\t\tconst aValue = orderBy === 'timestamp' ? a.timestamp.getTime() : a.type;\n\t\t\tconst bValue = orderBy === 'timestamp' ? b.timestamp.getTime() : b.type;\n\t\t\tif (aValue < bValue) return orderDirection === 'asc' ? -1 : 1;\n\t\t\tif (aValue > bValue) return orderDirection === 'asc' ? 1 : -1;\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Pagination\n\t\tif (options.offset !== undefined) {\n\t\t\tresults = results.slice(options.offset);\n\t\t}\n\t\tif (options.limit !== undefined) {\n\t\t\tresults = results.slice(0, options.limit);\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Count audit records matching filters.\n\t */\n\tasync count(\n\t\toptions: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n\t): Promise<number> {\n\t\tconst allRecords = await this.getAllRecords();\n\t\treturn this.applyFilters(allRecords, options).length;\n\t}\n\n\t/**\n\t * Get all stored records (for testing/debugging).\n\t */\n\tasync getRecords(): Promise<AuditRecord[]> {\n\t\treturn this.getAllRecords();\n\t}\n\n\t/**\n\t * Clear all stored records.\n\t */\n\tasync clear(): Promise<void> {\n\t\tconst ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\n\t\t// Delete all records\n\t\tfor (const id of ids) {\n\t\t\tawait this.cache.delete(this.getRecordKey(id));\n\t\t}\n\n\t\t// Delete index\n\t\tawait this.cache.delete(this.indexKey);\n\t}\n\n\tprivate getRecordKey(id: string): string {\n\t\treturn `${this.prefix}:${id}`;\n\t}\n\n\tprivate async getAllRecords(): Promise<AuditRecord[]> {\n\t\tconst ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\t\tconst records: AuditRecord[] = [];\n\t\tconst validIds: string[] = [];\n\n\t\tfor (const id of ids) {\n\t\t\tconst key = this.getRecordKey(id);\n\t\t\tconst serialized = await this.cache.get<SerializedAuditRecord>(key);\n\t\t\tif (serialized) {\n\t\t\t\trecords.push(this.deserializeRecord(serialized));\n\t\t\t\tvalidIds.push(id);\n\t\t\t}\n\t\t}\n\n\t\t// Clean up index if some records expired\n\t\tif (validIds.length !== ids.length) {\n\t\t\tawait this.cache.set(this.indexKey, validIds, this.ttl);\n\t\t}\n\n\t\treturn records;\n\t}\n\n\tprivate serializeRecord(record: AuditRecord): SerializedAuditRecord {\n\t\treturn {\n\t\t\t...record,\n\t\t\ttimestamp: record.timestamp.toISOString(),\n\t\t};\n\t}\n\n\tprivate deserializeRecord(serialized: SerializedAuditRecord): AuditRecord {\n\t\treturn {\n\t\t\t...serialized,\n\t\t\ttimestamp: new Date(serialized.timestamp),\n\t\t};\n\t}\n\n\tprivate applyFilters(\n\t\trecords: AuditRecord[],\n\t\toptions: AuditQueryOptions,\n\t): AuditRecord[] {\n\t\treturn records.filter((record) => {\n\t\t\t// Type filter\n\t\t\tif (options.type !== undefined) {\n\t\t\t\tif (Array.isArray(options.type)) {\n\t\t\t\t\tif (!options.type.includes(record.type)) return false;\n\t\t\t\t} else {\n\t\t\t\t\tif (record.type !== options.type) return false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Entity ID filter\n\t\t\tif (options.entityId !== undefined) {\n\t\t\t\tconst entityId =\n\t\t\t\t\ttypeof options.entityId === 'string'\n\t\t\t\t\t\t? options.entityId\n\t\t\t\t\t\t: JSON.stringify(options.entityId);\n\t\t\t\tconst recordEntityId =\n\t\t\t\t\ttypeof record.entityId === 'string'\n\t\t\t\t\t\t? record.entityId\n\t\t\t\t\t\t: JSON.stringify(record.entityId);\n\t\t\t\tif (recordEntityId !== entityId) return false;\n\t\t\t}\n\n\t\t\t// Table filter\n\t\t\tif (options.table !== undefined) {\n\t\t\t\tif (record.table !== options.table) return false;\n\t\t\t}\n\n\t\t\t// Actor ID filter\n\t\t\tif (options.actorId !== undefined) {\n\t\t\t\tif (record.actor?.id !== options.actorId) return false;\n\t\t\t}\n\n\t\t\t// Date range filters\n\t\t\tif (options.from !== undefined) {\n\t\t\t\tif (record.timestamp < options.from) return false;\n\t\t\t}\n\t\t\tif (options.to !== undefined) {\n\t\t\t\tif (record.timestamp > options.to) return false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n}\n\n/**\n * Serialized version of AuditRecord for cache storage.\n * Dates are stored as ISO strings.\n */\ntype SerializedAuditRecord = Omit<AuditRecord, 'timestamp'> & {\n\ttimestamp: string;\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction } from "./Auditor-Xf4Tp63p.mjs";
1
+ import { AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction } from "./Auditor-sW7YAJIA.cjs";
2
2
  import { Cache } from "@geekmidas/cache";
3
3
 
4
4
  //#region src/cache.d.ts
@@ -90,6 +90,7 @@ declare class CacheAuditStorage<TAuditAction extends AuditableAction<string, unk
90
90
  private deserializeRecord;
91
91
  private applyFilters;
92
92
  }
93
+ //# sourceMappingURL=cache.d.ts.map
93
94
  //#endregion
94
95
  export { CacheAuditStorage, CacheAuditStorageConfig };
95
- //# sourceMappingURL=cache-DBbGcCEq.d.mts.map
96
+ //# sourceMappingURL=cache-CDHqXqcl.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-CDHqXqcl.d.cts","names":[],"sources":["../src/cache.ts"],"sourcesContent":[],"mappings":";;;;;;AAOA;AAqDA;AAA8B,UArDb,uBAAA,CAqDa;EAAA;EACO,KAAoB,EApDjD,KAoDiD;EAAe;;;;;EA+CjC,MAAW,CAAA,EAAA,MAAA;EAAW;;;;EA+BlD,GAQkB,CAAA,EAAA,MAAA;;;;AAlFJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cALZ,uCACS,mCAAmC,6CAI5C,aAAa;;;;;sBAOL;;;;iBAUC,gBAAgB;;;;iBA0BhB,oBAAoB,QAAQ;;;;iBA8BvC,KAAK,yCACZ;;;;gBAQiB,QAAQ;;;;WAOb"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache-l7jAptBl.cjs","names":["config: CacheAuditStorageConfig","records: AuditRecord[]","newIds: string[]","options: AuditQueryOptions","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","id: string","validIds: string[]","record: AuditRecord","serialized: SerializedAuditRecord"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditRecord, AuditableAction } from './types';\n\n/**\n * Configuration for CacheAuditStorage.\n */\nexport interface CacheAuditStorageConfig {\n /** Cache instance to use for storage */\n cache: Cache;\n /**\n * Key prefix for audit records.\n * Records are stored as `${prefix}:${id}`.\n * @default 'audit'\n */\n prefix?: string;\n /**\n * TTL (time-to-live) in seconds for audit records.\n * If not set, records use the cache's default TTL.\n */\n ttl?: number;\n}\n\n/**\n * Cache-based audit storage implementation.\n * Uses any @geekmidas/cache implementation for storage.\n *\n * Best suited for:\n * - Development and testing\n * - Temporary audit logs that don't need persistence\n * - Applications with existing cache infrastructure\n * - Distributed systems needing shared audit state (with Redis/Upstash)\n *\n * Note: Query performance may degrade with large numbers of records\n * since filtering happens in memory after fetching all records.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { CacheAuditStorage } from '@geekmidas/audit/cache';\n * import { InMemoryCache } from '@geekmidas/cache/memory';\n * import { UpstashCache } from '@geekmidas/cache/upstash';\n *\n * // With in-memory cache (development/testing)\n * const storage = new CacheAuditStorage({\n * cache: new InMemoryCache(),\n * ttl: 86400, // 24 hours\n * });\n *\n * // With Upstash Redis (production)\n * const storage = new CacheAuditStorage({\n * cache: new UpstashCache({\n * url: process.env.UPSTASH_REDIS_URL,\n * token: process.env.UPSTASH_REDIS_TOKEN,\n * }),\n * ttl: 604800, // 7 days\n * });\n * ```\n */\nexport class CacheAuditStorage<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> implements AuditStorage<TAuditAction>\n{\n private readonly cache: Cache;\n private readonly prefix: string;\n private readonly ttl?: number;\n private readonly indexKey: string;\n\n constructor(config: CacheAuditStorageConfig) {\n this.cache = config.cache;\n this.prefix = config.prefix ?? 'audit';\n this.ttl = config.ttl;\n this.indexKey = `${this.prefix}:__index__`;\n }\n\n /**\n * Write audit records to cache.\n */\n async write(records: AuditRecord[]): Promise<void> {\n if (records.length === 0) {\n return;\n }\n\n // Get existing index\n const existingIds = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n const newIds: string[] = [];\n\n // Write each record\n for (const record of records) {\n const key = this.getRecordKey(record.id);\n // Serialize Date to ISO string for cache storage\n const serialized = this.serializeRecord(record);\n await this.cache.set(key, serialized, this.ttl);\n newIds.push(record.id);\n }\n\n // Update index with new IDs\n const updatedIds = [...existingIds, ...newIds];\n await this.cache.set(this.indexKey, updatedIds, this.ttl);\n }\n\n /**\n * Query audit records from cache.\n */\n async query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n const allRecords = await this.getAllRecords();\n let results = this.applyFilters(allRecords, options);\n\n // Ordering\n const orderBy = options.orderBy ?? 'timestamp';\n const orderDirection = options.orderDirection ?? 'desc';\n results.sort((a, b) => {\n const aValue = orderBy === 'timestamp' ? a.timestamp.getTime() : a.type;\n const bValue = orderBy === 'timestamp' ? b.timestamp.getTime() : b.type;\n if (aValue < bValue) return orderDirection === 'asc' ? -1 : 1;\n if (aValue > bValue) return orderDirection === 'asc' ? 1 : -1;\n return 0;\n });\n\n // Pagination\n if (options.offset !== undefined) {\n results = results.slice(options.offset);\n }\n if (options.limit !== undefined) {\n results = results.slice(0, options.limit);\n }\n\n return results;\n }\n\n /**\n * Count audit records matching filters.\n */\n async count(\n options: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n ): Promise<number> {\n const allRecords = await this.getAllRecords();\n return this.applyFilters(allRecords, options).length;\n }\n\n /**\n * Get all stored records (for testing/debugging).\n */\n async getRecords(): Promise<AuditRecord[]> {\n return this.getAllRecords();\n }\n\n /**\n * Clear all stored records.\n */\n async clear(): Promise<void> {\n const ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\n // Delete all records\n for (const id of ids) {\n await this.cache.delete(this.getRecordKey(id));\n }\n\n // Delete index\n await this.cache.delete(this.indexKey);\n }\n\n private getRecordKey(id: string): string {\n return `${this.prefix}:${id}`;\n }\n\n private async getAllRecords(): Promise<AuditRecord[]> {\n const ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n const records: AuditRecord[] = [];\n const validIds: string[] = [];\n\n for (const id of ids) {\n const key = this.getRecordKey(id);\n const serialized = await this.cache.get<SerializedAuditRecord>(key);\n if (serialized) {\n records.push(this.deserializeRecord(serialized));\n validIds.push(id);\n }\n }\n\n // Clean up index if some records expired\n if (validIds.length !== ids.length) {\n await this.cache.set(this.indexKey, validIds, this.ttl);\n }\n\n return records;\n }\n\n private serializeRecord(record: AuditRecord): SerializedAuditRecord {\n return {\n ...record,\n timestamp: record.timestamp.toISOString(),\n };\n }\n\n private deserializeRecord(serialized: SerializedAuditRecord): AuditRecord {\n return {\n ...serialized,\n timestamp: new Date(serialized.timestamp),\n };\n }\n\n private applyFilters(\n records: AuditRecord[],\n options: AuditQueryOptions,\n ): AuditRecord[] {\n return records.filter((record) => {\n // Type filter\n if (options.type !== undefined) {\n if (Array.isArray(options.type)) {\n if (!options.type.includes(record.type)) return false;\n } else {\n if (record.type !== options.type) return false;\n }\n }\n\n // Entity ID filter\n if (options.entityId !== undefined) {\n const entityId =\n typeof options.entityId === 'string'\n ? options.entityId\n : JSON.stringify(options.entityId);\n const recordEntityId =\n typeof record.entityId === 'string'\n ? record.entityId\n : JSON.stringify(record.entityId);\n if (recordEntityId !== entityId) return false;\n }\n\n // Table filter\n if (options.table !== undefined) {\n if (record.table !== options.table) return false;\n }\n\n // Actor ID filter\n if (options.actorId !== undefined) {\n if (record.actor?.id !== options.actorId) return false;\n }\n\n // Date range filters\n if (options.from !== undefined) {\n if (record.timestamp < options.from) return false;\n }\n if (options.to !== undefined) {\n if (record.timestamp > options.to) return false;\n }\n\n return true;\n });\n }\n}\n\n/**\n * Serialized version of AuditRecord for cache storage.\n * Dates are stored as ISO strings.\n */\ntype SerializedAuditRecord = Omit<AuditRecord, 'timestamp'> & {\n timestamp: string;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"cache-l7jAptBl.cjs","names":["config: CacheAuditStorageConfig","records: AuditRecord[]","newIds: string[]","options: AuditQueryOptions","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","id: string","validIds: string[]","record: AuditRecord","serialized: SerializedAuditRecord"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditableAction, AuditRecord } from './types';\n\n/**\n * Configuration for CacheAuditStorage.\n */\nexport interface CacheAuditStorageConfig {\n\t/** Cache instance to use for storage */\n\tcache: Cache;\n\t/**\n\t * Key prefix for audit records.\n\t * Records are stored as `${prefix}:${id}`.\n\t * @default 'audit'\n\t */\n\tprefix?: string;\n\t/**\n\t * TTL (time-to-live) in seconds for audit records.\n\t * If not set, records use the cache's default TTL.\n\t */\n\tttl?: number;\n}\n\n/**\n * Cache-based audit storage implementation.\n * Uses any @geekmidas/cache implementation for storage.\n *\n * Best suited for:\n * - Development and testing\n * - Temporary audit logs that don't need persistence\n * - Applications with existing cache infrastructure\n * - Distributed systems needing shared audit state (with Redis/Upstash)\n *\n * Note: Query performance may degrade with large numbers of records\n * since filtering happens in memory after fetching all records.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { CacheAuditStorage } from '@geekmidas/audit/cache';\n * import { InMemoryCache } from '@geekmidas/cache/memory';\n * import { UpstashCache } from '@geekmidas/cache/upstash';\n *\n * // With in-memory cache (development/testing)\n * const storage = new CacheAuditStorage({\n * cache: new InMemoryCache(),\n * ttl: 86400, // 24 hours\n * });\n *\n * // With Upstash Redis (production)\n * const storage = new CacheAuditStorage({\n * cache: new UpstashCache({\n * url: process.env.UPSTASH_REDIS_URL,\n * token: process.env.UPSTASH_REDIS_TOKEN,\n * }),\n * ttl: 604800, // 7 days\n * });\n * ```\n */\nexport class CacheAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> implements AuditStorage<TAuditAction>\n{\n\tprivate readonly cache: Cache;\n\tprivate readonly prefix: string;\n\tprivate readonly ttl?: number;\n\tprivate readonly indexKey: string;\n\n\tconstructor(config: CacheAuditStorageConfig) {\n\t\tthis.cache = config.cache;\n\t\tthis.prefix = config.prefix ?? 'audit';\n\t\tthis.ttl = config.ttl;\n\t\tthis.indexKey = `${this.prefix}:__index__`;\n\t}\n\n\t/**\n\t * Write audit records to cache.\n\t */\n\tasync write(records: AuditRecord[]): Promise<void> {\n\t\tif (records.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get existing index\n\t\tconst existingIds = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\t\tconst newIds: string[] = [];\n\n\t\t// Write each record\n\t\tfor (const record of records) {\n\t\t\tconst key = this.getRecordKey(record.id);\n\t\t\t// Serialize Date to ISO string for cache storage\n\t\t\tconst serialized = this.serializeRecord(record);\n\t\t\tawait this.cache.set(key, serialized, this.ttl);\n\t\t\tnewIds.push(record.id);\n\t\t}\n\n\t\t// Update index with new IDs\n\t\tconst updatedIds = [...existingIds, ...newIds];\n\t\tawait this.cache.set(this.indexKey, updatedIds, this.ttl);\n\t}\n\n\t/**\n\t * Query audit records from cache.\n\t */\n\tasync query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n\t\tconst allRecords = await this.getAllRecords();\n\t\tlet results = this.applyFilters(allRecords, options);\n\n\t\t// Ordering\n\t\tconst orderBy = options.orderBy ?? 'timestamp';\n\t\tconst orderDirection = options.orderDirection ?? 'desc';\n\t\tresults.sort((a, b) => {\n\t\t\tconst aValue = orderBy === 'timestamp' ? a.timestamp.getTime() : a.type;\n\t\t\tconst bValue = orderBy === 'timestamp' ? b.timestamp.getTime() : b.type;\n\t\t\tif (aValue < bValue) return orderDirection === 'asc' ? -1 : 1;\n\t\t\tif (aValue > bValue) return orderDirection === 'asc' ? 1 : -1;\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Pagination\n\t\tif (options.offset !== undefined) {\n\t\t\tresults = results.slice(options.offset);\n\t\t}\n\t\tif (options.limit !== undefined) {\n\t\t\tresults = results.slice(0, options.limit);\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Count audit records matching filters.\n\t */\n\tasync count(\n\t\toptions: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n\t): Promise<number> {\n\t\tconst allRecords = await this.getAllRecords();\n\t\treturn this.applyFilters(allRecords, options).length;\n\t}\n\n\t/**\n\t * Get all stored records (for testing/debugging).\n\t */\n\tasync getRecords(): Promise<AuditRecord[]> {\n\t\treturn this.getAllRecords();\n\t}\n\n\t/**\n\t * Clear all stored records.\n\t */\n\tasync clear(): Promise<void> {\n\t\tconst ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\n\t\t// Delete all records\n\t\tfor (const id of ids) {\n\t\t\tawait this.cache.delete(this.getRecordKey(id));\n\t\t}\n\n\t\t// Delete index\n\t\tawait this.cache.delete(this.indexKey);\n\t}\n\n\tprivate getRecordKey(id: string): string {\n\t\treturn `${this.prefix}:${id}`;\n\t}\n\n\tprivate async getAllRecords(): Promise<AuditRecord[]> {\n\t\tconst ids = (await this.cache.get<string[]>(this.indexKey)) ?? [];\n\t\tconst records: AuditRecord[] = [];\n\t\tconst validIds: string[] = [];\n\n\t\tfor (const id of ids) {\n\t\t\tconst key = this.getRecordKey(id);\n\t\t\tconst serialized = await this.cache.get<SerializedAuditRecord>(key);\n\t\t\tif (serialized) {\n\t\t\t\trecords.push(this.deserializeRecord(serialized));\n\t\t\t\tvalidIds.push(id);\n\t\t\t}\n\t\t}\n\n\t\t// Clean up index if some records expired\n\t\tif (validIds.length !== ids.length) {\n\t\t\tawait this.cache.set(this.indexKey, validIds, this.ttl);\n\t\t}\n\n\t\treturn records;\n\t}\n\n\tprivate serializeRecord(record: AuditRecord): SerializedAuditRecord {\n\t\treturn {\n\t\t\t...record,\n\t\t\ttimestamp: record.timestamp.toISOString(),\n\t\t};\n\t}\n\n\tprivate deserializeRecord(serialized: SerializedAuditRecord): AuditRecord {\n\t\treturn {\n\t\t\t...serialized,\n\t\t\ttimestamp: new Date(serialized.timestamp),\n\t\t};\n\t}\n\n\tprivate applyFilters(\n\t\trecords: AuditRecord[],\n\t\toptions: AuditQueryOptions,\n\t): AuditRecord[] {\n\t\treturn records.filter((record) => {\n\t\t\t// Type filter\n\t\t\tif (options.type !== undefined) {\n\t\t\t\tif (Array.isArray(options.type)) {\n\t\t\t\t\tif (!options.type.includes(record.type)) return false;\n\t\t\t\t} else {\n\t\t\t\t\tif (record.type !== options.type) return false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Entity ID filter\n\t\t\tif (options.entityId !== undefined) {\n\t\t\t\tconst entityId =\n\t\t\t\t\ttypeof options.entityId === 'string'\n\t\t\t\t\t\t? options.entityId\n\t\t\t\t\t\t: JSON.stringify(options.entityId);\n\t\t\t\tconst recordEntityId =\n\t\t\t\t\ttypeof record.entityId === 'string'\n\t\t\t\t\t\t? record.entityId\n\t\t\t\t\t\t: JSON.stringify(record.entityId);\n\t\t\t\tif (recordEntityId !== entityId) return false;\n\t\t\t}\n\n\t\t\t// Table filter\n\t\t\tif (options.table !== undefined) {\n\t\t\t\tif (record.table !== options.table) return false;\n\t\t\t}\n\n\t\t\t// Actor ID filter\n\t\t\tif (options.actorId !== undefined) {\n\t\t\t\tif (record.actor?.id !== options.actorId) return false;\n\t\t\t}\n\n\t\t\t// Date range filters\n\t\t\tif (options.from !== undefined) {\n\t\t\t\tif (record.timestamp < options.from) return false;\n\t\t\t}\n\t\t\tif (options.to !== undefined) {\n\t\t\t\tif (record.timestamp > options.to) return false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n}\n\n/**\n * Serialized version of AuditRecord for cache storage.\n * Dates are stored as ISO strings.\n */\ntype SerializedAuditRecord = Omit<AuditRecord, 'timestamp'> & {\n\ttimestamp: string;\n};\n"],"mappings":"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"}
package/dist/cache.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- import "./Auditor-DrR0ImvJ.cjs";
2
- import { CacheAuditStorage, CacheAuditStorageConfig } from "./cache-0AjJ0zis.cjs";
1
+ import "./Auditor-sW7YAJIA.cjs";
2
+ import { CacheAuditStorage, CacheAuditStorageConfig } from "./cache-CDHqXqcl.cjs";
3
3
  export { CacheAuditStorage, CacheAuditStorageConfig };
package/dist/cache.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import "./Auditor-Xf4Tp63p.mjs";
2
- import { CacheAuditStorage, CacheAuditStorageConfig } from "./cache-DBbGcCEq.mjs";
1
+ import "./Auditor-_Dn2dp8d.mjs";
2
+ import { CacheAuditStorage, CacheAuditStorageConfig } from "./cache-2VI80Vao.mjs";
3
3
  export { CacheAuditStorage, CacheAuditStorageConfig };
package/dist/index.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-DrR0ImvJ.cjs";
2
- import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-BaZa4u_m.cjs";
1
+ import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-sW7YAJIA.cjs";
2
+ import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-BSYMwojG.cjs";
3
3
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, DefaultAuditor, DefaultAuditorConfig, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-Xf4Tp63p.mjs";
2
- import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-3Q1zVd1b.mjs";
1
+ import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-_Dn2dp8d.mjs";
2
+ import { DefaultAuditor, DefaultAuditorConfig } from "./DefaultAuditor-CYE-uAry.mjs";
3
3
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditQueryOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, DefaultAuditor, DefaultAuditorConfig, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
@@ -1 +1 @@
1
- {"version":3,"file":"kysely.cjs","names":["db: DatabaseConnection<DB>","auditor: TransactionAwareAuditor<Transaction<DB>>","cb: (trx: Transaction<DB>) => Promise<T>","settings?: TransactionSettings","trx: Transaction<DB>","config: KyselyAuditStorageConfig<DB>","records: AuditRecord[]","trx?: unknown","options: AuditQueryOptions","row: AuditLogTable","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","eb: any","callback: () => Promise<T>","db?: DatabaseConnection<DB>","query: any","record: AuditRecord","value: unknown","actor: NonNullable<AuditRecord['actor']>","entityId: string"],"sources":["../src/kysely.ts"],"sourcesContent":["import type {\n ControlledTransaction,\n IsolationLevel,\n Kysely,\n Transaction,\n} from 'kysely';\nimport { nanoid } from 'nanoid';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditRecord } from './types';\n\n/**\n * Minimal interface for transaction-aware audit flushing.\n * Use this when you need to flush audits within a database transaction.\n *\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * import { withAuditableTransaction } from '@geekmidas/audit/kysely';\n * import type { TransactionAwareAuditor } from '@geekmidas/audit/kysely';\n *\n * const result = await withAuditableTransaction(\n * db,\n * auditor as TransactionAwareAuditor<Transaction<DB>>,\n * async (trx) => {\n * // Your transactional operations\n * return result;\n * },\n * );\n * ```\n */\nexport interface TransactionAwareAuditor<TTransaction = unknown> {\n /** Register the transaction with the auditor for use during flush */\n setTransaction(trx: TTransaction): void;\n /** Flush all pending audits, optionally within a transaction */\n flush(trx?: TTransaction): Promise<void>;\n}\n\nexport interface TransactionSettings {\n isolationLevel?: IsolationLevel;\n}\n\nexport type DatabaseConnection<T> =\n | ControlledTransaction<T>\n | Kysely<T>\n | Transaction<T>;\n\n/**\n * Execute a callback within a database transaction with automatic audit handling.\n *\n * This wrapper ensures that:\n * 1. The transaction is automatically registered with the auditor\n * 2. Manual audits (via `auditor.audit()`) are flushed BEFORE the transaction commits\n * 3. If audit flush fails, the entire transaction rolls back\n * 4. If the callback fails, audits are NOT written (atomic consistency)\n *\n * **Note:** Declarative audits (defined via `.audit([...])` on the endpoint builder)\n * are processed AFTER the handler returns, so they run outside this transaction.\n * If you need all audits to be atomic with your database operations, use manual\n * audits via `auditor.audit()` inside this wrapper.\n *\n * @param db - Database connection (Kysely, Transaction, or ControlledTransaction)\n * @param auditor - Auditor instance that will receive the transaction\n * @param cb - Callback to execute within the transaction\n * @param settings - Optional transaction settings (isolation level)\n * @returns The result of the callback\n *\n * @example\n * ```typescript\n * import { withAuditableTransaction } from '@geekmidas/audit/kysely';\n *\n * const result = await withAuditableTransaction(\n * services.database,\n * auditor,\n * async (trx) => {\n * const user = await trx\n * .insertInto('users')\n * .values(data)\n * .returningAll()\n * .executeTakeFirstOrThrow();\n *\n * // Manual audits are atomic with the transaction\n * auditor.audit('user.created', { userId: user.id, email: user.email });\n *\n * return user;\n * },\n * );\n * // Audits are automatically flushed inside the transaction before commit\n * ```\n */\nexport async function withAuditableTransaction<DB, T>(\n db: DatabaseConnection<DB>,\n auditor: TransactionAwareAuditor<Transaction<DB>>,\n cb: (trx: Transaction<DB>) => Promise<T>,\n settings?: TransactionSettings,\n): Promise<T> {\n const execute = async (trx: Transaction<DB>): Promise<T> => {\n // Register transaction with auditor\n auditor.setTransaction(trx);\n\n // Execute the callback\n const result = await cb(trx);\n\n // Flush audits BEFORE transaction commits\n // If this fails, the transaction will roll back\n await auditor.flush(trx);\n\n return result;\n };\n\n // If already in a transaction, just run with it\n if (db.isTransaction) {\n return execute(db as Transaction<DB>);\n }\n\n const builder = db.transaction();\n\n if (settings?.isolationLevel) {\n return builder.setIsolationLevel(settings.isolationLevel).execute(execute);\n }\n\n return builder.execute(execute);\n}\n\n/**\n * Database table interface for audit records.\n * Use this to define your audit_logs table in your Kysely database schema.\n *\n * Column names use snake_case to match standard PostgreSQL conventions.\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * // ... other tables\n * }\n * ```\n */\nexport interface AuditLogTable {\n id: string;\n type: string;\n operation: string;\n table: string | null;\n entityId: string | null;\n oldValues: unknown | null;\n newValues: unknown | null;\n payload: unknown | null;\n timestamp: Date;\n actorId: string | null;\n actorType: string | null;\n actorData: unknown | null;\n metadata: unknown | null;\n}\n\n/**\n * Insertable version of AuditLogTable where id is optional.\n * Use this when your database auto-generates IDs or when using autoId option.\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * }\n *\n * // For insertions where id is auto-generated\n * type NewAuditLog = InsertableAuditLogTable;\n * ```\n */\nexport type InsertableAuditLogTable = Omit<AuditLogTable, 'id'> & {\n id?: string;\n};\n\n/**\n * Configuration for KyselyAuditStorage.\n */\nexport interface KyselyAuditStorageConfig<DB> {\n /** Kysely database instance */\n db: Kysely<DB>;\n /** Table name for audit logs (must be a key in DB that extends AuditLogTable) */\n tableName: keyof DB & string;\n /**\n * Service name of the database service.\n * When set, endpoint adaptors will automatically use the audit transaction as `db`\n * in the handler context if the endpoint's database service has the same name.\n */\n databaseServiceName?: string;\n /**\n * Let the database auto-generate IDs (e.g., via DEFAULT gen_random_uuid()).\n * When true, the ID field is omitted from inserts if not provided.\n * When false (default), IDs are generated using nanoid if not provided.\n * @default false\n */\n autoId?: boolean;\n}\n\n/**\n * Kysely-based audit storage implementation.\n * Stores audit records in a database table using Kysely.\n *\n * @template DB - Your Kysely database schema\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * }\n *\n * const storage = new KyselyAuditStorage({\n * db: kyselyDb,\n * tableName: 'audit_logs',\n * });\n *\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n * ```\n */\nexport class KyselyAuditStorage<DB> implements AuditStorage {\n private readonly db: Kysely<DB>;\n private readonly tableName: keyof DB & string;\n private readonly autoId: boolean;\n readonly databaseServiceName?: string;\n\n constructor(config: KyselyAuditStorageConfig<DB>) {\n this.db = config.db;\n this.tableName = config.tableName;\n this.databaseServiceName = config.databaseServiceName;\n this.autoId = config.autoId ?? false;\n }\n\n async write(records: AuditRecord[], trx?: unknown): Promise<void> {\n if (records.length === 0) {\n return;\n }\n\n const db = (trx as Transaction<DB>) ?? this.db;\n const rows = records.map((record) => this.toRow(record));\n\n await (db as any).insertInto(this.tableName).values(rows).execute();\n }\n\n async query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n let query = (this.db as any).selectFrom(this.tableName).selectAll();\n\n query = this.applyFilters(query, options);\n\n // Ordering\n const orderBy = options.orderBy ?? 'timestamp';\n const orderDirection = options.orderDirection ?? 'desc';\n query = query.orderBy(\n orderBy === 'timestamp' ? 'timestamp' : 'type',\n orderDirection,\n );\n\n // Pagination\n if (options.limit !== undefined) {\n query = query.limit(options.limit);\n }\n if (options.offset !== undefined) {\n query = query.offset(options.offset);\n }\n\n const rows = await query.execute();\n return rows.map((row: AuditLogTable) => this.fromRow(row));\n }\n\n async count(\n options: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n ): Promise<number> {\n let query = (this.db as any)\n .selectFrom(this.tableName)\n .select((eb: any) => eb.fn.count('id').as('count'));\n\n query = this.applyFilters(query, options);\n\n const result = await query.executeTakeFirst();\n return Number(result?.count ?? 0);\n }\n\n /**\n * Get the Kysely database instance for transactional operations.\n * Used by endpoint adaptors to automatically wrap handlers in transactions.\n */\n getDatabase(): Kysely<DB> {\n return this.db;\n }\n\n /**\n * Execute a callback within a Kysely transaction with automatic audit handling.\n * The auditor is registered with the transaction and audits are flushed\n * before the transaction commits.\n *\n * If the provided db connection is already a transaction, it will be reused\n * instead of creating a nested transaction.\n */\n async withTransaction<T>(\n auditor: TransactionAwareAuditor<Transaction<DB>>,\n callback: () => Promise<T>,\n db?: DatabaseConnection<DB>,\n ): Promise<T> {\n const connection = db ?? this.db;\n\n // If already in a transaction, reuse it\n if (connection.isTransaction) {\n const trx = connection as Transaction<DB>;\n auditor.setTransaction(trx);\n const result = await callback();\n await auditor.flush(trx);\n return result;\n }\n\n // Create new transaction\n return connection.transaction().execute(async (trx) => {\n auditor.setTransaction(trx);\n const result = await callback();\n await auditor.flush(trx);\n return result;\n });\n }\n\n private applyFilters(query: any, options: AuditQueryOptions): any {\n // Type filter\n if (options.type !== undefined) {\n if (Array.isArray(options.type)) {\n query = query.where('type', 'in', options.type);\n } else {\n query = query.where('type', '=', options.type);\n }\n }\n\n // Entity ID filter\n if (options.entityId !== undefined) {\n const entityId =\n typeof options.entityId === 'string'\n ? options.entityId\n : JSON.stringify(options.entityId);\n query = query.where('entityId', '=', entityId);\n }\n\n // Table filter\n if (options.table !== undefined) {\n query = query.where('table', '=', options.table);\n }\n\n // Actor ID filter\n if (options.actorId !== undefined) {\n query = query.where('actorId', '=', options.actorId);\n }\n\n // Date range filters\n if (options.from !== undefined) {\n query = query.where('timestamp', '>=', options.from);\n }\n if (options.to !== undefined) {\n query = query.where('timestamp', '<=', options.to);\n }\n\n return query;\n }\n\n private toRow(record: AuditRecord): AuditLogTable {\n // If autoId is true, let database generate ID (ignore record.id)\n // If autoId is false (default), use record.id or generate with nanoid\n const id = this.autoId ? undefined : record.id || nanoid();\n\n return {\n ...(id && { id }),\n type: record.type,\n operation: record.operation,\n table: record.table ?? null,\n entityId:\n record.entityId === undefined\n ? null\n : typeof record.entityId === 'string'\n ? record.entityId\n : JSON.stringify(record.entityId),\n oldValues: record.oldValues ?? null,\n newValues: record.newValues ?? null,\n payload: record.payload ?? null,\n timestamp: record.timestamp,\n actorId: record.actor?.id ?? null,\n actorType: record.actor?.type ?? null,\n actorData:\n record.actor !== undefined ? this.getActorData(record.actor) : null,\n metadata: record.metadata ?? null,\n } as AuditLogTable;\n }\n\n private fromRow(row: AuditLogTable): AuditRecord {\n const actor =\n row.actorId !== null || row.actorType !== null\n ? {\n id: row.actorId ?? undefined,\n type: row.actorType ?? undefined,\n ...(row.actorData ? this.parseJson(row.actorData) : {}),\n }\n : undefined;\n\n return {\n id: row.id,\n type: row.type,\n operation: row.operation as AuditRecord['operation'],\n table: row.table ?? undefined,\n entityId: row.entityId ? this.parseEntityId(row.entityId) : undefined,\n oldValues: row.oldValues ? this.parseJson(row.oldValues) : undefined,\n newValues: row.newValues ? this.parseJson(row.newValues) : undefined,\n payload: row.payload ? this.parseJson(row.payload) : undefined,\n timestamp: row.timestamp,\n actor,\n metadata: row.metadata ? this.parseJson(row.metadata) : undefined,\n };\n }\n\n /**\n * Parse a JSON value that may already be parsed (e.g., from jsonb columns).\n */\n private parseJson(value: unknown): Record<string, unknown> {\n if (typeof value === 'object' && value !== null) {\n return value as Record<string, unknown>;\n }\n if (typeof value === 'string') {\n return JSON.parse(value);\n }\n return {};\n }\n\n private getActorData(\n actor: NonNullable<AuditRecord['actor']>,\n ): Record<string, unknown> {\n const { id, type, ...rest } = actor;\n return rest;\n }\n\n private parseEntityId(entityId: string): string | Record<string, unknown> {\n try {\n const parsed = JSON.parse(entityId);\n if (typeof parsed === 'object' && parsed !== null) {\n return parsed;\n }\n return entityId;\n } catch {\n return entityId;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"kysely.cjs","names":["db: DatabaseConnection<DB>","auditor: TransactionAwareAuditor<Transaction<DB>>","cb: (trx: Transaction<DB>) => Promise<T>","settings?: TransactionSettings","trx: Transaction<DB>","config: KyselyAuditStorageConfig<DB>","records: AuditRecord[]","trx?: unknown","options: AuditQueryOptions","row: AuditLogTable","options: Omit<AuditQueryOptions, 'limit' | 'offset'>","eb: any","callback: () => Promise<T>","db?: DatabaseConnection<DB>","query: any","record: AuditRecord","value: unknown","actor: NonNullable<AuditRecord['actor']>","entityId: string"],"sources":["../src/kysely.ts"],"sourcesContent":["import type {\n\tControlledTransaction,\n\tIsolationLevel,\n\tKysely,\n\tTransaction,\n} from 'kysely';\nimport { nanoid } from 'nanoid';\nimport type { AuditQueryOptions, AuditStorage } from './storage';\nimport type { AuditRecord } from './types';\n\n/**\n * Minimal interface for transaction-aware audit flushing.\n * Use this when you need to flush audits within a database transaction.\n *\n * @template TTransaction - Transaction type (e.g., Kysely Transaction)\n *\n * @example\n * ```typescript\n * import { withAuditableTransaction } from '@geekmidas/audit/kysely';\n * import type { TransactionAwareAuditor } from '@geekmidas/audit/kysely';\n *\n * const result = await withAuditableTransaction(\n * db,\n * auditor as TransactionAwareAuditor<Transaction<DB>>,\n * async (trx) => {\n * // Your transactional operations\n * return result;\n * },\n * );\n * ```\n */\nexport interface TransactionAwareAuditor<TTransaction = unknown> {\n\t/** Register the transaction with the auditor for use during flush */\n\tsetTransaction(trx: TTransaction): void;\n\t/** Flush all pending audits, optionally within a transaction */\n\tflush(trx?: TTransaction): Promise<void>;\n}\n\nexport interface TransactionSettings {\n\tisolationLevel?: IsolationLevel;\n}\n\nexport type DatabaseConnection<T> =\n\t| ControlledTransaction<T>\n\t| Kysely<T>\n\t| Transaction<T>;\n\n/**\n * Execute a callback within a database transaction with automatic audit handling.\n *\n * This wrapper ensures that:\n * 1. The transaction is automatically registered with the auditor\n * 2. Manual audits (via `auditor.audit()`) are flushed BEFORE the transaction commits\n * 3. If audit flush fails, the entire transaction rolls back\n * 4. If the callback fails, audits are NOT written (atomic consistency)\n *\n * **Note:** Declarative audits (defined via `.audit([...])` on the endpoint builder)\n * are processed AFTER the handler returns, so they run outside this transaction.\n * If you need all audits to be atomic with your database operations, use manual\n * audits via `auditor.audit()` inside this wrapper.\n *\n * @param db - Database connection (Kysely, Transaction, or ControlledTransaction)\n * @param auditor - Auditor instance that will receive the transaction\n * @param cb - Callback to execute within the transaction\n * @param settings - Optional transaction settings (isolation level)\n * @returns The result of the callback\n *\n * @example\n * ```typescript\n * import { withAuditableTransaction } from '@geekmidas/audit/kysely';\n *\n * const result = await withAuditableTransaction(\n * services.database,\n * auditor,\n * async (trx) => {\n * const user = await trx\n * .insertInto('users')\n * .values(data)\n * .returningAll()\n * .executeTakeFirstOrThrow();\n *\n * // Manual audits are atomic with the transaction\n * auditor.audit('user.created', { userId: user.id, email: user.email });\n *\n * return user;\n * },\n * );\n * // Audits are automatically flushed inside the transaction before commit\n * ```\n */\nexport async function withAuditableTransaction<DB, T>(\n\tdb: DatabaseConnection<DB>,\n\tauditor: TransactionAwareAuditor<Transaction<DB>>,\n\tcb: (trx: Transaction<DB>) => Promise<T>,\n\tsettings?: TransactionSettings,\n): Promise<T> {\n\tconst execute = async (trx: Transaction<DB>): Promise<T> => {\n\t\t// Register transaction with auditor\n\t\tauditor.setTransaction(trx);\n\n\t\t// Execute the callback\n\t\tconst result = await cb(trx);\n\n\t\t// Flush audits BEFORE transaction commits\n\t\t// If this fails, the transaction will roll back\n\t\tawait auditor.flush(trx);\n\n\t\treturn result;\n\t};\n\n\t// If already in a transaction, just run with it\n\tif (db.isTransaction) {\n\t\treturn execute(db as Transaction<DB>);\n\t}\n\n\tconst builder = db.transaction();\n\n\tif (settings?.isolationLevel) {\n\t\treturn builder.setIsolationLevel(settings.isolationLevel).execute(execute);\n\t}\n\n\treturn builder.execute(execute);\n}\n\n/**\n * Database table interface for audit records.\n * Use this to define your audit_logs table in your Kysely database schema.\n *\n * Column names use snake_case to match standard PostgreSQL conventions.\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * // ... other tables\n * }\n * ```\n */\nexport interface AuditLogTable {\n\tid: string;\n\ttype: string;\n\toperation: string;\n\ttable: string | null;\n\tentityId: string | null;\n\toldValues: unknown | null;\n\tnewValues: unknown | null;\n\tpayload: unknown | null;\n\ttimestamp: Date;\n\tactorId: string | null;\n\tactorType: string | null;\n\tactorData: unknown | null;\n\tmetadata: unknown | null;\n}\n\n/**\n * Insertable version of AuditLogTable where id is optional.\n * Use this when your database auto-generates IDs or when using autoId option.\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * }\n *\n * // For insertions where id is auto-generated\n * type NewAuditLog = InsertableAuditLogTable;\n * ```\n */\nexport type InsertableAuditLogTable = Omit<AuditLogTable, 'id'> & {\n\tid?: string;\n};\n\n/**\n * Configuration for KyselyAuditStorage.\n */\nexport interface KyselyAuditStorageConfig<DB> {\n\t/** Kysely database instance */\n\tdb: Kysely<DB>;\n\t/** Table name for audit logs (must be a key in DB that extends AuditLogTable) */\n\ttableName: keyof DB & string;\n\t/**\n\t * Service name of the database service.\n\t * When set, endpoint adaptors will automatically use the audit transaction as `db`\n\t * in the handler context if the endpoint's database service has the same name.\n\t */\n\tdatabaseServiceName?: string;\n\t/**\n\t * Let the database auto-generate IDs (e.g., via DEFAULT gen_random_uuid()).\n\t * When true, the ID field is omitted from inserts if not provided.\n\t * When false (default), IDs are generated using nanoid if not provided.\n\t * @default false\n\t */\n\tautoId?: boolean;\n}\n\n/**\n * Kysely-based audit storage implementation.\n * Stores audit records in a database table using Kysely.\n *\n * @template DB - Your Kysely database schema\n *\n * @example\n * ```typescript\n * interface Database {\n * audit_logs: AuditLogTable;\n * }\n *\n * const storage = new KyselyAuditStorage({\n * db: kyselyDb,\n * tableName: 'audit_logs',\n * });\n *\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n * ```\n */\nexport class KyselyAuditStorage<DB> implements AuditStorage {\n\tprivate readonly db: Kysely<DB>;\n\tprivate readonly tableName: keyof DB & string;\n\tprivate readonly autoId: boolean;\n\treadonly databaseServiceName?: string;\n\n\tconstructor(config: KyselyAuditStorageConfig<DB>) {\n\t\tthis.db = config.db;\n\t\tthis.tableName = config.tableName;\n\t\tthis.databaseServiceName = config.databaseServiceName;\n\t\tthis.autoId = config.autoId ?? false;\n\t}\n\n\tasync write(records: AuditRecord[], trx?: unknown): Promise<void> {\n\t\tif (records.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst db = (trx as Transaction<DB>) ?? this.db;\n\t\tconst rows = records.map((record) => this.toRow(record));\n\n\t\tawait (db as any).insertInto(this.tableName).values(rows).execute();\n\t}\n\n\tasync query(options: AuditQueryOptions): Promise<AuditRecord[]> {\n\t\tlet query = (this.db as any).selectFrom(this.tableName).selectAll();\n\n\t\tquery = this.applyFilters(query, options);\n\n\t\t// Ordering\n\t\tconst orderBy = options.orderBy ?? 'timestamp';\n\t\tconst orderDirection = options.orderDirection ?? 'desc';\n\t\tquery = query.orderBy(\n\t\t\torderBy === 'timestamp' ? 'timestamp' : 'type',\n\t\t\torderDirection,\n\t\t);\n\n\t\t// Pagination\n\t\tif (options.limit !== undefined) {\n\t\t\tquery = query.limit(options.limit);\n\t\t}\n\t\tif (options.offset !== undefined) {\n\t\t\tquery = query.offset(options.offset);\n\t\t}\n\n\t\tconst rows = await query.execute();\n\t\treturn rows.map((row: AuditLogTable) => this.fromRow(row));\n\t}\n\n\tasync count(\n\t\toptions: Omit<AuditQueryOptions, 'limit' | 'offset'>,\n\t): Promise<number> {\n\t\tlet query = (this.db as any)\n\t\t\t.selectFrom(this.tableName)\n\t\t\t.select((eb: any) => eb.fn.count('id').as('count'));\n\n\t\tquery = this.applyFilters(query, options);\n\n\t\tconst result = await query.executeTakeFirst();\n\t\treturn Number(result?.count ?? 0);\n\t}\n\n\t/**\n\t * Get the Kysely database instance for transactional operations.\n\t * Used by endpoint adaptors to automatically wrap handlers in transactions.\n\t */\n\tgetDatabase(): Kysely<DB> {\n\t\treturn this.db;\n\t}\n\n\t/**\n\t * Execute a callback within a Kysely transaction with automatic audit handling.\n\t * The auditor is registered with the transaction and audits are flushed\n\t * before the transaction commits.\n\t *\n\t * If the provided db connection is already a transaction, it will be reused\n\t * instead of creating a nested transaction.\n\t */\n\tasync withTransaction<T>(\n\t\tauditor: TransactionAwareAuditor<Transaction<DB>>,\n\t\tcallback: () => Promise<T>,\n\t\tdb?: DatabaseConnection<DB>,\n\t): Promise<T> {\n\t\tconst connection = db ?? this.db;\n\n\t\t// If already in a transaction, reuse it\n\t\tif (connection.isTransaction) {\n\t\t\tconst trx = connection as Transaction<DB>;\n\t\t\tauditor.setTransaction(trx);\n\t\t\tconst result = await callback();\n\t\t\tawait auditor.flush(trx);\n\t\t\treturn result;\n\t\t}\n\n\t\t// Create new transaction\n\t\treturn connection.transaction().execute(async (trx) => {\n\t\t\tauditor.setTransaction(trx);\n\t\t\tconst result = await callback();\n\t\t\tawait auditor.flush(trx);\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tprivate applyFilters(query: any, options: AuditQueryOptions): any {\n\t\t// Type filter\n\t\tif (options.type !== undefined) {\n\t\t\tif (Array.isArray(options.type)) {\n\t\t\t\tquery = query.where('type', 'in', options.type);\n\t\t\t} else {\n\t\t\t\tquery = query.where('type', '=', options.type);\n\t\t\t}\n\t\t}\n\n\t\t// Entity ID filter\n\t\tif (options.entityId !== undefined) {\n\t\t\tconst entityId =\n\t\t\t\ttypeof options.entityId === 'string'\n\t\t\t\t\t? options.entityId\n\t\t\t\t\t: JSON.stringify(options.entityId);\n\t\t\tquery = query.where('entityId', '=', entityId);\n\t\t}\n\n\t\t// Table filter\n\t\tif (options.table !== undefined) {\n\t\t\tquery = query.where('table', '=', options.table);\n\t\t}\n\n\t\t// Actor ID filter\n\t\tif (options.actorId !== undefined) {\n\t\t\tquery = query.where('actorId', '=', options.actorId);\n\t\t}\n\n\t\t// Date range filters\n\t\tif (options.from !== undefined) {\n\t\t\tquery = query.where('timestamp', '>=', options.from);\n\t\t}\n\t\tif (options.to !== undefined) {\n\t\t\tquery = query.where('timestamp', '<=', options.to);\n\t\t}\n\n\t\treturn query;\n\t}\n\n\tprivate toRow(record: AuditRecord): AuditLogTable {\n\t\t// If autoId is true, let database generate ID (ignore record.id)\n\t\t// If autoId is false (default), use record.id or generate with nanoid\n\t\tconst id = this.autoId ? undefined : record.id || nanoid();\n\n\t\treturn {\n\t\t\t...(id && { id }),\n\t\t\ttype: record.type,\n\t\t\toperation: record.operation,\n\t\t\ttable: record.table ?? null,\n\t\t\tentityId:\n\t\t\t\trecord.entityId === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: typeof record.entityId === 'string'\n\t\t\t\t\t\t? record.entityId\n\t\t\t\t\t\t: JSON.stringify(record.entityId),\n\t\t\toldValues: record.oldValues ?? null,\n\t\t\tnewValues: record.newValues ?? null,\n\t\t\tpayload: record.payload ?? null,\n\t\t\ttimestamp: record.timestamp,\n\t\t\tactorId: record.actor?.id ?? null,\n\t\t\tactorType: record.actor?.type ?? null,\n\t\t\tactorData:\n\t\t\t\trecord.actor !== undefined ? this.getActorData(record.actor) : null,\n\t\t\tmetadata: record.metadata ?? null,\n\t\t} as AuditLogTable;\n\t}\n\n\tprivate fromRow(row: AuditLogTable): AuditRecord {\n\t\tconst actor =\n\t\t\trow.actorId !== null || row.actorType !== null\n\t\t\t\t? {\n\t\t\t\t\t\tid: row.actorId ?? undefined,\n\t\t\t\t\t\ttype: row.actorType ?? undefined,\n\t\t\t\t\t\t...(row.actorData ? this.parseJson(row.actorData) : {}),\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\tid: row.id,\n\t\t\ttype: row.type,\n\t\t\toperation: row.operation as AuditRecord['operation'],\n\t\t\ttable: row.table ?? undefined,\n\t\t\tentityId: row.entityId ? this.parseEntityId(row.entityId) : undefined,\n\t\t\toldValues: row.oldValues ? this.parseJson(row.oldValues) : undefined,\n\t\t\tnewValues: row.newValues ? this.parseJson(row.newValues) : undefined,\n\t\t\tpayload: row.payload ? this.parseJson(row.payload) : undefined,\n\t\t\ttimestamp: row.timestamp,\n\t\t\tactor,\n\t\t\tmetadata: row.metadata ? this.parseJson(row.metadata) : undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Parse a JSON value that may already be parsed (e.g., from jsonb columns).\n\t */\n\tprivate parseJson(value: unknown): Record<string, unknown> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn value as Record<string, unknown>;\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\treturn JSON.parse(value);\n\t\t}\n\t\treturn {};\n\t}\n\n\tprivate getActorData(\n\t\tactor: NonNullable<AuditRecord['actor']>,\n\t): Record<string, unknown> {\n\t\tconst { id, type, ...rest } = actor;\n\t\treturn rest;\n\t}\n\n\tprivate parseEntityId(entityId: string): string | Record<string, unknown> {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(entityId);\n\t\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t\treturn entityId;\n\t\t} catch {\n\t\t\treturn entityId;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
package/dist/kysely.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { AuditQueryOptions, AuditRecord, AuditStorage } from "./Auditor-DrR0ImvJ.cjs";
1
+ import { AuditQueryOptions, AuditRecord, AuditStorage } from "./Auditor-sW7YAJIA.cjs";
2
2
  import { ControlledTransaction, IsolationLevel, Kysely, Transaction } from "kysely";
3
3
 
4
4
  //#region src/kysely.d.ts
@@ -202,6 +202,7 @@ declare class KyselyAuditStorage<DB> implements AuditStorage {
202
202
  private getActorData;
203
203
  private parseEntityId;
204
204
  }
205
+ //# sourceMappingURL=kysely.d.ts.map
205
206
  //#endregion
206
207
  export { AuditLogTable, DatabaseConnection, InsertableAuditLogTable, KyselyAuditStorage, KyselyAuditStorageConfig, TransactionAwareAuditor, TransactionSettings, withAuditableTransaction };
207
208
  //# sourceMappingURL=kysely.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kysely.d.cts","names":[],"sources":["../src/kysely.ts"],"sourcesContent":[],"mappings":";;;;;;AA+BA;;;;;AAImC;AAGnC;AAIA;;;;;;;;AAGc;AA6Cd;;;;AAE8C,UA7D7B,uBA6D6B,CAAA,eAAA,OAAA,CAAA,CAAA;EAAE;EAAH,cAAnC,CAAA,GAAA,EA3DW,YA2DX,CAAA,EAAA,IAAA;EAAuB;EACR,KAAd,CAAA,GAAA,CAAA,EA1DE,YA0DF,CAAA,EA1DiB,OA0DjB,CAAA,IAAA,CAAA;;AAAoB,UAvDd,mBAAA,CAuDc;EAAO,cAC1B,CAAA,EAvDM,cAuDN;;AACT,KArDS,kBAqDT,CAAA,CAAA,CAAA,GApDA,qBAoDA,CApDsB,CAoDtB,CAAA,GAnDA,MAmDA,CAnDO,CAmDP,CAAA,GAlDA,WAkDA,CAlDY,CAkDZ,CAAA;AAAO;AA2CV;AA8BA;;;;AAA0C;AAO1C;;;;;AAIoB;AAuCpB;;;;;;;;;;;;;;;;;;;;;;;;AAA2D;;;;;;iBAhIrC,oCACjB,mBAAmB,cACd,wBAAwB,YAAY,gBACnC,YAAY,QAAQ,QAAQ,eAC3B,sBACT,QAAQ;;;;;;;;;;;;;;;UA2CM,aAAA;;;;;;;;;aASL;;;;;;;;;;;;;;;;;;;;KAqBA,uBAAA,GAA0B,KAAK;;;;;;UAO1B;;MAEZ,OAAO;;mBAEM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuCL,kCAAkC;;;;;sBAM1B,yBAAyB;iBAOxB,+BAA+B;iBAW/B,oBAAoB,QAAQ;iBA0BvC,KAAK,yCACZ;;;;;iBAeY,OAAO;;;;;;;;;8BAaZ,wBAAwB,YAAY,sBAC7B,QAAQ,SACnB,mBAAmB,MACtB,QAAQ"}
package/dist/kysely.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { AuditQueryOptions, AuditRecord, AuditStorage } from "./Auditor-Xf4Tp63p.mjs";
1
+ import { AuditQueryOptions, AuditRecord, AuditStorage } from "./Auditor-_Dn2dp8d.mjs";
2
2
  import { ControlledTransaction, IsolationLevel, Kysely, Transaction } from "kysely";
3
3
 
4
4
  //#region src/kysely.d.ts
@@ -202,6 +202,7 @@ declare class KyselyAuditStorage<DB> implements AuditStorage {
202
202
  private getActorData;
203
203
  private parseEntityId;
204
204
  }
205
+ //# sourceMappingURL=kysely.d.ts.map
205
206
  //#endregion
206
207
  export { AuditLogTable, DatabaseConnection, InsertableAuditLogTable, KyselyAuditStorage, KyselyAuditStorageConfig, TransactionAwareAuditor, TransactionSettings, withAuditableTransaction };
207
208
  //# sourceMappingURL=kysely.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kysely.d.mts","names":[],"sources":["../src/kysely.ts"],"sourcesContent":[],"mappings":";;;;;;AA+BA;;;;;AAImC;AAGnC;AAIA;;;;;;;;AAGc;AA6Cd;;;;AAE8C,UA7D7B,uBA6D6B,CAAA,eAAA,OAAA,CAAA,CAAA;EAAE;EAAH,cAAnC,CAAA,GAAA,EA3DW,YA2DX,CAAA,EAAA,IAAA;EAAuB;EACR,KAAd,CAAA,GAAA,CAAA,EA1DE,YA0DF,CAAA,EA1DiB,OA0DjB,CAAA,IAAA,CAAA;;AAAoB,UAvDd,mBAAA,CAuDc;EAAO,cAC1B,CAAA,EAvDM,cAuDN;;AACT,KArDS,kBAqDT,CAAA,CAAA,CAAA,GApDA,qBAoDA,CApDsB,CAoDtB,CAAA,GAnDA,MAmDA,CAnDO,CAmDP,CAAA,GAlDA,WAkDA,CAlDY,CAkDZ,CAAA;AAAO;AA2CV;AA8BA;;;;AAA0C;AAO1C;;;;;AAIoB;AAuCpB;;;;;;;;;;;;;;;;;;;;;;;;AAA2D;;;;;;iBAhIrC,oCACjB,mBAAmB,cACd,wBAAwB,YAAY,gBACnC,YAAY,QAAQ,QAAQ,eAC3B,sBACT,QAAQ;;;;;;;;;;;;;;;UA2CM,aAAA;;;;;;;;;aASL;;;;;;;;;;;;;;;;;;;;KAqBA,uBAAA,GAA0B,KAAK;;;;;;UAO1B;;MAEZ,OAAO;;mBAEM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuCL,kCAAkC;;;;;sBAM1B,yBAAyB;iBAOxB,+BAA+B;iBAW/B,oBAAoB,QAAQ;iBA0BvC,KAAK,yCACZ;;;;;iBAeY,OAAO;;;;;;;;;8BAaZ,wBAAwB,YAAY,sBAC7B,QAAQ,SACnB,mBAAmB,MACtB,QAAQ"}