@event-driven-io/pongo 0.17.0-beta.34 → 0.17.0-beta.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-TYTEQJBC.cjs → chunk-EQ3T4XHT.cjs} +2 -2
- package/dist/{chunk-TYTEQJBC.cjs.map → chunk-EQ3T4XHT.cjs.map} +1 -1
- package/dist/{chunk-OJVG4KXA.js → chunk-H6YIW5C5.js} +2 -2
- package/dist/{chunk-UP6HTRMM.cjs → chunk-NTHMSHNG.cjs} +12 -12
- package/dist/{chunk-UP6HTRMM.cjs.map → chunk-NTHMSHNG.cjs.map} +1 -1
- package/dist/{chunk-U4NNEXNH.js → chunk-NWYI26VT.js} +2 -2
- package/dist/{chunk-U4NNEXNH.js.map → chunk-NWYI26VT.js.map} +1 -1
- package/dist/cli.cjs +13 -13
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare.cjs +10 -10
- package/dist/cloudflare.d.cts +2 -2
- package/dist/cloudflare.d.ts +2 -2
- package/dist/cloudflare.js +2 -2
- package/dist/{index-DHszkVjP.d.ts → index-BfBszcG4.d.ts} +1 -1
- package/dist/{index-DLDCIBgH.d.cts → index-a-fxODW1.d.cts} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/pg.cjs +16 -16
- package/dist/pg.d.cts +1 -1
- package/dist/pg.d.ts +1 -1
- package/dist/pg.js +1 -1
- package/dist/{pongoTransactionCache-BsigBOq1.d.ts → pongoTransactionCache-CRuPGag3.d.cts} +1 -1
- package/dist/{pongoTransactionCache-BsigBOq1.d.cts → pongoTransactionCache-CRuPGag3.d.ts} +1 -1
- package/dist/shim.cjs +5 -5
- package/dist/shim.d.cts +1 -1
- package/dist/shim.d.ts +1 -1
- package/dist/shim.js +1 -1
- package/dist/sqlite3.cjs +10 -10
- package/dist/sqlite3.d.cts +2 -2
- package/dist/sqlite3.d.ts +2 -2
- package/dist/sqlite3.js +2 -2
- package/package.json +2 -2
- /package/dist/{chunk-OJVG4KXA.js.map → chunk-H6YIW5C5.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/chunk-TYTEQJBC.cjs","../src/core/cache/pongoCacheWrapper.ts","../src/core/cache/providers/identityMapCache.ts","../src/core/cache/providers/lruCache.ts","../src/core/cache/providers/noopCache.ts","../src/core/cache/pongoCache.ts","../src/core/cache/transactions/pongoTransactionCache.ts","../src/core/collection/filters/filters.ts","../src/core/collection/pongoCollection.ts","../src/core/collection/pongoCollectionSchemaComponent.ts","../src/core/collection/query.ts","../src/core/database/pongoDatabaseCache.ts","../src/core/database/pongoDatabaseSchemaComponent.ts","../src/core/typing/entries.ts","../src/core/typing/operations.ts","../src/core/errors/index.ts","../src/core/schema/index.ts","../src/core/database/pongoDb.ts","../src/core/drivers/databaseDriver.ts","../src/core/pongoClient.ts","../src/core/pongoTransaction.ts","../src/core/pongoSession.ts","../src/core/utils/deepEquals.ts","../src/core/utils/mapAsync.ts","../src/core/collection/handle.ts"],"names":["options","schemaComponent","operationResult","runSQLMigrations","pongoClient"],"mappings":"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","file":"/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/chunk-TYTEQJBC.cjs","sourcesContent":[null,"import type { PongoDocument } from '../typing';\nimport type {\n CacheHooks,\n PongoCache,\n PongoDocumentCacheKey,\n} from './pongoCache';\n\nexport const pongoCacheWrapper = (options: {\n provider: PongoCache;\n hooks?: CacheHooks;\n}): PongoCache => {\n const { provider, hooks } = options;\n\n const onError = (error: unknown, operation: string) => {\n hooks?.onError?.(error, operation);\n };\n let isClosed = false;\n\n return {\n cacheType: provider.cacheType,\n async get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): Promise<Doc | null | undefined> {\n try {\n const result = await provider.get<Doc>(key);\n if (result !== undefined) {\n hooks?.onHit?.(key);\n } else {\n hooks?.onMiss?.(key);\n }\n return result;\n } catch (error) {\n onError(error, 'get');\n hooks?.onMiss?.(key);\n return undefined;\n }\n },\n\n async getMany(keys) {\n try {\n return await provider.getMany(keys);\n } catch (error) {\n onError(error, 'getMany');\n return [];\n }\n },\n\n async set(key, value) {\n try {\n await provider.set(key, value);\n } catch (error) {\n onError(error, 'set');\n }\n },\n\n async setMany(entries) {\n try {\n await provider.setMany(entries);\n } catch (error) {\n onError(error, 'setMany');\n }\n },\n\n async update(key, updater) {\n try {\n await provider.update(key, updater);\n } catch (error) {\n onError(error, 'update');\n }\n },\n\n async updateMany(keys, updater) {\n try {\n await provider.updateMany(keys, updater);\n } catch (error) {\n onError(error, 'updateMany');\n }\n },\n\n async delete(key) {\n try {\n await provider.delete(key);\n hooks?.onEvict?.(key);\n } catch (error) {\n onError(error, 'delete');\n }\n },\n\n async deleteMany(keys) {\n try {\n await provider.deleteMany(keys);\n for (const key of keys) hooks?.onEvict?.(key);\n } catch (error) {\n onError(error, 'deleteMany');\n }\n },\n\n clear() {\n return provider.clear();\n },\n\n close() {\n if (isClosed) return;\n\n isClosed = true;\n return provider.close();\n },\n };\n};\n","import type { PongoDocument } from '../../typing';\nimport type { PongoCache, PongoDocumentCacheKey } from '../pongoCache';\n\nexport const identityMapCache = (): PongoCache => {\n const store = new Map<string, PongoDocument | null>();\n\n return {\n cacheType: 'pongo:cache:identity-map',\n get: <Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): Promise<Doc | null | undefined> =>\n Promise.resolve(\n store.has(key) ? (store.get(key) as Doc | null) : undefined,\n ),\n getMany: <Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): (Doc | null | undefined)[] =>\n keys.map((k) =>\n store.has(k) ? (store.get(k) as Doc | null) : undefined,\n ),\n set: (key, value) => {\n store.set(key, value);\n },\n setMany: (entries) => {\n for (const { key, value } of entries) store.set(key, value);\n },\n update: (key, _updater) => {\n // TODO: Implement proper update logic instead of just setting the updater as value\n store.delete(key);\n // const existing = store.get(key);\n // if (!existing) return;\n // const updated = typeof updater === 'function' ? updater(existing) : updater;\n // store.set(key, updated);\n },\n updateMany: (keys, _updater) => {\n // TODO: Implement proper update logic instead of just setting the updater as value\n for (const key of keys) store.delete(key);\n // for (const key of keys) {\n // const existing = store.get(key);\n // if (!existing) continue;\n // const updated = typeof updater === 'function' ? updater(existing) : updater;\n // store.set(key, updated);\n // }\n },\n delete: (key) => {\n store.delete(key);\n },\n deleteMany: (keys) => {\n for (const key of keys) store.delete(key);\n },\n clear: () => {\n store.clear();\n },\n close: () => {\n store.clear();\n },\n };\n};\n","import { LRUCache } from 'lru-cache';\nimport type { MaybePromise, PongoDocument } from '../../typing';\nimport type { PongoCache, PongoDocumentCacheKey } from '../pongoCache';\n\nexport type LRUCacheOptions = Omit<\n LRUCache.Options<string, { doc: PongoDocument | null }, unknown>,\n 'max'\n> & { max?: number };\n\nconst defaultLRUCacheOptions: LRUCache.Options<\n string,\n { doc: PongoDocument | null },\n unknown\n> = {\n max: 1000,\n};\n\nexport const lruCache = (options?: LRUCacheOptions): PongoCache => {\n const cache = new LRUCache<string, { doc: PongoDocument | null }>({\n ...defaultLRUCacheOptions,\n ...options,\n });\n\n return {\n cacheType: 'pongo:cache:lru',\n get: <Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined> => {\n const entry = cache.get(key);\n if (entry === undefined) return undefined;\n return entry.doc as Doc | null;\n },\n getMany: <Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): (Doc | null | undefined)[] =>\n keys.map((k) => {\n const entry = cache.get(k);\n if (entry === undefined) return undefined;\n return entry.doc as Doc | null;\n }),\n set: (key, value) => {\n cache.set(key, { doc: value });\n },\n setMany: (entries) => {\n for (const { key, value } of entries) {\n cache.set(key, { doc: value });\n }\n },\n update: (key, _updater) => {\n cache.delete(key);\n // TODO: Add updater using mingo\n // const existing = cache.get(key);\n // if (existing) {\n // const updated = updater(existing);\n // cache.set(key, updated, opts?.ttl !== undefined ? { ttl: opts.ttl } : undefined);\n // }\n },\n updateMany(keys, _updater) {\n for (const key of keys) {\n cache.delete(key);\n // TODO: Add updater using mingo\n // const existing = cache.get(key);\n // if (existing) {\n // const updated = updater(existing);\n // cache.set(key, updated);\n // }\n }\n },\n delete: (key) => {\n cache.delete(key);\n },\n deleteMany: (keys) => {\n for (const key of keys) cache.delete(key);\n },\n clear: () => {\n cache.clear();\n },\n close: () => {\n cache.clear();\n },\n };\n};\n","import type { PongoCache } from '../pongoCache';\n\nexport const noopCacheProvider: PongoCache = {\n cacheType: 'pongo:cache:no-op',\n get: () => undefined,\n set: () => {},\n update: () => {},\n delete: () => {},\n getMany: (keys) => keys.map(() => undefined),\n setMany: () => {},\n updateMany: () => {},\n deleteMany: () => {},\n clear: () => {},\n close: () => {},\n};\n","import type { MaybePromise, PongoDocument, PongoUpdate } from '../typing';\nimport { pongoCacheWrapper } from './pongoCacheWrapper';\nimport type { LRUCacheOptions } from './providers';\nimport { identityMapCache, lruCache, noopCacheProvider } from './providers';\n\nexport type PongoDocumentCacheKey = `${string}:${string}:${string}`;\n\nexport type PongoCacheSetEntry<Doc extends PongoDocument = PongoDocument> = {\n key: PongoDocumentCacheKey;\n value: Doc | null;\n};\n\nexport type PongoCacheType<T extends string = string> = `pongo:cache:${T}`;\n\nexport interface PongoCache<T extends string = string> {\n cacheType: PongoCacheType<T>;\n get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined>;\n getMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): MaybePromise<(Doc | null | undefined)[]>;\n set<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n value: Doc | null,\n ): MaybePromise<void>;\n setMany(entries: PongoCacheSetEntry[]): MaybePromise<void>;\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n ): MaybePromise<void>;\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n ): MaybePromise<void>;\n delete(key: PongoDocumentCacheKey): MaybePromise<void>;\n deleteMany(keys: PongoDocumentCacheKey[]): MaybePromise<void>;\n clear(): MaybePromise<void>;\n close(): MaybePromise<void>;\n}\n\nexport type CacheHooks = {\n onHit?(key: PongoDocumentCacheKey): void;\n onMiss?(key: PongoDocumentCacheKey): void;\n onEvict?(key: PongoDocumentCacheKey): void;\n onError?(error: unknown, operation: string): void;\n};\n\nexport type CacheType = 'in-memory' | 'identity-map';\n\nexport type CacheSettings =\n | ({\n type: 'in-memory';\n } & LRUCacheOptions)\n | {\n type: 'identity-map';\n };\n\nexport type CacheConfig = CacheSettings | 'disabled';\n\nexport type CacheOptions = {\n skipCache?: boolean;\n};\n\nconst DEFAULT_CONFIG: CacheSettings = { type: 'in-memory' };\n\nexport const pongoCache = (\n options?: CacheConfig | 'disabled' | PongoCache | undefined,\n): PongoCache => {\n if (options === undefined || options === 'disabled') return noopCacheProvider;\n\n if ('cacheType' in options) return options as PongoCache;\n\n const config = options ?? DEFAULT_CONFIG;\n\n if (config.type === 'identity-map') return identityMapCache();\n\n const raw = lruCache(config);\n\n return pongoCacheWrapper({ provider: raw });\n};\n","import type { MaybePromise, PongoUpdate } from '../../typing';\nimport type { PongoDocument } from '../../typing/operations';\nimport type {\n PongoCache,\n PongoCacheSetEntry,\n PongoCacheType,\n PongoDocumentCacheKey,\n} from '../pongoCache';\nimport { identityMapCache } from '../providers';\n\nexport type PongoTransactionCacheOperationOptions = {\n mainCache: PongoCache;\n};\n\ntype CacheOperation =\n | {\n type: 'set';\n key: PongoDocumentCacheKey;\n value: PongoDocument | null;\n mainCache: PongoCache;\n }\n | { type: 'setMany'; entries: PongoCacheSetEntry[]; mainCache: PongoCache }\n | {\n type: 'replaceMany';\n entries: PongoCacheSetEntry[];\n mainCache: PongoCache;\n }\n | {\n type: 'update';\n key: PongoDocumentCacheKey;\n updater: PongoUpdate<PongoDocument>;\n mainCache: PongoCache;\n }\n | {\n type: 'updateMany';\n keys: PongoDocumentCacheKey[];\n updater: PongoUpdate<PongoDocument>;\n mainCache: PongoCache;\n }\n | { type: 'delete'; key: PongoDocumentCacheKey; mainCache: PongoCache }\n | {\n type: 'deleteMany';\n keys: PongoDocumentCacheKey[];\n mainCache: PongoCache;\n };\n\nexport interface PongoTransactionCache<T extends string = string> {\n type: PongoCacheType<T>;\n get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined>;\n set(\n key: PongoDocumentCacheKey,\n value: PongoDocument | null,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n delete(\n key: PongoDocumentCacheKey,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n getMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): MaybePromise<(Doc | null | undefined)[]>;\n setMany(\n entries: PongoCacheSetEntry[],\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n deleteMany(\n keys: PongoDocumentCacheKey[],\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n clear(): MaybePromise<void>;\n commit(): Promise<void>;\n}\n\nexport const pongoTransactionCache = (options?: {\n cache?: PongoCache;\n}): PongoTransactionCache => {\n const innerCache = options?.cache ?? identityMapCache();\n const operations: CacheOperation[] = [];\n\n const cache: PongoTransactionCache = {\n type: 'pongo:cache:transaction-buffer',\n\n get(key: PongoDocumentCacheKey) {\n return innerCache.get(key);\n },\n\n set(\n key: PongoDocumentCacheKey,\n value: PongoDocument,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.set(key, value);\n operations.push({\n type: 'set',\n key,\n value,\n mainCache,\n });\n },\n\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.update(key, updater);\n operations.push({\n type: 'update',\n key,\n updater,\n mainCache,\n });\n },\n\n delete(\n key: PongoDocumentCacheKey,\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.delete(key);\n operations.push({ type: 'delete', key, mainCache: options.mainCache });\n },\n\n getMany(keys: PongoDocumentCacheKey[]) {\n return innerCache.getMany(keys);\n },\n\n setMany(\n entries: PongoCacheSetEntry[],\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.setMany(entries);\n operations.push({\n type: 'setMany',\n entries,\n mainCache: options.mainCache,\n });\n },\n\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.updateMany(keys, updater);\n operations.push({\n type: 'updateMany',\n keys,\n updater,\n mainCache,\n });\n },\n\n deleteMany(\n keys: PongoDocumentCacheKey[],\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.deleteMany(keys);\n operations.push({\n type: 'deleteMany',\n keys,\n mainCache: options.mainCache,\n });\n },\n\n clear() {\n innerCache.clear();\n operations.length = 0;\n },\n\n async commit() {\n for (const op of operations) {\n switch (op.type) {\n case 'set':\n await op.mainCache.set(op.key, op.value);\n break;\n case 'setMany':\n await op.mainCache.setMany(op.entries);\n break;\n case 'update':\n await op.mainCache.update(\n op.key,\n op.updater as unknown as PongoUpdate<PongoDocument>,\n );\n break;\n case 'updateMany':\n await op.mainCache.updateMany(\n op.keys,\n op.updater as unknown as PongoUpdate<PongoDocument>,\n );\n break;\n case 'delete':\n await op.mainCache.delete(op.key);\n break;\n case 'deleteMany':\n await op.mainCache.deleteMany(op.keys);\n break;\n }\n }\n innerCache.clear();\n operations.length = 0;\n },\n };\n\n return cache;\n};\n","import type { SQL } from '@event-driven-io/dumbo';\nimport type { PongoFilter } from '../../typing';\n\nconst asPlainObjectWithSingleKey = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n key: string,\n): Record<string, unknown> | undefined =>\n filter &&\n typeof filter === 'object' &&\n !Array.isArray(filter) &&\n Object.keys(filter).length === 1 &&\n key in filter\n ? filter\n : undefined;\n\nexport const idFromFilter = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n): string | undefined => {\n const idFilter = asPlainObjectWithSingleKey(filter, '_id');\n return typeof idFilter?.['_id'] === 'string' ? idFilter['_id'] : undefined;\n};\n\nexport const getIdsFromIdOnlyFilter = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n): string[] | undefined => {\n const idFilter = asPlainObjectWithSingleKey(filter, '_id');\n if (!idFilter) return undefined;\n\n const idValue = idFilter['_id'];\n if (typeof idValue === 'string') return [idValue];\n\n const $in =\n idValue && typeof idValue === 'object' && '$in' in idValue\n ? idValue['$in']\n : undefined;\n\n return Array.isArray($in) && $in.every((i) => typeof i === 'string')\n ? $in\n : undefined;\n};\n","import type { JSONSerializer, SQL } from '@event-driven-io/dumbo';\nimport {\n mapColumnToBigint,\n mapColumnToJSON,\n runSQLMigrations,\n single,\n type DatabaseDriverType,\n type DatabaseTransaction,\n type Dumbo,\n type MigrationStyle,\n type QueryResult,\n type QueryResultRow,\n type SQLExecutor,\n type SQLQueryResultColumnMapping,\n} from '@event-driven-io/dumbo';\nimport { v7 as uuid } from 'uuid';\nimport type {\n PongoCollectionSchemaComponent,\n PongoDocumentCacheKey,\n WithId,\n} from '..';\nimport {\n getIdsFromIdOnlyFilter,\n idFromFilter,\n operationResult,\n type CollectionOperationOptions,\n type DeleteManyOptions,\n type DeleteOneOptions,\n type FindOptions,\n type InsertManyOptions,\n type InsertOneOptions,\n type OptionalUnlessRequiredIdAndVersion,\n type PongoCollection,\n type PongoDb,\n type PongoDeleteResult,\n type PongoDocument,\n type PongoFilter,\n type PongoInsertManyResult,\n type PongoInsertOneResult,\n type PongoMigrationOptions,\n type PongoReplaceManyResult,\n type PongoUpdate,\n type PongoUpdateManyResult,\n type PongoUpdateResult,\n type ReplaceManyOptions,\n type ReplaceOneOptions,\n type UpdateManyOptions,\n type UpdateOneOptions,\n type WithIdAndVersion,\n type WithoutId,\n} from '..';\nimport { pongoCache, type CacheConfig, type PongoCache } from '../cache';\nimport { DocumentCommandHandler } from './handle';\n\nexport type PongoCollectionOptions<\n T extends PongoDocument = PongoDocument,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Payload extends PongoDocument = T,\n> = {\n db: PongoDb<DriverType>;\n collectionName: string;\n pool: Dumbo<DatabaseDriverType>;\n schemaComponent: PongoCollectionSchemaComponent;\n schema?: {\n autoMigration?: MigrationStyle;\n versioning?: {\n upcast?: (doc: Payload) => T;\n downcast?: (doc: T) => Payload;\n };\n };\n errors?: { throwOnOperationFailures?: boolean };\n serializer: JSONSerializer;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n};\n\nconst enlistIntoTransactionIfActive = async <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>(\n db: PongoDb<DriverType>,\n options: CollectionOperationOptions | undefined,\n): Promise<DatabaseTransaction | null> => {\n const transaction = options?.session?.transaction;\n\n if (!transaction || !transaction.isActive) return null;\n\n return await transaction.enlistDatabase(db);\n};\n\nexport const transactionExecutorOrDefault = async <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>(\n db: PongoDb<DriverType>,\n options: CollectionOperationOptions | undefined,\n defaultSqlExecutor: SQLExecutor,\n): Promise<SQLExecutor> => {\n const existingTransaction = await enlistIntoTransactionIfActive(db, options);\n return existingTransaction?.execute ?? defaultSqlExecutor;\n};\n\nexport const pongoCollection = <\n T extends PongoDocument,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Payload extends PongoDocument = T,\n>({\n db,\n collectionName,\n pool,\n schemaComponent,\n schema,\n errors,\n serializer,\n cache: cacheOptions,\n}: PongoCollectionOptions<T, DriverType, Payload>): PongoCollection<T> => {\n const SqlFor = schemaComponent.sqlBuilder;\n const sqlExecutor = pool.execute;\n\n const cache = pongoCache(cacheOptions);\n\n const columnMapping = {\n mapping: {\n ...mapColumnToJSON('data', serializer),\n ...mapColumnToBigint('_version'),\n } satisfies SQLQueryResultColumnMapping,\n };\n\n const command = async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ) =>\n (\n await transactionExecutorOrDefault(db, options, sqlExecutor)\n ).command<Result>(sql, columnMapping);\n\n const query = async <T extends QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ) =>\n (await transactionExecutorOrDefault(db, options, sqlExecutor)).query<T>(\n sql,\n columnMapping,\n );\n\n let shouldMigrate = schema?.autoMigration !== 'None';\n\n const createCollection = (options?: CollectionOperationOptions) => {\n shouldMigrate = false;\n\n if (options?.session) return command(SqlFor.createCollection(), options);\n else return command(SqlFor.createCollection());\n };\n\n const ensureCollectionCreated = (options?: CollectionOperationOptions) => {\n if (!shouldMigrate) {\n return Promise.resolve();\n }\n\n return createCollection(options);\n };\n\n const upcast =\n schema?.versioning?.upcast ?? ((doc: Payload) => doc as unknown as T);\n\n const downcast =\n schema?.versioning?.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n const rowToDoc = (row: { data: T; _version: bigint }): WithIdAndVersion<T> =>\n upcast({\n ...row.data,\n _version: row._version,\n } as unknown as Payload) as WithIdAndVersion<T>;\n\n const findOneFromDb = async (\n filter: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n const result = await query<{ data: T; _version: bigint }>(\n SqlFor.findOne(filter),\n options,\n );\n const row = result.rows[0];\n return row ? rowToDoc(row) : null;\n };\n\n const cacheKey = (id: string): PongoDocumentCacheKey =>\n `${db.databaseName}:${collectionName}:${id}`;\n\n const txCacheFor = (options: CollectionOperationOptions | undefined) =>\n options?.session?.transaction?.cache ?? null;\n\n const resolveFromCache = async (\n key: PongoDocumentCacheKey,\n options: CollectionOperationOptions | undefined,\n ): Promise<T | null | undefined> => {\n const txCache = txCacheFor(options);\n if (txCache) {\n const cached = await txCache.get<T>(key);\n if (cached !== undefined) return cached;\n }\n return cache.get<T>(key);\n };\n\n const findManyFromCache = async (\n keys: PongoDocumentCacheKey[],\n options: CollectionOperationOptions | undefined,\n ): Promise<(T | null | undefined)[]> => {\n const txCache = txCacheFor(options);\n\n if (!txCache) {\n return cache.getMany<T>(keys);\n }\n\n const txResults = await txCache.getMany<T>(keys);\n const mainResults = await cache.getMany<T>(keys);\n return keys.map((_, i) =>\n txResults[i] !== undefined ? txResults[i] : mainResults[i],\n );\n };\n\n const fetchByIds = async (\n ids: string[],\n options: CollectionOperationOptions | undefined,\n ): Promise<(WithIdAndVersion<T> | null)[]> => {\n const cachedResults = await findManyFromCache(ids.map(cacheKey), options);\n\n const missIds = ids.filter((_, i) => cachedResults[i] === undefined);\n\n let dbDocsById = new Map<string, WithIdAndVersion<T>>();\n if (missIds.length > 0) {\n const dbResult = await query<{ data: T; _version: bigint }>(\n SqlFor.find(\n { _id: { $in: missIds } } as unknown as PongoFilter<T>,\n options,\n ),\n );\n const dbDocs = dbResult.rows.map(rowToDoc);\n dbDocsById = new Map(\n dbDocs.map((d) => [(d as PongoDocument)['_id'] as string, d]),\n );\n const leftovers = missIds.map(\n (id) => [id, dbDocsById.get(id) ?? null] as const,\n );\n await cacheSetMany(\n leftovers.map((d) => d[1]).filter((d) => d !== null),\n options,\n );\n await cacheDeleteMany(\n leftovers.filter(([, doc]) => doc === null).map(([id]) => id),\n options,\n );\n }\n\n return ids.map((id, i) => {\n const cached = cachedResults[i];\n if (cached !== undefined) {\n return cached !== null\n ? (upcast({ ...cached } as unknown as Payload) as WithIdAndVersion<T>)\n : null;\n }\n return dbDocsById.get(id) ?? null;\n });\n };\n\n const findManyByIds = async (\n ids: string[],\n options: FindOptions | undefined,\n ): Promise<WithIdAndVersion<T>[]> => {\n const results = await fetchByIds(ids, options);\n return results.filter((doc): doc is WithIdAndVersion<T> => doc !== null);\n };\n\n const cacheSet = (\n value: WithId<T>,\n options: CollectionOperationOptions | undefined,\n ) => {\n const key = cacheKey(value._id);\n const txCache = txCacheFor(options);\n\n if (txCache) return txCache.set(key, value, { mainCache: cache });\n\n return cache.set(key, value);\n };\n\n const cacheSetMany = (\n documents: WithId<T>[],\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const entries = documents.map((d) => ({ key: cacheKey(d._id), value: d }));\n\n if (txCache) return txCache.setMany(entries, { mainCache: cache });\n return cache.setMany(entries);\n };\n\n const cacheDelete = (\n id: string,\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const key = cacheKey(id);\n\n if (txCache) return txCache.delete(key, { mainCache: cache });\n return cache.delete(key);\n };\n\n const cacheDeleteMany = (\n ids: string[],\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const keys = ids.map(cacheKey);\n\n if (txCache) return txCache.deleteMany(keys, { mainCache: cache });\n return cache.deleteMany(keys);\n };\n\n const deleteManyByIds = async (\n ids: Array<{ _id: string; _version?: bigint }>,\n options?: CollectionOperationOptions,\n ): Promise<PongoDeleteResult & { deletedIds: Set<string> }> => {\n await ensureCollectionCreated(options);\n\n const result = await command<{ _id: string; deleted?: number }>(\n SqlFor.deleteManyByIds(ids),\n options,\n );\n\n const deletedIds = new Set(\n result.rows.filter((row) => (row.deleted ?? 1) > 0).map((row) => row._id),\n );\n\n if (!options?.skipCache) {\n await cacheDeleteMany([...deletedIds], options);\n }\n\n return operationResult<PongoDeleteResult & { deletedIds: Set<string> }>(\n {\n successful: deletedIds.size > 0,\n deletedCount: deletedIds.size,\n matchedCount: ids.length,\n deletedIds,\n },\n {\n operationName: 'deleteManyByIds',\n collectionName,\n serializer,\n errors,\n },\n );\n };\n\n const collection: PongoCollection<T> = {\n dbName: db.databaseName,\n collectionName,\n createCollection: async (options?: CollectionOperationOptions) => {\n await createCollection(options);\n },\n insertOne: async (\n document: OptionalUnlessRequiredIdAndVersion<T>,\n options?: InsertOneOptions,\n ): Promise<PongoInsertOneResult> => {\n await ensureCollectionCreated(options);\n\n const _id = (document._id as string | undefined | null) ?? uuid();\n const _version = document._version ?? 1n;\n const downcasted = downcast(document as T);\n\n const result = await command(\n SqlFor.insertOne({\n ...downcasted,\n _id,\n _version,\n } as unknown as OptionalUnlessRequiredIdAndVersion<Payload>),\n options,\n );\n\n const successful = (result.rowCount ?? 0) > 0;\n\n if (successful && !options?.skipCache) {\n const doc = { ...document, _id, _version } as WithId<T>;\n await cacheSet(doc, options);\n }\n\n return operationResult<PongoInsertOneResult>(\n {\n successful,\n insertedId: successful ? _id : null,\n nextExpectedVersion: _version,\n },\n { operationName: 'insertOne', collectionName, serializer, errors },\n );\n },\n insertMany: async (\n documents: OptionalUnlessRequiredIdAndVersion<T>[],\n options?: InsertManyOptions,\n ): Promise<PongoInsertManyResult> => {\n await ensureCollectionCreated(options);\n\n const documentsWithMetadata = documents.map((doc) =>\n doc._id && doc._version\n ? (doc as WithIdAndVersion<T>)\n : ({\n ...doc,\n _id: doc._id ?? uuid(),\n _version: doc._version ?? 1n,\n } as WithIdAndVersion<T>),\n );\n\n const rows = documentsWithMetadata.map((d) => ({\n ...downcast(d as T),\n _id: d._id,\n _version: d._version,\n }));\n\n const result = await command(\n SqlFor.insertMany(\n rows as unknown as OptionalUnlessRequiredIdAndVersion<Payload>[],\n ),\n options,\n );\n\n if (!options?.skipCache) {\n const insertedIdSet = new Set(result.rows.map((d) => d._id as string));\n await cacheSetMany(\n documentsWithMetadata.filter((d) => insertedIdSet.has(d._id)),\n options,\n );\n }\n\n return operationResult<PongoInsertManyResult>(\n {\n successful: result.rowCount === rows.length,\n insertedCount: result.rowCount ?? 0,\n insertedIds: result.rows.map((d) => d._id as string),\n },\n { operationName: 'insertMany', collectionName, serializer, errors },\n );\n },\n updateOne: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateOneOptions,\n ): Promise<PongoUpdateResult> => {\n await ensureCollectionCreated(options);\n\n const result = await command<UpdateSqlResult>(\n SqlFor.updateOne(filter, update, options),\n options,\n );\n\n const opResult = operationResult<PongoUpdateResult>(\n {\n successful:\n result.rows.length > 0 &&\n result.rows[0]!.modified === result.rows[0]!.matched,\n modifiedCount: Number(result.rows[0]?.modified ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n nextExpectedVersion: BigInt(result.rows[0]?.version ?? 0n),\n },\n { operationName: 'updateOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache) {\n const id = idFromFilter(filter);\n if (id) await cacheDelete(id, options);\n }\n\n return opResult;\n },\n replaceOne: async (\n filter: PongoFilter<T>,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<PongoUpdateResult> => {\n await ensureCollectionCreated(options);\n\n const downcasted = downcast(document as T) as unknown as WithoutId<T>;\n\n const result = await command<UpdateSqlResult>(\n SqlFor.replaceOne(filter, downcasted, options),\n options,\n );\n\n const opResult = operationResult<PongoUpdateResult>(\n {\n successful: result.rows.length > 0 && result.rows[0]!.modified > 0,\n modifiedCount: Number(result.rows[0]?.modified ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n nextExpectedVersion: BigInt(result.rows[0]?.version ?? 0n),\n },\n { operationName: 'replaceOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache) {\n const _id = idFromFilter(filter);\n if (_id) {\n await cacheSet(\n {\n ...document,\n _id,\n _version: opResult.nextExpectedVersion,\n } as unknown as WithId<T>,\n options,\n );\n }\n }\n\n return opResult;\n },\n updateMany: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateManyOptions,\n ): Promise<PongoUpdateManyResult> => {\n await ensureCollectionCreated(options);\n\n // TODO: add a similar filter checking if filter is not ids only\n const result = await command(SqlFor.updateMany(filter, update), options);\n\n return operationResult<PongoUpdateManyResult>(\n {\n successful: true,\n modifiedCount: result.rowCount ?? 0,\n matchedCount: result.rowCount ?? 0,\n },\n { operationName: 'updateMany', collectionName, serializer, errors },\n );\n },\n deleteOne: async (\n filter?: PongoFilter<T>,\n options?: DeleteOneOptions,\n ): Promise<PongoDeleteResult> => {\n await ensureCollectionCreated(options);\n\n const result = await command<DeleteSqlResult>(\n SqlFor.deleteOne(filter ?? {}, options),\n options,\n );\n\n const opResult = operationResult<PongoDeleteResult>(\n {\n successful: result.rows.length > 0 && result.rows[0]!.deleted! > 0,\n deletedCount: Number(result.rows[0]?.deleted ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n },\n { operationName: 'deleteOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache && filter) {\n const id = idFromFilter(filter);\n if (id) await cacheDelete(id, options);\n }\n\n return opResult;\n },\n deleteMany: async (\n filter?: PongoFilter<T>,\n options?: DeleteManyOptions,\n ): Promise<PongoDeleteResult> => {\n const ids = filter ? getIdsFromIdOnlyFilter(filter) : null;\n if (ids)\n return deleteManyByIds(\n ids.map((id) => ({ _id: id })),\n options,\n );\n\n await ensureCollectionCreated(options);\n\n const result = await command(SqlFor.deleteMany(filter ?? {}), options);\n\n return operationResult<PongoDeleteResult>(\n {\n successful: (result.rowCount ?? 0) > 0,\n deletedCount: result.rowCount ?? 0,\n matchedCount: result.rowCount ?? 0,\n },\n { operationName: 'deleteMany', collectionName, serializer, errors },\n );\n },\n findOne: async (\n filter?: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const id = filter && !options?.skipCache ? idFromFilter(filter) : null;\n\n if (id) {\n const cached = await resolveFromCache(cacheKey(id), options);\n if (cached !== undefined)\n return cached !== null\n ? (upcast({\n ...cached,\n } as unknown as Payload) as WithIdAndVersion<T>)\n : null;\n\n const doc = await findOneFromDb(filter!, options);\n if (doc) await cacheSet(doc, options);\n else await cacheDelete(id, options);\n return doc;\n }\n\n return findOneFromDb(filter ?? {}, options);\n },\n findOneAndDelete: async (\n filter: PongoFilter<T>,\n options?: DeleteOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.deleteOne(filter, options);\n return existingDoc;\n },\n findOneAndReplace: async (\n filter: PongoFilter<T>,\n replacement: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.replaceOne(filter, replacement, options);\n return existingDoc;\n },\n findOneAndUpdate: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.updateOne(filter, update, options);\n return existingDoc;\n },\n replaceMany: async (\n documents: Array<WithIdAndVersion<T> | WithId<T>>,\n options?: ReplaceManyOptions,\n ): Promise<PongoReplaceManyResult> => {\n await ensureCollectionCreated(options);\n\n const downcasted = documents.map(\n (d) => downcast(d as T) as WithIdAndVersion<T>,\n );\n\n const result = await command<{\n _id: string;\n version?: bigint | string | number;\n }>(SqlFor.replaceMany(downcasted), options);\n\n const modifiedIds = result.rows.map((row) => row._id);\n const conflictIds = documents\n .map((d) => d._id)\n .filter((id) => !modifiedIds.includes(id));\n const versions = new Map<string, bigint>(\n result.rows.map((row) => [row._id, BigInt(row.version ?? 1n)]),\n );\n\n if (!options?.skipCache) {\n const cacheEntries = documents\n .filter((d) => modifiedIds.includes(d._id))\n .map((doc) =>\n doc._version\n ? doc\n : {\n ...doc,\n _version: versions.get(doc._id) ?? 1n,\n },\n );\n if (cacheEntries.length > 0) await cacheSetMany(cacheEntries, options);\n\n if (conflictIds.length > 0)\n await cacheDeleteMany([...conflictIds], options);\n }\n\n return operationResult<PongoReplaceManyResult>(\n {\n successful: modifiedIds.length > 0 && conflictIds.length === 0,\n modifiedCount: modifiedIds.length,\n matchedCount: documents.length,\n modifiedIds: [...modifiedIds],\n conflictIds: [...conflictIds],\n nextExpectedVersions: versions,\n },\n { operationName: 'replaceMany', collectionName, serializer, errors },\n );\n },\n handle: DocumentCommandHandler<T>({\n collectionName,\n serializer,\n errors,\n storage: {\n ensureCollectionCreated,\n fetchByIds,\n insertMany: (docs, options) => collection.insertMany(docs, options),\n replaceMany: (docs, options) => collection.replaceMany(docs, options),\n deleteManyByIds,\n },\n }),\n find: async (\n filter?: PongoFilter<T>,\n options?: FindOptions,\n ): Promise<WithIdAndVersion<T>[]> => {\n await ensureCollectionCreated(options);\n\n if (!options?.skipCache && filter) {\n const ids = getIdsFromIdOnlyFilter(filter);\n if (ids && ids.length > 0) return findManyByIds(ids, options);\n }\n\n const result = await query<{ data: T; _version: bigint }>(\n SqlFor.find(filter ?? {}, options),\n );\n return result.rows.map(rowToDoc);\n },\n countDocuments: async (\n filter?: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<number> => {\n await ensureCollectionCreated(options);\n\n const { count } = await single(\n query<{ count: number }>(SqlFor.countDocuments(filter ?? {})),\n );\n return count;\n },\n drop: async (options?: CollectionOperationOptions): Promise<boolean> => {\n await ensureCollectionCreated(options);\n const result = await command(SqlFor.drop());\n return (result?.rowCount ?? 0) > 0;\n },\n rename: async (\n newName: string,\n options?: CollectionOperationOptions,\n ): Promise<PongoCollection<T>> => {\n await ensureCollectionCreated(options);\n await command(SqlFor.rename(newName));\n collectionName = newName;\n return collection as unknown as PongoCollection<T>;\n },\n close: () => cache.close(),\n\n sql: {\n async query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<Result[]> {\n await ensureCollectionCreated(options);\n\n const result = await query<Result>(sql, options);\n return result.rows;\n },\n async command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<QueryResult<Result>> {\n await ensureCollectionCreated(options);\n\n return command(sql, options);\n },\n },\n schema: {\n component: schemaComponent,\n migrate: (options?: PongoMigrationOptions) =>\n runSQLMigrations(pool, schemaComponent.migrations, options),\n },\n };\n\n return collection as unknown as PongoCollection<T>;\n};\n\ntype UpdateSqlResult = {\n matched: bigint;\n modified: bigint;\n version: bigint;\n};\n\ntype DeleteSqlResult = {\n matched: bigint | null;\n deleted: bigint | null;\n};\n","import {\n schemaComponent,\n type DatabaseDriverType,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '@event-driven-io/dumbo';\nimport type { PongoCollectionSchema, PongoCollectionSQLBuilder } from '..';\n\nexport type PongoCollectionURNType = 'sc:pongo:collection';\nexport type PongoCollectionURN = `${PongoCollectionURNType}:${string}`;\n\nexport type PongoCollectionSchemaComponent =\n SchemaComponent<PongoCollectionURN> & {\n collectionName: string;\n definition: PongoCollectionSchema;\n sqlBuilder: PongoCollectionSQLBuilder;\n };\n\nexport type PongoCollectionSchemaComponentOptions<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = Readonly<{\n driverType: DriverType;\n definition: PongoCollectionSchema;\n migrationsOrSchemaComponents: SchemaComponentOptions;\n sqlBuilder: PongoCollectionSQLBuilder;\n}>;\n\nexport const PongoCollectionSchemaComponent = <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>({\n definition,\n migrationsOrSchemaComponents,\n sqlBuilder,\n}: PongoCollectionSchemaComponentOptions<DriverType>): PongoCollectionSchemaComponent =>\n ({\n ...schemaComponent(\n `sc:pongo:collection:${definition.name}`,\n migrationsOrSchemaComponents,\n ),\n sqlBuilder,\n definition,\n collectionName: definition.name,\n }) as PongoCollectionSchemaComponent;\n","export const QueryOperators = {\n $eq: '$eq',\n $gt: '$gt',\n $gte: '$gte',\n $lt: '$lt',\n $lte: '$lte',\n $ne: '$ne',\n $in: '$in',\n $nin: '$nin',\n $elemMatch: '$elemMatch',\n $all: '$all',\n $size: '$size',\n};\n\nexport const OperatorMap = {\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n $ne: '!=',\n};\n\nexport const isOperator = (key: string) => key.startsWith('$');\n\nexport const hasOperators = (value: Record<string, unknown>) =>\n Object.keys(value).some(isOperator);\n","import {\n getDatabaseMetadata,\n type DatabaseDriverType,\n type JSONSerializationOptions,\n type MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport type { PongoDatabaseFactoryOptions, PongoDriver } from '../drivers';\nimport type { PongoClientSchema, PongoCollectionSchema } from '../schema';\nimport type { PongoDb } from '../typing';\n\nexport const PongoDatabaseCache = <\n Database extends PongoDb<DatabaseDriverType> = PongoDb<DatabaseDriverType>,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n>({\n driver,\n typedSchema,\n}: {\n driver: PongoDriver<Database>;\n typedSchema?: TypedClientSchema | undefined;\n}) => {\n const dbClients = new Map<string, PongoDb>();\n\n const getDatabaseDefinition = (dbName: string | undefined) =>\n Object.values(typedSchema?.dbs ?? {}).find((d) => d.name === dbName);\n\n return {\n getOrCreate: <\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n >(\n createOptions: Omit<\n PongoDatabaseFactoryOptions<CollectionsSchema>,\n 'schema'\n > &\n JSONSerializationOptions & {\n schema?: {\n autoMigration?: MigrationStyle;\n };\n },\n ): Database => {\n const metadata = getDatabaseMetadata(driver.driverType);\n const dbName =\n createOptions.databaseName ??\n metadata?.parseDatabaseName?.(\n 'connectionString' in createOptions\n ? (createOptions.connectionString as string)\n : undefined,\n ) ??\n 'db:default';\n\n const existing = dbClients.get(dbName);\n if (existing) return existing as Database;\n\n const definition = getDatabaseDefinition(createOptions.databaseName);\n\n const newDb: Database = driver.databaseFactory({\n ...createOptions,\n databaseName: dbName,\n schema: {\n ...createOptions.schema,\n ...(definition ? { definition } : {}),\n },\n });\n dbClients.set(dbName, newDb);\n return newDb as unknown as Database;\n },\n\n all: (): Database[] => Array.from(dbClients.values()) as Database[],\n\n forAll: (func: (db: Database) => Promise<void>): Promise<void[]> => {\n return Promise.all(\n Array.from(dbClients.values())\n .map((v) => v as Database)\n .map(func),\n );\n },\n };\n};\n","import {\n schemaComponent,\n type DatabaseDriverType,\n type SchemaComponent,\n} from '@event-driven-io/dumbo';\nimport type { PongoCollectionSchemaComponent } from '../collection';\nimport type { PongoCollectionSQLBuilder } from '../collection';\nimport {\n pongoSchema,\n type PongoCollectionSchema,\n type PongoDbSchema,\n} from '../schema';\nimport type { PongoDocument } from '../typing';\n\nexport type PongoDatabaseURNType = 'sc:dumbo:database';\nexport type PongoDatabaseURN = `${PongoDatabaseURNType}:${string}`;\n\nexport type PongoDatabaseSchemaComponent<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = SchemaComponent<PongoDatabaseURN> & {\n definition: PongoDbSchema<T>;\n collections: ReadonlyArray<PongoCollectionSchemaComponent>;\n\n collection: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => PongoCollectionSchemaComponent;\n};\n\nexport type PongoDatabaseSchemaComponentOptions<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = Readonly<{\n driverType: DriverType;\n definition: PongoDbSchema<T>;\n collectionFactory: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => PongoCollectionSchemaComponent;\n}>;\n\nexport const PongoDatabaseSchemaComponent = <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>({\n definition,\n collectionFactory,\n}: PongoDatabaseSchemaComponentOptions<DriverType>): PongoDatabaseSchemaComponent => {\n const collections: PongoCollectionSchemaComponent[] =\n Object.values(definition.collections).map(collectionFactory) ?? [];\n\n return {\n ...schemaComponent(`sc:dumbo:database:${definition.name}`, {\n components: collections,\n }),\n definition,\n collections,\n\n collection: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => {\n const existing = collections.find(\n (c) => c.collectionName === schema.name,\n );\n\n if (existing) return existing;\n\n const newCollection = collectionFactory(\n pongoSchema.collection(schema.name),\n );\n collections.push(newCollection);\n definition.collections[schema.name] = schema;\n return newCollection;\n },\n };\n};\n\nexport type PongoDatabaseSQLBuilder<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = {\n driverType: DriverType;\n collection: PongoCollectionSQLBuilder;\n};\n","type Entry<T> = {\n [K in keyof Required<T>]: [K, Required<T>[K]];\n}[keyof Required<T>];\n\ntype IterableEntry<T> = Entry<T> & {\n [Symbol.iterator](): Iterator<Entry<T>>;\n};\n\nexport const objectEntries = <T extends object>(obj: T): IterableEntry<T>[] =>\n Object.entries(obj).map(([key, value]) => [key as keyof T, value]);\n\nexport type NonPartial<T> = { [K in keyof Required<T>]: T[K] };\n","import type {\n AnyConnection,\n DatabaseDriverType,\n DatabaseTransaction,\n JSONSerializationOptions,\n JSONSerializer,\n MigrationStyle,\n QueryResult,\n QueryResultRow,\n RunSQLMigrationsResult,\n SQL,\n SQLCommandOptions,\n SQLExecutor,\n SQLQueryOptions,\n WithDatabaseTransactionFactory,\n} from '@event-driven-io/dumbo';\nimport { v7 as uuid } from 'uuid';\nimport type { MaybePromise } from '.';\nimport type { CacheConfig, PongoCache, PongoTransactionCache } from '../cache';\nimport type {\n DocumentCommandHandlerInput,\n PongoCollectionSchemaComponent,\n} from '../collection';\nimport type { PongoDatabaseSchemaComponent } from '../database/pongoDatabaseSchemaComponent';\nimport type { AnyPongoDriver, ExtractPongoDriverOptions } from '../drivers';\nimport { ConcurrencyError } from '../errors';\nimport type { PongoClientSchema } from '../schema';\n\nexport interface PongoClient<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> {\n driverType: DriverType;\n\n connect(): Promise<this>;\n\n close(): Promise<void>;\n\n db(dbName?: string, options?: PongoDbOptions): Database;\n\n startSession(): PongoSession<DriverType>;\n\n withSession<T = unknown>(\n callback: (session: PongoSession<DriverType>) => Promise<T>,\n ): Promise<T>;\n}\n\nexport type PongoClientOptions<\n DatabaseDriver extends AnyPongoDriver = AnyPongoDriver,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n> =\n ExtractPongoDriverOptions<DatabaseDriver> extends infer Options\n ? Options extends unknown\n ? {\n driver: DatabaseDriver;\n schema?:\n | { autoMigration?: MigrationStyle; definition?: TypedClientSchema }\n | undefined;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | PongoCache | undefined;\n } & JSONSerializationOptions &\n Omit<Options, 'driver'>\n : never\n : never;\n\nexport declare interface PongoTransactionOptions {\n get snapshotEnabled(): boolean;\n maxCommitTimeMS?: number;\n}\n\nexport interface PongoDbTransaction<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> {\n get databaseName(): string | null;\n options: PongoTransactionOptions;\n enlistDatabase: (\n database: Database,\n ) => Promise<DatabaseTransaction<AnyConnection>>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n get cache(): PongoTransactionCache | null;\n get sqlExecutor(): SQLExecutor;\n get isStarting(): boolean;\n get isActive(): boolean;\n get isCommitted(): boolean;\n}\n\nexport interface PongoSession<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> {\n hasEnded: boolean;\n explicit: boolean;\n defaultTransactionOptions: PongoTransactionOptions;\n transaction: PongoDbTransaction<DriverType> | null;\n get snapshotEnabled(): boolean;\n\n endSession(): Promise<void>;\n incrementTransactionNumber(): void;\n inTransaction(): boolean;\n startTransaction(options?: PongoTransactionOptions): void;\n commitTransaction(): Promise<void>;\n abortTransaction(): Promise<void>;\n withTransaction<T = unknown>(\n fn: (session: PongoSession<DriverType>) => Promise<T>,\n options?: PongoTransactionOptions,\n ): Promise<T>;\n}\n\nexport type PongoDBCollectionOptions<\n T extends PongoDocument,\n Payload extends PongoDocument = T,\n> = {\n schema?: {\n versioning?: {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n };\n };\n errors?: { throwOnOperationFailures?: boolean };\n cache?: CacheConfig | 'disabled' | PongoCache;\n};\n\nexport type PongoDbOptions = {\n cache?: CacheConfig | PongoCache;\n};\n\nexport interface PongoDb<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> extends WithDatabaseTransactionFactory<AnyConnection> {\n driverType: DriverType;\n databaseName: string;\n connect(): Promise<void>;\n close(): Promise<void>;\n collection<T extends PongoDocument, Payload extends PongoDocument = T>(\n name: string,\n options?: PongoDBCollectionOptions<T, Payload>,\n ): PongoCollection<T>;\n collections(): ReadonlyArray<PongoCollection<PongoDocument>>;\n readonly schema: Readonly<{\n component: PongoDatabaseSchemaComponent<DriverType>;\n migrate(options?: PongoMigrationOptions): Promise<RunSQLMigrationsResult>;\n }>;\n sql: {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ): Promise<Result[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n };\n}\n\nexport type AnyPongoDb = PongoDb<DatabaseDriverType>;\n\nexport type PongoMigrationOptions = {\n dryRun?: boolean | undefined;\n ignoreMigrationHashMismatch?: boolean | undefined;\n migrationTimeoutMs?: number | undefined;\n};\n\nexport type CollectionOperationOptions = {\n session?: PongoSession;\n skipCache?: boolean;\n};\n\nexport type InsertOneOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type InsertManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type UpdateOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type UpdateManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type HandleOptions = CollectionOperationOptions;\n\nexport type BatchHandleOptions = {\n parallel?: boolean;\n} & CollectionOperationOptions;\n\nexport type ReplaceOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type DeleteOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type ReplaceManyOptions = CollectionOperationOptions;\n\nexport type DeleteManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type FindOptions = {\n limit?: number;\n skip?: number;\n} & CollectionOperationOptions;\n\nexport interface PongoCollection<T extends PongoDocument> {\n readonly dbName: string;\n readonly collectionName: string;\n createCollection(options?: CollectionOperationOptions): Promise<void>;\n insertOne(\n document: OptionalUnlessRequiredId<T>,\n options?: InsertOneOptions,\n ): Promise<PongoInsertOneResult>;\n insertMany(\n documents: OptionalUnlessRequiredId<T>[],\n options?: CollectionOperationOptions,\n ): Promise<PongoInsertManyResult>;\n updateOne(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): Promise<PongoUpdateResult>;\n replaceOne(\n filter: PongoFilter<T> | SQL,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<PongoUpdateResult>;\n updateMany(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateManyOptions,\n ): Promise<PongoUpdateManyResult>;\n deleteOne(\n filter?: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): Promise<PongoDeleteResult>;\n deleteMany(\n filter?: PongoFilter<T> | SQL,\n options?: DeleteManyOptions,\n ): Promise<PongoDeleteResult>;\n findOne(\n filter?: PongoFilter<T> | SQL,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n find(\n filter?: PongoFilter<T> | SQL,\n options?: FindOptions,\n ): Promise<WithIdAndVersion<T>[]>;\n findOneAndDelete(\n filter: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n findOneAndReplace(\n filter: PongoFilter<T> | SQL,\n replacement: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n findOneAndUpdate(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n countDocuments(\n filter?: PongoFilter<T> | SQL,\n options?: CollectionOperationOptions,\n ): Promise<number>;\n drop(options?: CollectionOperationOptions): Promise<boolean>;\n rename(\n newName: string,\n options?: CollectionOperationOptions,\n ): Promise<PongoCollection<T>>;\n handle(\n id: string | DocumentCommandHandlerInput,\n handle: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>>;\n handle(\n id: string[] | DocumentCommandHandlerInput[],\n handle: DocumentHandler<T>,\n options?: BatchHandleOptions,\n ): Promise<PongoHandleResult<T>[]>;\n replaceMany(\n documents: Array<WithId<T> | WithIdAndVersion<T>>,\n options?: ReplaceManyOptions,\n ): Promise<PongoReplaceManyResult>;\n readonly schema: Readonly<{\n component: PongoCollectionSchemaComponent;\n migrate(options?: PongoMigrationOptions): Promise<RunSQLMigrationsResult>;\n }>;\n close: () => MaybePromise<void>;\n sql: {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<Result[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<QueryResult<Result>>;\n };\n}\n\nexport type ObjectId = string & { __brandId: 'ObjectId' };\nexport const ObjectId = (value?: string) => value ?? uuid();\n\nexport type HasId = { _id: string };\n\nexport declare type InferIdType<TSchema> = TSchema extends {\n _id: infer IdType;\n}\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<any, never> extends IdType\n ? never\n : IdType\n : TSchema extends {\n _id?: infer IdType;\n }\n ? unknown extends IdType\n ? ObjectId\n : IdType\n : ObjectId;\n\n/** TypeScript Omit (Exclude to be specific) does not work for objects with an \"any\" indexed type, and breaks discriminated unions @public */\nexport declare type EnhancedOmit<TRecordOrUnion, KeyUnion> =\n string extends keyof TRecordOrUnion\n ? TRecordOrUnion\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TRecordOrUnion extends any\n ? Pick<TRecordOrUnion, Exclude<keyof TRecordOrUnion, KeyUnion>>\n : never;\n\nexport declare type OptionalUnlessRequiredId<TSchema> = TSchema extends {\n _id: string | ObjectId;\n}\n ? TSchema\n : OptionalId<TSchema>;\n\nexport declare type OptionalUnlessRequiredVersion<TSchema> = TSchema extends {\n _version: bigint;\n}\n ? TSchema\n : OptionalVersion<TSchema>;\n\nexport declare type OptionalUnlessRequiredIdAndVersion<TSchema> =\n OptionalUnlessRequiredId<TSchema> & OptionalUnlessRequiredVersion<TSchema>;\n\nexport declare type WithId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id: string | ObjectId;\n};\nexport type WithoutId<T> = Omit<T, '_id'>;\n\nexport declare type WithVersion<TSchema> = EnhancedOmit<TSchema, '_version'> & {\n _version: bigint;\n};\nexport type WithoutVersion<T> = Omit<T, '_version'>;\n\nexport type WithIdAndVersion<T> = WithId<T> & WithVersion<T>;\nexport type WithoutIdAndVersion<T> = WithoutId<WithoutVersion<T>>;\n\n/** @public */\nexport declare type RegExpOrString<T> = T extends string ? RegExp | T : T;\n\nexport declare interface Document {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport declare type OptionalId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id?: string | ObjectId;\n};\nexport declare type OptionalVersion<TSchema> = EnhancedOmit<\n TSchema,\n '_version'\n> & {\n _version?: bigint;\n};\n\nexport declare interface ObjectIdLike {\n __id?: string | ObjectId;\n}\n\nexport declare type NonObjectIdLikeDocument = {\n [key in keyof ObjectIdLike]?: never;\n} & Document;\n\nexport declare type AlternativeType<T> =\n T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\n\nexport declare type Condition<T> =\n | AlternativeType<T>\n | PongoFilterOperator<AlternativeType<T>>;\n\nexport declare type PongoFilter<TSchema> =\n | {\n [P in keyof WithId<TSchema>]?: Condition<WithId<TSchema>[P]>;\n }\n | HasId; // TODO: & RootFilterOperators<WithId<TSchema>>;\n\nexport declare interface RootFilterOperators<TSchema> extends Document {\n $and?: PongoFilter<TSchema>[];\n $nor?: PongoFilter<TSchema>[];\n $or?: PongoFilter<TSchema>[];\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: TSchema) => boolean);\n $comment?: string | Document;\n}\n\nexport declare interface PongoFilterOperator<\n TValue,\n> extends NonObjectIdLikeDocument {\n $eq?: TValue;\n $gt?: TValue;\n $gte?: TValue;\n $lt?: TValue;\n $lte?: TValue;\n $ne?: TValue;\n $in?: TValue[];\n $nin?: TValue[];\n // $eq?: TValue;\n // $gt?: TValue;\n // $gte?: TValue;\n // $in?: ReadonlyArray<TValue>;\n // $lt?: TValue;\n // $lte?: TValue;\n // $ne?: TValue;\n // $nin?: ReadonlyArray<TValue>;\n // $not?: TValue extends string ? FilterOperators<TValue> | RegExp : FilterOperators<TValue>;\n // /**\n // * When `true`, `$exists` matches the documents that contain the field,\n // * including documents where the field value is null.\n // */\n // $exists?: boolean;\n // $type?: BSONType | BSONTypeAlias;\n // $expr?: Record<string, any>;\n // $jsonSchema?: Record<string, any>;\n // $mod?: TValue extends number ? [number, number] : never;\n // $regex?: TValue extends string ? RegExp | BSONRegExp | string : never;\n // $options?: TValue extends string ? string : never;\n // $geoIntersects?: {\n // $geometry: Document;\n // };\n // $geoWithin?: Document;\n // $near?: Document;\n // $nearSphere?: Document;\n // $maxDistance?: number;\n // $all?: ReadonlyArray<any>;\n // $elemMatch?: Document;\n // $size?: TValue extends ReadonlyArray<any> ? number : never;\n // $bitsAllClear?: BitwiseFilter;\n // $bitsAllSet?: BitwiseFilter;\n // $bitsAnyClear?: BitwiseFilter;\n // $bitsAnySet?: BitwiseFilter;\n // $rand?: Record<string, never>;\n}\n\nexport type $set<T> = Partial<T>;\nexport type $unset<T> = { [P in keyof T]?: '' };\nexport type $inc<T> = { [P in keyof T]?: number | bigint };\nexport type $push<T> = { [P in keyof T]?: T[P] };\n\nexport type ExpectedDocumentVersionGeneral =\n | 'DOCUMENT_EXISTS'\n | 'DOCUMENT_DOES_NOT_EXIST'\n | 'NO_CONCURRENCY_CHECK';\n\nexport type ExpectedDocumentVersionValue = bigint & { __brand: 'sql' };\n\nexport type ExpectedDocumentVersion =\n | (bigint & { __brand: 'sql' })\n | bigint\n | ExpectedDocumentVersionGeneral;\n\nexport const DOCUMENT_EXISTS =\n 'DOCUMENT_EXISTS' as ExpectedDocumentVersionGeneral;\nexport const DOCUMENT_DOES_NOT_EXIST =\n 'DOCUMENT_DOES_NOT_EXIST' as ExpectedDocumentVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedDocumentVersionGeneral;\n\nexport const isGeneralExpectedDocumentVersion = (\n version: ExpectedDocumentVersion,\n): version is ExpectedDocumentVersionGeneral =>\n version === 'DOCUMENT_DOES_NOT_EXIST' ||\n version === 'DOCUMENT_EXISTS' ||\n version === 'NO_CONCURRENCY_CHECK';\n\nexport const expectedVersionValue = (\n version: ExpectedDocumentVersion | undefined,\n): ExpectedDocumentVersionValue | null =>\n version === undefined || isGeneralExpectedDocumentVersion(version)\n ? null\n : (version as ExpectedDocumentVersionValue);\n\nexport const expectedVersion = (\n version: number | bigint | string | undefined | null,\n): ExpectedDocumentVersion => {\n return version\n ? (BigInt(version) as ExpectedDocumentVersion)\n : NO_CONCURRENCY_CHECK;\n};\n\nexport type PongoUpdate<T> = {\n $set?: Partial<T>;\n $unset?: $unset<T>;\n $inc?: $inc<T>;\n $push?: $push<T>;\n};\n\nexport type OperationResult = {\n acknowledged: boolean;\n successful: boolean;\n\n assertSuccessful: (errorMessage?: string) => void;\n};\n\nexport const operationResult = <T extends OperationResult>(\n result: Omit<T, 'assertSuccess' | 'acknowledged' | 'assertSuccessful'>,\n options: {\n operationName: string;\n collectionName: string;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n },\n): T => {\n const operationResult: T = {\n ...result,\n acknowledged: true,\n successful: result.successful,\n assertSuccessful: (errorMessage?: string) => {\n const { successful } = result;\n const { operationName, collectionName } = options;\n\n if (!successful)\n throw new ConcurrencyError(\n errorMessage ??\n `${operationName} on ${collectionName} failed. Expected document state does not match current one! Result: ${options.serializer.serialize(result)}!`,\n );\n },\n } as T;\n\n if (options.errors?.throwOnOperationFailures)\n operationResult.assertSuccessful();\n\n return operationResult;\n};\n\nexport interface PongoInsertOneResult extends OperationResult {\n insertedId: string | null;\n nextExpectedVersion: bigint;\n}\n\nexport interface PongoInsertManyResult extends OperationResult {\n insertedIds: string[];\n insertedCount: number;\n}\n\nexport interface PongoUpdateResult extends OperationResult {\n matchedCount: number;\n modifiedCount: number;\n nextExpectedVersion: bigint;\n}\n\nexport interface PongoUpdateManyResult extends OperationResult {\n matchedCount: number;\n modifiedCount: number;\n}\n\nexport interface PongoDeleteResult extends OperationResult {\n matchedCount: number;\n deletedCount: number;\n}\n\nexport interface PongoDeleteManyResult extends OperationResult {\n deletedCount: number;\n}\n\nexport interface PongoReplaceManyResult extends OperationResult {\n modifiedCount: number;\n matchedCount: number;\n modifiedIds: string[];\n conflictIds: string[];\n nextExpectedVersions: Map<string, bigint>;\n}\n\nexport type PongoHandleResult<T> =\n | (PongoInsertOneResult & { document: T })\n | (PongoUpdateResult & { document: T })\n | (PongoDeleteResult & { document: null })\n | (OperationResult & { document: null });\n\nexport type PongoDocument = Record<string, unknown>;\n\nexport type DocumentHandler<T extends PongoDocument> =\n | ((document: T | null) => T | null)\n | ((document: T | null) => Promise<T | null>);\n","export const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\nexport class PongoError extends Error {\n public errorCode: number;\n\n constructor(\n options?: { errorCode: number; message?: string } | string | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : 500;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during Pongo processing`;\n\n super(message);\n this.errorCode = errorCode;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, PongoError.prototype);\n }\n}\n\nexport class ConcurrencyError extends PongoError {\n constructor(message?: string) {\n super({\n errorCode: 412,\n message: message ?? `Expected document state does not match current one!`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n","import type { DatabaseDriverType } from '@event-driven-io/dumbo';\nimport {\n type Document,\n type PongoClient,\n type PongoCollection,\n type PongoDb,\n type PongoDocument,\n objectEntries,\n} from '../typing';\n\nexport interface PongoCollectionSchema<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n T extends PongoDocument = PongoDocument,\n> {\n name: string;\n}\n\n// Database schema interface\nexport interface PongoDbSchema<\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> {\n name?: string;\n collections: T;\n}\n\nexport interface PongoClientSchema<\n T extends Record<string, PongoDbSchema> = Record<string, PongoDbSchema>,\n> {\n dbs: T;\n}\n\nexport type CollectionsMap<T extends Record<string, PongoCollectionSchema>> = {\n [K in keyof T]: PongoCollection<\n T[K] extends PongoCollectionSchema<infer U> ? U : PongoDocument\n >;\n};\n\nexport type PongoDbWithSchema<\n T extends Record<string, PongoCollectionSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = CollectionsMap<T> & PongoDb<DriverType>;\n\nexport type DBsMap<\n T extends Record<string, PongoDbSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> = {\n [K in keyof T]: CollectionsMap<T[K]['collections']> & Database;\n};\n\nexport type PongoClientWithSchema<\n T extends PongoClientSchema,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> = DBsMap<T['dbs'], DriverType, Database> & PongoClient<DriverType, Database>;\n\nconst pongoCollectionSchema = <T extends PongoDocument>(\n name: string,\n): PongoCollectionSchema<T> => ({\n name,\n});\n\npongoCollectionSchema.from = (\n collectionNames: string[],\n): Record<string, PongoCollectionSchema> =>\n collectionNames.reduce(\n (acc, collectionName) => (\n (acc[collectionName] = pongoSchema.collection(collectionName)),\n acc\n ),\n {} as Record<string, PongoCollectionSchema>,\n );\n\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n collections: T,\n): PongoDbSchema<T>;\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n name: string,\n collections: T,\n): PongoDbSchema<T>;\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n nameOrCollections: string | T,\n collections?: T,\n): PongoDbSchema<T> {\n if (collections === undefined) {\n if (typeof nameOrCollections === 'string') {\n throw new Error('You need to provide colleciton definition');\n }\n return {\n collections: nameOrCollections,\n };\n }\n\n return nameOrCollections && typeof nameOrCollections === 'string'\n ? {\n name: nameOrCollections,\n collections,\n }\n : { collections: collections };\n}\n\npongoDbSchema.from = (\n databaseName: string | undefined,\n collectionNames: string[],\n): PongoDbSchema =>\n databaseName\n ? pongoDbSchema(databaseName, pongoCollectionSchema.from(collectionNames))\n : pongoDbSchema(pongoCollectionSchema.from(collectionNames));\n\nconst pongoClientSchema = <T extends Record<string, PongoDbSchema>>(\n dbs: T,\n): PongoClientSchema<T> => ({\n dbs,\n});\n\nexport const pongoSchema = {\n client: pongoClientSchema,\n db: pongoDbSchema,\n collection: pongoCollectionSchema,\n};\n\n// Factory function to create DB instances\nexport const proxyPongoDbWithSchema = <\n Collections extends Record<string, PongoCollectionSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n>(\n pongoDb: Database,\n dbSchema: PongoDbSchema<Collections>,\n collections: Map<string, PongoCollection<Document>>,\n): PongoDbWithSchema<Collections, DriverType> & Database => {\n const collectionNames = Object.keys(dbSchema.collections);\n\n for (const collectionName of collectionNames) {\n collections.set(collectionName, pongoDb.collection(collectionName));\n }\n\n return new Proxy(\n pongoDb as Database & {\n [key: string]: unknown;\n },\n {\n get(target, prop: string) {\n return collections.get(prop) ?? target[prop];\n },\n },\n ) as PongoDbWithSchema<Collections, DriverType> & Database;\n};\n\nexport const proxyClientWithSchema = <\n TypedClientSchema extends PongoClientSchema,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n>(\n client: PongoClient<DriverType, Database>,\n schema: TypedClientSchema | undefined,\n): PongoClientWithSchema<TypedClientSchema, DriverType, Database> => {\n if (!schema)\n return client as PongoClientWithSchema<\n TypedClientSchema,\n DriverType,\n Database\n >;\n\n const dbNames = Object.keys(schema.dbs);\n\n return new Proxy(\n client as PongoClient<DriverType, Database> & {\n [key: string]: unknown;\n },\n {\n get(target, prop: string) {\n if (dbNames.includes(prop)) return client.db(schema.dbs[prop]?.name);\n\n return target[prop];\n },\n },\n ) as PongoClientWithSchema<TypedClientSchema, DriverType, Database>;\n};\n\nexport type PongoCollectionSchemaMetadata = {\n name: string;\n};\n\nexport type PongoDbSchemaMetadata = {\n name?: string | undefined;\n collections: PongoCollectionSchemaMetadata[];\n};\n\nexport type PongoClientSchemaMetadata = {\n databases: PongoDbSchemaMetadata[];\n database: (name?: string) => PongoDbSchemaMetadata | undefined;\n};\n\nexport const toDbSchemaMetadata = <TypedDbSchema extends PongoDbSchema>(\n schema: TypedDbSchema,\n): PongoDbSchemaMetadata => ({\n name: schema.name,\n collections: objectEntries(schema.collections).map((c) => ({\n name: c[1].name,\n })),\n});\n\nexport const toClientSchemaMetadata = <\n TypedClientSchema extends PongoClientSchema,\n>(\n schema: TypedClientSchema,\n): PongoClientSchemaMetadata => {\n const databases = objectEntries(schema.dbs).map((e) =>\n toDbSchemaMetadata(e[1]),\n );\n\n return {\n databases,\n database: (name) => databases.find((db) => db.name === name),\n };\n};\n\nexport interface PongoSchemaConfig<\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n> {\n schema: TypedClientSchema;\n}\n","import type { JSONSerializer, SQL } from '@event-driven-io/dumbo';\nimport {\n runSQLMigrations,\n type DatabaseDriverType,\n type Dumbo,\n type MigrationStyle,\n type QueryResult,\n type QueryResultRow,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '@event-driven-io/dumbo';\nimport { pongoCache, type CacheConfig, type PongoCache } from '../cache';\nimport { pongoCollection, transactionExecutorOrDefault } from '../collection';\nimport {\n pongoSchema,\n proxyPongoDbWithSchema,\n type PongoCollectionSchema,\n type PongoDbSchema,\n} from '../schema';\nimport type {\n AnyPongoDb,\n CollectionOperationOptions,\n Document,\n PongoCollection,\n PongoDb,\n PongoDBCollectionOptions,\n PongoMigrationOptions,\n} from '../typing';\nimport type { PongoDatabaseSchemaComponent } from './pongoDatabaseSchemaComponent';\n\nexport type PongoDatabaseOptions<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DumboType extends Dumbo<DatabaseDriverType, any> = Dumbo<\n DatabaseDriverType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >,\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = {\n databaseName: string;\n pool: DumboType;\n serializer: JSONSerializer;\n schemaComponent: PongoDatabaseSchemaComponent<DumboType['driverType']>;\n schema?:\n | {\n autoMigration?: MigrationStyle;\n definition?: PongoDbSchema<CollectionsSchema>;\n }\n | undefined;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n};\n\nexport const PongoDatabase = <\n Database extends AnyPongoDb = AnyPongoDb,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DumboType extends Dumbo<Database['driverType'], any> = Dumbo<\n Database['driverType'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >,\n>(\n options: PongoDatabaseOptions<DumboType>,\n): Database => {\n const {\n databaseName,\n schemaComponent,\n pool,\n cache: cacheOptions,\n serializer,\n } = options;\n\n const cache =\n cacheOptions === 'disabled' || cacheOptions === undefined\n ? 'disabled'\n : pongoCache(cacheOptions);\n\n const collections = new Map<string, PongoCollection<Document>>();\n\n const command = async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ) =>\n (\n await transactionExecutorOrDefault(db, options, pool.execute)\n ).command<Result>(sql, options);\n\n const query = async <T extends QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ) =>\n (await transactionExecutorOrDefault(db, options, pool.execute)).query<T>(\n sql,\n options,\n );\n\n const driverType = pool.driverType as Database['driverType'];\n\n const db = {\n driverType,\n databaseName,\n connect: () => Promise.resolve(),\n close: async () => {\n await Promise.allSettled([\n pool.close(),\n cache !== 'disabled' ? cache.close() : Promise.resolve(),\n ...collections.values().map((collection) => collection.close()),\n ]);\n },\n\n collections: () => [...collections.values()],\n collection: <T extends Document, Payload extends Document = T>(\n collectionName: string,\n collectionOptions?: PongoDBCollectionOptions<T, Payload>,\n ) =>\n (collections.get(collectionName) as PongoCollection<T> | undefined) ??\n pongoCollection({\n collectionName,\n db,\n pool,\n schemaComponent: schemaComponent.collection(\n pongoSchema.collection<T>(collectionName),\n ),\n schema: { ...options.schema, ...collectionOptions?.schema },\n serializer,\n errors: { ...options.errors, ...collectionOptions?.errors },\n cache:\n collectionOptions?.cache !== undefined\n ? collectionOptions.cache\n : cache,\n }),\n transaction: () => pool.transaction(),\n withTransaction: (handle) => pool.withTransaction(handle),\n\n schema: {\n component: schemaComponent,\n migrate: (options?: PongoMigrationOptions) =>\n runSQLMigrations(pool, schemaComponent.migrations, options),\n },\n\n sql: {\n async query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ): Promise<Result[]> {\n const result = await query<Result>(sql, options);\n return result.rows;\n },\n async command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ): Promise<QueryResult<Result>> {\n return command(sql, options);\n },\n },\n } satisfies PongoDb<Database['driverType']> as unknown as Database;\n\n const dbSchema = options?.schema?.definition;\n\n if (dbSchema) {\n return proxyPongoDbWithSchema(db, dbSchema, collections);\n }\n\n return db;\n};\n","import type {\n DatabaseDriverType,\n JSONSerializationOptions,\n JSONSerializer,\n MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport type { CacheConfig, PongoCache } from '../cache';\nimport type { PongoCollectionSchema, PongoDbSchema } from '../schema';\nimport type { AnyPongoDb, PongoDb } from '../typing';\n\nexport type PongoDriverOptions<ConnectionOptions = unknown> = {\n connectionOptions?: ConnectionOptions | undefined;\n} & JSONSerializationOptions;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyPongoDriverOptions = PongoDriverOptions<any>;\n\nexport type PongoDatabaseFactoryOptions<\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n DriverOptions extends AnyPongoDriverOptions = AnyPongoDriverOptions,\n> = {\n databaseName?: string | undefined;\n schema?:\n | {\n autoMigration?: MigrationStyle;\n definition?: PongoDbSchema<CollectionsSchema>;\n }\n | undefined;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n} & DriverOptions;\n\nexport interface PongoDriver<\n Database extends AnyPongoDb = AnyPongoDb,\n DriverOptions extends AnyPongoDriverOptions = AnyPongoDriverOptions,\n> {\n driverType: Database['driverType'];\n databaseFactory<\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n >(\n options: PongoDatabaseFactoryOptions<CollectionsSchema, DriverOptions>,\n ): Database & PongoDb<Database['driverType']>;\n}\n\nexport type AnyPongoDriver = PongoDriver<AnyPongoDb, AnyPongoDriverOptions>;\n\nexport type ExtractPongoDriverOptions<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDriver<any, infer O> ? O : never;\n\nexport type ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDriver<infer D, any> ? D : never;\n\nexport const PongoDriverRegistry = () => {\n const drivers = new Map<\n DatabaseDriverType,\n PongoDriver | (() => Promise<PongoDriver>)\n >();\n\n const register = <Database extends AnyPongoDb = AnyPongoDb>(\n driverType: Database['driverType'],\n driver: PongoDriver<Database> | (() => Promise<PongoDriver<Database>>),\n ): void => {\n const entry = drivers.get(driverType);\n if (\n entry &&\n (typeof entry !== 'function' || typeof driver === 'function')\n ) {\n return;\n }\n drivers.set(driverType, driver);\n };\n\n const tryResolve = async <Driver extends AnyPongoDriver = AnyPongoDriver>(\n driverType: Driver['driverType'],\n ): Promise<Driver | null> => {\n const entry = drivers.get(driverType);\n\n if (!entry) return null;\n\n if (typeof entry !== 'function') return entry as Driver;\n\n const driver = await entry();\n\n register(driverType, driver);\n return driver as Driver;\n };\n\n const tryGet = <Driver extends AnyPongoDriver = AnyPongoDriver>(\n driverType: Driver['driverType'],\n ): Driver | null => {\n const entry = drivers.get(driverType);\n return entry && typeof entry !== 'function' ? (entry as Driver) : null;\n };\n\n const has = (driverType: DatabaseDriverType): boolean =>\n drivers.has(driverType);\n\n return {\n register,\n tryResolve,\n tryGet,\n has,\n get databaseDriverTypes(): DatabaseDriverType[] {\n return Array.from(drivers.keys());\n },\n };\n};\n\ndeclare global {\n var pongoDriverRegistry: ReturnType<typeof PongoDriverRegistry>;\n}\n\nexport const pongoDriverRegistry = (globalThis.pongoDriverRegistry =\n globalThis.pongoDriverRegistry ?? PongoDriverRegistry());\n","import { JSONSerializer } from '@event-driven-io/dumbo';\nimport { pongoCache } from './cache';\nimport { PongoDatabaseCache } from './database';\nimport type {\n AnyPongoDriver,\n ExtractPongoDatabaseTypeFromDriver,\n} from './drivers';\nimport { pongoSession } from './pongoSession';\nimport {\n proxyClientWithSchema,\n type PongoClientSchema,\n type PongoClientWithSchema,\n} from './schema';\nimport type {\n PongoClient,\n PongoClientOptions,\n PongoDb,\n PongoDbOptions,\n PongoSession,\n} from './typing';\n\nexport const pongoClient = <\n DatabaseDriver extends AnyPongoDriver,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n>(\n options: PongoClientOptions<DatabaseDriver, TypedClientSchema>,\n): PongoClient<\n DatabaseDriver['driverType'],\n ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>\n> &\n PongoClientWithSchema<TypedClientSchema> => {\n const {\n driver,\n schema,\n errors,\n cache: cacheOptions,\n serialization,\n ...connectionOptions\n } = options;\n\n const dbClients = PongoDatabaseCache<PongoDb, TypedClientSchema>({\n driver,\n typedSchema: schema?.definition,\n });\n\n const serializer = JSONSerializer.from(options);\n\n const cache =\n cacheOptions === 'disabled' || cacheOptions === undefined\n ? 'disabled'\n : pongoCache(cacheOptions);\n\n const pongoClient: PongoClient<\n DatabaseDriver['driverType'],\n ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>\n > = {\n driverType: driver.driverType,\n connect: async () => {\n await dbClients.forAll((db) => db.connect());\n return pongoClient;\n },\n close: async () => {\n await dbClients.forAll((db) => db.close());\n },\n db: (\n dbName?: string,\n options?: PongoDbOptions,\n ): ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> => {\n const db = dbClients.getOrCreate({\n ...connectionOptions,\n databaseName: dbName,\n serializer,\n errors,\n cache: options?.cache ?? cache,\n serialization,\n });\n\n return db as ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>;\n },\n startSession: pongoSession,\n withSession: async <T>(\n callback: (session: PongoSession) => Promise<T>,\n ): Promise<T> => {\n const session = pongoSession();\n\n try {\n return await callback(session);\n } finally {\n await session.endSession();\n }\n },\n };\n\n return proxyClientWithSchema(pongoClient, schema?.definition);\n};\n","import type { DatabaseTransaction } from '@event-driven-io/dumbo';\nimport { pongoTransactionCache } from './cache';\nimport type {\n PongoDb,\n PongoDbTransaction,\n PongoTransactionOptions,\n} from './typing';\n\nexport const pongoTransaction = (\n options: PongoTransactionOptions,\n): PongoDbTransaction => {\n let isCommitted = false;\n let isRolledBack = false;\n let databaseName: string | null = null;\n let transaction: DatabaseTransaction | null = null;\n const cache = pongoTransactionCache();\n\n return {\n cache,\n enlistDatabase: async (db: PongoDb): Promise<DatabaseTransaction> => {\n if (transaction && databaseName !== db.databaseName)\n throw new Error(\n \"There's already other database assigned to transaction\",\n );\n\n if (transaction && databaseName === db.databaseName) return transaction;\n\n databaseName = db.databaseName;\n transaction = db.transaction();\n await transaction.begin();\n\n return transaction;\n },\n commit: async () => {\n if (isCommitted) return;\n if (isRolledBack) throw new Error('Transaction is not active!');\n\n isCommitted = true;\n\n if (transaction) {\n await transaction.commit();\n transaction = null;\n }\n await cache.commit();\n },\n rollback: async (error?: unknown) => {\n if (isCommitted) throw new Error('Cannot rollback commited transaction!');\n if (isRolledBack) return;\n\n isRolledBack = true;\n\n if (transaction) {\n await transaction.rollback(error);\n transaction = null;\n }\n cache.clear();\n },\n databaseName,\n isStarting: false,\n isCommitted,\n get isActive() {\n return !isCommitted && !isRolledBack;\n },\n get sqlExecutor() {\n if (transaction === null)\n throw new Error('No database transaction was started');\n\n return transaction.execute;\n },\n options,\n };\n};\n","import type { CacheConfig, PongoCache } from './cache';\nimport { pongoTransaction } from './pongoTransaction';\nimport type {\n PongoDbTransaction,\n PongoSession,\n PongoTransactionOptions,\n} from './typing';\n\nexport type PongoSessionOptions = {\n explicit?: boolean;\n defaultTransactionOptions: PongoTransactionOptions;\n cache?: CacheConfig | 'disabled' | PongoCache;\n};\n\nconst isActive = (\n transaction: PongoDbTransaction | null,\n): transaction is PongoDbTransaction => transaction?.isActive === true;\n\nfunction assertInActiveTransaction(\n transaction: PongoDbTransaction | null,\n): asserts transaction is PongoDbTransaction {\n if (!isActive(transaction)) throw new Error('No active transaction exists!');\n}\n\nfunction assertNotInActiveTransaction(\n transaction: PongoDbTransaction | null,\n): asserts transaction is null {\n if (isActive(transaction))\n throw new Error('Active transaction already exists!');\n}\n\nexport const pongoSession = (options?: PongoSessionOptions): PongoSession => {\n const explicit = options?.explicit === true;\n const defaultTransactionOptions: PongoTransactionOptions =\n options?.defaultTransactionOptions ?? {\n get snapshotEnabled() {\n return false;\n },\n };\n\n let transaction: PongoDbTransaction | null = null;\n let hasEnded = false;\n\n const startTransaction = (options?: PongoTransactionOptions) => {\n assertNotInActiveTransaction(transaction);\n\n transaction = pongoTransaction(options ?? defaultTransactionOptions);\n };\n const commitTransaction = async () => {\n assertInActiveTransaction(transaction);\n\n await transaction.commit();\n };\n const abortTransaction = async () => {\n assertInActiveTransaction(transaction);\n\n await transaction.rollback();\n };\n\n const endSession = async (): Promise<void> => {\n if (hasEnded) return;\n hasEnded = true;\n\n if (isActive(transaction)) await transaction.rollback();\n };\n\n const session = {\n get hasEnded() {\n return hasEnded;\n },\n explicit,\n defaultTransactionOptions: defaultTransactionOptions ?? {\n get snapshotEnabled() {\n return false;\n },\n },\n get transaction() {\n return transaction;\n },\n get snapshotEnabled() {\n return defaultTransactionOptions.snapshotEnabled;\n },\n endSession,\n incrementTransactionNumber: () => {},\n inTransaction: () => isActive(transaction),\n startTransaction,\n commitTransaction,\n abortTransaction,\n withTransaction: async <T = unknown>(\n fn: (session: PongoSession) => Promise<T>,\n options?: PongoTransactionOptions,\n ): Promise<T> => {\n startTransaction(options);\n\n try {\n const result = await fn(session);\n await commitTransaction();\n return result;\n } catch (error) {\n await abortTransaction();\n throw error;\n }\n },\n };\n\n return session;\n};\n","export const deepEquals = <T>(left: T, right: T): boolean => {\n if (isEquatable(left)) {\n return left.equals(right);\n }\n\n if (Array.isArray(left)) {\n return (\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((val, index) => deepEquals(val, right[index]))\n );\n }\n\n if (\n typeof left !== 'object' ||\n typeof right !== 'object' ||\n left === null ||\n right === null\n ) {\n return left === right;\n }\n\n if (Array.isArray(right)) return false;\n\n const keys1 = Object.keys(left);\n const keys2 = Object.keys(right);\n\n if (\n keys1.length !== keys2.length ||\n !keys1.every((key) => keys2.includes(key))\n )\n return false;\n\n for (const key in left) {\n if (left[key] instanceof Function && right[key] instanceof Function)\n continue;\n\n const isEqual = deepEquals(left[key], right[key]);\n if (!isEqual) {\n return false;\n }\n }\n\n return true;\n};\n\nexport type Equatable<T> = { equals: (right: T) => boolean } & T;\n\nexport const isEquatable = <T>(left: T): left is Equatable<T> => {\n return (\n left &&\n typeof left === 'object' &&\n 'equals' in left &&\n typeof left['equals'] === 'function'\n );\n};\n","export async function mapSequential<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = [];\n for (let i = 0; i < items.length; i++) {\n results.push(await fn(items[i]!, i));\n }\n return results;\n}\n\nexport const mapParallel = <T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> => Promise.all(items.map(fn));\n\nexport const mapAsync = <T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n options: { parallel: boolean | undefined } = { parallel: false },\n): Promise<R[]> =>\n options?.parallel ? mapParallel(items, fn) : mapSequential(items, fn);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport type {\n BatchHandleOptions,\n CollectionOperationOptions,\n DocumentHandler,\n ExpectedDocumentVersion,\n HandleOptions,\n OperationResult,\n OptionalUnlessRequiredIdAndVersion,\n PongoDeleteResult,\n PongoDocument,\n PongoHandleResult,\n PongoInsertManyResult,\n PongoReplaceManyResult,\n WithId,\n WithIdAndVersion,\n} from '..';\nimport {\n deepEquals,\n expectedVersionValue,\n mapAsync,\n operationResult,\n} from '..';\n\nexport type DocumentCommandHandlerOptions<T extends PongoDocument> = {\n collectionName: string;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n storage: {\n ensureCollectionCreated: (\n options?: CollectionOperationOptions,\n ) => Promise<unknown>;\n fetchByIds: (\n ids: string[],\n options?: CollectionOperationOptions,\n ) => Promise<(WithIdAndVersion<T> | null)[]>;\n insertMany: (\n docs: OptionalUnlessRequiredIdAndVersion<T>[],\n options?: CollectionOperationOptions,\n ) => Promise<PongoInsertManyResult>;\n replaceMany: (\n docs: Array<WithIdAndVersion<T>>,\n options?: CollectionOperationOptions,\n ) => Promise<PongoReplaceManyResult>;\n deleteManyByIds: (\n ids: Array<{ _id: string; _version?: bigint }>,\n options?: CollectionOperationOptions,\n ) => Promise<PongoDeleteResult & { deletedIds: Set<string> }>;\n };\n};\n\nexport type DocumentCommandHandlerInput = {\n _id: string;\n expectedVersion?: ExpectedDocumentVersion;\n};\n\ntype DocumentChange<T extends PongoDocument> =\n | {\n type: 'noop';\n existing: WithIdAndVersion<T> | null;\n versionMismatch?: boolean;\n }\n | { type: 'insert'; doc: WithId<T> }\n | {\n type: 'replace';\n existing: WithIdAndVersion<T>;\n result: WithId<T>;\n _version?: bigint;\n }\n | { type: 'delete'; docId: string; _version?: bigint };\n\ntype DocumentHandlerResult = { succeeded: boolean; newVersion?: bigint };\n\nexport function DocumentCommandHandler<T extends PongoDocument>(\n deps: DocumentCommandHandlerOptions<T>,\n): {\n (\n id: string | DocumentCommandHandlerInput,\n handler: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>>;\n (\n ids: string[] | DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: HandleOptions & BatchHandleOptions,\n ): Promise<PongoHandleResult<T>[]>;\n} {\n const fn = async (\n input:\n | string\n | string[]\n | DocumentCommandHandlerInput\n | DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: HandleOptions | BatchHandleOptions,\n ): Promise<PongoHandleResult<T> | PongoHandleResult<T>[]> => {\n const changes = await handleDocuments(\n deps.storage,\n normalizeInput(input),\n handler,\n options,\n );\n\n const results = changes.map(({ change, result: outcome }) =>\n toHandleResult(deps, change, outcome),\n );\n\n return Array.isArray(input) ? results : results[0]!;\n };\n return fn as ReturnType<typeof DocumentCommandHandler<T>>;\n}\n\nasync function handleDocuments<T extends PongoDocument>(\n storage: DocumentCommandHandlerOptions<T>['storage'],\n inputs: DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: BatchHandleOptions,\n): Promise<{ change: DocumentChange<T>; result: DocumentHandlerResult }[]> {\n if (inputs.length === 0) return [];\n\n const { parallel, ...operationOptions } = options ?? {};\n\n await storage.ensureCollectionCreated(operationOptions);\n\n const docs = await storage.fetchByIds(\n inputs.map((i) => i._id),\n operationOptions,\n );\n\n const changes = await mapAsync(\n inputs,\n (item, i) =>\n handleDocument(\n {\n ...item,\n existing: docs[i] ?? null,\n },\n handler,\n ),\n { parallel },\n );\n\n return await executeStorageChanges(storage, changes, operationOptions);\n}\n\nasync function handleDocument<T extends PongoDocument>(\n item: {\n _id: string;\n expectedVersion?: ExpectedDocumentVersion | undefined;\n existing: WithIdAndVersion<T> | null;\n },\n handler: DocumentHandler<T>,\n): Promise<DocumentChange<T>> {\n const { _id: id, existing, expectedVersion } = item;\n\n if (hasVersionMismatch(existing, expectedVersion))\n return { type: 'noop', existing, versionMismatch: true };\n\n const result = await handler(existing ? ({ ...existing } as T) : null);\n\n return toDocumentChange(id, existing, result);\n}\n\nasync function executeStorageChanges<T extends PongoDocument>(\n storage: DocumentCommandHandlerOptions<T>['storage'],\n changes: DocumentChange<T>[],\n operationOptions?: CollectionOperationOptions,\n): Promise<{ change: DocumentChange<T>; result: DocumentHandlerResult }[]> {\n const toInsert = changes.flatMap((c) =>\n c.type === 'insert' ? [c.doc as OptionalUnlessRequiredIdAndVersion<T>] : [],\n );\n\n const toReplace = changes.flatMap((c): Array<WithIdAndVersion<T>> => {\n if (c.type !== 'replace') return [];\n const { _version: _, ...cleanResult } = c.result as Record<string, unknown>;\n return [\n (c._version !== undefined\n ? { ...cleanResult, _version: c._version }\n : cleanResult) as WithIdAndVersion<T>,\n ];\n });\n\n const toDelete = changes.flatMap((c) =>\n c.type === 'delete'\n ? [\n c._version !== undefined\n ? { _id: c.docId, _version: c._version }\n : { _id: c.docId },\n ]\n : [],\n );\n\n const insertedIds =\n toInsert.length > 0\n ? new Set(\n (await storage.insertMany(toInsert, operationOptions)).insertedIds,\n )\n : new Set<string>();\n\n const replaceResult =\n toReplace.length > 0\n ? await storage.replaceMany(toReplace, operationOptions)\n : null;\n\n const deletedIds =\n toDelete.length > 0\n ? (await storage.deleteManyByIds(toDelete, operationOptions)).deletedIds\n : new Set<string>();\n\n const toDocumentHandlerResult = (\n change: DocumentChange<T>,\n ): DocumentHandlerResult => {\n if (change.type === 'noop') return { succeeded: !change.versionMismatch };\n if (change.type === 'insert')\n return { succeeded: insertedIds.has(change.doc._id), newVersion: 1n };\n if (change.type === 'delete')\n return { succeeded: deletedIds.has(change.docId) };\n\n const id = change.result._id;\n return {\n succeeded: replaceResult?.modifiedIds.includes(id) ?? false,\n newVersion: replaceResult?.nextExpectedVersions.get(id) ?? 0n,\n };\n };\n\n return changes.map((change) => ({\n change,\n result: toDocumentHandlerResult(change),\n }));\n}\n\nfunction normalizeInput(\n input:\n | string\n | string[]\n | DocumentCommandHandlerInput\n | DocumentCommandHandlerInput[],\n): DocumentCommandHandlerInput[] {\n if (typeof input === 'string') return [{ _id: input }];\n\n if (!Array.isArray(input)) return [input];\n\n return input.map((item) => (typeof item === 'string' ? { _id: item } : item));\n}\n\nfunction hasVersionMismatch<T extends PongoDocument>(\n existing: WithIdAndVersion<T> | null,\n version?: ExpectedDocumentVersion,\n): boolean {\n const expected = expectedVersionValue(version);\n return (\n (existing == null && version === 'DOCUMENT_EXISTS') ||\n (existing == null && expected != null) ||\n (existing != null && version === 'DOCUMENT_DOES_NOT_EXIST') ||\n (existing != null && expected !== null && existing._version !== expected)\n );\n}\n\nfunction toDocumentChange<T extends PongoDocument>(\n docId: string,\n existing: WithIdAndVersion<T> | null,\n result: T | null,\n): DocumentChange<T> {\n if (deepEquals(existing as T | null, result))\n return { type: 'noop', existing };\n\n if (!existing && result)\n return {\n type: 'insert',\n doc: { ...result, _id: docId } as WithId<T>,\n };\n\n if (existing && !result)\n return {\n type: 'delete',\n docId,\n _version: existing._version,\n };\n\n return {\n type: 'replace',\n existing: existing!,\n result: { ...result, _id: docId } as WithId<T>,\n _version: existing!._version,\n };\n}\n\nfunction toHandleResult<T extends PongoDocument>(\n deps: DocumentCommandHandlerOptions<T>,\n change: DocumentChange<T>,\n { succeeded, newVersion }: DocumentHandlerResult,\n): PongoHandleResult<T> {\n const opMeta = {\n operationName: 'handle',\n collectionName: deps.collectionName,\n serializer: deps.serializer,\n errors: deps.errors,\n };\n const toResult = (\n op: Record<string, unknown>,\n document: T | null,\n ): PongoHandleResult<T> =>\n ({\n ...operationResult(op as OperationResult, opMeta),\n document,\n }) as unknown as PongoHandleResult<T>;\n\n if (change.type === 'noop')\n return toResult({ successful: succeeded }, change.existing as T | null);\n\n if (change.type === 'insert')\n return toResult(\n {\n successful: succeeded,\n insertedId: succeeded ? change.doc._id : null,\n nextExpectedVersion: 1n,\n },\n succeeded ? ({ ...change.doc, _version: 1n } as unknown as T) : null,\n );\n\n if (change.type === 'delete')\n return toResult(\n {\n successful: succeeded,\n deletedCount: succeeded ? 1 : 0,\n matchedCount: 1,\n },\n null,\n );\n\n return toResult(\n {\n successful: succeeded,\n modifiedCount: succeeded ? 1 : 0,\n matchedCount: 1,\n nextExpectedVersion: newVersion ?? 0n,\n },\n succeeded\n ? ({ ...change.result, _version: newVersion } as unknown as T)\n : (change.existing as T | null),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/chunk-EQ3T4XHT.cjs","../src/core/cache/pongoCacheWrapper.ts","../src/core/cache/providers/identityMapCache.ts","../src/core/cache/providers/lruCache.ts","../src/core/cache/providers/noopCache.ts","../src/core/cache/pongoCache.ts","../src/core/cache/transactions/pongoTransactionCache.ts","../src/core/collection/filters/filters.ts","../src/core/collection/pongoCollection.ts","../src/core/collection/pongoCollectionSchemaComponent.ts","../src/core/collection/query.ts","../src/core/database/pongoDatabaseCache.ts","../src/core/database/pongoDatabaseSchemaComponent.ts","../src/core/typing/entries.ts","../src/core/typing/operations.ts","../src/core/errors/index.ts","../src/core/schema/index.ts","../src/core/database/pongoDb.ts","../src/core/drivers/databaseDriver.ts","../src/core/pongoClient.ts","../src/core/pongoTransaction.ts","../src/core/pongoSession.ts","../src/core/utils/deepEquals.ts","../src/core/utils/mapAsync.ts","../src/core/collection/handle.ts"],"names":["options","schemaComponent","operationResult","runSQLMigrations","pongoClient"],"mappings":"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","file":"/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/chunk-EQ3T4XHT.cjs","sourcesContent":[null,"import type { PongoDocument } from '../typing';\nimport type {\n CacheHooks,\n PongoCache,\n PongoDocumentCacheKey,\n} from './pongoCache';\n\nexport const pongoCacheWrapper = (options: {\n provider: PongoCache;\n hooks?: CacheHooks;\n}): PongoCache => {\n const { provider, hooks } = options;\n\n const onError = (error: unknown, operation: string) => {\n hooks?.onError?.(error, operation);\n };\n let isClosed = false;\n\n return {\n cacheType: provider.cacheType,\n async get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): Promise<Doc | null | undefined> {\n try {\n const result = await provider.get<Doc>(key);\n if (result !== undefined) {\n hooks?.onHit?.(key);\n } else {\n hooks?.onMiss?.(key);\n }\n return result;\n } catch (error) {\n onError(error, 'get');\n hooks?.onMiss?.(key);\n return undefined;\n }\n },\n\n async getMany(keys) {\n try {\n return await provider.getMany(keys);\n } catch (error) {\n onError(error, 'getMany');\n return [];\n }\n },\n\n async set(key, value) {\n try {\n await provider.set(key, value);\n } catch (error) {\n onError(error, 'set');\n }\n },\n\n async setMany(entries) {\n try {\n await provider.setMany(entries);\n } catch (error) {\n onError(error, 'setMany');\n }\n },\n\n async update(key, updater) {\n try {\n await provider.update(key, updater);\n } catch (error) {\n onError(error, 'update');\n }\n },\n\n async updateMany(keys, updater) {\n try {\n await provider.updateMany(keys, updater);\n } catch (error) {\n onError(error, 'updateMany');\n }\n },\n\n async delete(key) {\n try {\n await provider.delete(key);\n hooks?.onEvict?.(key);\n } catch (error) {\n onError(error, 'delete');\n }\n },\n\n async deleteMany(keys) {\n try {\n await provider.deleteMany(keys);\n for (const key of keys) hooks?.onEvict?.(key);\n } catch (error) {\n onError(error, 'deleteMany');\n }\n },\n\n clear() {\n return provider.clear();\n },\n\n close() {\n if (isClosed) return;\n\n isClosed = true;\n return provider.close();\n },\n };\n};\n","import type { PongoDocument } from '../../typing';\nimport type { PongoCache, PongoDocumentCacheKey } from '../pongoCache';\n\nexport const identityMapCache = (): PongoCache => {\n const store = new Map<string, PongoDocument | null>();\n\n return {\n cacheType: 'pongo:cache:identity-map',\n get: <Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): Promise<Doc | null | undefined> =>\n Promise.resolve(\n store.has(key) ? (store.get(key) as Doc | null) : undefined,\n ),\n getMany: <Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): (Doc | null | undefined)[] =>\n keys.map((k) =>\n store.has(k) ? (store.get(k) as Doc | null) : undefined,\n ),\n set: (key, value) => {\n store.set(key, value);\n },\n setMany: (entries) => {\n for (const { key, value } of entries) store.set(key, value);\n },\n update: (key, _updater) => {\n // TODO: Implement proper update logic instead of just setting the updater as value\n store.delete(key);\n // const existing = store.get(key);\n // if (!existing) return;\n // const updated = typeof updater === 'function' ? updater(existing) : updater;\n // store.set(key, updated);\n },\n updateMany: (keys, _updater) => {\n // TODO: Implement proper update logic instead of just setting the updater as value\n for (const key of keys) store.delete(key);\n // for (const key of keys) {\n // const existing = store.get(key);\n // if (!existing) continue;\n // const updated = typeof updater === 'function' ? updater(existing) : updater;\n // store.set(key, updated);\n // }\n },\n delete: (key) => {\n store.delete(key);\n },\n deleteMany: (keys) => {\n for (const key of keys) store.delete(key);\n },\n clear: () => {\n store.clear();\n },\n close: () => {\n store.clear();\n },\n };\n};\n","import { LRUCache } from 'lru-cache';\nimport type { MaybePromise, PongoDocument } from '../../typing';\nimport type { PongoCache, PongoDocumentCacheKey } from '../pongoCache';\n\nexport type LRUCacheOptions = Omit<\n LRUCache.Options<string, { doc: PongoDocument | null }, unknown>,\n 'max'\n> & { max?: number };\n\nconst defaultLRUCacheOptions: LRUCache.Options<\n string,\n { doc: PongoDocument | null },\n unknown\n> = {\n max: 1000,\n};\n\nexport const lruCache = (options?: LRUCacheOptions): PongoCache => {\n const cache = new LRUCache<string, { doc: PongoDocument | null }>({\n ...defaultLRUCacheOptions,\n ...options,\n });\n\n return {\n cacheType: 'pongo:cache:lru',\n get: <Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined> => {\n const entry = cache.get(key);\n if (entry === undefined) return undefined;\n return entry.doc as Doc | null;\n },\n getMany: <Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): (Doc | null | undefined)[] =>\n keys.map((k) => {\n const entry = cache.get(k);\n if (entry === undefined) return undefined;\n return entry.doc as Doc | null;\n }),\n set: (key, value) => {\n cache.set(key, { doc: value });\n },\n setMany: (entries) => {\n for (const { key, value } of entries) {\n cache.set(key, { doc: value });\n }\n },\n update: (key, _updater) => {\n cache.delete(key);\n // TODO: Add updater using mingo\n // const existing = cache.get(key);\n // if (existing) {\n // const updated = updater(existing);\n // cache.set(key, updated, opts?.ttl !== undefined ? { ttl: opts.ttl } : undefined);\n // }\n },\n updateMany(keys, _updater) {\n for (const key of keys) {\n cache.delete(key);\n // TODO: Add updater using mingo\n // const existing = cache.get(key);\n // if (existing) {\n // const updated = updater(existing);\n // cache.set(key, updated);\n // }\n }\n },\n delete: (key) => {\n cache.delete(key);\n },\n deleteMany: (keys) => {\n for (const key of keys) cache.delete(key);\n },\n clear: () => {\n cache.clear();\n },\n close: () => {\n cache.clear();\n },\n };\n};\n","import type { PongoCache } from '../pongoCache';\n\nexport const noopCacheProvider: PongoCache = {\n cacheType: 'pongo:cache:no-op',\n get: () => undefined,\n set: () => {},\n update: () => {},\n delete: () => {},\n getMany: (keys) => keys.map(() => undefined),\n setMany: () => {},\n updateMany: () => {},\n deleteMany: () => {},\n clear: () => {},\n close: () => {},\n};\n","import type { MaybePromise, PongoDocument, PongoUpdate } from '../typing';\nimport { pongoCacheWrapper } from './pongoCacheWrapper';\nimport type { LRUCacheOptions } from './providers';\nimport { identityMapCache, lruCache, noopCacheProvider } from './providers';\n\nexport type PongoDocumentCacheKey = `${string}:${string}:${string}`;\n\nexport type PongoCacheSetEntry<Doc extends PongoDocument = PongoDocument> = {\n key: PongoDocumentCacheKey;\n value: Doc | null;\n};\n\nexport type PongoCacheType<T extends string = string> = `pongo:cache:${T}`;\n\nexport interface PongoCache<T extends string = string> {\n cacheType: PongoCacheType<T>;\n get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined>;\n getMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): MaybePromise<(Doc | null | undefined)[]>;\n set<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n value: Doc | null,\n ): MaybePromise<void>;\n setMany(entries: PongoCacheSetEntry[]): MaybePromise<void>;\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n ): MaybePromise<void>;\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n ): MaybePromise<void>;\n delete(key: PongoDocumentCacheKey): MaybePromise<void>;\n deleteMany(keys: PongoDocumentCacheKey[]): MaybePromise<void>;\n clear(): MaybePromise<void>;\n close(): MaybePromise<void>;\n}\n\nexport type CacheHooks = {\n onHit?(key: PongoDocumentCacheKey): void;\n onMiss?(key: PongoDocumentCacheKey): void;\n onEvict?(key: PongoDocumentCacheKey): void;\n onError?(error: unknown, operation: string): void;\n};\n\nexport type CacheType = 'in-memory' | 'identity-map';\n\nexport type CacheSettings =\n | ({\n type: 'in-memory';\n } & LRUCacheOptions)\n | {\n type: 'identity-map';\n };\n\nexport type CacheConfig = CacheSettings | 'disabled';\n\nexport type CacheOptions = {\n skipCache?: boolean;\n};\n\nconst DEFAULT_CONFIG: CacheSettings = { type: 'in-memory' };\n\nexport const pongoCache = (\n options?: CacheConfig | 'disabled' | PongoCache | undefined,\n): PongoCache => {\n if (options === undefined || options === 'disabled') return noopCacheProvider;\n\n if ('cacheType' in options) return options as PongoCache;\n\n const config = options ?? DEFAULT_CONFIG;\n\n if (config.type === 'identity-map') return identityMapCache();\n\n const raw = lruCache(config);\n\n return pongoCacheWrapper({ provider: raw });\n};\n","import type { MaybePromise, PongoUpdate } from '../../typing';\nimport type { PongoDocument } from '../../typing/operations';\nimport type {\n PongoCache,\n PongoCacheSetEntry,\n PongoCacheType,\n PongoDocumentCacheKey,\n} from '../pongoCache';\nimport { identityMapCache } from '../providers';\n\nexport type PongoTransactionCacheOperationOptions = {\n mainCache: PongoCache;\n};\n\ntype CacheOperation =\n | {\n type: 'set';\n key: PongoDocumentCacheKey;\n value: PongoDocument | null;\n mainCache: PongoCache;\n }\n | { type: 'setMany'; entries: PongoCacheSetEntry[]; mainCache: PongoCache }\n | {\n type: 'replaceMany';\n entries: PongoCacheSetEntry[];\n mainCache: PongoCache;\n }\n | {\n type: 'update';\n key: PongoDocumentCacheKey;\n updater: PongoUpdate<PongoDocument>;\n mainCache: PongoCache;\n }\n | {\n type: 'updateMany';\n keys: PongoDocumentCacheKey[];\n updater: PongoUpdate<PongoDocument>;\n mainCache: PongoCache;\n }\n | { type: 'delete'; key: PongoDocumentCacheKey; mainCache: PongoCache }\n | {\n type: 'deleteMany';\n keys: PongoDocumentCacheKey[];\n mainCache: PongoCache;\n };\n\nexport interface PongoTransactionCache<T extends string = string> {\n type: PongoCacheType<T>;\n get<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n ): MaybePromise<Doc | null | undefined>;\n set(\n key: PongoDocumentCacheKey,\n value: PongoDocument | null,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n delete(\n key: PongoDocumentCacheKey,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n getMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n ): MaybePromise<(Doc | null | undefined)[]>;\n setMany(\n entries: PongoCacheSetEntry[],\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n deleteMany(\n keys: PongoDocumentCacheKey[],\n options: PongoTransactionCacheOperationOptions,\n ): MaybePromise<void>;\n clear(): MaybePromise<void>;\n commit(): Promise<void>;\n}\n\nexport const pongoTransactionCache = (options?: {\n cache?: PongoCache;\n}): PongoTransactionCache => {\n const innerCache = options?.cache ?? identityMapCache();\n const operations: CacheOperation[] = [];\n\n const cache: PongoTransactionCache = {\n type: 'pongo:cache:transaction-buffer',\n\n get(key: PongoDocumentCacheKey) {\n return innerCache.get(key);\n },\n\n set(\n key: PongoDocumentCacheKey,\n value: PongoDocument,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.set(key, value);\n operations.push({\n type: 'set',\n key,\n value,\n mainCache,\n });\n },\n\n update<Doc extends PongoDocument = PongoDocument>(\n key: PongoDocumentCacheKey,\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.update(key, updater);\n operations.push({\n type: 'update',\n key,\n updater,\n mainCache,\n });\n },\n\n delete(\n key: PongoDocumentCacheKey,\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.delete(key);\n operations.push({ type: 'delete', key, mainCache: options.mainCache });\n },\n\n getMany(keys: PongoDocumentCacheKey[]) {\n return innerCache.getMany(keys);\n },\n\n setMany(\n entries: PongoCacheSetEntry[],\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.setMany(entries);\n operations.push({\n type: 'setMany',\n entries,\n mainCache: options.mainCache,\n });\n },\n\n updateMany<Doc extends PongoDocument = PongoDocument>(\n keys: PongoDocumentCacheKey[],\n updater: PongoUpdate<Doc>,\n options: PongoTransactionCacheOperationOptions,\n ) {\n const { mainCache } = options;\n innerCache.updateMany(keys, updater);\n operations.push({\n type: 'updateMany',\n keys,\n updater,\n mainCache,\n });\n },\n\n deleteMany(\n keys: PongoDocumentCacheKey[],\n options: PongoTransactionCacheOperationOptions,\n ) {\n innerCache.deleteMany(keys);\n operations.push({\n type: 'deleteMany',\n keys,\n mainCache: options.mainCache,\n });\n },\n\n clear() {\n innerCache.clear();\n operations.length = 0;\n },\n\n async commit() {\n for (const op of operations) {\n switch (op.type) {\n case 'set':\n await op.mainCache.set(op.key, op.value);\n break;\n case 'setMany':\n await op.mainCache.setMany(op.entries);\n break;\n case 'update':\n await op.mainCache.update(\n op.key,\n op.updater as unknown as PongoUpdate<PongoDocument>,\n );\n break;\n case 'updateMany':\n await op.mainCache.updateMany(\n op.keys,\n op.updater as unknown as PongoUpdate<PongoDocument>,\n );\n break;\n case 'delete':\n await op.mainCache.delete(op.key);\n break;\n case 'deleteMany':\n await op.mainCache.deleteMany(op.keys);\n break;\n }\n }\n innerCache.clear();\n operations.length = 0;\n },\n };\n\n return cache;\n};\n","import type { SQL } from '@event-driven-io/dumbo';\nimport type { PongoFilter } from '../../typing';\n\nconst asPlainObjectWithSingleKey = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n key: string,\n): Record<string, unknown> | undefined =>\n filter &&\n typeof filter === 'object' &&\n !Array.isArray(filter) &&\n Object.keys(filter).length === 1 &&\n key in filter\n ? filter\n : undefined;\n\nexport const idFromFilter = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n): string | undefined => {\n const idFilter = asPlainObjectWithSingleKey(filter, '_id');\n return typeof idFilter?.['_id'] === 'string' ? idFilter['_id'] : undefined;\n};\n\nexport const getIdsFromIdOnlyFilter = <T>(\n filter: PongoFilter<T> | SQL | undefined,\n): string[] | undefined => {\n const idFilter = asPlainObjectWithSingleKey(filter, '_id');\n if (!idFilter) return undefined;\n\n const idValue = idFilter['_id'];\n if (typeof idValue === 'string') return [idValue];\n\n const $in =\n idValue && typeof idValue === 'object' && '$in' in idValue\n ? idValue['$in']\n : undefined;\n\n return Array.isArray($in) && $in.every((i) => typeof i === 'string')\n ? $in\n : undefined;\n};\n","import type { JSONSerializer, SQL } from '@event-driven-io/dumbo';\nimport {\n mapColumnToBigint,\n mapColumnToJSON,\n runSQLMigrations,\n single,\n type DatabaseDriverType,\n type DatabaseTransaction,\n type Dumbo,\n type MigrationStyle,\n type QueryResult,\n type QueryResultRow,\n type SQLExecutor,\n type SQLQueryResultColumnMapping,\n} from '@event-driven-io/dumbo';\nimport { v7 as uuid } from 'uuid';\nimport type {\n PongoCollectionSchemaComponent,\n PongoDocumentCacheKey,\n WithId,\n} from '..';\nimport {\n getIdsFromIdOnlyFilter,\n idFromFilter,\n operationResult,\n type CollectionOperationOptions,\n type DeleteManyOptions,\n type DeleteOneOptions,\n type FindOptions,\n type InsertManyOptions,\n type InsertOneOptions,\n type OptionalUnlessRequiredIdAndVersion,\n type PongoCollection,\n type PongoDb,\n type PongoDeleteResult,\n type PongoDocument,\n type PongoFilter,\n type PongoInsertManyResult,\n type PongoInsertOneResult,\n type PongoMigrationOptions,\n type PongoReplaceManyResult,\n type PongoUpdate,\n type PongoUpdateManyResult,\n type PongoUpdateResult,\n type ReplaceManyOptions,\n type ReplaceOneOptions,\n type UpdateManyOptions,\n type UpdateOneOptions,\n type WithIdAndVersion,\n type WithoutId,\n} from '..';\nimport { pongoCache, type CacheConfig, type PongoCache } from '../cache';\nimport { DocumentCommandHandler } from './handle';\n\nexport type PongoCollectionOptions<\n T extends PongoDocument = PongoDocument,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Payload extends PongoDocument = T,\n> = {\n db: PongoDb<DriverType>;\n collectionName: string;\n pool: Dumbo<DatabaseDriverType>;\n schemaComponent: PongoCollectionSchemaComponent;\n schema?: {\n autoMigration?: MigrationStyle;\n versioning?: {\n upcast?: (doc: Payload) => T;\n downcast?: (doc: T) => Payload;\n };\n };\n errors?: { throwOnOperationFailures?: boolean };\n serializer: JSONSerializer;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n};\n\nconst enlistIntoTransactionIfActive = async <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>(\n db: PongoDb<DriverType>,\n options: CollectionOperationOptions | undefined,\n): Promise<DatabaseTransaction | null> => {\n const transaction = options?.session?.transaction;\n\n if (!transaction || !transaction.isActive) return null;\n\n return await transaction.enlistDatabase(db);\n};\n\nexport const transactionExecutorOrDefault = async <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>(\n db: PongoDb<DriverType>,\n options: CollectionOperationOptions | undefined,\n defaultSqlExecutor: SQLExecutor,\n): Promise<SQLExecutor> => {\n const existingTransaction = await enlistIntoTransactionIfActive(db, options);\n return existingTransaction?.execute ?? defaultSqlExecutor;\n};\n\nexport const pongoCollection = <\n T extends PongoDocument,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Payload extends PongoDocument = T,\n>({\n db,\n collectionName,\n pool,\n schemaComponent,\n schema,\n errors,\n serializer,\n cache: cacheOptions,\n}: PongoCollectionOptions<T, DriverType, Payload>): PongoCollection<T> => {\n const SqlFor = schemaComponent.sqlBuilder;\n const sqlExecutor = pool.execute;\n\n const cache = pongoCache(cacheOptions);\n\n const columnMapping = {\n mapping: {\n ...mapColumnToJSON('data', serializer),\n ...mapColumnToBigint('_version'),\n } satisfies SQLQueryResultColumnMapping,\n };\n\n const command = async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ) =>\n (\n await transactionExecutorOrDefault(db, options, sqlExecutor)\n ).command<Result>(sql, columnMapping);\n\n const query = async <T extends QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ) =>\n (await transactionExecutorOrDefault(db, options, sqlExecutor)).query<T>(\n sql,\n columnMapping,\n );\n\n let shouldMigrate = schema?.autoMigration !== 'None';\n\n const createCollection = (options?: CollectionOperationOptions) => {\n shouldMigrate = false;\n\n if (options?.session) return command(SqlFor.createCollection(), options);\n else return command(SqlFor.createCollection());\n };\n\n const ensureCollectionCreated = (options?: CollectionOperationOptions) => {\n if (!shouldMigrate) {\n return Promise.resolve();\n }\n\n return createCollection(options);\n };\n\n const upcast =\n schema?.versioning?.upcast ?? ((doc: Payload) => doc as unknown as T);\n\n const downcast =\n schema?.versioning?.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n const rowToDoc = (row: { data: T; _version: bigint }): WithIdAndVersion<T> =>\n upcast({\n ...row.data,\n _version: row._version,\n } as unknown as Payload) as WithIdAndVersion<T>;\n\n const findOneFromDb = async (\n filter: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n const result = await query<{ data: T; _version: bigint }>(\n SqlFor.findOne(filter),\n options,\n );\n const row = result.rows[0];\n return row ? rowToDoc(row) : null;\n };\n\n const cacheKey = (id: string): PongoDocumentCacheKey =>\n `${db.databaseName}:${collectionName}:${id}`;\n\n const txCacheFor = (options: CollectionOperationOptions | undefined) =>\n options?.session?.transaction?.cache ?? null;\n\n const resolveFromCache = async (\n key: PongoDocumentCacheKey,\n options: CollectionOperationOptions | undefined,\n ): Promise<T | null | undefined> => {\n const txCache = txCacheFor(options);\n if (txCache) {\n const cached = await txCache.get<T>(key);\n if (cached !== undefined) return cached;\n }\n return cache.get<T>(key);\n };\n\n const findManyFromCache = async (\n keys: PongoDocumentCacheKey[],\n options: CollectionOperationOptions | undefined,\n ): Promise<(T | null | undefined)[]> => {\n const txCache = txCacheFor(options);\n\n if (!txCache) {\n return cache.getMany<T>(keys);\n }\n\n const txResults = await txCache.getMany<T>(keys);\n const mainResults = await cache.getMany<T>(keys);\n return keys.map((_, i) =>\n txResults[i] !== undefined ? txResults[i] : mainResults[i],\n );\n };\n\n const fetchByIds = async (\n ids: string[],\n options: CollectionOperationOptions | undefined,\n ): Promise<(WithIdAndVersion<T> | null)[]> => {\n const cachedResults = await findManyFromCache(ids.map(cacheKey), options);\n\n const missIds = ids.filter((_, i) => cachedResults[i] === undefined);\n\n let dbDocsById = new Map<string, WithIdAndVersion<T>>();\n if (missIds.length > 0) {\n const dbResult = await query<{ data: T; _version: bigint }>(\n SqlFor.find(\n { _id: { $in: missIds } } as unknown as PongoFilter<T>,\n options,\n ),\n );\n const dbDocs = dbResult.rows.map(rowToDoc);\n dbDocsById = new Map(\n dbDocs.map((d) => [(d as PongoDocument)['_id'] as string, d]),\n );\n const leftovers = missIds.map(\n (id) => [id, dbDocsById.get(id) ?? null] as const,\n );\n await cacheSetMany(\n leftovers.map((d) => d[1]).filter((d) => d !== null),\n options,\n );\n await cacheDeleteMany(\n leftovers.filter(([, doc]) => doc === null).map(([id]) => id),\n options,\n );\n }\n\n return ids.map((id, i) => {\n const cached = cachedResults[i];\n if (cached !== undefined) {\n return cached !== null\n ? (upcast({ ...cached } as unknown as Payload) as WithIdAndVersion<T>)\n : null;\n }\n return dbDocsById.get(id) ?? null;\n });\n };\n\n const findManyByIds = async (\n ids: string[],\n options: FindOptions | undefined,\n ): Promise<WithIdAndVersion<T>[]> => {\n const results = await fetchByIds(ids, options);\n return results.filter((doc): doc is WithIdAndVersion<T> => doc !== null);\n };\n\n const cacheSet = (\n value: WithId<T>,\n options: CollectionOperationOptions | undefined,\n ) => {\n const key = cacheKey(value._id);\n const txCache = txCacheFor(options);\n\n if (txCache) return txCache.set(key, value, { mainCache: cache });\n\n return cache.set(key, value);\n };\n\n const cacheSetMany = (\n documents: WithId<T>[],\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const entries = documents.map((d) => ({ key: cacheKey(d._id), value: d }));\n\n if (txCache) return txCache.setMany(entries, { mainCache: cache });\n return cache.setMany(entries);\n };\n\n const cacheDelete = (\n id: string,\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const key = cacheKey(id);\n\n if (txCache) return txCache.delete(key, { mainCache: cache });\n return cache.delete(key);\n };\n\n const cacheDeleteMany = (\n ids: string[],\n options: CollectionOperationOptions | undefined,\n ) => {\n const txCache = txCacheFor(options);\n const keys = ids.map(cacheKey);\n\n if (txCache) return txCache.deleteMany(keys, { mainCache: cache });\n return cache.deleteMany(keys);\n };\n\n const deleteManyByIds = async (\n ids: Array<{ _id: string; _version?: bigint }>,\n options?: CollectionOperationOptions,\n ): Promise<PongoDeleteResult & { deletedIds: Set<string> }> => {\n await ensureCollectionCreated(options);\n\n const result = await command<{ _id: string; deleted?: number }>(\n SqlFor.deleteManyByIds(ids),\n options,\n );\n\n const deletedIds = new Set(\n result.rows.filter((row) => (row.deleted ?? 1) > 0).map((row) => row._id),\n );\n\n if (!options?.skipCache) {\n await cacheDeleteMany([...deletedIds], options);\n }\n\n return operationResult<PongoDeleteResult & { deletedIds: Set<string> }>(\n {\n successful: deletedIds.size > 0,\n deletedCount: deletedIds.size,\n matchedCount: ids.length,\n deletedIds,\n },\n {\n operationName: 'deleteManyByIds',\n collectionName,\n serializer,\n errors,\n },\n );\n };\n\n const collection: PongoCollection<T> = {\n dbName: db.databaseName,\n collectionName,\n createCollection: async (options?: CollectionOperationOptions) => {\n await createCollection(options);\n },\n insertOne: async (\n document: OptionalUnlessRequiredIdAndVersion<T>,\n options?: InsertOneOptions,\n ): Promise<PongoInsertOneResult> => {\n await ensureCollectionCreated(options);\n\n const _id = (document._id as string | undefined | null) ?? uuid();\n const _version = document._version ?? 1n;\n const downcasted = downcast(document as T);\n\n const result = await command(\n SqlFor.insertOne({\n ...downcasted,\n _id,\n _version,\n } as unknown as OptionalUnlessRequiredIdAndVersion<Payload>),\n options,\n );\n\n const successful = (result.rowCount ?? 0) > 0;\n\n if (successful && !options?.skipCache) {\n const doc = { ...document, _id, _version } as WithId<T>;\n await cacheSet(doc, options);\n }\n\n return operationResult<PongoInsertOneResult>(\n {\n successful,\n insertedId: successful ? _id : null,\n nextExpectedVersion: _version,\n },\n { operationName: 'insertOne', collectionName, serializer, errors },\n );\n },\n insertMany: async (\n documents: OptionalUnlessRequiredIdAndVersion<T>[],\n options?: InsertManyOptions,\n ): Promise<PongoInsertManyResult> => {\n await ensureCollectionCreated(options);\n\n const documentsWithMetadata = documents.map((doc) =>\n doc._id && doc._version\n ? (doc as WithIdAndVersion<T>)\n : ({\n ...doc,\n _id: doc._id ?? uuid(),\n _version: doc._version ?? 1n,\n } as WithIdAndVersion<T>),\n );\n\n const rows = documentsWithMetadata.map((d) => ({\n ...downcast(d as T),\n _id: d._id,\n _version: d._version,\n }));\n\n const result = await command(\n SqlFor.insertMany(\n rows as unknown as OptionalUnlessRequiredIdAndVersion<Payload>[],\n ),\n options,\n );\n\n if (!options?.skipCache) {\n const insertedIdSet = new Set(result.rows.map((d) => d._id as string));\n await cacheSetMany(\n documentsWithMetadata.filter((d) => insertedIdSet.has(d._id)),\n options,\n );\n }\n\n return operationResult<PongoInsertManyResult>(\n {\n successful: result.rowCount === rows.length,\n insertedCount: result.rowCount ?? 0,\n insertedIds: result.rows.map((d) => d._id as string),\n },\n { operationName: 'insertMany', collectionName, serializer, errors },\n );\n },\n updateOne: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateOneOptions,\n ): Promise<PongoUpdateResult> => {\n await ensureCollectionCreated(options);\n\n const result = await command<UpdateSqlResult>(\n SqlFor.updateOne(filter, update, options),\n options,\n );\n\n const opResult = operationResult<PongoUpdateResult>(\n {\n successful:\n result.rows.length > 0 &&\n result.rows[0]!.modified === result.rows[0]!.matched,\n modifiedCount: Number(result.rows[0]?.modified ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n nextExpectedVersion: BigInt(result.rows[0]?.version ?? 0n),\n },\n { operationName: 'updateOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache) {\n const id = idFromFilter(filter);\n if (id) await cacheDelete(id, options);\n }\n\n return opResult;\n },\n replaceOne: async (\n filter: PongoFilter<T>,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<PongoUpdateResult> => {\n await ensureCollectionCreated(options);\n\n const downcasted = downcast(document as T) as unknown as WithoutId<T>;\n\n const result = await command<UpdateSqlResult>(\n SqlFor.replaceOne(filter, downcasted, options),\n options,\n );\n\n const opResult = operationResult<PongoUpdateResult>(\n {\n successful: result.rows.length > 0 && result.rows[0]!.modified > 0,\n modifiedCount: Number(result.rows[0]?.modified ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n nextExpectedVersion: BigInt(result.rows[0]?.version ?? 0n),\n },\n { operationName: 'replaceOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache) {\n const _id = idFromFilter(filter);\n if (_id) {\n await cacheSet(\n {\n ...document,\n _id,\n _version: opResult.nextExpectedVersion,\n } as unknown as WithId<T>,\n options,\n );\n }\n }\n\n return opResult;\n },\n updateMany: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateManyOptions,\n ): Promise<PongoUpdateManyResult> => {\n await ensureCollectionCreated(options);\n\n // TODO: add a similar filter checking if filter is not ids only\n const result = await command(SqlFor.updateMany(filter, update), options);\n\n return operationResult<PongoUpdateManyResult>(\n {\n successful: true,\n modifiedCount: result.rowCount ?? 0,\n matchedCount: result.rowCount ?? 0,\n },\n { operationName: 'updateMany', collectionName, serializer, errors },\n );\n },\n deleteOne: async (\n filter?: PongoFilter<T>,\n options?: DeleteOneOptions,\n ): Promise<PongoDeleteResult> => {\n await ensureCollectionCreated(options);\n\n const result = await command<DeleteSqlResult>(\n SqlFor.deleteOne(filter ?? {}, options),\n options,\n );\n\n const opResult = operationResult<PongoDeleteResult>(\n {\n successful: result.rows.length > 0 && result.rows[0]!.deleted! > 0,\n deletedCount: Number(result.rows[0]?.deleted ?? 0),\n matchedCount: Number(result.rows[0]?.matched ?? 0),\n },\n { operationName: 'deleteOne', collectionName, serializer, errors },\n );\n\n if (opResult.successful && !options?.skipCache && filter) {\n const id = idFromFilter(filter);\n if (id) await cacheDelete(id, options);\n }\n\n return opResult;\n },\n deleteMany: async (\n filter?: PongoFilter<T>,\n options?: DeleteManyOptions,\n ): Promise<PongoDeleteResult> => {\n const ids = filter ? getIdsFromIdOnlyFilter(filter) : null;\n if (ids)\n return deleteManyByIds(\n ids.map((id) => ({ _id: id })),\n options,\n );\n\n await ensureCollectionCreated(options);\n\n const result = await command(SqlFor.deleteMany(filter ?? {}), options);\n\n return operationResult<PongoDeleteResult>(\n {\n successful: (result.rowCount ?? 0) > 0,\n deletedCount: result.rowCount ?? 0,\n matchedCount: result.rowCount ?? 0,\n },\n { operationName: 'deleteMany', collectionName, serializer, errors },\n );\n },\n findOne: async (\n filter?: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const id = filter && !options?.skipCache ? idFromFilter(filter) : null;\n\n if (id) {\n const cached = await resolveFromCache(cacheKey(id), options);\n if (cached !== undefined)\n return cached !== null\n ? (upcast({\n ...cached,\n } as unknown as Payload) as WithIdAndVersion<T>)\n : null;\n\n const doc = await findOneFromDb(filter!, options);\n if (doc) await cacheSet(doc, options);\n else await cacheDelete(id, options);\n return doc;\n }\n\n return findOneFromDb(filter ?? {}, options);\n },\n findOneAndDelete: async (\n filter: PongoFilter<T>,\n options?: DeleteOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.deleteOne(filter, options);\n return existingDoc;\n },\n findOneAndReplace: async (\n filter: PongoFilter<T>,\n replacement: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.replaceOne(filter, replacement, options);\n return existingDoc;\n },\n findOneAndUpdate: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateOneOptions,\n ): Promise<WithIdAndVersion<T> | null> => {\n await ensureCollectionCreated(options);\n\n const existingDoc = await collection.findOne(filter, options);\n\n if (existingDoc === null) return null;\n\n await collection.updateOne(filter, update, options);\n return existingDoc;\n },\n replaceMany: async (\n documents: Array<WithIdAndVersion<T> | WithId<T>>,\n options?: ReplaceManyOptions,\n ): Promise<PongoReplaceManyResult> => {\n await ensureCollectionCreated(options);\n\n const downcasted = documents.map(\n (d) => downcast(d as T) as WithIdAndVersion<T>,\n );\n\n const result = await command<{\n _id: string;\n version?: bigint | string | number;\n }>(SqlFor.replaceMany(downcasted), options);\n\n const modifiedIds = result.rows.map((row) => row._id);\n const conflictIds = documents\n .map((d) => d._id)\n .filter((id) => !modifiedIds.includes(id));\n const versions = new Map<string, bigint>(\n result.rows.map((row) => [row._id, BigInt(row.version ?? 1n)]),\n );\n\n if (!options?.skipCache) {\n const cacheEntries = documents\n .filter((d) => modifiedIds.includes(d._id))\n .map((doc) =>\n doc._version\n ? doc\n : {\n ...doc,\n _version: versions.get(doc._id) ?? 1n,\n },\n );\n if (cacheEntries.length > 0) await cacheSetMany(cacheEntries, options);\n\n if (conflictIds.length > 0)\n await cacheDeleteMany([...conflictIds], options);\n }\n\n return operationResult<PongoReplaceManyResult>(\n {\n successful: modifiedIds.length > 0 && conflictIds.length === 0,\n modifiedCount: modifiedIds.length,\n matchedCount: documents.length,\n modifiedIds: [...modifiedIds],\n conflictIds: [...conflictIds],\n nextExpectedVersions: versions,\n },\n { operationName: 'replaceMany', collectionName, serializer, errors },\n );\n },\n handle: DocumentCommandHandler<T>({\n collectionName,\n serializer,\n errors,\n storage: {\n ensureCollectionCreated,\n fetchByIds,\n insertMany: (docs, options) => collection.insertMany(docs, options),\n replaceMany: (docs, options) => collection.replaceMany(docs, options),\n deleteManyByIds,\n },\n }),\n find: async (\n filter?: PongoFilter<T>,\n options?: FindOptions,\n ): Promise<WithIdAndVersion<T>[]> => {\n await ensureCollectionCreated(options);\n\n if (!options?.skipCache && filter) {\n const ids = getIdsFromIdOnlyFilter(filter);\n if (ids && ids.length > 0) return findManyByIds(ids, options);\n }\n\n const result = await query<{ data: T; _version: bigint }>(\n SqlFor.find(filter ?? {}, options),\n );\n return result.rows.map(rowToDoc);\n },\n countDocuments: async (\n filter?: PongoFilter<T>,\n options?: CollectionOperationOptions,\n ): Promise<number> => {\n await ensureCollectionCreated(options);\n\n const { count } = await single(\n query<{ count: number }>(SqlFor.countDocuments(filter ?? {})),\n );\n return count;\n },\n drop: async (options?: CollectionOperationOptions): Promise<boolean> => {\n await ensureCollectionCreated(options);\n const result = await command(SqlFor.drop());\n return (result?.rowCount ?? 0) > 0;\n },\n rename: async (\n newName: string,\n options?: CollectionOperationOptions,\n ): Promise<PongoCollection<T>> => {\n await ensureCollectionCreated(options);\n await command(SqlFor.rename(newName));\n collectionName = newName;\n return collection as unknown as PongoCollection<T>;\n },\n close: () => cache.close(),\n\n sql: {\n async query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<Result[]> {\n await ensureCollectionCreated(options);\n\n const result = await query<Result>(sql, options);\n return result.rows;\n },\n async command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<QueryResult<Result>> {\n await ensureCollectionCreated(options);\n\n return command(sql, options);\n },\n },\n schema: {\n component: schemaComponent,\n migrate: (options?: PongoMigrationOptions) =>\n runSQLMigrations(pool, schemaComponent.migrations, options),\n },\n };\n\n return collection as unknown as PongoCollection<T>;\n};\n\ntype UpdateSqlResult = {\n matched: bigint;\n modified: bigint;\n version: bigint;\n};\n\ntype DeleteSqlResult = {\n matched: bigint | null;\n deleted: bigint | null;\n};\n","import {\n schemaComponent,\n type DatabaseDriverType,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '@event-driven-io/dumbo';\nimport type { PongoCollectionSchema, PongoCollectionSQLBuilder } from '..';\n\nexport type PongoCollectionURNType = 'sc:pongo:collection';\nexport type PongoCollectionURN = `${PongoCollectionURNType}:${string}`;\n\nexport type PongoCollectionSchemaComponent =\n SchemaComponent<PongoCollectionURN> & {\n collectionName: string;\n definition: PongoCollectionSchema;\n sqlBuilder: PongoCollectionSQLBuilder;\n };\n\nexport type PongoCollectionSchemaComponentOptions<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = Readonly<{\n driverType: DriverType;\n definition: PongoCollectionSchema;\n migrationsOrSchemaComponents: SchemaComponentOptions;\n sqlBuilder: PongoCollectionSQLBuilder;\n}>;\n\nexport const PongoCollectionSchemaComponent = <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>({\n definition,\n migrationsOrSchemaComponents,\n sqlBuilder,\n}: PongoCollectionSchemaComponentOptions<DriverType>): PongoCollectionSchemaComponent =>\n ({\n ...schemaComponent(\n `sc:pongo:collection:${definition.name}`,\n migrationsOrSchemaComponents,\n ),\n sqlBuilder,\n definition,\n collectionName: definition.name,\n }) as PongoCollectionSchemaComponent;\n","export const QueryOperators = {\n $eq: '$eq',\n $gt: '$gt',\n $gte: '$gte',\n $lt: '$lt',\n $lte: '$lte',\n $ne: '$ne',\n $in: '$in',\n $nin: '$nin',\n $elemMatch: '$elemMatch',\n $all: '$all',\n $size: '$size',\n};\n\nexport const OperatorMap = {\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n $ne: '!=',\n};\n\nexport const isOperator = (key: string) => key.startsWith('$');\n\nexport const hasOperators = (value: Record<string, unknown>) =>\n Object.keys(value).some(isOperator);\n","import {\n getDatabaseMetadata,\n type DatabaseDriverType,\n type JSONSerializationOptions,\n type MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport type { PongoDatabaseFactoryOptions, PongoDriver } from '../drivers';\nimport type { PongoClientSchema, PongoCollectionSchema } from '../schema';\nimport type { PongoDb } from '../typing';\n\nexport const PongoDatabaseCache = <\n Database extends PongoDb<DatabaseDriverType> = PongoDb<DatabaseDriverType>,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n>({\n driver,\n typedSchema,\n}: {\n driver: PongoDriver<Database>;\n typedSchema?: TypedClientSchema | undefined;\n}) => {\n const dbClients = new Map<string, PongoDb>();\n\n const getDatabaseDefinition = (dbName: string | undefined) =>\n Object.values(typedSchema?.dbs ?? {}).find((d) => d.name === dbName);\n\n return {\n getOrCreate: <\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n >(\n createOptions: Omit<\n PongoDatabaseFactoryOptions<CollectionsSchema>,\n 'schema'\n > &\n JSONSerializationOptions & {\n schema?: {\n autoMigration?: MigrationStyle;\n };\n },\n ): Database => {\n const metadata = getDatabaseMetadata(driver.driverType);\n const dbName =\n createOptions.databaseName ??\n metadata?.parseDatabaseName?.(\n 'connectionString' in createOptions\n ? (createOptions.connectionString as string)\n : undefined,\n ) ??\n 'db:default';\n\n const existing = dbClients.get(dbName);\n if (existing) return existing as Database;\n\n const definition = getDatabaseDefinition(createOptions.databaseName);\n\n const newDb: Database = driver.databaseFactory({\n ...createOptions,\n databaseName: dbName,\n schema: {\n ...createOptions.schema,\n ...(definition ? { definition } : {}),\n },\n });\n dbClients.set(dbName, newDb);\n return newDb as unknown as Database;\n },\n\n all: (): Database[] => Array.from(dbClients.values()) as Database[],\n\n forAll: (func: (db: Database) => Promise<void>): Promise<void[]> => {\n return Promise.all(\n Array.from(dbClients.values())\n .map((v) => v as Database)\n .map(func),\n );\n },\n };\n};\n","import {\n schemaComponent,\n type DatabaseDriverType,\n type SchemaComponent,\n} from '@event-driven-io/dumbo';\nimport type { PongoCollectionSchemaComponent } from '../collection';\nimport type { PongoCollectionSQLBuilder } from '../collection';\nimport {\n pongoSchema,\n type PongoCollectionSchema,\n type PongoDbSchema,\n} from '../schema';\nimport type { PongoDocument } from '../typing';\n\nexport type PongoDatabaseURNType = 'sc:dumbo:database';\nexport type PongoDatabaseURN = `${PongoDatabaseURNType}:${string}`;\n\nexport type PongoDatabaseSchemaComponent<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = SchemaComponent<PongoDatabaseURN> & {\n definition: PongoDbSchema<T>;\n collections: ReadonlyArray<PongoCollectionSchemaComponent>;\n\n collection: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => PongoCollectionSchemaComponent;\n};\n\nexport type PongoDatabaseSchemaComponentOptions<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = Readonly<{\n driverType: DriverType;\n definition: PongoDbSchema<T>;\n collectionFactory: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => PongoCollectionSchemaComponent;\n}>;\n\nexport const PongoDatabaseSchemaComponent = <\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n>({\n definition,\n collectionFactory,\n}: PongoDatabaseSchemaComponentOptions<DriverType>): PongoDatabaseSchemaComponent => {\n const collections: PongoCollectionSchemaComponent[] =\n Object.values(definition.collections).map(collectionFactory) ?? [];\n\n return {\n ...schemaComponent(`sc:dumbo:database:${definition.name}`, {\n components: collections,\n }),\n definition,\n collections,\n\n collection: <T extends PongoDocument = PongoDocument>(\n schema: PongoCollectionSchema<T>,\n ) => {\n const existing = collections.find(\n (c) => c.collectionName === schema.name,\n );\n\n if (existing) return existing;\n\n const newCollection = collectionFactory(\n pongoSchema.collection(schema.name),\n );\n collections.push(newCollection);\n definition.collections[schema.name] = schema;\n return newCollection;\n },\n };\n};\n\nexport type PongoDatabaseSQLBuilder<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = {\n driverType: DriverType;\n collection: PongoCollectionSQLBuilder;\n};\n","type Entry<T> = {\n [K in keyof Required<T>]: [K, Required<T>[K]];\n}[keyof Required<T>];\n\ntype IterableEntry<T> = Entry<T> & {\n [Symbol.iterator](): Iterator<Entry<T>>;\n};\n\nexport const objectEntries = <T extends object>(obj: T): IterableEntry<T>[] =>\n Object.entries(obj).map(([key, value]) => [key as keyof T, value]);\n\nexport type NonPartial<T> = { [K in keyof Required<T>]: T[K] };\n","import type {\n AnyConnection,\n DatabaseDriverType,\n DatabaseTransaction,\n JSONSerializationOptions,\n JSONSerializer,\n MigrationStyle,\n QueryResult,\n QueryResultRow,\n RunSQLMigrationsResult,\n SQL,\n SQLCommandOptions,\n SQLExecutor,\n SQLQueryOptions,\n WithDatabaseTransactionFactory,\n} from '@event-driven-io/dumbo';\nimport { v7 as uuid } from 'uuid';\nimport type { MaybePromise } from '.';\nimport type { CacheConfig, PongoCache, PongoTransactionCache } from '../cache';\nimport type {\n DocumentCommandHandlerInput,\n PongoCollectionSchemaComponent,\n} from '../collection';\nimport type { PongoDatabaseSchemaComponent } from '../database/pongoDatabaseSchemaComponent';\nimport type { AnyPongoDriver, ExtractPongoDriverOptions } from '../drivers';\nimport { ConcurrencyError } from '../errors';\nimport type { PongoClientSchema } from '../schema';\n\nexport interface PongoClient<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> {\n driverType: DriverType;\n\n connect(): Promise<this>;\n\n close(): Promise<void>;\n\n db(dbName?: string, options?: PongoDbOptions): Database;\n\n startSession(): PongoSession<DriverType>;\n\n withSession<T = unknown>(\n callback: (session: PongoSession<DriverType>) => Promise<T>,\n ): Promise<T>;\n}\n\nexport type PongoClientOptions<\n DatabaseDriver extends AnyPongoDriver = AnyPongoDriver,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n> =\n ExtractPongoDriverOptions<DatabaseDriver> extends infer Options\n ? Options extends unknown\n ? {\n driver: DatabaseDriver;\n schema?:\n | { autoMigration?: MigrationStyle; definition?: TypedClientSchema }\n | undefined;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | PongoCache | undefined;\n } & JSONSerializationOptions &\n Omit<Options, 'driver'>\n : never\n : never;\n\nexport declare interface PongoTransactionOptions {\n get snapshotEnabled(): boolean;\n maxCommitTimeMS?: number;\n}\n\nexport interface PongoDbTransaction<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> {\n get databaseName(): string | null;\n options: PongoTransactionOptions;\n enlistDatabase: (\n database: Database,\n ) => Promise<DatabaseTransaction<AnyConnection>>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n get cache(): PongoTransactionCache | null;\n get sqlExecutor(): SQLExecutor;\n get isStarting(): boolean;\n get isActive(): boolean;\n get isCommitted(): boolean;\n}\n\nexport interface PongoSession<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> {\n hasEnded: boolean;\n explicit: boolean;\n defaultTransactionOptions: PongoTransactionOptions;\n transaction: PongoDbTransaction<DriverType> | null;\n get snapshotEnabled(): boolean;\n\n endSession(): Promise<void>;\n incrementTransactionNumber(): void;\n inTransaction(): boolean;\n startTransaction(options?: PongoTransactionOptions): void;\n commitTransaction(): Promise<void>;\n abortTransaction(): Promise<void>;\n withTransaction<T = unknown>(\n fn: (session: PongoSession<DriverType>) => Promise<T>,\n options?: PongoTransactionOptions,\n ): Promise<T>;\n}\n\nexport type PongoDBCollectionOptions<\n T extends PongoDocument,\n Payload extends PongoDocument = T,\n> = {\n schema?: {\n versioning?: {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n };\n };\n errors?: { throwOnOperationFailures?: boolean };\n cache?: CacheConfig | 'disabled' | PongoCache;\n};\n\nexport type PongoDbOptions = {\n cache?: CacheConfig | PongoCache;\n};\n\nexport interface PongoDb<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> extends WithDatabaseTransactionFactory<AnyConnection> {\n driverType: DriverType;\n databaseName: string;\n connect(): Promise<void>;\n close(): Promise<void>;\n collection<T extends PongoDocument, Payload extends PongoDocument = T>(\n name: string,\n options?: PongoDBCollectionOptions<T, Payload>,\n ): PongoCollection<T>;\n collections(): ReadonlyArray<PongoCollection<PongoDocument>>;\n readonly schema: Readonly<{\n component: PongoDatabaseSchemaComponent<DriverType>;\n migrate(options?: PongoMigrationOptions): Promise<RunSQLMigrationsResult>;\n }>;\n sql: {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ): Promise<Result[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n };\n}\n\nexport type AnyPongoDb = PongoDb<DatabaseDriverType>;\n\nexport type PongoMigrationOptions = {\n dryRun?: boolean | undefined;\n ignoreMigrationHashMismatch?: boolean | undefined;\n migrationTimeoutMs?: number | undefined;\n};\n\nexport type CollectionOperationOptions = {\n session?: PongoSession;\n skipCache?: boolean;\n};\n\nexport type InsertOneOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type InsertManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type UpdateOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type UpdateManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type HandleOptions = CollectionOperationOptions;\n\nexport type BatchHandleOptions = {\n parallel?: boolean;\n} & CollectionOperationOptions;\n\nexport type ReplaceOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type DeleteOneOptions = {\n expectedVersion?: Exclude<ExpectedDocumentVersion, 'DOCUMENT_DOES_NOT_EXIST'>;\n} & CollectionOperationOptions;\n\nexport type ReplaceManyOptions = CollectionOperationOptions;\n\nexport type DeleteManyOptions = {\n expectedVersion?: Extract<\n ExpectedDocumentVersion,\n 'DOCUMENT_EXISTS' | 'NO_CONCURRENCY_CHECK'\n >;\n} & CollectionOperationOptions;\n\nexport type FindOptions = {\n limit?: number;\n skip?: number;\n} & CollectionOperationOptions;\n\nexport interface PongoCollection<T extends PongoDocument> {\n readonly dbName: string;\n readonly collectionName: string;\n createCollection(options?: CollectionOperationOptions): Promise<void>;\n insertOne(\n document: OptionalUnlessRequiredId<T>,\n options?: InsertOneOptions,\n ): Promise<PongoInsertOneResult>;\n insertMany(\n documents: OptionalUnlessRequiredId<T>[],\n options?: CollectionOperationOptions,\n ): Promise<PongoInsertManyResult>;\n updateOne(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): Promise<PongoUpdateResult>;\n replaceOne(\n filter: PongoFilter<T> | SQL,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<PongoUpdateResult>;\n updateMany(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateManyOptions,\n ): Promise<PongoUpdateManyResult>;\n deleteOne(\n filter?: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): Promise<PongoDeleteResult>;\n deleteMany(\n filter?: PongoFilter<T> | SQL,\n options?: DeleteManyOptions,\n ): Promise<PongoDeleteResult>;\n findOne(\n filter?: PongoFilter<T> | SQL,\n options?: CollectionOperationOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n find(\n filter?: PongoFilter<T> | SQL,\n options?: FindOptions,\n ): Promise<WithIdAndVersion<T>[]>;\n findOneAndDelete(\n filter: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n findOneAndReplace(\n filter: PongoFilter<T> | SQL,\n replacement: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n findOneAndUpdate(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): Promise<WithIdAndVersion<T> | null>;\n countDocuments(\n filter?: PongoFilter<T> | SQL,\n options?: CollectionOperationOptions,\n ): Promise<number>;\n drop(options?: CollectionOperationOptions): Promise<boolean>;\n rename(\n newName: string,\n options?: CollectionOperationOptions,\n ): Promise<PongoCollection<T>>;\n handle(\n id: string | DocumentCommandHandlerInput,\n handle: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>>;\n handle(\n id: string[] | DocumentCommandHandlerInput[],\n handle: DocumentHandler<T>,\n options?: BatchHandleOptions,\n ): Promise<PongoHandleResult<T>[]>;\n replaceMany(\n documents: Array<WithId<T> | WithIdAndVersion<T>>,\n options?: ReplaceManyOptions,\n ): Promise<PongoReplaceManyResult>;\n readonly schema: Readonly<{\n component: PongoCollectionSchemaComponent;\n migrate(options?: PongoMigrationOptions): Promise<RunSQLMigrationsResult>;\n }>;\n close: () => MaybePromise<void>;\n sql: {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<Result[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions,\n ): Promise<QueryResult<Result>>;\n };\n}\n\nexport type ObjectId = string & { __brandId: 'ObjectId' };\nexport const ObjectId = (value?: string) => value ?? uuid();\n\nexport type HasId = { _id: string };\n\nexport declare type InferIdType<TSchema> = TSchema extends {\n _id: infer IdType;\n}\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<any, never> extends IdType\n ? never\n : IdType\n : TSchema extends {\n _id?: infer IdType;\n }\n ? unknown extends IdType\n ? ObjectId\n : IdType\n : ObjectId;\n\n/** TypeScript Omit (Exclude to be specific) does not work for objects with an \"any\" indexed type, and breaks discriminated unions @public */\nexport declare type EnhancedOmit<TRecordOrUnion, KeyUnion> =\n string extends keyof TRecordOrUnion\n ? TRecordOrUnion\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TRecordOrUnion extends any\n ? Pick<TRecordOrUnion, Exclude<keyof TRecordOrUnion, KeyUnion>>\n : never;\n\nexport declare type OptionalUnlessRequiredId<TSchema> = TSchema extends {\n _id: string | ObjectId;\n}\n ? TSchema\n : OptionalId<TSchema>;\n\nexport declare type OptionalUnlessRequiredVersion<TSchema> = TSchema extends {\n _version: bigint;\n}\n ? TSchema\n : OptionalVersion<TSchema>;\n\nexport declare type OptionalUnlessRequiredIdAndVersion<TSchema> =\n OptionalUnlessRequiredId<TSchema> & OptionalUnlessRequiredVersion<TSchema>;\n\nexport declare type WithId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id: string | ObjectId;\n};\nexport type WithoutId<T> = Omit<T, '_id'>;\n\nexport declare type WithVersion<TSchema> = EnhancedOmit<TSchema, '_version'> & {\n _version: bigint;\n};\nexport type WithoutVersion<T> = Omit<T, '_version'>;\n\nexport type WithIdAndVersion<T> = WithId<T> & WithVersion<T>;\nexport type WithoutIdAndVersion<T> = WithoutId<WithoutVersion<T>>;\n\n/** @public */\nexport declare type RegExpOrString<T> = T extends string ? RegExp | T : T;\n\nexport declare interface Document {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport declare type OptionalId<TSchema> = EnhancedOmit<TSchema, '_id'> & {\n _id?: string | ObjectId;\n};\nexport declare type OptionalVersion<TSchema> = EnhancedOmit<\n TSchema,\n '_version'\n> & {\n _version?: bigint;\n};\n\nexport declare interface ObjectIdLike {\n __id?: string | ObjectId;\n}\n\nexport declare type NonObjectIdLikeDocument = {\n [key in keyof ObjectIdLike]?: never;\n} & Document;\n\nexport declare type AlternativeType<T> =\n T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\n\nexport declare type Condition<T> =\n | AlternativeType<T>\n | PongoFilterOperator<AlternativeType<T>>;\n\nexport declare type PongoFilter<TSchema> =\n | {\n [P in keyof WithId<TSchema>]?: Condition<WithId<TSchema>[P]>;\n }\n | HasId; // TODO: & RootFilterOperators<WithId<TSchema>>;\n\nexport declare interface RootFilterOperators<TSchema> extends Document {\n $and?: PongoFilter<TSchema>[];\n $nor?: PongoFilter<TSchema>[];\n $or?: PongoFilter<TSchema>[];\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: TSchema) => boolean);\n $comment?: string | Document;\n}\n\nexport declare interface PongoFilterOperator<\n TValue,\n> extends NonObjectIdLikeDocument {\n $eq?: TValue;\n $gt?: TValue;\n $gte?: TValue;\n $lt?: TValue;\n $lte?: TValue;\n $ne?: TValue;\n $in?: TValue[];\n $nin?: TValue[];\n // $eq?: TValue;\n // $gt?: TValue;\n // $gte?: TValue;\n // $in?: ReadonlyArray<TValue>;\n // $lt?: TValue;\n // $lte?: TValue;\n // $ne?: TValue;\n // $nin?: ReadonlyArray<TValue>;\n // $not?: TValue extends string ? FilterOperators<TValue> | RegExp : FilterOperators<TValue>;\n // /**\n // * When `true`, `$exists` matches the documents that contain the field,\n // * including documents where the field value is null.\n // */\n // $exists?: boolean;\n // $type?: BSONType | BSONTypeAlias;\n // $expr?: Record<string, any>;\n // $jsonSchema?: Record<string, any>;\n // $mod?: TValue extends number ? [number, number] : never;\n // $regex?: TValue extends string ? RegExp | BSONRegExp | string : never;\n // $options?: TValue extends string ? string : never;\n // $geoIntersects?: {\n // $geometry: Document;\n // };\n // $geoWithin?: Document;\n // $near?: Document;\n // $nearSphere?: Document;\n // $maxDistance?: number;\n // $all?: ReadonlyArray<any>;\n // $elemMatch?: Document;\n // $size?: TValue extends ReadonlyArray<any> ? number : never;\n // $bitsAllClear?: BitwiseFilter;\n // $bitsAllSet?: BitwiseFilter;\n // $bitsAnyClear?: BitwiseFilter;\n // $bitsAnySet?: BitwiseFilter;\n // $rand?: Record<string, never>;\n}\n\nexport type $set<T> = Partial<T>;\nexport type $unset<T> = { [P in keyof T]?: '' };\nexport type $inc<T> = { [P in keyof T]?: number | bigint };\nexport type $push<T> = { [P in keyof T]?: T[P] };\n\nexport type ExpectedDocumentVersionGeneral =\n | 'DOCUMENT_EXISTS'\n | 'DOCUMENT_DOES_NOT_EXIST'\n | 'NO_CONCURRENCY_CHECK';\n\nexport type ExpectedDocumentVersionValue = bigint & { __brand: 'sql' };\n\nexport type ExpectedDocumentVersion =\n | (bigint & { __brand: 'sql' })\n | bigint\n | ExpectedDocumentVersionGeneral;\n\nexport const DOCUMENT_EXISTS =\n 'DOCUMENT_EXISTS' as ExpectedDocumentVersionGeneral;\nexport const DOCUMENT_DOES_NOT_EXIST =\n 'DOCUMENT_DOES_NOT_EXIST' as ExpectedDocumentVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedDocumentVersionGeneral;\n\nexport const isGeneralExpectedDocumentVersion = (\n version: ExpectedDocumentVersion,\n): version is ExpectedDocumentVersionGeneral =>\n version === 'DOCUMENT_DOES_NOT_EXIST' ||\n version === 'DOCUMENT_EXISTS' ||\n version === 'NO_CONCURRENCY_CHECK';\n\nexport const expectedVersionValue = (\n version: ExpectedDocumentVersion | undefined,\n): ExpectedDocumentVersionValue | null =>\n version === undefined || isGeneralExpectedDocumentVersion(version)\n ? null\n : (version as ExpectedDocumentVersionValue);\n\nexport const expectedVersion = (\n version: number | bigint | string | undefined | null,\n): ExpectedDocumentVersion => {\n return version\n ? (BigInt(version) as ExpectedDocumentVersion)\n : NO_CONCURRENCY_CHECK;\n};\n\nexport type PongoUpdate<T> = {\n $set?: Partial<T>;\n $unset?: $unset<T>;\n $inc?: $inc<T>;\n $push?: $push<T>;\n};\n\nexport type OperationResult = {\n acknowledged: boolean;\n successful: boolean;\n\n assertSuccessful: (errorMessage?: string) => void;\n};\n\nexport const operationResult = <T extends OperationResult>(\n result: Omit<T, 'assertSuccess' | 'acknowledged' | 'assertSuccessful'>,\n options: {\n operationName: string;\n collectionName: string;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n },\n): T => {\n const operationResult: T = {\n ...result,\n acknowledged: true,\n successful: result.successful,\n assertSuccessful: (errorMessage?: string) => {\n const { successful } = result;\n const { operationName, collectionName } = options;\n\n if (!successful)\n throw new ConcurrencyError(\n errorMessage ??\n `${operationName} on ${collectionName} failed. Expected document state does not match current one! Result: ${options.serializer.serialize(result)}!`,\n );\n },\n } as T;\n\n if (options.errors?.throwOnOperationFailures)\n operationResult.assertSuccessful();\n\n return operationResult;\n};\n\nexport interface PongoInsertOneResult extends OperationResult {\n insertedId: string | null;\n nextExpectedVersion: bigint;\n}\n\nexport interface PongoInsertManyResult extends OperationResult {\n insertedIds: string[];\n insertedCount: number;\n}\n\nexport interface PongoUpdateResult extends OperationResult {\n matchedCount: number;\n modifiedCount: number;\n nextExpectedVersion: bigint;\n}\n\nexport interface PongoUpdateManyResult extends OperationResult {\n matchedCount: number;\n modifiedCount: number;\n}\n\nexport interface PongoDeleteResult extends OperationResult {\n matchedCount: number;\n deletedCount: number;\n}\n\nexport interface PongoDeleteManyResult extends OperationResult {\n deletedCount: number;\n}\n\nexport interface PongoReplaceManyResult extends OperationResult {\n modifiedCount: number;\n matchedCount: number;\n modifiedIds: string[];\n conflictIds: string[];\n nextExpectedVersions: Map<string, bigint>;\n}\n\nexport type PongoHandleResult<T> =\n | (PongoInsertOneResult & { document: T })\n | (PongoUpdateResult & { document: T })\n | (PongoDeleteResult & { document: null })\n | (OperationResult & { document: null });\n\nexport type PongoDocument = Record<string, unknown>;\n\nexport type DocumentHandler<T extends PongoDocument> =\n | ((document: T | null, id: string) => T | null)\n | ((document: T | null, id: string) => Promise<T | null>);\n","export const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\nexport class PongoError extends Error {\n public errorCode: number;\n\n constructor(\n options?: { errorCode: number; message?: string } | string | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : 500;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during Pongo processing`;\n\n super(message);\n this.errorCode = errorCode;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, PongoError.prototype);\n }\n}\n\nexport class ConcurrencyError extends PongoError {\n constructor(message?: string) {\n super({\n errorCode: 412,\n message: message ?? `Expected document state does not match current one!`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n","import type { DatabaseDriverType } from '@event-driven-io/dumbo';\nimport {\n type Document,\n type PongoClient,\n type PongoCollection,\n type PongoDb,\n type PongoDocument,\n objectEntries,\n} from '../typing';\n\nexport interface PongoCollectionSchema<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n T extends PongoDocument = PongoDocument,\n> {\n name: string;\n}\n\n// Database schema interface\nexport interface PongoDbSchema<\n T extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> {\n name?: string;\n collections: T;\n}\n\nexport interface PongoClientSchema<\n T extends Record<string, PongoDbSchema> = Record<string, PongoDbSchema>,\n> {\n dbs: T;\n}\n\nexport type CollectionsMap<T extends Record<string, PongoCollectionSchema>> = {\n [K in keyof T]: PongoCollection<\n T[K] extends PongoCollectionSchema<infer U> ? U : PongoDocument\n >;\n};\n\nexport type PongoDbWithSchema<\n T extends Record<string, PongoCollectionSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n> = CollectionsMap<T> & PongoDb<DriverType>;\n\nexport type DBsMap<\n T extends Record<string, PongoDbSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> = {\n [K in keyof T]: CollectionsMap<T[K]['collections']> & Database;\n};\n\nexport type PongoClientWithSchema<\n T extends PongoClientSchema,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n> = DBsMap<T['dbs'], DriverType, Database> & PongoClient<DriverType, Database>;\n\nconst pongoCollectionSchema = <T extends PongoDocument>(\n name: string,\n): PongoCollectionSchema<T> => ({\n name,\n});\n\npongoCollectionSchema.from = (\n collectionNames: string[],\n): Record<string, PongoCollectionSchema> =>\n collectionNames.reduce(\n (acc, collectionName) => (\n (acc[collectionName] = pongoSchema.collection(collectionName)),\n acc\n ),\n {} as Record<string, PongoCollectionSchema>,\n );\n\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n collections: T,\n): PongoDbSchema<T>;\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n name: string,\n collections: T,\n): PongoDbSchema<T>;\nfunction pongoDbSchema<T extends Record<string, PongoCollectionSchema>>(\n nameOrCollections: string | T,\n collections?: T,\n): PongoDbSchema<T> {\n if (collections === undefined) {\n if (typeof nameOrCollections === 'string') {\n throw new Error('You need to provide colleciton definition');\n }\n return {\n collections: nameOrCollections,\n };\n }\n\n return nameOrCollections && typeof nameOrCollections === 'string'\n ? {\n name: nameOrCollections,\n collections,\n }\n : { collections: collections };\n}\n\npongoDbSchema.from = (\n databaseName: string | undefined,\n collectionNames: string[],\n): PongoDbSchema =>\n databaseName\n ? pongoDbSchema(databaseName, pongoCollectionSchema.from(collectionNames))\n : pongoDbSchema(pongoCollectionSchema.from(collectionNames));\n\nconst pongoClientSchema = <T extends Record<string, PongoDbSchema>>(\n dbs: T,\n): PongoClientSchema<T> => ({\n dbs,\n});\n\nexport const pongoSchema = {\n client: pongoClientSchema,\n db: pongoDbSchema,\n collection: pongoCollectionSchema,\n};\n\n// Factory function to create DB instances\nexport const proxyPongoDbWithSchema = <\n Collections extends Record<string, PongoCollectionSchema>,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n>(\n pongoDb: Database,\n dbSchema: PongoDbSchema<Collections>,\n collections: Map<string, PongoCollection<Document>>,\n): PongoDbWithSchema<Collections, DriverType> & Database => {\n const collectionNames = Object.keys(dbSchema.collections);\n\n for (const collectionName of collectionNames) {\n collections.set(collectionName, pongoDb.collection(collectionName));\n }\n\n return new Proxy(\n pongoDb as Database & {\n [key: string]: unknown;\n },\n {\n get(target, prop: string) {\n return collections.get(prop) ?? target[prop];\n },\n },\n ) as PongoDbWithSchema<Collections, DriverType> & Database;\n};\n\nexport const proxyClientWithSchema = <\n TypedClientSchema extends PongoClientSchema,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n Database extends PongoDb<DriverType> = PongoDb<DriverType>,\n>(\n client: PongoClient<DriverType, Database>,\n schema: TypedClientSchema | undefined,\n): PongoClientWithSchema<TypedClientSchema, DriverType, Database> => {\n if (!schema)\n return client as PongoClientWithSchema<\n TypedClientSchema,\n DriverType,\n Database\n >;\n\n const dbNames = Object.keys(schema.dbs);\n\n return new Proxy(\n client as PongoClient<DriverType, Database> & {\n [key: string]: unknown;\n },\n {\n get(target, prop: string) {\n if (dbNames.includes(prop)) return client.db(schema.dbs[prop]?.name);\n\n return target[prop];\n },\n },\n ) as PongoClientWithSchema<TypedClientSchema, DriverType, Database>;\n};\n\nexport type PongoCollectionSchemaMetadata = {\n name: string;\n};\n\nexport type PongoDbSchemaMetadata = {\n name?: string | undefined;\n collections: PongoCollectionSchemaMetadata[];\n};\n\nexport type PongoClientSchemaMetadata = {\n databases: PongoDbSchemaMetadata[];\n database: (name?: string) => PongoDbSchemaMetadata | undefined;\n};\n\nexport const toDbSchemaMetadata = <TypedDbSchema extends PongoDbSchema>(\n schema: TypedDbSchema,\n): PongoDbSchemaMetadata => ({\n name: schema.name,\n collections: objectEntries(schema.collections).map((c) => ({\n name: c[1].name,\n })),\n});\n\nexport const toClientSchemaMetadata = <\n TypedClientSchema extends PongoClientSchema,\n>(\n schema: TypedClientSchema,\n): PongoClientSchemaMetadata => {\n const databases = objectEntries(schema.dbs).map((e) =>\n toDbSchemaMetadata(e[1]),\n );\n\n return {\n databases,\n database: (name) => databases.find((db) => db.name === name),\n };\n};\n\nexport interface PongoSchemaConfig<\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n> {\n schema: TypedClientSchema;\n}\n","import type { JSONSerializer, SQL } from '@event-driven-io/dumbo';\nimport {\n runSQLMigrations,\n type DatabaseDriverType,\n type Dumbo,\n type MigrationStyle,\n type QueryResult,\n type QueryResultRow,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '@event-driven-io/dumbo';\nimport { pongoCache, type CacheConfig, type PongoCache } from '../cache';\nimport { pongoCollection, transactionExecutorOrDefault } from '../collection';\nimport {\n pongoSchema,\n proxyPongoDbWithSchema,\n type PongoCollectionSchema,\n type PongoDbSchema,\n} from '../schema';\nimport type {\n AnyPongoDb,\n CollectionOperationOptions,\n Document,\n PongoCollection,\n PongoDb,\n PongoDBCollectionOptions,\n PongoMigrationOptions,\n} from '../typing';\nimport type { PongoDatabaseSchemaComponent } from './pongoDatabaseSchemaComponent';\n\nexport type PongoDatabaseOptions<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DumboType extends Dumbo<DatabaseDriverType, any> = Dumbo<\n DatabaseDriverType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >,\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n> = {\n databaseName: string;\n pool: DumboType;\n serializer: JSONSerializer;\n schemaComponent: PongoDatabaseSchemaComponent<DumboType['driverType']>;\n schema?:\n | {\n autoMigration?: MigrationStyle;\n definition?: PongoDbSchema<CollectionsSchema>;\n }\n | undefined;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n};\n\nexport const PongoDatabase = <\n Database extends AnyPongoDb = AnyPongoDb,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DumboType extends Dumbo<Database['driverType'], any> = Dumbo<\n Database['driverType'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >,\n>(\n options: PongoDatabaseOptions<DumboType>,\n): Database => {\n const {\n databaseName,\n schemaComponent,\n pool,\n cache: cacheOptions,\n serializer,\n } = options;\n\n const cache =\n cacheOptions === 'disabled' || cacheOptions === undefined\n ? 'disabled'\n : pongoCache(cacheOptions);\n\n const collections = new Map<string, PongoCollection<Document>>();\n\n const command = async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ) =>\n (\n await transactionExecutorOrDefault(db, options, pool.execute)\n ).command<Result>(sql, options);\n\n const query = async <T extends QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ) =>\n (await transactionExecutorOrDefault(db, options, pool.execute)).query<T>(\n sql,\n options,\n );\n\n const driverType = pool.driverType as Database['driverType'];\n\n const db = {\n driverType,\n databaseName,\n connect: () => Promise.resolve(),\n close: async () => {\n await Promise.allSettled([\n pool.close(),\n cache !== 'disabled' ? cache.close() : Promise.resolve(),\n ...collections.values().map((collection) => collection.close()),\n ]);\n },\n\n collections: () => [...collections.values()],\n collection: <T extends Document, Payload extends Document = T>(\n collectionName: string,\n collectionOptions?: PongoDBCollectionOptions<T, Payload>,\n ) =>\n (collections.get(collectionName) as PongoCollection<T> | undefined) ??\n pongoCollection({\n collectionName,\n db,\n pool,\n schemaComponent: schemaComponent.collection(\n pongoSchema.collection<T>(collectionName),\n ),\n schema: { ...options.schema, ...collectionOptions?.schema },\n serializer,\n errors: { ...options.errors, ...collectionOptions?.errors },\n cache:\n collectionOptions?.cache !== undefined\n ? collectionOptions.cache\n : cache,\n }),\n transaction: () => pool.transaction(),\n withTransaction: (handle) => pool.withTransaction(handle),\n\n schema: {\n component: schemaComponent,\n migrate: (options?: PongoMigrationOptions) =>\n runSQLMigrations(pool, schemaComponent.migrations, options),\n },\n\n sql: {\n async query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLQueryOptions,\n ): Promise<Result[]> {\n const result = await query<Result>(sql, options);\n return result.rows;\n },\n async command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: CollectionOperationOptions & SQLCommandOptions,\n ): Promise<QueryResult<Result>> {\n return command(sql, options);\n },\n },\n } satisfies PongoDb<Database['driverType']> as unknown as Database;\n\n const dbSchema = options?.schema?.definition;\n\n if (dbSchema) {\n return proxyPongoDbWithSchema(db, dbSchema, collections);\n }\n\n return db;\n};\n","import type {\n DatabaseDriverType,\n JSONSerializationOptions,\n JSONSerializer,\n MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport type { CacheConfig, PongoCache } from '../cache';\nimport type { PongoCollectionSchema, PongoDbSchema } from '../schema';\nimport type { AnyPongoDb, PongoDb } from '../typing';\n\nexport type PongoDriverOptions<ConnectionOptions = unknown> = {\n connectionOptions?: ConnectionOptions | undefined;\n} & JSONSerializationOptions;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyPongoDriverOptions = PongoDriverOptions<any>;\n\nexport type PongoDatabaseFactoryOptions<\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n DriverOptions extends AnyPongoDriverOptions = AnyPongoDriverOptions,\n> = {\n databaseName?: string | undefined;\n schema?:\n | {\n autoMigration?: MigrationStyle;\n definition?: PongoDbSchema<CollectionsSchema>;\n }\n | undefined;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n cache?: CacheConfig | 'disabled' | PongoCache | undefined;\n} & DriverOptions;\n\nexport interface PongoDriver<\n Database extends AnyPongoDb = AnyPongoDb,\n DriverOptions extends AnyPongoDriverOptions = AnyPongoDriverOptions,\n> {\n driverType: Database['driverType'];\n databaseFactory<\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n >(\n options: PongoDatabaseFactoryOptions<CollectionsSchema, DriverOptions>,\n ): Database & PongoDb<Database['driverType']>;\n}\n\nexport type AnyPongoDriver = PongoDriver<AnyPongoDb, AnyPongoDriverOptions>;\n\nexport type ExtractPongoDriverOptions<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDriver<any, infer O> ? O : never;\n\nexport type ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDriver<infer D, any> ? D : never;\n\nexport const PongoDriverRegistry = () => {\n const drivers = new Map<\n DatabaseDriverType,\n PongoDriver | (() => Promise<PongoDriver>)\n >();\n\n const register = <Database extends AnyPongoDb = AnyPongoDb>(\n driverType: Database['driverType'],\n driver: PongoDriver<Database> | (() => Promise<PongoDriver<Database>>),\n ): void => {\n const entry = drivers.get(driverType);\n if (\n entry &&\n (typeof entry !== 'function' || typeof driver === 'function')\n ) {\n return;\n }\n drivers.set(driverType, driver);\n };\n\n const tryResolve = async <Driver extends AnyPongoDriver = AnyPongoDriver>(\n driverType: Driver['driverType'],\n ): Promise<Driver | null> => {\n const entry = drivers.get(driverType);\n\n if (!entry) return null;\n\n if (typeof entry !== 'function') return entry as Driver;\n\n const driver = await entry();\n\n register(driverType, driver);\n return driver as Driver;\n };\n\n const tryGet = <Driver extends AnyPongoDriver = AnyPongoDriver>(\n driverType: Driver['driverType'],\n ): Driver | null => {\n const entry = drivers.get(driverType);\n return entry && typeof entry !== 'function' ? (entry as Driver) : null;\n };\n\n const has = (driverType: DatabaseDriverType): boolean =>\n drivers.has(driverType);\n\n return {\n register,\n tryResolve,\n tryGet,\n has,\n get databaseDriverTypes(): DatabaseDriverType[] {\n return Array.from(drivers.keys());\n },\n };\n};\n\ndeclare global {\n var pongoDriverRegistry: ReturnType<typeof PongoDriverRegistry>;\n}\n\nexport const pongoDriverRegistry = (globalThis.pongoDriverRegistry =\n globalThis.pongoDriverRegistry ?? PongoDriverRegistry());\n","import { JSONSerializer } from '@event-driven-io/dumbo';\nimport { pongoCache } from './cache';\nimport { PongoDatabaseCache } from './database';\nimport type {\n AnyPongoDriver,\n ExtractPongoDatabaseTypeFromDriver,\n} from './drivers';\nimport { pongoSession } from './pongoSession';\nimport {\n proxyClientWithSchema,\n type PongoClientSchema,\n type PongoClientWithSchema,\n} from './schema';\nimport type {\n PongoClient,\n PongoClientOptions,\n PongoDb,\n PongoDbOptions,\n PongoSession,\n} from './typing';\n\nexport const pongoClient = <\n DatabaseDriver extends AnyPongoDriver,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n>(\n options: PongoClientOptions<DatabaseDriver, TypedClientSchema>,\n): PongoClient<\n DatabaseDriver['driverType'],\n ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>\n> &\n PongoClientWithSchema<TypedClientSchema> => {\n const {\n driver,\n schema,\n errors,\n cache: cacheOptions,\n serialization,\n ...connectionOptions\n } = options;\n\n const dbClients = PongoDatabaseCache<PongoDb, TypedClientSchema>({\n driver,\n typedSchema: schema?.definition,\n });\n\n const serializer = JSONSerializer.from(options);\n\n const cache =\n cacheOptions === 'disabled' || cacheOptions === undefined\n ? 'disabled'\n : pongoCache(cacheOptions);\n\n const pongoClient: PongoClient<\n DatabaseDriver['driverType'],\n ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>\n > = {\n driverType: driver.driverType,\n connect: async () => {\n await dbClients.forAll((db) => db.connect());\n return pongoClient;\n },\n close: async () => {\n await dbClients.forAll((db) => db.close());\n },\n db: (\n dbName?: string,\n options?: PongoDbOptions,\n ): ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> => {\n const db = dbClients.getOrCreate({\n ...connectionOptions,\n databaseName: dbName,\n serializer,\n errors,\n cache: options?.cache ?? cache,\n serialization,\n });\n\n return db as ExtractPongoDatabaseTypeFromDriver<DatabaseDriver>;\n },\n startSession: pongoSession,\n withSession: async <T>(\n callback: (session: PongoSession) => Promise<T>,\n ): Promise<T> => {\n const session = pongoSession();\n\n try {\n return await callback(session);\n } finally {\n await session.endSession();\n }\n },\n };\n\n return proxyClientWithSchema(pongoClient, schema?.definition);\n};\n","import type { DatabaseTransaction } from '@event-driven-io/dumbo';\nimport { pongoTransactionCache } from './cache';\nimport type {\n PongoDb,\n PongoDbTransaction,\n PongoTransactionOptions,\n} from './typing';\n\nexport const pongoTransaction = (\n options: PongoTransactionOptions,\n): PongoDbTransaction => {\n let isCommitted = false;\n let isRolledBack = false;\n let databaseName: string | null = null;\n let transaction: DatabaseTransaction | null = null;\n const cache = pongoTransactionCache();\n\n return {\n cache,\n enlistDatabase: async (db: PongoDb): Promise<DatabaseTransaction> => {\n if (transaction && databaseName !== db.databaseName)\n throw new Error(\n \"There's already other database assigned to transaction\",\n );\n\n if (transaction && databaseName === db.databaseName) return transaction;\n\n databaseName = db.databaseName;\n transaction = db.transaction();\n await transaction.begin();\n\n return transaction;\n },\n commit: async () => {\n if (isCommitted) return;\n if (isRolledBack) throw new Error('Transaction is not active!');\n\n isCommitted = true;\n\n if (transaction) {\n await transaction.commit();\n transaction = null;\n }\n await cache.commit();\n },\n rollback: async (error?: unknown) => {\n if (isCommitted) throw new Error('Cannot rollback commited transaction!');\n if (isRolledBack) return;\n\n isRolledBack = true;\n\n if (transaction) {\n await transaction.rollback(error);\n transaction = null;\n }\n cache.clear();\n },\n databaseName,\n isStarting: false,\n isCommitted,\n get isActive() {\n return !isCommitted && !isRolledBack;\n },\n get sqlExecutor() {\n if (transaction === null)\n throw new Error('No database transaction was started');\n\n return transaction.execute;\n },\n options,\n };\n};\n","import type { CacheConfig, PongoCache } from './cache';\nimport { pongoTransaction } from './pongoTransaction';\nimport type {\n PongoDbTransaction,\n PongoSession,\n PongoTransactionOptions,\n} from './typing';\n\nexport type PongoSessionOptions = {\n explicit?: boolean;\n defaultTransactionOptions: PongoTransactionOptions;\n cache?: CacheConfig | 'disabled' | PongoCache;\n};\n\nconst isActive = (\n transaction: PongoDbTransaction | null,\n): transaction is PongoDbTransaction => transaction?.isActive === true;\n\nfunction assertInActiveTransaction(\n transaction: PongoDbTransaction | null,\n): asserts transaction is PongoDbTransaction {\n if (!isActive(transaction)) throw new Error('No active transaction exists!');\n}\n\nfunction assertNotInActiveTransaction(\n transaction: PongoDbTransaction | null,\n): asserts transaction is null {\n if (isActive(transaction))\n throw new Error('Active transaction already exists!');\n}\n\nexport const pongoSession = (options?: PongoSessionOptions): PongoSession => {\n const explicit = options?.explicit === true;\n const defaultTransactionOptions: PongoTransactionOptions =\n options?.defaultTransactionOptions ?? {\n get snapshotEnabled() {\n return false;\n },\n };\n\n let transaction: PongoDbTransaction | null = null;\n let hasEnded = false;\n\n const startTransaction = (options?: PongoTransactionOptions) => {\n assertNotInActiveTransaction(transaction);\n\n transaction = pongoTransaction(options ?? defaultTransactionOptions);\n };\n const commitTransaction = async () => {\n assertInActiveTransaction(transaction);\n\n await transaction.commit();\n };\n const abortTransaction = async () => {\n assertInActiveTransaction(transaction);\n\n await transaction.rollback();\n };\n\n const endSession = async (): Promise<void> => {\n if (hasEnded) return;\n hasEnded = true;\n\n if (isActive(transaction)) await transaction.rollback();\n };\n\n const session = {\n get hasEnded() {\n return hasEnded;\n },\n explicit,\n defaultTransactionOptions: defaultTransactionOptions ?? {\n get snapshotEnabled() {\n return false;\n },\n },\n get transaction() {\n return transaction;\n },\n get snapshotEnabled() {\n return defaultTransactionOptions.snapshotEnabled;\n },\n endSession,\n incrementTransactionNumber: () => {},\n inTransaction: () => isActive(transaction),\n startTransaction,\n commitTransaction,\n abortTransaction,\n withTransaction: async <T = unknown>(\n fn: (session: PongoSession) => Promise<T>,\n options?: PongoTransactionOptions,\n ): Promise<T> => {\n startTransaction(options);\n\n try {\n const result = await fn(session);\n await commitTransaction();\n return result;\n } catch (error) {\n await abortTransaction();\n throw error;\n }\n },\n };\n\n return session;\n};\n","export const deepEquals = <T>(left: T, right: T): boolean => {\n if (isEquatable(left)) {\n return left.equals(right);\n }\n\n if (Array.isArray(left)) {\n return (\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((val, index) => deepEquals(val, right[index]))\n );\n }\n\n if (\n typeof left !== 'object' ||\n typeof right !== 'object' ||\n left === null ||\n right === null\n ) {\n return left === right;\n }\n\n if (Array.isArray(right)) return false;\n\n const keys1 = Object.keys(left);\n const keys2 = Object.keys(right);\n\n if (\n keys1.length !== keys2.length ||\n !keys1.every((key) => keys2.includes(key))\n )\n return false;\n\n for (const key in left) {\n if (left[key] instanceof Function && right[key] instanceof Function)\n continue;\n\n const isEqual = deepEquals(left[key], right[key]);\n if (!isEqual) {\n return false;\n }\n }\n\n return true;\n};\n\nexport type Equatable<T> = { equals: (right: T) => boolean } & T;\n\nexport const isEquatable = <T>(left: T): left is Equatable<T> => {\n return (\n left &&\n typeof left === 'object' &&\n 'equals' in left &&\n typeof left['equals'] === 'function'\n );\n};\n","export async function mapSequential<T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = [];\n for (let i = 0; i < items.length; i++) {\n results.push(await fn(items[i]!, i));\n }\n return results;\n}\n\nexport const mapParallel = <T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> => Promise.all(items.map(fn));\n\nexport const mapAsync = <T, R>(\n items: T[],\n fn: (item: T, index: number) => Promise<R>,\n options: { parallel: boolean | undefined } = { parallel: false },\n): Promise<R[]> =>\n options?.parallel ? mapParallel(items, fn) : mapSequential(items, fn);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport type {\n BatchHandleOptions,\n CollectionOperationOptions,\n DocumentHandler,\n ExpectedDocumentVersion,\n HandleOptions,\n OperationResult,\n OptionalUnlessRequiredIdAndVersion,\n PongoDeleteResult,\n PongoDocument,\n PongoHandleResult,\n PongoInsertManyResult,\n PongoReplaceManyResult,\n WithId,\n WithIdAndVersion,\n} from '..';\nimport {\n deepEquals,\n expectedVersionValue,\n mapAsync,\n operationResult,\n} from '..';\n\nexport type DocumentCommandHandlerOptions<T extends PongoDocument> = {\n collectionName: string;\n serializer: JSONSerializer;\n errors?: { throwOnOperationFailures?: boolean } | undefined;\n storage: {\n ensureCollectionCreated: (\n options?: CollectionOperationOptions,\n ) => Promise<unknown>;\n fetchByIds: (\n ids: string[],\n options?: CollectionOperationOptions,\n ) => Promise<(WithIdAndVersion<T> | null)[]>;\n insertMany: (\n docs: OptionalUnlessRequiredIdAndVersion<T>[],\n options?: CollectionOperationOptions,\n ) => Promise<PongoInsertManyResult>;\n replaceMany: (\n docs: Array<WithIdAndVersion<T>>,\n options?: CollectionOperationOptions,\n ) => Promise<PongoReplaceManyResult>;\n deleteManyByIds: (\n ids: Array<{ _id: string; _version?: bigint }>,\n options?: CollectionOperationOptions,\n ) => Promise<PongoDeleteResult & { deletedIds: Set<string> }>;\n };\n};\n\nexport type DocumentCommandHandlerInput = {\n _id: string;\n expectedVersion?: ExpectedDocumentVersion;\n};\n\ntype DocumentChange<T extends PongoDocument> =\n | {\n type: 'noop';\n existing: WithIdAndVersion<T> | null;\n versionMismatch?: boolean;\n }\n | { type: 'insert'; doc: WithId<T> }\n | {\n type: 'replace';\n existing: WithIdAndVersion<T>;\n result: WithId<T>;\n _version?: bigint;\n }\n | { type: 'delete'; docId: string; _version?: bigint };\n\ntype DocumentHandlerResult = { succeeded: boolean; newVersion?: bigint };\n\nexport function DocumentCommandHandler<T extends PongoDocument>(\n deps: DocumentCommandHandlerOptions<T>,\n): {\n (\n id: string | DocumentCommandHandlerInput,\n handler: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>>;\n (\n ids: string[] | DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: HandleOptions & BatchHandleOptions,\n ): Promise<PongoHandleResult<T>[]>;\n} {\n const fn = async (\n input:\n | string\n | string[]\n | DocumentCommandHandlerInput\n | DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: HandleOptions | BatchHandleOptions,\n ): Promise<PongoHandleResult<T> | PongoHandleResult<T>[]> => {\n const changes = await handleDocuments(\n deps.storage,\n normalizeInput(input),\n handler,\n options,\n );\n\n const results = changes.map(({ change, result: outcome }) =>\n toHandleResult(deps, change, outcome),\n );\n\n return Array.isArray(input) ? results : results[0]!;\n };\n return fn as ReturnType<typeof DocumentCommandHandler<T>>;\n}\n\nasync function handleDocuments<T extends PongoDocument>(\n storage: DocumentCommandHandlerOptions<T>['storage'],\n inputs: DocumentCommandHandlerInput[],\n handler: DocumentHandler<T>,\n options?: BatchHandleOptions,\n): Promise<{ change: DocumentChange<T>; result: DocumentHandlerResult }[]> {\n if (inputs.length === 0) return [];\n\n const { parallel, ...operationOptions } = options ?? {};\n\n await storage.ensureCollectionCreated(operationOptions);\n\n const docs = await storage.fetchByIds(\n inputs.map((i) => i._id),\n operationOptions,\n );\n\n const changes = await mapAsync(\n inputs,\n (item, i) =>\n handleDocument(\n {\n ...item,\n existing: docs[i] ?? null,\n },\n handler,\n ),\n { parallel },\n );\n\n return await executeStorageChanges(storage, changes, operationOptions);\n}\n\nasync function handleDocument<T extends PongoDocument>(\n item: {\n _id: string;\n expectedVersion?: ExpectedDocumentVersion | undefined;\n existing: WithIdAndVersion<T> | null;\n },\n handler: DocumentHandler<T>,\n): Promise<DocumentChange<T>> {\n const { _id: id, existing, expectedVersion } = item;\n\n if (hasVersionMismatch(existing, expectedVersion))\n return { type: 'noop', existing, versionMismatch: true };\n\n const result = await handler(existing ? ({ ...existing } as T) : null, id);\n\n return toDocumentChange(id, existing, result);\n}\n\nasync function executeStorageChanges<T extends PongoDocument>(\n storage: DocumentCommandHandlerOptions<T>['storage'],\n changes: DocumentChange<T>[],\n operationOptions?: CollectionOperationOptions,\n): Promise<{ change: DocumentChange<T>; result: DocumentHandlerResult }[]> {\n const toInsert = changes.flatMap((c) =>\n c.type === 'insert' ? [c.doc as OptionalUnlessRequiredIdAndVersion<T>] : [],\n );\n\n const toReplace = changes.flatMap((c): Array<WithIdAndVersion<T>> => {\n if (c.type !== 'replace') return [];\n const { _version: _, ...cleanResult } = c.result as Record<string, unknown>;\n return [\n (c._version !== undefined\n ? { ...cleanResult, _version: c._version }\n : cleanResult) as WithIdAndVersion<T>,\n ];\n });\n\n const toDelete = changes.flatMap((c) =>\n c.type === 'delete'\n ? [\n c._version !== undefined\n ? { _id: c.docId, _version: c._version }\n : { _id: c.docId },\n ]\n : [],\n );\n\n const insertedIds =\n toInsert.length > 0\n ? new Set(\n (await storage.insertMany(toInsert, operationOptions)).insertedIds,\n )\n : new Set<string>();\n\n const replaceResult =\n toReplace.length > 0\n ? await storage.replaceMany(toReplace, operationOptions)\n : null;\n\n const deletedIds =\n toDelete.length > 0\n ? (await storage.deleteManyByIds(toDelete, operationOptions)).deletedIds\n : new Set<string>();\n\n const toDocumentHandlerResult = (\n change: DocumentChange<T>,\n ): DocumentHandlerResult => {\n if (change.type === 'noop') return { succeeded: !change.versionMismatch };\n if (change.type === 'insert')\n return { succeeded: insertedIds.has(change.doc._id), newVersion: 1n };\n if (change.type === 'delete')\n return { succeeded: deletedIds.has(change.docId) };\n\n const id = change.result._id;\n return {\n succeeded: replaceResult?.modifiedIds.includes(id) ?? false,\n newVersion: replaceResult?.nextExpectedVersions.get(id) ?? 0n,\n };\n };\n\n return changes.map((change) => ({\n change,\n result: toDocumentHandlerResult(change),\n }));\n}\n\nfunction normalizeInput(\n input:\n | string\n | string[]\n | DocumentCommandHandlerInput\n | DocumentCommandHandlerInput[],\n): DocumentCommandHandlerInput[] {\n if (typeof input === 'string') return [{ _id: input }];\n\n if (!Array.isArray(input)) return [input];\n\n return input.map((item) => (typeof item === 'string' ? { _id: item } : item));\n}\n\nfunction hasVersionMismatch<T extends PongoDocument>(\n existing: WithIdAndVersion<T> | null,\n version?: ExpectedDocumentVersion,\n): boolean {\n const expected = expectedVersionValue(version);\n return (\n (existing == null && version === 'DOCUMENT_EXISTS') ||\n (existing == null && expected != null) ||\n (existing != null && version === 'DOCUMENT_DOES_NOT_EXIST') ||\n (existing != null && expected !== null && existing._version !== expected)\n );\n}\n\nfunction toDocumentChange<T extends PongoDocument>(\n docId: string,\n existing: WithIdAndVersion<T> | null,\n result: T | null,\n): DocumentChange<T> {\n if (deepEquals(existing as T | null, result))\n return { type: 'noop', existing };\n\n if (!existing && result)\n return {\n type: 'insert',\n doc: { ...result, _id: docId } as WithId<T>,\n };\n\n if (existing && !result)\n return {\n type: 'delete',\n docId,\n _version: existing._version,\n };\n\n return {\n type: 'replace',\n existing: existing!,\n result: { ...result, _id: docId } as WithId<T>,\n _version: existing!._version,\n };\n}\n\nfunction toHandleResult<T extends PongoDocument>(\n deps: DocumentCommandHandlerOptions<T>,\n change: DocumentChange<T>,\n { succeeded, newVersion }: DocumentHandlerResult,\n): PongoHandleResult<T> {\n const opMeta = {\n operationName: 'handle',\n collectionName: deps.collectionName,\n serializer: deps.serializer,\n errors: deps.errors,\n };\n const toResult = (\n op: Record<string, unknown>,\n document: T | null,\n ): PongoHandleResult<T> =>\n ({\n ...operationResult(op as OperationResult, opMeta),\n document,\n }) as unknown as PongoHandleResult<T>;\n\n if (change.type === 'noop')\n return toResult({ successful: succeeded }, change.existing as T | null);\n\n if (change.type === 'insert')\n return toResult(\n {\n successful: succeeded,\n insertedId: succeeded ? change.doc._id : null,\n nextExpectedVersion: 1n,\n },\n succeeded ? ({ ...change.doc, _version: 1n } as unknown as T) : null,\n );\n\n if (change.type === 'delete')\n return toResult(\n {\n successful: succeeded,\n deletedCount: succeeded ? 1 : 0,\n matchedCount: 1,\n },\n null,\n );\n\n return toResult(\n {\n successful: succeeded,\n modifiedCount: succeeded ? 1 : 0,\n matchedCount: 1,\n nextExpectedVersion: newVersion ?? 0n,\n },\n succeeded\n ? ({ ...change.result, _version: newVersion } as unknown as T)\n : (change.existing as T | null),\n );\n}\n"]}
|