@geekmidas/audit 10.0.0-alpha.2 → 10.0.0-alpha.21

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 (77) hide show
  1. package/dist/{Auditor-CW2NrfHS.d.mts → Auditor-BBXXCD0v.d.cts} +2 -7
  2. package/dist/Auditor-BBXXCD0v.d.cts.map +1 -0
  3. package/dist/{Auditor-DpBHXIJM.d.cts → Auditor-BBXXCD0v.d.mts} +2 -7
  4. package/dist/Auditor-BBXXCD0v.d.mts.map +1 -0
  5. package/dist/Auditor.d.cts +1 -1
  6. package/dist/Auditor.d.mts +1 -1
  7. package/dist/Auditor.mjs +1 -0
  8. package/dist/DefaultAuditor.cjs +95 -2
  9. package/dist/DefaultAuditor.cjs.map +1 -0
  10. package/dist/DefaultAuditor.d.cts +55 -3
  11. package/dist/DefaultAuditor.d.cts.map +1 -0
  12. package/dist/DefaultAuditor.d.mts +55 -3
  13. package/dist/DefaultAuditor.d.mts.map +1 -0
  14. package/dist/DefaultAuditor.mjs +94 -2
  15. package/dist/DefaultAuditor.mjs.map +1 -0
  16. package/dist/cache.cjs +166 -2
  17. package/dist/cache.cjs.map +1 -0
  18. package/dist/cache.d.cts +92 -3
  19. package/dist/cache.d.cts.map +1 -0
  20. package/dist/cache.d.mts +92 -3
  21. package/dist/cache.d.mts.map +1 -0
  22. package/dist/cache.mjs +165 -2
  23. package/dist/cache.mjs.map +1 -0
  24. package/dist/index.cjs +3 -3
  25. package/dist/index.d.cts +3 -3
  26. package/dist/index.d.mts +3 -3
  27. package/dist/index.mjs +2 -3
  28. package/dist/knex.cjs +9 -9
  29. package/dist/knex.cjs.map +1 -1
  30. package/dist/knex.d.cts +9 -11
  31. package/dist/knex.d.cts.map +1 -1
  32. package/dist/knex.d.mts +9 -11
  33. package/dist/knex.d.mts.map +1 -1
  34. package/dist/knex.mjs +7 -7
  35. package/dist/knex.mjs.map +1 -1
  36. package/dist/kysely.cjs +9 -9
  37. package/dist/kysely.cjs.map +1 -1
  38. package/dist/kysely.d.cts +9 -11
  39. package/dist/kysely.d.cts.map +1 -1
  40. package/dist/kysely.d.mts +9 -11
  41. package/dist/kysely.d.mts.map +1 -1
  42. package/dist/kysely.mjs +7 -7
  43. package/dist/kysely.mjs.map +1 -1
  44. package/dist/memory.cjs +6 -7
  45. package/dist/memory.cjs.map +1 -1
  46. package/dist/memory.d.cts +3 -7
  47. package/dist/memory.d.cts.map +1 -1
  48. package/dist/memory.d.mts +3 -7
  49. package/dist/memory.d.mts.map +1 -1
  50. package/dist/memory.mjs +3 -4
  51. package/dist/memory.mjs.map +1 -1
  52. package/dist/storage.d.cts +1 -1
  53. package/dist/storage.d.mts +1 -1
  54. package/dist/storage.mjs +1 -0
  55. package/dist/types.d.cts +1 -1
  56. package/dist/types.d.mts +1 -1
  57. package/dist/types.mjs +1 -0
  58. package/package.json +13 -13
  59. package/dist/Auditor-CW2NrfHS.d.mts.map +0 -1
  60. package/dist/Auditor-DpBHXIJM.d.cts.map +0 -1
  61. package/dist/DefaultAuditor-BAVnNmRh.mjs +0 -96
  62. package/dist/DefaultAuditor-BAVnNmRh.mjs.map +0 -1
  63. package/dist/DefaultAuditor-DlJ1ENfx.d.mts +0 -59
  64. package/dist/DefaultAuditor-DlJ1ENfx.d.mts.map +0 -1
  65. package/dist/DefaultAuditor-GRFI86N_.d.cts +0 -59
  66. package/dist/DefaultAuditor-GRFI86N_.d.cts.map +0 -1
  67. package/dist/DefaultAuditor-JbZ_BQfh.cjs +0 -102
  68. package/dist/DefaultAuditor-JbZ_BQfh.cjs.map +0 -1
  69. package/dist/cache-BbIl31RL.mjs +0 -167
  70. package/dist/cache-BbIl31RL.mjs.map +0 -1
  71. package/dist/cache-Bih6HxY6.d.cts +0 -96
  72. package/dist/cache-Bih6HxY6.d.cts.map +0 -1
  73. package/dist/cache-l7jAptBl.cjs +0 -173
  74. package/dist/cache-l7jAptBl.cjs.map +0 -1
  75. package/dist/cache-wET57t6d.d.mts +0 -96
  76. package/dist/cache-wET57t6d.d.mts.map +0 -1
  77. package/dist/chunk-CUT6urMc.cjs +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"kysely.mjs","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 {\n\tAuditQueryOptions,\n\tAuditStorage,\n\tTransactionAwareAuditor,\n} from './storage';\nimport type { AuditRecord } from './types';\n\nexport type { TransactionAwareAuditor };\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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"}
1
+ {"version":3,"file":"kysely.mjs","names":[],"sources":["../src/kysely.ts"],"sourcesContent":["import type {\n\tControlledTransaction,\n\tIsolationLevel,\n\tKysely,\n\tTransaction,\n} from 'kysely';\nimport { nanoid } from 'nanoid';\nimport type {\n\tAuditQueryOptions,\n\tAuditStorage,\n\tTransactionAwareAuditor,\n} from './storage';\nimport type { AuditRecord } from './types';\n\nexport type { TransactionAwareAuditor };\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/memory.cjs CHANGED
@@ -1,7 +1,6 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_cache = require('./cache-l7jAptBl.cjs');
3
- const __geekmidas_cache_memory = require_chunk.__toESM(require("@geekmidas/cache/memory"));
4
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_cache = require("./cache.cjs");
3
+ let _geekmidas_cache_memory = require("@geekmidas/cache/memory");
5
4
  //#region src/memory.ts
6
5
  /**
7
6
  * In-memory audit storage implementation.
@@ -38,12 +37,12 @@ const __geekmidas_cache_memory = require_chunk.__toESM(require("@geekmidas/cache
38
37
  var InMemoryAuditStorage = class extends require_cache.CacheAuditStorage {
39
38
  constructor() {
40
39
  super({
41
- cache: new __geekmidas_cache_memory.InMemoryCache(),
42
- ttl: 86400 * 365
40
+ cache: new _geekmidas_cache_memory.InMemoryCache(),
41
+ ttl: 31536e3
43
42
  });
44
43
  }
45
44
  };
46
-
47
45
  //#endregion
48
46
  exports.InMemoryAuditStorage = InMemoryAuditStorage;
47
+
49
48
  //# sourceMappingURL=memory.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.cjs","names":["CacheAuditStorage","InMemoryCache"],"sources":["../src/memory.ts"],"sourcesContent":["import { InMemoryCache } from '@geekmidas/cache/memory';\nimport { CacheAuditStorage } from './cache';\nimport type { AuditableAction } from './types';\n\n/**\n * In-memory audit storage implementation.\n * Convenience wrapper around CacheAuditStorage with InMemoryCache.\n *\n * Useful for testing, development, and applications that don't need persistent audit logs.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { InMemoryAuditStorage } from '@geekmidas/audit/memory';\n * import { DefaultAuditor } from '@geekmidas/audit';\n *\n * const storage = new InMemoryAuditStorage();\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n * await auditor.flush();\n *\n * // Query stored records\n * const records = await storage.query({ type: 'user.created' });\n *\n * // Get all records (for testing)\n * const all = await storage.getRecords();\n *\n * // Clear for next test\n * await storage.clear();\n * ```\n */\nexport class InMemoryAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends CacheAuditStorage<TAuditAction> {\n\tconstructor() {\n\t\tsuper({\n\t\t\tcache: new InMemoryCache(),\n\t\t\t// Use a long TTL since in-memory cache expires items\n\t\t\tttl: 86400 * 365, // 1 year\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,uBAAb,cAKUA,gCAAgC;CACzC,cAAc;AACb,QAAM;GACL,OAAO,IAAIC;GAEX,KAAK,QAAQ;EACb,EAAC;CACF;AACD"}
1
+ {"version":3,"file":"memory.cjs","names":["CacheAuditStorage","InMemoryCache"],"sources":["../src/memory.ts"],"sourcesContent":["import { InMemoryCache } from '@geekmidas/cache/memory';\nimport { CacheAuditStorage } from './cache';\nimport type { AuditableAction } from './types';\n\n/**\n * In-memory audit storage implementation.\n * Convenience wrapper around CacheAuditStorage with InMemoryCache.\n *\n * Useful for testing, development, and applications that don't need persistent audit logs.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { InMemoryAuditStorage } from '@geekmidas/audit/memory';\n * import { DefaultAuditor } from '@geekmidas/audit';\n *\n * const storage = new InMemoryAuditStorage();\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n * await auditor.flush();\n *\n * // Query stored records\n * const records = await storage.query({ type: 'user.created' });\n *\n * // Get all records (for testing)\n * const all = await storage.getRecords();\n *\n * // Clear for next test\n * await storage.clear();\n * ```\n */\nexport class InMemoryAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends CacheAuditStorage<TAuditAction> {\n\tconstructor() {\n\t\tsuper({\n\t\t\tcache: new InMemoryCache(),\n\t\t\t// Use a long TTL since in-memory cache expires items\n\t\t\tttl: 86400 * 365, // 1 year\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,uBAAb,cAKUA,cAAAA,kBAAgC;CACzC,cAAc;EACb,MAAM;GACL,OAAO,IAAIC,wBAAAA,cAAc;GAEzB,KAAK;EACN,CAAC;CACF;AACD"}
package/dist/memory.d.cts CHANGED
@@ -1,8 +1,6 @@
1
- import { AuditableAction } from "./Auditor-DpBHXIJM.cjs";
2
- import { CacheAuditStorage } from "./cache-Bih6HxY6.cjs";
3
-
1
+ import { s as AuditableAction } from "./Auditor-BBXXCD0v.cjs";
2
+ import { CacheAuditStorage } from "./cache.cjs";
4
3
  //#region src/memory.d.ts
5
-
6
4
  /**
7
5
  * In-memory audit storage implementation.
8
6
  * Convenience wrapper around CacheAuditStorage with InMemoryCache.
@@ -35,10 +33,8 @@ import { CacheAuditStorage } from "./cache-Bih6HxY6.cjs";
35
33
  * await storage.clear();
36
34
  * ```
37
35
  */
38
- declare class InMemoryAuditStorage<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends CacheAuditStorage<TAuditAction> {
36
+ export declare class InMemoryAuditStorage<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends CacheAuditStorage<TAuditAction> {
39
37
  constructor();
40
38
  }
41
- //# sourceMappingURL=memory.d.ts.map
42
39
  //#endregion
43
- export { InMemoryAuditStorage };
44
40
  //# sourceMappingURL=memory.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.cts","names":[],"sources":["../src/memory.ts"],"sourcesContent":[],"mappings":";;;;;;;AAoCA;;;;;;AAK2B;;;;;;;;;;;;;;;;;;;;;;;;cALd,0CACS,mCAAmC,0CAI/C,kBAAkB"}
1
+ {"version":3,"file":"memory.d.cts","names":[],"sources":["../src/memory.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCa,qBACZ,qBAAqB,mCAAmC,0CAI/C,kBAAkB;EAC3B"}
package/dist/memory.d.mts CHANGED
@@ -1,8 +1,6 @@
1
- import { AuditableAction } from "./Auditor-CW2NrfHS.mjs";
2
- import { CacheAuditStorage } from "./cache-wET57t6d.mjs";
3
-
1
+ import { s as AuditableAction } from "./Auditor-BBXXCD0v.mjs";
2
+ import { CacheAuditStorage } from "./cache.mjs";
4
3
  //#region src/memory.d.ts
5
-
6
4
  /**
7
5
  * In-memory audit storage implementation.
8
6
  * Convenience wrapper around CacheAuditStorage with InMemoryCache.
@@ -35,10 +33,8 @@ import { CacheAuditStorage } from "./cache-wET57t6d.mjs";
35
33
  * await storage.clear();
36
34
  * ```
37
35
  */
38
- declare class InMemoryAuditStorage<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends CacheAuditStorage<TAuditAction> {
36
+ export declare class InMemoryAuditStorage<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends CacheAuditStorage<TAuditAction> {
39
37
  constructor();
40
38
  }
41
- //# sourceMappingURL=memory.d.ts.map
42
39
  //#endregion
43
- export { InMemoryAuditStorage };
44
40
  //# sourceMappingURL=memory.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.mts","names":[],"sources":["../src/memory.ts"],"sourcesContent":[],"mappings":";;;;;;;AAoCA;;;;;;AAK2B;;;;;;;;;;;;;;;;;;;;;;;;cALd,0CACS,mCAAmC,0CAI/C,kBAAkB"}
1
+ {"version":3,"file":"memory.d.mts","names":[],"sources":["../src/memory.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCa,qBACZ,qBAAqB,mCAAmC,0CAI/C,kBAAkB;EAC3B"}
package/dist/memory.mjs CHANGED
@@ -1,6 +1,5 @@
1
- import { CacheAuditStorage } from "./cache-BbIl31RL.mjs";
1
+ import { CacheAuditStorage } from "./cache.mjs";
2
2
  import { InMemoryCache } from "@geekmidas/cache/memory";
3
-
4
3
  //#region src/memory.ts
5
4
  /**
6
5
  * In-memory audit storage implementation.
@@ -38,11 +37,11 @@ var InMemoryAuditStorage = class extends CacheAuditStorage {
38
37
  constructor() {
39
38
  super({
40
39
  cache: new InMemoryCache(),
41
- ttl: 86400 * 365
40
+ ttl: 31536e3
42
41
  });
43
42
  }
44
43
  };
45
-
46
44
  //#endregion
47
45
  export { InMemoryAuditStorage };
46
+
48
47
  //# sourceMappingURL=memory.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.mjs","names":[],"sources":["../src/memory.ts"],"sourcesContent":["import { InMemoryCache } from '@geekmidas/cache/memory';\nimport { CacheAuditStorage } from './cache';\nimport type { AuditableAction } from './types';\n\n/**\n * In-memory audit storage implementation.\n * Convenience wrapper around CacheAuditStorage with InMemoryCache.\n *\n * Useful for testing, development, and applications that don't need persistent audit logs.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { InMemoryAuditStorage } from '@geekmidas/audit/memory';\n * import { DefaultAuditor } from '@geekmidas/audit';\n *\n * const storage = new InMemoryAuditStorage();\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n * await auditor.flush();\n *\n * // Query stored records\n * const records = await storage.query({ type: 'user.created' });\n *\n * // Get all records (for testing)\n * const all = await storage.getRecords();\n *\n * // Clear for next test\n * await storage.clear();\n * ```\n */\nexport class InMemoryAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends CacheAuditStorage<TAuditAction> {\n\tconstructor() {\n\t\tsuper({\n\t\t\tcache: new InMemoryCache(),\n\t\t\t// Use a long TTL since in-memory cache expires items\n\t\t\tttl: 86400 * 365, // 1 year\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,uBAAb,cAKU,kBAAgC;CACzC,cAAc;AACb,QAAM;GACL,OAAO,IAAI;GAEX,KAAK,QAAQ;EACb,EAAC;CACF;AACD"}
1
+ {"version":3,"file":"memory.mjs","names":[],"sources":["../src/memory.ts"],"sourcesContent":["import { InMemoryCache } from '@geekmidas/cache/memory';\nimport { CacheAuditStorage } from './cache';\nimport type { AuditableAction } from './types';\n\n/**\n * In-memory audit storage implementation.\n * Convenience wrapper around CacheAuditStorage with InMemoryCache.\n *\n * Useful for testing, development, and applications that don't need persistent audit logs.\n *\n * @template TAuditAction - Optional type parameter for type-safe audit actions.\n *\n * @example\n * ```typescript\n * import { InMemoryAuditStorage } from '@geekmidas/audit/memory';\n * import { DefaultAuditor } from '@geekmidas/audit';\n *\n * const storage = new InMemoryAuditStorage();\n * const auditor = new DefaultAuditor({\n * actor: { id: 'user-123', type: 'user' },\n * storage,\n * });\n *\n * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });\n * await auditor.flush();\n *\n * // Query stored records\n * const records = await storage.query({ type: 'user.created' });\n *\n * // Get all records (for testing)\n * const all = await storage.getRecords();\n *\n * // Clear for next test\n * await storage.clear();\n * ```\n */\nexport class InMemoryAuditStorage<\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends CacheAuditStorage<TAuditAction> {\n\tconstructor() {\n\t\tsuper({\n\t\t\tcache: new InMemoryCache(),\n\t\t\t// Use a long TTL since in-memory cache expires items\n\t\t\tttl: 86400 * 365, // 1 year\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,uBAAb,cAKU,kBAAgC;CACzC,cAAc;EACb,MAAM;GACL,OAAO,IAAI,cAAc;GAEzB,KAAK;EACN,CAAC;CACF;AACD"}
@@ -1,2 +1,2 @@
1
- import { AuditQueryOptions, AuditStorage, TransactionAwareAuditor } from "./Auditor-DpBHXIJM.cjs";
1
+ import { h as TransactionAwareAuditor, m as AuditStorage, p as AuditQueryOptions } from "./Auditor-BBXXCD0v.cjs";
2
2
  export { AuditQueryOptions, AuditStorage, TransactionAwareAuditor };
@@ -1,2 +1,2 @@
1
- import { AuditQueryOptions, AuditStorage, TransactionAwareAuditor } from "./Auditor-CW2NrfHS.mjs";
1
+ import { h as TransactionAwareAuditor, m as AuditStorage, p as AuditQueryOptions } from "./Auditor-BBXXCD0v.mjs";
2
2
  export { AuditQueryOptions, AuditStorage, TransactionAwareAuditor };
package/dist/storage.mjs CHANGED
@@ -0,0 +1 @@
1
+ export {};
package/dist/types.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditRecord, AuditableAction, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-DpBHXIJM.cjs";
1
+ import { a as AuditOptions, c as ExtractAuditPayload, d as ExtractStorageAuditAction, f as MappedAudit, i as AuditOperation, l as ExtractAuditType, n as AuditActor, o as AuditRecord, r as AuditMetadata, s as AuditableAction, u as ExtractAuditorAction } from "./Auditor-BBXXCD0v.cjs";
2
2
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditRecord, AuditableAction, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditRecord, AuditableAction, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit } from "./Auditor-CW2NrfHS.mjs";
1
+ import { a as AuditOptions, c as ExtractAuditPayload, d as ExtractStorageAuditAction, f as MappedAudit, i as AuditOperation, l as ExtractAuditType, n as AuditActor, o as AuditRecord, r as AuditMetadata, s as AuditableAction, u as ExtractAuditorAction } from "./Auditor-BBXXCD0v.mjs";
2
2
  export { AuditActor, AuditMetadata, AuditOperation, AuditOptions, AuditRecord, AuditableAction, ExtractAuditPayload, ExtractAuditType, ExtractAuditorAction, ExtractStorageAuditAction, MappedAudit };
package/dist/types.mjs CHANGED
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekmidas/audit",
3
- "version": "10.0.0-alpha.2",
3
+ "version": "10.0.0-alpha.21",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -66,14 +66,14 @@
66
66
  "access": "public"
67
67
  },
68
68
  "dependencies": {
69
- "@standard-schema/spec": "~1.0.0",
70
- "nanoid": "~5.1.5"
69
+ "@standard-schema/spec": "~1.1.0",
70
+ "nanoid": "~6.0.1"
71
71
  },
72
72
  "peerDependencies": {
73
- "kysely": ">=0.28.2 <0.30.0",
74
- "knex": ">=3.0.0 <4.0.0",
75
- "@geekmidas/cache": "^10.0.0-alpha.2",
76
- "@geekmidas/schema": "^10.0.0-alpha.2"
73
+ "kysely": "~0.29.6",
74
+ "knex": ">=3.3.0",
75
+ "@geekmidas/cache": "^10.0.0-alpha.21",
76
+ "@geekmidas/schema": "^10.0.0-alpha.21"
77
77
  },
78
78
  "peerDependenciesMeta": {
79
79
  "@geekmidas/cache": {
@@ -90,11 +90,11 @@
90
90
  }
91
91
  },
92
92
  "devDependencies": {
93
- "kysely": "~0.29.4",
94
- "pg": "~8.16.0",
95
- "@types/pg": "~8.15.6",
96
- "knex": "~3.1.0",
97
- "@geekmidas/cache": "^10.0.0-alpha.2",
98
- "@geekmidas/schema": "^10.0.0-alpha.2"
93
+ "kysely": "~0.29.6",
94
+ "pg": "~8.23.0",
95
+ "@types/pg": "~8.23.1",
96
+ "knex": "~3.3.0",
97
+ "@geekmidas/cache": "^10.0.0-alpha.21",
98
+ "@geekmidas/schema": "^10.0.0-alpha.21"
99
99
  }
100
100
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Auditor-CW2NrfHS.d.mts","names":[],"sources":["../src/storage.ts","../src/types.ts","../src/Auditor.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Auditor-DpBHXIJM.d.cts","names":[],"sources":["../src/storage.ts","../src/types.ts","../src/Auditor.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,96 +0,0 @@
1
- import { nanoid } from "nanoid";
2
-
3
- //#region src/DefaultAuditor.ts
4
- /**
5
- * Default implementation of the Auditor interface.
6
- * Collects audit records in memory and flushes to storage.
7
- *
8
- * @template TAuditAction - Union of all allowed audit action types
9
- * @template TTransaction - Transaction type (e.g., Kysely Transaction)
10
- *
11
- * @example
12
- * ```typescript
13
- * const auditor = new DefaultAuditor<AppAuditAction>({
14
- * actor: { id: 'user-123', type: 'user' },
15
- * storage: auditStorage,
16
- * metadata: { requestId: 'req-456', endpoint: '/users' },
17
- * });
18
- *
19
- * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });
20
- *
21
- * // Flush inside transaction
22
- * await auditor.flush(trx);
23
- * ```
24
- */
25
- var DefaultAuditor = class {
26
- actor;
27
- storage;
28
- metadata;
29
- generateId;
30
- records = [];
31
- transaction;
32
- constructor(config) {
33
- this.actor = config.actor;
34
- this.storage = config.storage;
35
- this.metadata = config.metadata;
36
- this.generateId = config.generateId ?? (() => nanoid());
37
- }
38
- audit(type, payload, options) {
39
- const record = {
40
- id: this.generateId(),
41
- type,
42
- operation: options?.operation ?? "CUSTOM",
43
- table: options?.table,
44
- entityId: options?.entityId,
45
- oldValues: options?.oldValues,
46
- newValues: options?.newValues,
47
- payload,
48
- timestamp: /* @__PURE__ */ new Date(),
49
- actor: this.actor,
50
- metadata: this.metadata
51
- };
52
- this.records.push(record);
53
- }
54
- record(record) {
55
- const fullRecord = {
56
- ...record,
57
- id: this.generateId(),
58
- timestamp: /* @__PURE__ */ new Date(),
59
- actor: this.actor,
60
- metadata: this.metadata ? {
61
- ...this.metadata,
62
- ...record.metadata
63
- } : record.metadata
64
- };
65
- this.records.push(fullRecord);
66
- }
67
- getRecords() {
68
- return [...this.records];
69
- }
70
- async flush(trx) {
71
- if (this.records.length === 0) return;
72
- const recordsToFlush = [...this.records];
73
- this.records = [];
74
- const transactionToUse = trx ?? this.transaction;
75
- await this.storage.write(recordsToFlush, transactionToUse);
76
- }
77
- setTransaction(trx) {
78
- this.transaction = trx;
79
- }
80
- getTransaction() {
81
- return this.transaction;
82
- }
83
- clear() {
84
- this.records = [];
85
- }
86
- addMetadata(metadata) {
87
- this.metadata = this.metadata ? {
88
- ...this.metadata,
89
- ...metadata
90
- } : metadata;
91
- }
92
- };
93
-
94
- //#endregion
95
- export { DefaultAuditor };
96
- //# sourceMappingURL=DefaultAuditor-BAVnNmRh.mjs.map
@@ -1 +0,0 @@
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,59 +0,0 @@
1
- import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-CW2NrfHS.mjs";
2
-
3
- //#region src/DefaultAuditor.d.ts
4
-
5
- /**
6
- * Configuration for DefaultAuditor.
7
- */
8
- interface DefaultAuditorConfig {
9
- /** The actor performing audits (set at construction, immutable) */
10
- actor: AuditActor;
11
- /** Storage backend for persisting audits */
12
- storage: AuditStorage;
13
- /** Optional metadata to attach to all audits */
14
- metadata?: AuditMetadata;
15
- /** Optional custom ID generator (defaults to nanoid) */
16
- generateId?: () => string;
17
- }
18
- /**
19
- * Default implementation of the Auditor interface.
20
- * Collects audit records in memory and flushes to storage.
21
- *
22
- * @template TAuditAction - Union of all allowed audit action types
23
- * @template TTransaction - Transaction type (e.g., Kysely Transaction)
24
- *
25
- * @example
26
- * ```typescript
27
- * const auditor = new DefaultAuditor<AppAuditAction>({
28
- * actor: { id: 'user-123', type: 'user' },
29
- * storage: auditStorage,
30
- * metadata: { requestId: 'req-456', endpoint: '/users' },
31
- * });
32
- *
33
- * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });
34
- *
35
- * // Flush inside transaction
36
- * await auditor.flush(trx);
37
- * ```
38
- */
39
- declare class DefaultAuditor<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TTransaction = unknown> implements Auditor<TAuditAction, TTransaction> {
40
- readonly actor: AuditActor;
41
- private readonly storage;
42
- private metadata?;
43
- private readonly generateId;
44
- private records;
45
- private transaction?;
46
- constructor(config: DefaultAuditorConfig);
47
- audit<TType extends ExtractAuditType<TAuditAction>>(type: TType, payload: ExtractAuditPayload<TAuditAction, TType>, options?: AuditOptions): void;
48
- record(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void;
49
- getRecords(): AuditRecord[];
50
- flush(trx?: TTransaction): Promise<void>;
51
- setTransaction(trx: TTransaction): void;
52
- getTransaction(): TTransaction | undefined;
53
- clear(): void;
54
- addMetadata(metadata: AuditMetadata): void;
55
- }
56
- //# sourceMappingURL=DefaultAuditor.d.ts.map
57
- //#endregion
58
- export { DefaultAuditor, DefaultAuditorConfig };
59
- //# sourceMappingURL=DefaultAuditor-DlJ1ENfx.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DefaultAuditor-DlJ1ENfx.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,59 +0,0 @@
1
- import { AuditActor, AuditMetadata, AuditOptions, AuditRecord, AuditStorage, AuditableAction, Auditor, ExtractAuditPayload, ExtractAuditType } from "./Auditor-DpBHXIJM.cjs";
2
-
3
- //#region src/DefaultAuditor.d.ts
4
-
5
- /**
6
- * Configuration for DefaultAuditor.
7
- */
8
- interface DefaultAuditorConfig {
9
- /** The actor performing audits (set at construction, immutable) */
10
- actor: AuditActor;
11
- /** Storage backend for persisting audits */
12
- storage: AuditStorage;
13
- /** Optional metadata to attach to all audits */
14
- metadata?: AuditMetadata;
15
- /** Optional custom ID generator (defaults to nanoid) */
16
- generateId?: () => string;
17
- }
18
- /**
19
- * Default implementation of the Auditor interface.
20
- * Collects audit records in memory and flushes to storage.
21
- *
22
- * @template TAuditAction - Union of all allowed audit action types
23
- * @template TTransaction - Transaction type (e.g., Kysely Transaction)
24
- *
25
- * @example
26
- * ```typescript
27
- * const auditor = new DefaultAuditor<AppAuditAction>({
28
- * actor: { id: 'user-123', type: 'user' },
29
- * storage: auditStorage,
30
- * metadata: { requestId: 'req-456', endpoint: '/users' },
31
- * });
32
- *
33
- * auditor.audit('user.created', { userId: '789', email: 'test@example.com' });
34
- *
35
- * // Flush inside transaction
36
- * await auditor.flush(trx);
37
- * ```
38
- */
39
- declare class DefaultAuditor<TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TTransaction = unknown> implements Auditor<TAuditAction, TTransaction> {
40
- readonly actor: AuditActor;
41
- private readonly storage;
42
- private metadata?;
43
- private readonly generateId;
44
- private records;
45
- private transaction?;
46
- constructor(config: DefaultAuditorConfig);
47
- audit<TType extends ExtractAuditType<TAuditAction>>(type: TType, payload: ExtractAuditPayload<TAuditAction, TType>, options?: AuditOptions): void;
48
- record(record: Omit<AuditRecord, 'id' | 'timestamp' | 'actor'>): void;
49
- getRecords(): AuditRecord[];
50
- flush(trx?: TTransaction): Promise<void>;
51
- setTransaction(trx: TTransaction): void;
52
- getTransaction(): TTransaction | undefined;
53
- clear(): void;
54
- addMetadata(metadata: AuditMetadata): void;
55
- }
56
- //# sourceMappingURL=DefaultAuditor.d.ts.map
57
- //#endregion
58
- export { DefaultAuditor, DefaultAuditorConfig };
59
- //# sourceMappingURL=DefaultAuditor-GRFI86N_.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DefaultAuditor-GRFI86N_.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"}