@event-driven-io/pongo 0.17.0-beta.17 → 0.17.0-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{chunk-QJZKVZBU.cjs → chunk-56GGH7CW.cjs} +12 -12
  2. package/dist/{chunk-QJZKVZBU.cjs.map → chunk-56GGH7CW.cjs.map} +1 -1
  3. package/dist/{chunk-LHIYVLUA.cjs → chunk-HZZ76RUC.cjs} +33 -27
  4. package/dist/chunk-HZZ76RUC.cjs.map +1 -0
  5. package/dist/{chunk-BHL7DORE.js → chunk-IBYIIPWV.js} +8 -2
  6. package/dist/chunk-IBYIIPWV.js.map +1 -0
  7. package/dist/{chunk-E66GVGL3.js → chunk-T5YVXV53.js} +2 -2
  8. package/dist/cli.cjs +31 -31
  9. package/dist/cli.cjs.map +1 -1
  10. package/dist/cli.js +20 -20
  11. package/dist/cli.js.map +1 -1
  12. package/dist/cloudflare.cjs +11 -14
  13. package/dist/cloudflare.cjs.map +1 -1
  14. package/dist/cloudflare.d.cts +2 -2
  15. package/dist/cloudflare.d.ts +2 -2
  16. package/dist/cloudflare.js +3 -6
  17. package/dist/cloudflare.js.map +1 -1
  18. package/dist/{index-jnCVHtgU.d.cts → index-486WMLOn.d.cts} +1 -1
  19. package/dist/{index-BbSLAsTJ.d.ts → index-C2T_cRSs.d.ts} +1 -1
  20. package/dist/index.cjs +2 -2
  21. package/dist/index.d.cts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +1 -1
  24. package/dist/pg.cjs +18 -21
  25. package/dist/pg.cjs.map +1 -1
  26. package/dist/pg.d.cts +1 -1
  27. package/dist/pg.d.ts +1 -1
  28. package/dist/pg.js +5 -8
  29. package/dist/pg.js.map +1 -1
  30. package/dist/{pongoCollectionSchemaComponent-BApG9N1N.d.cts → pongoCollectionSchemaComponent-JWAbt4LN.d.cts} +0 -1
  31. package/dist/{pongoCollectionSchemaComponent-BApG9N1N.d.ts → pongoCollectionSchemaComponent-JWAbt4LN.d.ts} +0 -1
  32. package/dist/shim.cjs +5 -5
  33. package/dist/shim.d.cts +1 -1
  34. package/dist/shim.d.ts +1 -1
  35. package/dist/shim.js +1 -1
  36. package/dist/sqlite3.cjs +12 -16
  37. package/dist/sqlite3.cjs.map +1 -1
  38. package/dist/sqlite3.d.cts +2 -2
  39. package/dist/sqlite3.d.ts +2 -2
  40. package/dist/sqlite3.js +4 -8
  41. package/dist/sqlite3.js.map +1 -1
  42. package/package.json +2 -2
  43. package/dist/chunk-BHL7DORE.js.map +0 -1
  44. package/dist/chunk-LHIYVLUA.cjs.map +0 -1
  45. /package/dist/{chunk-E66GVGL3.js.map → chunk-T5YVXV53.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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"],"sourcesContent":["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 { PongoCollectionSchemaComponent } from '..';\nimport {\n deepEquals,\n expectedVersionValue,\n operationResult,\n type CollectionOperationOptions,\n type DeleteManyOptions,\n type DeleteOneOptions,\n type DocumentHandler,\n type FindOptions,\n type HandleOptions,\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 PongoHandleResult,\n type PongoInsertManyResult,\n type PongoInsertOneResult,\n type PongoMigrationOptions,\n type PongoUpdate,\n type PongoUpdateManyResult,\n type PongoUpdateResult,\n type ReplaceOneOptions,\n type UpdateManyOptions,\n type UpdateOneOptions,\n type WithIdAndVersion,\n type WithoutId,\n type WithVersion,\n} from '..';\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};\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}: PongoCollectionOptions<T, DriverType, Payload>): PongoCollection<T> => {\n const SqlFor = schemaComponent.sqlBuilder;\n const sqlExecutor = pool.execute;\n\n const columnMapping = {\n mapping: {\n ...mapColumnToJSON('data', serializer),\n //...mapColumnToJSON('metadata'),\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 collection = {\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 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 rows = documents.map((doc) => {\n const downcasted = downcast(doc as T);\n return {\n ...downcasted,\n _id: (doc._id as string | undefined | null) ?? uuid(),\n _version: doc._version ?? 1n,\n };\n });\n\n const result = await command(\n SqlFor.insertMany(\n rows as unknown as OptionalUnlessRequiredIdAndVersion<Payload>[],\n ),\n options,\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 return 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 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 return 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 updateMany: async (\n filter: PongoFilter<T>,\n update: PongoUpdate<T>,\n options?: UpdateManyOptions,\n ): Promise<PongoUpdateManyResult> => {\n await ensureCollectionCreated(options);\n\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 return 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 deleteMany: async (\n filter?: PongoFilter<T>,\n options?: DeleteManyOptions,\n ): Promise<PongoDeleteResult> => {\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 result = await query<{ data: T; _version: bigint }>(\n SqlFor.findOne(filter ?? {}),\n options,\n );\n\n const row = result.rows[0];\n if (row === undefined || row === null) return null;\n\n return upcast({\n ...row.data,\n _version: row._version,\n } as unknown as Payload) as WithIdAndVersion<T>;\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\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\n return existingDoc;\n },\n handle: async (\n id: string,\n handle: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>> => {\n const { expectedVersion: version, ...operationOptions } = options ?? {};\n await ensureCollectionCreated(options);\n\n const byId: PongoFilter<T> = { _id: id };\n\n const existing = (await collection.findOne(\n byId,\n options,\n )) as WithVersion<T> | null;\n\n const expectedVersion = expectedVersionValue(version);\n\n if (\n (existing == null && version === 'DOCUMENT_EXISTS') ||\n (existing == null && expectedVersion != null) ||\n (existing != null && version === 'DOCUMENT_DOES_NOT_EXIST') ||\n (existing != null &&\n expectedVersion !== null &&\n existing._version !== expectedVersion)\n ) {\n return operationResult<PongoHandleResult<T>>(\n {\n successful: false,\n document: existing as T,\n },\n { operationName: 'handle', collectionName, serializer, errors },\n );\n }\n\n const result = await handle(\n existing !== null ? ({ ...existing } as T) : null,\n );\n\n if (deepEquals(existing as T | null, result))\n return operationResult<PongoHandleResult<T>>(\n {\n successful: true,\n document: existing as T | null,\n },\n { operationName: 'handle', collectionName, serializer, errors },\n );\n\n if (!existing && result) {\n const newDoc = { ...result, _id: id };\n const insertResult = await collection.insertOne(\n { ...newDoc, _id: id } as OptionalUnlessRequiredIdAndVersion<T>,\n {\n ...operationOptions,\n expectedVersion: 'DOCUMENT_DOES_NOT_EXIST',\n },\n );\n return {\n ...insertResult,\n document: {\n ...newDoc,\n _version: insertResult.nextExpectedVersion,\n } as T,\n };\n }\n\n if (existing && !result) {\n const deleteResult = await collection.deleteOne(byId, {\n ...operationOptions,\n expectedVersion: expectedVersion ?? 'DOCUMENT_EXISTS',\n });\n return { ...deleteResult, document: null };\n }\n\n if (existing && result) {\n const replaceResult = await collection.replaceOne(byId, result, {\n ...operationOptions,\n expectedVersion: expectedVersion ?? 'DOCUMENT_EXISTS',\n });\n return {\n ...replaceResult,\n document: {\n ...result,\n _version: replaceResult.nextExpectedVersion,\n } as T,\n };\n }\n\n return operationResult<PongoHandleResult<T>>(\n {\n successful: true,\n document: existing as T,\n },\n { operationName: 'handle', collectionName, serializer, errors },\n );\n },\n find: async (\n filter?: PongoFilter<T>,\n options?: FindOptions,\n ): Promise<WithIdAndVersion<T>[]> => {\n await ensureCollectionCreated(options);\n\n const result = await query<{ data: T; _version: bigint }>(\n SqlFor.find(filter ?? {}, options),\n );\n return result.rows.map(\n (row) =>\n upcast({\n ...row.data,\n _version: row._version,\n } as unknown as Payload) as WithIdAndVersion<T>,\n );\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;\n },\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;\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 {\n PongoDatabaseDriver,\n PongoDatabaseFactoryOptions,\n} 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: PongoDatabaseDriver<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 { JSONSerializer } from '@event-driven-io/dumbo';\nimport type {\n AnyConnection,\n DatabaseDriverType,\n DatabaseTransaction,\n JSONSerializationOptions,\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 { PongoCollectionSchemaComponent } from '../collection';\nimport type { PongoDatabaseSchemaComponent } from '../database/pongoDatabaseSchemaComponent';\nimport type {\n AnyPongoDatabaseDriver,\n ExtractPongoDatabaseDriverOptions,\n} 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): 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 AnyPongoDatabaseDriver = AnyPongoDatabaseDriver,\n TypedClientSchema extends PongoClientSchema = PongoClientSchema,\n> =\n ExtractPongoDatabaseDriverOptions<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 } & 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 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};\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};\n\nexport type CollectionOperationOptions = {\n session?: PongoSession;\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 = {\n expectedVersion?: ExpectedDocumentVersion;\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 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,\n handle: DocumentHandler<T>,\n options?: HandleOptions,\n ): Promise<PongoHandleResult<T>>;\n readonly schema: Readonly<{\n component: PongoCollectionSchemaComponent;\n migrate(options?: PongoMigrationOptions): Promise<RunSQLMigrationsResult>;\n }>;\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<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 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 { 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};\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 { databaseName, schemaComponent, pool, serializer } = options;\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: () => pool.close(),\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 }),\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 { PongoCollectionSchema, PongoDbSchema } from '../schema';\nimport type { AnyPongoDb, PongoDb } from '../typing';\n\nexport type PongoDatabaseDriverOptions<ConnectionOptions = unknown> = {\n connectionOptions?: ConnectionOptions | undefined;\n} & JSONSerializationOptions;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyPongoDatabaseDriverOptions = PongoDatabaseDriverOptions<any>;\n\nexport type PongoDatabaseFactoryOptions<\n CollectionsSchema extends Record<string, PongoCollectionSchema> = Record<\n string,\n PongoCollectionSchema\n >,\n DriverOptions extends AnyPongoDatabaseDriverOptions =\n AnyPongoDatabaseDriverOptions,\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} & DriverOptions;\n\nexport type DatabaseDriverOptionsWithDatabaseName = {\n databaseName?: string | undefined;\n};\n\nexport type DatabaseDriverOptionsWithConnectionString = {\n connectionString?: string | undefined;\n};\n\nexport interface PongoDatabaseDriver<\n Database extends AnyPongoDb = AnyPongoDb,\n DriverOptions extends AnyPongoDatabaseDriverOptions =\n AnyPongoDatabaseDriverOptions,\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 AnyPongoDatabaseDriver = PongoDatabaseDriver<\n AnyPongoDb,\n AnyPongoDatabaseDriverOptions\n>;\n\nexport type ExtractPongoDatabaseDriverOptions<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDatabaseDriver<any, infer O> ? O : never;\n\nexport type ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends PongoDatabaseDriver<infer D, any> ? D : never;\n\nexport const PongoDatabaseDriverRegistry = () => {\n const drivers = new Map<\n DatabaseDriverType,\n PongoDatabaseDriver | (() => Promise<PongoDatabaseDriver>)\n >();\n\n const register = <Database extends AnyPongoDb = AnyPongoDb>(\n driverType: Database['driverType'],\n driver:\n | PongoDatabaseDriver<Database>\n | (() => Promise<PongoDatabaseDriver<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 <\n Driver extends AnyPongoDatabaseDriver = AnyPongoDatabaseDriver,\n >(\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 = <\n Driver extends AnyPongoDatabaseDriver = AnyPongoDatabaseDriver,\n >(\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 pongoDatabaseDriverRegistry: ReturnType<\n typeof PongoDatabaseDriverRegistry\n >;\n}\n\nexport const pongoDatabaseDriverRegistry =\n (globalThis.pongoDatabaseDriverRegistry =\n globalThis.pongoDatabaseDriverRegistry ?? PongoDatabaseDriverRegistry());\n","import { JSONSerializer } from '@event-driven-io/dumbo';\nimport { PongoDatabaseCache } from './database';\nimport type {\n AnyPongoDatabaseDriver,\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 PongoSession,\n} from './typing';\n\nexport const pongoClient = <\n DatabaseDriver extends AnyPongoDatabaseDriver,\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 { driver, schema, errors, ...connectionOptions } = 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 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 ): ExtractPongoDatabaseTypeFromDriver<DatabaseDriver> => {\n const db = dbClients.getOrCreate({\n ...connectionOptions,\n databaseName: dbName,\n serializer,\n errors,\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 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\n return {\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 (!transaction) throw new Error('No database transaction started!');\n if (isCommitted) return;\n if (isRolledBack) throw new Error('Transaction is not active!');\n\n isCommitted = true;\n\n await transaction.commit();\n\n transaction = null;\n },\n rollback: async (error?: unknown) => {\n if (!transaction) throw new Error('No database transaction started!');\n if (isCommitted) throw new Error('Cannot rollback commited transaction!');\n if (isRolledBack) return;\n\n isRolledBack = true;\n\n await transaction.rollback(error);\n\n transaction = null;\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 { 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};\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"],"mappings":";AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA,oBAAAA;AAAA,EACA;AAAA,OASK;AACP,SAAS,MAAMC,aAAY;;;ACf3B;AAAA,EACE;AAAA,OAIK;AAsBA,IAAM,iCAAiC,CAE5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OACG;AAAA,EACC,GAAG;AAAA,IACD,uBAAuB,WAAW,IAAI;AAAA,IACtC;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,WAAW;AAC7B;;;AC1CK,IAAM,iBAAiB;AAAA,EAC5B,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,cAAc;AAAA,EACzB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AACP;AAEO,IAAM,aAAa,CAAC,QAAgB,IAAI,WAAW,GAAG;AAEtD,IAAM,eAAe,CAAC,UAC3B,OAAO,KAAK,KAAK,EAAE,KAAK,UAAU;;;ACzBpC;AAAA,EACE;AAAA,OAIK;AAQA,IAAM,qBAAqB,CAGhC;AAAA,EACA;AAAA,EACA;AACF,MAGM;AACJ,QAAM,YAAY,oBAAI,IAAqB;AAE3C,QAAM,wBAAwB,CAAC,WAC7B,OAAO,OAAO,aAAa,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAErE,SAAO;AAAA,IACL,aAAa,CAMX,kBASa;AACb,YAAM,WAAW,oBAAoB,OAAO,UAAU;AACtD,YAAM,SACJ,cAAc,gBACd,UAAU;AAAA,QACR,sBAAsB,gBACjB,cAAc,mBACf;AAAA,MACN,KACA;AAEF,YAAM,WAAW,UAAU,IAAI,MAAM;AACrC,UAAI,SAAU,QAAO;AAErB,YAAM,aAAa,sBAAsB,cAAc,YAAY;AAEnE,YAAM,QAAkB,OAAO,gBAAgB;AAAA,QAC7C,GAAG;AAAA,QACH,cAAc;AAAA,QACd,QAAQ;AAAA,UACN,GAAG,cAAc;AAAA,UACjB,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,QACrC;AAAA,MACF,CAAC;AACD,gBAAU,IAAI,QAAQ,KAAK;AAC3B,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,MAAkB,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,IAEpD,QAAQ,CAAC,SAA2D;AAClE,aAAO,QAAQ;AAAA,QACb,MAAM,KAAK,UAAU,OAAO,CAAC,EAC1B,IAAI,CAAC,MAAM,CAAa,EACxB,IAAI,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;AClFA;AAAA,EACE,mBAAAC;AAAA,OAGK;;;ACIA,IAAM,gBAAgB,CAAmB,QAC9C,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAgB,KAAK,CAAC;;;ACOnE,SAAS,MAAM,YAAY;;;AChBpB,IAAM,WAAW,CAAC,QACvB,OAAO,QAAQ,YAAY,QAAQ;AAE9B,IAAM,WAAW,CAAC,QACvB,OAAO,QAAQ;AAEV,IAAM,aAAN,MAAM,oBAAmB,MAAM;AAAA,EAC7B;AAAA,EAEP,YACE,SACA;AACA,UAAM,YACJ,WAAW,OAAO,YAAY,YAAY,eAAe,UACrD,QAAQ,YACR,SAAS,OAAO,IACd,UACA;AACR,UAAM,UACJ,WAAW,OAAO,YAAY,YAAY,aAAa,UACnD,QAAQ,UACR,SAAS,OAAO,IACd,UACA,2BAA2B,SAAS;AAE5C,UAAM,OAAO;AACb,SAAK,YAAY;AAGjB,WAAO,eAAe,MAAM,YAAW,SAAS;AAAA,EAClD;AACF;AAEO,IAAM,mBAAN,MAAM,0BAAyB,WAAW;AAAA,EAC/C,YAAY,SAAkB;AAC5B,UAAM;AAAA,MACJ,WAAW;AAAA,MACX,SAAS,WAAW;AAAA,IACtB,CAAC;AAGD,WAAO,eAAe,MAAM,kBAAiB,SAAS;AAAA,EACxD;AACF;;;AD2PO,IAAM,WAAW,CAAC,UAAmB,SAAS,KAAK;AA8KnD,IAAM,kBACX;AACK,IAAM,0BACX;AACK,IAAM,uBACX;AAEK,IAAM,mCAAmC,CAC9C,YAEA,YAAY,6BACZ,YAAY,qBACZ,YAAY;AAEP,IAAM,uBAAuB,CAClC,YAEA,YAAY,UAAa,iCAAiC,OAAO,IAC7D,OACC;AAEA,IAAM,kBAAkB,CAC7B,YAC4B;AAC5B,SAAO,UACF,OAAO,OAAO,IACf;AACN;AAgBO,IAAM,kBAAkB,CAC7B,QACA,YAMM;AACN,QAAMC,mBAAqB;AAAA,IACzB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,kBAAkB,CAAC,iBAA0B;AAC3C,YAAM,EAAE,WAAW,IAAI;AACvB,YAAM,EAAE,eAAe,eAAe,IAAI;AAE1C,UAAI,CAAC;AACH,cAAM,IAAI;AAAA,UACR,gBACE,GAAG,aAAa,OAAO,cAAc,wEAAwE,QAAQ,WAAW,UAAU,MAAM,CAAC;AAAA,QACrJ;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,IAAAA,iBAAgB,iBAAiB;AAEnC,SAAOA;AACT;;;AEjeA,IAAM,wBAAwB,CAC5B,UAC8B;AAAA,EAC9B;AACF;AAEA,sBAAsB,OAAO,CAC3B,oBAEA,gBAAgB;AAAA,EACd,CAAC,KAAK,oBACH,IAAI,cAAc,IAAI,YAAY,WAAW,cAAc,GAC5D;AAAA,EAEF,CAAC;AACH;AASF,SAAS,cACP,mBACA,aACkB;AAClB,MAAI,gBAAgB,QAAW;AAC7B,QAAI,OAAO,sBAAsB,UAAU;AACzC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO;AAAA,MACL,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,qBAAqB,OAAO,sBAAsB,WACrD;AAAA,IACE,MAAM;AAAA,IACN;AAAA,EACF,IACA,EAAE,YAAyB;AACjC;AAEA,cAAc,OAAO,CACnB,cACA,oBAEA,eACI,cAAc,cAAc,sBAAsB,KAAK,eAAe,CAAC,IACvE,cAAc,sBAAsB,KAAK,eAAe,CAAC;AAE/D,IAAM,oBAAoB,CACxB,SAC0B;AAAA,EAC1B;AACF;AAEO,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,YAAY;AACd;AAGO,IAAM,yBAAyB,CAKpC,SACA,UACA,gBAC0D;AAC1D,QAAM,kBAAkB,OAAO,KAAK,SAAS,WAAW;AAExD,aAAW,kBAAkB,iBAAiB;AAC5C,gBAAY,IAAI,gBAAgB,QAAQ,WAAW,cAAc,CAAC;AAAA,EACpE;AAEA,SAAO,IAAI;AAAA,IACT;AAAA,IAGA;AAAA,MACE,IAAI,QAAQ,MAAc;AACxB,eAAO,YAAY,IAAI,IAAI,KAAK,OAAO,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,wBAAwB,CAKnC,QACA,WACmE;AACnE,MAAI,CAAC;AACH,WAAO;AAMT,QAAM,UAAU,OAAO,KAAK,OAAO,GAAG;AAEtC,SAAO,IAAI;AAAA,IACT;AAAA,IAGA;AAAA,MACE,IAAI,QAAQ,MAAc;AACxB,YAAI,QAAQ,SAAS,IAAI,EAAG,QAAO,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,IAAI;AAEnE,eAAO,OAAO,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAgBO,IAAM,qBAAqB,CAChC,YAC2B;AAAA,EAC3B,MAAM,OAAO;AAAA,EACb,aAAa,cAAc,OAAO,WAAW,EAAE,IAAI,CAAC,OAAO;AAAA,IACzD,MAAM,EAAE,CAAC,EAAE;AAAA,EACb,EAAE;AACJ;AAEO,IAAM,yBAAyB,CAGpC,WAC8B;AAC9B,QAAM,YAAY,cAAc,OAAO,GAAG,EAAE;AAAA,IAAI,CAAC,MAC/C,mBAAmB,EAAE,CAAC,CAAC;AAAA,EACzB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,CAAC,SAAS,UAAU,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI;AAAA,EAC7D;AACF;;;AJ5KO,IAAM,+BAA+B,CAE1C;AAAA,EACA;AAAA,EACA;AACF,MAAqF;AACnF,QAAM,cACJ,OAAO,OAAO,WAAW,WAAW,EAAE,IAAI,iBAAiB,KAAK,CAAC;AAEnE,SAAO;AAAA,IACL,GAAGC,iBAAgB,qBAAqB,WAAW,IAAI,IAAI;AAAA,MACzD,YAAY;AAAA,IACd,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IAEA,YAAY,CACV,WACG;AACH,YAAM,WAAW,YAAY;AAAA,QAC3B,CAAC,MAAM,EAAE,mBAAmB,OAAO;AAAA,MACrC;AAEA,UAAI,SAAU,QAAO;AAErB,YAAM,gBAAgB;AAAA,QACpB,YAAY,WAAW,OAAO,IAAI;AAAA,MACpC;AACA,kBAAY,KAAK,aAAa;AAC9B,iBAAW,YAAY,OAAO,IAAI,IAAI;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AK/EA;AAAA,EACE;AAAA,OAQK;AA4CA,IAAM,gBAAgB,CAS3B,YACa;AACb,QAAM,EAAE,cAAc,iBAAAC,kBAAiB,MAAM,WAAW,IAAI;AAE5D,QAAM,cAAc,oBAAI,IAAuC;AAE/D,QAAM,UAAU,OACd,KACAC,cAGE,MAAM,6BAA6B,IAAIA,UAAS,KAAK,OAAO,GAC5D,QAAgB,KAAKA,QAAO;AAEhC,QAAM,QAAQ,OACZ,KACAA,cAEC,MAAM,6BAA6B,IAAIA,UAAS,KAAK,OAAO,GAAG;AAAA,IAC9D;AAAA,IACAA;AAAA,EACF;AAEF,QAAM,aAAa,KAAK;AAExB,QAAM,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC/B,OAAO,MAAM,KAAK,MAAM;AAAA,IAExB,aAAa,MAAM,CAAC,GAAG,YAAY,OAAO,CAAC;AAAA,IAC3C,YAAY,CACV,gBACA,sBAEC,YAAY,IAAI,cAAc,KAC/B,gBAAgB;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiBD,iBAAgB;AAAA,QAC/B,YAAY,WAAc,cAAc;AAAA,MAC1C;AAAA,MACA,QAAQ,EAAE,GAAG,QAAQ,QAAQ,GAAG,mBAAmB,OAAO;AAAA,MAC1D;AAAA,MACA,QAAQ,EAAE,GAAG,QAAQ,QAAQ,GAAG,mBAAmB,OAAO;AAAA,IAC5D,CAAC;AAAA,IACH,aAAa,MAAM,KAAK,YAAY;AAAA,IACpC,iBAAiB,CAAC,WAAW,KAAK,gBAAgB,MAAM;AAAA,IAExD,QAAQ;AAAA,MACN,WAAWA;AAAA,MACX,SAAS,CAACC,aACR,iBAAiB,MAAMD,iBAAgB,YAAYC,QAAO;AAAA,IAC9D;AAAA,IAEA,KAAK;AAAA,MACH,MAAM,MACJ,KACAA,UACmB;AACnB,cAAM,SAAS,MAAM,MAAc,KAAKA,QAAO;AAC/C,eAAO,OAAO;AAAA,MAChB;AAAA,MACA,MAAM,QACJ,KACAA,UAC8B;AAC9B,eAAO,QAAQ,KAAKA,QAAO;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,QAAQ;AAElC,MAAI,UAAU;AACZ,WAAO,uBAAuB,IAAI,UAAU,WAAW;AAAA,EACzD;AAEA,SAAO;AACT;;;ACxEO,IAAM,8BAA8B,MAAM;AAC/C,QAAM,UAAU,oBAAI,IAGlB;AAEF,QAAM,WAAW,CACf,YACA,WAGS;AACT,UAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,QACE,UACC,OAAO,UAAU,cAAc,OAAO,WAAW,aAClD;AACA;AAAA,IACF;AACA,YAAQ,IAAI,YAAY,MAAM;AAAA,EAChC;AAEA,QAAM,aAAa,OAGjB,eAC2B;AAC3B,UAAM,QAAQ,QAAQ,IAAI,UAAU;AAEpC,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,OAAO,UAAU,WAAY,QAAO;AAExC,UAAM,SAAS,MAAM,MAAM;AAE3B,aAAS,YAAY,MAAM;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAGb,eACkB;AAClB,UAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,WAAO,SAAS,OAAO,UAAU,aAAc,QAAmB;AAAA,EACpE;AAEA,QAAM,MAAM,CAAC,eACX,QAAQ,IAAI,UAAU;AAExB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,sBAA4C;AAC9C,aAAO,MAAM,KAAK,QAAQ,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AACF;AAQO,IAAM,8BACV,WAAW,8BACV,WAAW,+BAA+B,4BAA4B;;;AC9I1E,SAAS,sBAAsB;;;ACOxB,IAAM,mBAAmB,CAC9B,YACuB;AACvB,MAAI,cAAc;AAClB,MAAI,eAAe;AACnB,MAAI,eAA8B;AAClC,MAAI,cAA0C;AAE9C,SAAO;AAAA,IACL,gBAAgB,OAAO,OAA8C;AACnE,UAAI,eAAe,iBAAiB,GAAG;AACrC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAEF,UAAI,eAAe,iBAAiB,GAAG,aAAc,QAAO;AAE5D,qBAAe,GAAG;AAClB,oBAAc,GAAG,YAAY;AAC7B,YAAM,YAAY,MAAM;AAExB,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,YAAY;AAClB,UAAI,CAAC,YAAa,OAAM,IAAI,MAAM,kCAAkC;AACpE,UAAI,YAAa;AACjB,UAAI,aAAc,OAAM,IAAI,MAAM,4BAA4B;AAE9D,oBAAc;AAEd,YAAM,YAAY,OAAO;AAEzB,oBAAc;AAAA,IAChB;AAAA,IACA,UAAU,OAAO,UAAoB;AACnC,UAAI,CAAC,YAAa,OAAM,IAAI,MAAM,kCAAkC;AACpE,UAAI,YAAa,OAAM,IAAI,MAAM,uCAAuC;AACxE,UAAI,aAAc;AAElB,qBAAe;AAEf,YAAM,YAAY,SAAS,KAAK;AAEhC,oBAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,IAAI,WAAW;AACb,aAAO,CAAC,eAAe,CAAC;AAAA,IAC1B;AAAA,IACA,IAAI,cAAc;AAChB,UAAI,gBAAgB;AAClB,cAAM,IAAI,MAAM,qCAAqC;AAEvD,aAAO,YAAY;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;;;ACtDA,IAAM,WAAW,CACf,gBACsC,aAAa,aAAa;AAElE,SAAS,0BACP,aAC2C;AAC3C,MAAI,CAAC,SAAS,WAAW,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC7E;AAEA,SAAS,6BACP,aAC6B;AAC7B,MAAI,SAAS,WAAW;AACtB,UAAM,IAAI,MAAM,oCAAoC;AACxD;AAEO,IAAM,eAAe,CAAC,YAAgD;AAC3E,QAAM,WAAW,SAAS,aAAa;AACvC,QAAM,4BACJ,SAAS,6BAA6B;AAAA,IACpC,IAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AAEF,MAAI,cAAyC;AAC7C,MAAI,WAAW;AAEf,QAAM,mBAAmB,CAACC,aAAsC;AAC9D,iCAA6B,WAAW;AAExC,kBAAc,iBAAiBA,YAAW,yBAAyB;AAAA,EACrE;AACA,QAAM,oBAAoB,YAAY;AACpC,8BAA0B,WAAW;AAErC,UAAM,YAAY,OAAO;AAAA,EAC3B;AACA,QAAM,mBAAmB,YAAY;AACnC,8BAA0B,WAAW;AAErC,UAAM,YAAY,SAAS;AAAA,EAC7B;AAEA,QAAM,aAAa,YAA2B;AAC5C,QAAI,SAAU;AACd,eAAW;AAEX,QAAI,SAAS,WAAW,EAAG,OAAM,YAAY,SAAS;AAAA,EACxD;AAEA,QAAM,UAAU;AAAA,IACd,IAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,2BAA2B,6BAA6B;AAAA,MACtD,IAAI,kBAAkB;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,IAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,kBAAkB;AACpB,aAAO,0BAA0B;AAAA,IACnC;AAAA,IACA;AAAA,IACA,4BAA4B,MAAM;AAAA,IAAC;AAAA,IACnC,eAAe,MAAM,SAAS,WAAW;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,OACf,IACAA,aACe;AACf,uBAAiBA,QAAO;AAExB,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,OAAO;AAC/B,cAAM,kBAAkB;AACxB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,iBAAiB;AACvB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AFrFO,IAAM,cAAc,CAIzB,YAK4C;AAC5C,QAAM,EAAE,QAAQ,QAAQ,QAAQ,GAAG,kBAAkB,IAAI;AAEzD,QAAM,YAAY,mBAA+C;AAAA,IAC/D;AAAA,IACA,aAAa,QAAQ;AAAA,EACvB,CAAC;AAED,QAAM,aAAa,eAAe,KAAK,OAAO;AAE9C,QAAMC,eAGF;AAAA,IACF,YAAY,OAAO;AAAA,IACnB,SAAS,YAAY;AACnB,YAAM,UAAU,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC3C,aAAOA;AAAA,IACT;AAAA,IACA,OAAO,YAAY;AACjB,YAAM,UAAU,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;AAAA,IAC3C;AAAA,IACA,IAAI,CACF,WACuD;AACvD,YAAM,KAAK,UAAU,YAAY;AAAA,QAC/B,GAAG;AAAA,QACH,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,IACd,aAAa,OACX,aACe;AACf,YAAM,UAAU,aAAa;AAE7B,UAAI;AACF,eAAO,MAAM,SAAS,OAAO;AAAA,MAC/B,UAAE;AACA,cAAM,QAAQ,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,sBAAsBA,cAAa,QAAQ,UAAU;AAC9D;;;AG7EO,IAAM,aAAa,CAAI,MAAS,UAAsB;AAC3D,MAAI,YAAY,IAAI,GAAG;AACrB,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WACE,MAAM,QAAQ,KAAK,KACnB,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,KAAK,UAAU,WAAW,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EAE5D;AAEA,MACE,OAAO,SAAS,YAChB,OAAO,UAAU,YACjB,SAAS,QACT,UAAU,MACV;AACA,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AAEjC,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAM,QAAQ,OAAO,KAAK,KAAK;AAE/B,MACE,MAAM,WAAW,MAAM,UACvB,CAAC,MAAM,MAAM,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAEzC,WAAO;AAET,aAAW,OAAO,MAAM;AACtB,QAAI,KAAK,GAAG,aAAa,YAAY,MAAM,GAAG,aAAa;AACzD;AAEF,UAAM,UAAU,WAAW,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC;AAChD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAIO,IAAM,cAAc,CAAI,SAAkC;AAC/D,SACE,QACA,OAAO,SAAS,YAChB,YAAY,QACZ,OAAO,KAAK,QAAQ,MAAM;AAE9B;;;AdeA,IAAM,gCAAgC,OAGpC,IACA,YACwC;AACxC,QAAM,cAAc,SAAS,SAAS;AAEtC,MAAI,CAAC,eAAe,CAAC,YAAY,SAAU,QAAO;AAElD,SAAO,MAAM,YAAY,eAAe,EAAE;AAC5C;AAEO,IAAM,+BAA+B,OAG1C,IACA,SACA,uBACyB;AACzB,QAAM,sBAAsB,MAAM,8BAA8B,IAAI,OAAO;AAC3E,SAAO,qBAAqB,WAAW;AACzC;AAEO,IAAM,kBAAkB,CAI7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0E;AACxE,QAAM,SAASA,iBAAgB;AAC/B,QAAM,cAAc,KAAK;AAEzB,QAAM,gBAAgB;AAAA,IACpB,SAAS;AAAA,MACP,GAAG,gBAAgB,QAAQ,UAAU;AAAA;AAAA,MAErC,GAAG,kBAAkB,UAAU;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,UAAU,OACd,KACA,aAGE,MAAM,6BAA6B,IAAI,SAAS,WAAW,GAC3D,QAAgB,KAAK,aAAa;AAEtC,QAAM,QAAQ,OACZ,KACA,aAEC,MAAM,6BAA6B,IAAI,SAAS,WAAW,GAAG;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AAEF,MAAI,gBAAgB,QAAQ,kBAAkB;AAE9C,QAAM,mBAAmB,CAAC,YAAyC;AACjE,oBAAgB;AAEhB,QAAI,SAAS,QAAS,QAAO,QAAQ,OAAO,iBAAiB,GAAG,OAAO;AAAA,QAClE,QAAO,QAAQ,OAAO,iBAAiB,CAAC;AAAA,EAC/C;AAEA,QAAM,0BAA0B,CAAC,YAAyC;AACxE,QAAI,CAAC,eAAe;AAClB,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,WAAO,iBAAiB,OAAO;AAAA,EACjC;AAEA,QAAM,SACJ,QAAQ,YAAY,WAAW,CAAC,QAAiB;AAEnD,QAAM,WACJ,QAAQ,YAAY,aAAa,CAAC,QAAW;AAE/C,QAAM,aAAa;AAAA,IACjB,QAAQ,GAAG;AAAA,IACX;AAAA,IACA,kBAAkB,OAAO,YAAyC;AAChE,YAAM,iBAAiB,OAAO;AAAA,IAChC;AAAA,IACA,WAAW,OACT,UACA,YACkC;AAClC,YAAM,wBAAwB,OAAO;AAErC,YAAM,MAAO,SAAS,OAAqCC,MAAK;AAChE,YAAM,WAAW,SAAS,YAAY;AACtC,YAAM,aAAa,SAAS,QAAa;AAEzC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,UAAU;AAAA,UACf,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF,CAA2D;AAAA,QAC3D;AAAA,MACF;AAEA,YAAM,cAAc,OAAO,YAAY,KAAK;AAE5C,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,YAAY,aAAa,MAAM;AAAA,UAC/B,qBAAqB;AAAA,QACvB;AAAA,QACA,EAAE,eAAe,aAAa,gBAAgB,YAAY,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,IACA,YAAY,OACV,WACA,YACmC;AACnC,YAAM,wBAAwB,OAAO;AAErC,YAAM,OAAO,UAAU,IAAI,CAAC,QAAQ;AAClC,cAAM,aAAa,SAAS,GAAQ;AACpC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,KAAM,IAAI,OAAqCA,MAAK;AAAA,UACpD,UAAU,IAAI,YAAY;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO;AAAA,UACL;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,UACE,YAAY,OAAO,aAAa,KAAK;AAAA,UACrC,eAAe,OAAO,YAAY;AAAA,UAClC,aAAa,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,GAAa;AAAA,QACrD;AAAA,QACA,EAAE,eAAe,cAAc,gBAAgB,YAAY,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,IACA,WAAW,OACT,QACA,QACA,YAC+B;AAC/B,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,UAAU,QAAQ,QAAQ,OAAO;AAAA,QACxC;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,UACE,YACE,OAAO,KAAK,SAAS,KACrB,OAAO,KAAK,CAAC,EAAG,aAAa,OAAO,KAAK,CAAC,EAAG;AAAA,UAC/C,eAAe,OAAO,OAAO,KAAK,CAAC,GAAG,YAAY,CAAC;AAAA,UACnD,cAAc,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,CAAC;AAAA,UACjD,qBAAqB,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,EAAE;AAAA,QAC3D;AAAA,QACA,EAAE,eAAe,aAAa,gBAAgB,YAAY,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,IACA,YAAY,OACV,QACA,UACA,YAC+B;AAC/B,YAAM,wBAAwB,OAAO;AAErC,YAAM,aAAa,SAAS,QAAa;AAEzC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,WAAW,QAAQ,YAAY,OAAO;AAAA,QAC7C;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,UACE,YAAY,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,CAAC,EAAG,WAAW;AAAA,UACjE,eAAe,OAAO,OAAO,KAAK,CAAC,GAAG,YAAY,CAAC;AAAA,UACnD,cAAc,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,CAAC;AAAA,UACjD,qBAAqB,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,EAAE;AAAA,QAC3D;AAAA,QACA,EAAE,eAAe,cAAc,gBAAgB,YAAY,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,IACA,YAAY,OACV,QACA,QACA,YACmC;AACnC,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM,QAAQ,OAAO,WAAW,QAAQ,MAAM,GAAG,OAAO;AAEvE,aAAO;AAAA,QACL;AAAA,UACE,YAAY;AAAA,UACZ,eAAe,OAAO,YAAY;AAAA,UAClC,cAAc,OAAO,YAAY;AAAA,QACnC;AAAA,QACA,EAAE,eAAe,cAAc,gBAAgB,YAAY,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,IACA,WAAW,OACT,QACA,YAC+B;AAC/B,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,UAAU,UAAU,CAAC,GAAG,OAAO;AAAA,QACtC;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,UACE,YAAY,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,CAAC,EAAG,UAAW;AAAA,UACjE,cAAc,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,CAAC;AAAA,UACjD,cAAc,OAAO,OAAO,KAAK,CAAC,GAAG,WAAW,CAAC;AAAA,QACnD;AAAA,QACA,EAAE,eAAe,aAAa,gBAAgB,YAAY,OAAO;AAAA,MACnE;AAAA,IACF;AAAA,IACA,YAAY,OACV,QACA,YAC+B;AAC/B,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM,QAAQ,OAAO,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;AAErE,aAAO;AAAA,QACL;AAAA,UACE,aAAa,OAAO,YAAY,KAAK;AAAA,UACrC,cAAc,OAAO,YAAY;AAAA,UACjC,cAAc,OAAO,YAAY;AAAA,QACnC;AAAA,QACA,EAAE,eAAe,cAAc,gBAAgB,YAAY,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,IACA,SAAS,OACP,QACA,YACwC;AACxC,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,QAAQ,UAAU,CAAC,CAAC;AAAA,QAC3B;AAAA,MACF;AAEA,YAAM,MAAM,OAAO,KAAK,CAAC;AACzB,UAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAE9C,aAAO,OAAO;AAAA,QACZ,GAAG,IAAI;AAAA,QACP,UAAU,IAAI;AAAA,MAChB,CAAuB;AAAA,IACzB;AAAA,IACA,kBAAkB,OAChB,QACA,YACwC;AACxC,YAAM,wBAAwB,OAAO;AAErC,YAAM,cAAc,MAAM,WAAW,QAAQ,QAAQ,OAAO;AAE5D,UAAI,gBAAgB,KAAM,QAAO;AAEjC,YAAM,WAAW,UAAU,QAAQ,OAAO;AAC1C,aAAO;AAAA,IACT;AAAA,IACA,mBAAmB,OACjB,QACA,aACA,YACwC;AACxC,YAAM,wBAAwB,OAAO;AAErC,YAAM,cAAc,MAAM,WAAW,QAAQ,QAAQ,OAAO;AAE5D,UAAI,gBAAgB,KAAM,QAAO;AAEjC,YAAM,WAAW,WAAW,QAAQ,aAAa,OAAO;AAExD,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,OAChB,QACA,QACA,YACwC;AACxC,YAAM,wBAAwB,OAAO;AAErC,YAAM,cAAc,MAAM,WAAW,QAAQ,QAAQ,OAAO;AAE5D,UAAI,gBAAgB,KAAM,QAAO;AAEjC,YAAM,WAAW,UAAU,QAAQ,QAAQ,OAAO;AAElD,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,OACN,IACA,QACA,YACkC;AAClC,YAAM,EAAE,iBAAiB,SAAS,GAAG,iBAAiB,IAAI,WAAW,CAAC;AACtE,YAAM,wBAAwB,OAAO;AAErC,YAAM,OAAuB,EAAE,KAAK,GAAG;AAEvC,YAAM,WAAY,MAAM,WAAW;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAEA,YAAMC,mBAAkB,qBAAqB,OAAO;AAEpD,UACG,YAAY,QAAQ,YAAY,qBAChC,YAAY,QAAQA,oBAAmB,QACvC,YAAY,QAAQ,YAAY,6BAChC,YAAY,QACXA,qBAAoB,QACpB,SAAS,aAAaA,kBACxB;AACA,eAAO;AAAA,UACL;AAAA,YACE,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ;AAAA,UACA,EAAE,eAAe,UAAU,gBAAgB,YAAY,OAAO;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AAAA,QACnB,aAAa,OAAQ,EAAE,GAAG,SAAS,IAAU;AAAA,MAC/C;AAEA,UAAI,WAAW,UAAsB,MAAM;AACzC,eAAO;AAAA,UACL;AAAA,YACE,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ;AAAA,UACA,EAAE,eAAe,UAAU,gBAAgB,YAAY,OAAO;AAAA,QAChE;AAEF,UAAI,CAAC,YAAY,QAAQ;AACvB,cAAM,SAAS,EAAE,GAAG,QAAQ,KAAK,GAAG;AACpC,cAAM,eAAe,MAAM,WAAW;AAAA,UACpC,EAAE,GAAG,QAAQ,KAAK,GAAG;AAAA,UACrB;AAAA,YACE,GAAG;AAAA,YACH,iBAAiB;AAAA,UACnB;AAAA,QACF;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG;AAAA,YACH,UAAU,aAAa;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,CAAC,QAAQ;AACvB,cAAM,eAAe,MAAM,WAAW,UAAU,MAAM;AAAA,UACpD,GAAG;AAAA,UACH,iBAAiBA,oBAAmB;AAAA,QACtC,CAAC;AACD,eAAO,EAAE,GAAG,cAAc,UAAU,KAAK;AAAA,MAC3C;AAEA,UAAI,YAAY,QAAQ;AACtB,cAAM,gBAAgB,MAAM,WAAW,WAAW,MAAM,QAAQ;AAAA,UAC9D,GAAG;AAAA,UACH,iBAAiBA,oBAAmB;AAAA,QACtC,CAAC;AACD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG;AAAA,YACH,UAAU,cAAc;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,UACE,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,QACA,EAAE,eAAe,UAAU,gBAAgB,YAAY,OAAO;AAAA,MAChE;AAAA,IACF;AAAA,IACA,MAAM,OACJ,QACA,YACmC;AACnC,YAAM,wBAAwB,OAAO;AAErC,YAAM,SAAS,MAAM;AAAA,QACnB,OAAO,KAAK,UAAU,CAAC,GAAG,OAAO;AAAA,MACnC;AACA,aAAO,OAAO,KAAK;AAAA,QACjB,CAAC,QACC,OAAO;AAAA,UACL,GAAG,IAAI;AAAA,UACP,UAAU,IAAI;AAAA,QAChB,CAAuB;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,gBAAgB,OACd,QACA,YACoB;AACpB,YAAM,wBAAwB,OAAO;AAErC,YAAM,EAAE,MAAM,IAAI,MAAM;AAAA,QACtB,MAAyB,OAAO,eAAe,UAAU,CAAC,CAAC,CAAC;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,YAA2D;AACtE,YAAM,wBAAwB,OAAO;AACrC,YAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC1C,cAAQ,QAAQ,YAAY,KAAK;AAAA,IACnC;AAAA,IACA,QAAQ,OACN,SACA,YACgC;AAChC,YAAM,wBAAwB,OAAO;AACrC,YAAM,QAAQ,OAAO,OAAO,OAAO,CAAC;AACpC,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AAAA,MACH,MAAM,MACJ,KACA,SACmB;AACnB,cAAM,wBAAwB,OAAO;AAErC,cAAM,SAAS,MAAM,MAAc,KAAK,OAAO;AAC/C,eAAO,OAAO;AAAA,MAChB;AAAA,MACA,MAAM,QACJ,KACA,SAC8B;AAC9B,cAAM,wBAAwB,OAAO;AAErC,eAAO,QAAQ,KAAK,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,WAAWF;AAAA,MACX,SAAS,CAAC,YACRG,kBAAiB,MAAMH,iBAAgB,YAAY,OAAO;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;","names":["runSQLMigrations","uuid","schemaComponent","operationResult","schemaComponent","schemaComponent","options","options","pongoClient","schemaComponent","uuid","expectedVersion","runSQLMigrations"]}
@@ -4,7 +4,7 @@ import {
4
4
  expectedVersionValue,
5
5
  hasOperators,
6
6
  objectEntries
7
- } from "./chunk-BHL7DORE.js";
7
+ } from "./chunk-IBYIIPWV.js";
8
8
 
9
9
  // src/storage/sqlite/core/sqlBuilder/index.ts
10
10
  import { isSQL, SQL as SQL4, sqlMigration } from "@event-driven-io/dumbo";
@@ -329,4 +329,4 @@ export {
329
329
  pongoCollectionSQLiteMigrations,
330
330
  sqliteSQLBuilder
331
331
  };
332
- //# sourceMappingURL=chunk-E66GVGL3.js.map
332
+ //# sourceMappingURL=chunk-T5YVXV53.js.map
package/dist/cli.cjs CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkLHIYVLUAcjs = require('./chunk-LHIYVLUA.cjs');
8
+ var _chunkHZZ76RUCcjs = require('./chunk-HZZ76RUC.cjs');
9
9
 
10
10
  // src/cli.ts
11
11
  var _commander = require('commander');
@@ -92,7 +92,7 @@ var parseDefaultDbSchema = (imported) => {
92
92
  if (!imported.default.schema.dbs) {
93
93
  return missingDbs;
94
94
  }
95
- const dbs = _chunkLHIYVLUAcjs.objectEntries.call(void 0, imported.default.schema.dbs).map((db) => db[1]);
95
+ const dbs = _chunkHZZ76RUCcjs.objectEntries.call(void 0, imported.default.schema.dbs).map((db) => db[1]);
96
96
  const defaultDb = dbs.find((db) => db.name === void 0);
97
97
  if (!defaultDb) {
98
98
  return missingDefaultDb;
@@ -100,17 +100,17 @@ var parseDefaultDbSchema = (imported) => {
100
100
  if (!defaultDb.collections) {
101
101
  return missingCollections;
102
102
  }
103
- const collections = _chunkLHIYVLUAcjs.objectEntries.call(void 0, defaultDb.collections).map((col) => col[1]);
103
+ const collections = _chunkHZZ76RUCcjs.objectEntries.call(void 0, defaultDb.collections).map((col) => col[1]);
104
104
  if (collections.length === 0) {
105
105
  return missingCollections;
106
106
  }
107
- return _chunkLHIYVLUAcjs.toDbSchemaMetadata.call(void 0, defaultDb);
107
+ return _chunkHZZ76RUCcjs.toDbSchemaMetadata.call(void 0, defaultDb);
108
108
  };
109
109
  var configCommand = new (0, _commander.Command)("config").description(
110
110
  "Manage Pongo configuration"
111
111
  );
112
112
  configCommand.command("sample").description("Generate or print sample configuration").option(
113
- "-col, --collection <name>",
113
+ "--col, --collection <name>",
114
114
  "Specify the collection name",
115
115
  (value, previous) => {
116
116
  return previous.concat([value]);
@@ -153,27 +153,27 @@ var migrateCommand = new (0, _commander.Command)("migrate").description(
153
153
  "Manage database migrations"
154
154
  );
155
155
  migrateCommand.command("run").description("Run database migrations").option(
156
- "-dbt, --database-type <string>",
156
+ "--dbt, --database-type <string>",
157
157
  "Database type that should be used for connection (e.g., PostgreSQL or SQLite)",
158
158
  void 0
159
159
  ).option(
160
- "-drv, --database-driver <string>",
160
+ "--drv, --database-driver <string>",
161
161
  'Database driver that should be used for connection (e.g., "pg" for PostgreSQL, "sqlite3" for SQLite)'
162
162
  ).option(
163
- "-dbn, --database-name <string>",
163
+ "--dbn, --database-name <string>",
164
164
  "Database name to connect to",
165
165
  void 0
166
166
  ).option(
167
- "-cs, --connection-string <string>",
167
+ "--cs, --connection-string <string>",
168
168
  "Connection string for the database"
169
169
  ).option(
170
- "-col, --collection <name>",
170
+ "--col, --collection <name>",
171
171
  "Specify the collection name",
172
172
  (value, previous) => {
173
173
  return previous.concat([value]);
174
174
  },
175
175
  []
176
- ).option("-f, --config <path>", "Path to configuration file with Pongo config").option("-dr, --dryRun", "Perform dry run without commiting changes", false).action(async (options) => {
176
+ ).option("-f, --config <path>", "Path to configuration file with Pongo config").option("--dr, --dryRun", "Perform dry run without commiting changes", false).action(async (options) => {
177
177
  const { collection, dryRun, databaseName, databaseDriver } = options;
178
178
  const connectionString = _nullishCoalesce(options.connectionString, () => ( process.env.DB_CONNECTION_STRING));
179
179
  const databaseType = _nullishCoalesce(options.databaseType, () => ( _dumbo.parseConnectionString.call(void 0, connectionString).databaseType));
@@ -208,17 +208,17 @@ migrateCommand.command("run").description("Run database migrations").option(
208
208
  });
209
209
  });
210
210
  migrateCommand.command("sql").description("Generate SQL for database migration").option(
211
- "-dbt, --database-type <string>",
211
+ "--dbt, --database-type <string>",
212
212
  "Database type that should be used for connection (e.g., PostgreSQL or SQLite)"
213
213
  ).option(
214
- "-drv, --database-driver <string>",
214
+ "--drv, --database-driver <string>",
215
215
  'Database driver that should be used for connection (e.g., "pg" for PostgreSQL, "sqlite3" for SQLite)'
216
216
  ).option(
217
- "-dbn, --database-name <string>",
217
+ "--dbn, --database-name <string>",
218
218
  "Database name to connect to",
219
219
  void 0
220
220
  ).option(
221
- "-col, --collection <name>",
221
+ "--col, --collection <name>",
222
222
  "Specify the collection name",
223
223
  (value, previous) => {
224
224
  return previous.concat([value]);
@@ -254,14 +254,14 @@ var getMigrations = ({
254
254
  databaseName,
255
255
  collectionNames
256
256
  }) => {
257
- const driver = _chunkLHIYVLUAcjs.pongoDatabaseDriverRegistry.tryGet(driverType);
257
+ const driver = _chunkHZZ76RUCcjs.pongoDatabaseDriverRegistry.tryGet(driverType);
258
258
  if (driver === null) {
259
259
  console.error(
260
260
  `Error: No database driver found for driver type "${driverType}". Make sure the driver is registered and the connection string is correct.`
261
261
  );
262
262
  process.exit(1);
263
263
  }
264
- const dbDefinition = _chunkLHIYVLUAcjs.pongoSchema.db.from(databaseName, collectionNames);
264
+ const dbDefinition = _chunkHZZ76RUCcjs.pongoSchema.db.from(databaseName, collectionNames);
265
265
  const driverOptions = {
266
266
  schema: { definition: dbDefinition },
267
267
  serializer: _dumbo.JSONSerializer
@@ -355,7 +355,7 @@ var prettifyLogs = (logLevel) => {
355
355
  var startRepl = async (options) => {
356
356
  setLogLevel(_nullishCoalesce(process.env.DUMBO_LOG_LEVEL, () => ( options.logging.logLevel)));
357
357
  setLogStyle(_nullishCoalesce(process.env.DUMBO_LOG_STYLE, () => ( options.logging.logStyle)));
358
- console.log(_dumbo.color.green("Starting Pongo Shell (version: 0.17.0-beta.17)"));
358
+ console.log(_dumbo.color.green("Starting Pongo Shell (version: 0.17.0-beta.19)"));
359
359
  if (options.logging.printOptions) {
360
360
  console.log(_dumbo.color.green("With Options:"));
361
361
  console.log(_dumbo.prettyJson.call(void 0, options));
@@ -370,7 +370,7 @@ var startRepl = async (options) => {
370
370
  }
371
371
  const { databaseType } = _dumbo.parseConnectionString.call(void 0, connectionString);
372
372
  const driverType = `${databaseType}:${options.databaseDriver}`;
373
- const driver = _chunkLHIYVLUAcjs.pongoDatabaseDriverRegistry.tryGet(driverType);
373
+ const driver = _chunkHZZ76RUCcjs.pongoDatabaseDriverRegistry.tryGet(driverType);
374
374
  if (driver === null) {
375
375
  console.error(
376
376
  `Error: No database driver found for driver type "${driverType}". Make sure the driver is installed and the connection string is correct.`
@@ -409,10 +409,10 @@ var startRepl = async (options) => {
409
409
  if (options.schema.collections.length > 0) {
410
410
  const collectionsSchema = {};
411
411
  for (const collectionName of options.schema.collections) {
412
- collectionsSchema[collectionName] = _chunkLHIYVLUAcjs.pongoSchema.collection(collectionName);
412
+ collectionsSchema[collectionName] = _chunkHZZ76RUCcjs.pongoSchema.collection(collectionName);
413
413
  }
414
- const schema = _chunkLHIYVLUAcjs.pongoSchema.client({
415
- database: _chunkLHIYVLUAcjs.pongoSchema.db(options.schema.database, collectionsSchema)
414
+ const schema = _chunkHZZ76RUCcjs.pongoSchema.client({
415
+ database: _chunkHZZ76RUCcjs.pongoSchema.db(options.schema.database, collectionsSchema)
416
416
  });
417
417
  const driverOptions = {
418
418
  driver,
@@ -424,7 +424,7 @@ var startRepl = async (options) => {
424
424
  const customOptions = {
425
425
  connectionString
426
426
  };
427
- const typedClient = _chunkLHIYVLUAcjs.pongoClient.call(void 0, {
427
+ const typedClient = _chunkHZZ76RUCcjs.pongoClient.call(void 0, {
428
428
  ...driverOptions,
429
429
  ...customOptions
430
430
  });
@@ -443,7 +443,7 @@ var startRepl = async (options) => {
443
443
  const customOptions = {
444
444
  connectionString
445
445
  };
446
- pongo = _chunkLHIYVLUAcjs.pongoClient.call(void 0, {
446
+ pongo = _chunkHZZ76RUCcjs.pongoClient.call(void 0, {
447
447
  ...driverOptions,
448
448
  ...customOptions
449
449
  });
@@ -474,27 +474,27 @@ var teardown = async () => {
474
474
  process.on("uncaughtException", teardown);
475
475
  process.on("SIGINT", teardown);
476
476
  var shellCommand = new (0, _commander.Command)("shell").description("Start an interactive Pongo shell").option(
477
- "-drv, --database-driver <string>",
477
+ "--drv, --database-driver <string>",
478
478
  'Database driver that should be used for connection (e.g., "pg" for PostgreSQL, "sqlite3" for SQLite)',
479
479
  "pg"
480
480
  ).option(
481
- "-cs, --connectionString <string>",
481
+ "--cs, --connectionString <string>",
482
482
  "Connection string for the database"
483
- ).option("-db, --database <string>", "Database name to connect", "postgres").option(
484
- "-col, --collection <name>",
483
+ ).option("--db, --database <string>", "Database name to connect", "postgres").option(
484
+ "--col, --collection <name>",
485
485
  "Specify the collection name",
486
486
  (value, previous) => {
487
487
  return previous.concat([value]);
488
488
  },
489
489
  []
490
490
  ).option(
491
- "-no-migrations, --disable-auto-migrations",
491
+ "--no-migrations, --disable-auto-migrations",
492
492
  "Disable automatic migrations"
493
493
  ).option("-o, --print-options", "Print shell options").option(
494
- "-ll, --log-level <logLevel>",
494
+ "--ll, --log-level <logLevel>",
495
495
  "Log level: DISABLED, INFO, LOG, WARN, ERROR",
496
496
  "DISABLED"
497
- ).option("-ls, --log-style", "Log style: RAW, PRETTY", "RAW").option("-p, --pretty-log", "Turn on logging with prettified output").action(async (options) => {
497
+ ).option("--ls, --log-style", "Log style: RAW, PRETTY", "RAW").option("-p, --pretty-log", "Turn on logging with prettified output").action(async (options) => {
498
498
  const { collection, database } = options;
499
499
  const connectionString = options.connectionString;
500
500
  await startRepl({
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/cli.cjs","../src/cli.ts","../src/commandLine/configFile.ts","../src/commandLine/migrate.ts","../src/commandLine/shell.ts"],"names":[],"mappings":"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","file":"/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/cli.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { configCommand, migrateCommand, shellCommand } from './commandLine';\n\nconst program = new Command();\n\nprogram.name('pongo').description('CLI tool for Pongo');\n\nprogram.addCommand(configCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(shellCommand);\n\nprogram.parse(process.argv);\n\nexport default program;\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport {\n objectEntries,\n toDbSchemaMetadata,\n type PongoDbSchemaMetadata,\n type PongoSchemaConfig,\n} from '../core';\n\nconst formatTypeName = (input: string): string => {\n if (input.length === 0) {\n return input;\n }\n\n let formatted = input.charAt(0).toUpperCase() + input.slice(1);\n\n if (formatted.endsWith('s')) {\n formatted = formatted.slice(0, -1);\n }\n\n return formatted;\n};\n\nconst sampleConfig = (collectionNames: string[] = ['users']) => {\n const types = collectionNames\n .map(\n (name) =>\n `export type ${formatTypeName(name)} = { name: string; description: string; date: Date }`,\n )\n .join('\\n');\n\n const collections = collectionNames\n .map(\n (name) =>\n ` ${name}: pongoSchema.collection<${formatTypeName(name)}>('${name}'),`,\n )\n .join('\\n');\n\n return `import { pongoSchema } from '@event-driven-io/pongo';\n\n${types}\n\nexport default {\n schema: pongoSchema.client({\n database: pongoSchema.db({\n${collections}\n }),\n }),\n};`;\n};\n\nconst missingDefaultExport = `Error: Config should contain default export, e.g.\\n\\n${sampleConfig()}`;\nconst missingSchema = `Error: Config should contain schema property, e.g.\\n\\n${sampleConfig()}`;\nconst missingDbs = `Error: Config should have at least a single database defined, e.g.\\n\\n${sampleConfig()}`;\nconst missingDefaultDb = `Error: Config should have a default database defined (without name or or with default database name), e.g.\\n\\n${sampleConfig()}`;\nconst missingCollections = `Error: Database should have defined at least one collection, e.g.\\n\\n${sampleConfig()}`;\n\nexport const loadConfigFile = async (\n configPath: string,\n): Promise<PongoDbSchemaMetadata> => {\n const configUrl = new URL(configPath, `file://${process.cwd()}/`);\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const imported: Partial<{ default: PongoSchemaConfig }> = await import(\n configUrl.href\n );\n\n const parsed = parseDefaultDbSchema(imported);\n\n if (typeof parsed === 'string') {\n console.error(parsed);\n process.exit(1);\n }\n\n return parsed;\n } catch {\n console.error(`Error: Couldn't load file: ${configUrl.href}`);\n process.exit(1);\n }\n};\n\nexport const generateConfigFile = (\n configPath: string,\n collectionNames: string[],\n): void => {\n try {\n fs.writeFileSync(configPath, sampleConfig(collectionNames), 'utf8');\n console.log(`Configuration file stored at: ${configPath}`);\n } catch (error) {\n console.error(`Error: Couldn't store config file: ${configPath}!`);\n console.error(error);\n process.exit(1);\n }\n};\n\nexport const parseDefaultDbSchema = (\n imported: Partial<{ default: PongoSchemaConfig }>,\n): PongoDbSchemaMetadata | string => {\n if (!imported.default) {\n return missingDefaultExport;\n }\n\n if (!imported.default.schema) {\n return missingSchema;\n }\n\n if (!imported.default.schema.dbs) {\n return missingDbs;\n }\n\n const dbs = objectEntries(imported.default.schema.dbs).map((db) => db[1]);\n\n const defaultDb = dbs.find((db) => db.name === undefined);\n\n if (!defaultDb) {\n return missingDefaultDb;\n }\n\n if (!defaultDb.collections) {\n return missingCollections;\n }\n\n const collections = objectEntries(defaultDb.collections).map((col) => col[1]);\n\n if (collections.length === 0) {\n return missingCollections;\n }\n\n return toDbSchemaMetadata(defaultDb);\n};\n\ntype SampleConfigOptions =\n | {\n collection: string[];\n print?: boolean;\n }\n | {\n collection: string[];\n generate?: boolean;\n file?: string;\n };\n\nexport const configCommand = new Command('config').description(\n 'Manage Pongo configuration',\n);\n\nconfigCommand\n .command('sample')\n .description('Generate or print sample configuration')\n .option(\n '-col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option(\n '-f, --file <path>',\n 'Path to configuration file with collection list',\n )\n .option('-g, --generate', 'Generate sample config file')\n .option('-p, --print', 'Print sample config file')\n .action((options: SampleConfigOptions) => {\n const collectionNames =\n options.collection.length > 0 ? options.collection : ['users'];\n\n if (!('print' in options) && !('generate' in options)) {\n console.error(\n 'Error: Please provide either:\\n--print param to print sample config or\\n--generate to generate sample config file',\n );\n process.exit(1);\n }\n\n if ('print' in options) {\n console.log(`${sampleConfig(collectionNames)}`);\n } else if ('generate' in options) {\n if (!options.file) {\n console.error(\n 'Error: You need to provide a config file through a --file',\n );\n process.exit(1);\n }\n\n generateConfigFile(options.file, collectionNames);\n }\n });\n","import {\n combineMigrations,\n dumbo,\n JSONSerializer,\n parseConnectionString,\n runSQLMigrations,\n type DatabaseDriverType,\n} from '@event-driven-io/dumbo';\nimport { Command } from 'commander';\nimport {\n pongoDatabaseDriverRegistry,\n pongoSchema,\n type AnyPongoDatabaseDriverOptions,\n type PongoCollectionSchema,\n type PongoDatabaseFactoryOptions,\n type PongoDocument,\n} from '../core';\nimport { loadConfigFile } from './configFile';\n\ninterface MigrateRunOptions {\n collection: string[];\n connectionString: string;\n databaseType?: string;\n databaseName?: string | undefined;\n databaseDriver: string;\n config?: string;\n dryRun?: boolean;\n}\n\ninterface MigrateSqlOptions {\n print?: boolean;\n write?: string;\n databaseType: string;\n databaseName?: string | undefined;\n databaseDriver: string;\n config?: string;\n collection: string[];\n}\n\nexport const migrateCommand = new Command('migrate').description(\n 'Manage database migrations',\n);\n\nmigrateCommand\n .command('run')\n .description('Run database migrations')\n .option(\n '-dbt, --database-type <string>',\n 'Database type that should be used for connection (e.g., PostgreSQL or SQLite)',\n undefined,\n )\n .option(\n '-drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n )\n .option(\n '-dbn, --database-name <string>',\n 'Database name to connect to',\n undefined,\n )\n .option(\n '-cs, --connection-string <string>',\n 'Connection string for the database',\n )\n .option(\n '-col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option('-f, --config <path>', 'Path to configuration file with Pongo config')\n .option('-dr, --dryRun', 'Perform dry run without commiting changes', false)\n .action(async (options: MigrateRunOptions) => {\n const { collection, dryRun, databaseName, databaseDriver } = options;\n const connectionString =\n options.connectionString ?? process.env.DB_CONNECTION_STRING;\n\n const databaseType =\n options.databaseType ??\n parseConnectionString(connectionString).databaseType;\n\n let collectionNames: string[];\n\n if (!connectionString) {\n console.error(\n 'Error: Connection string is required. Provide it either as a \"--connection-string\" parameter or through the DB_CONNECTION_STRING environment variable.' +\n '\\nFor instance: --connection-string postgresql://postgres:postgres@localhost:5432/postgres',\n );\n process.exit(1);\n }\n\n if (options.config) {\n const config = await loadConfigFile(options.config);\n\n collectionNames = config.collections.map((c) => c.name);\n } else if (collection) {\n collectionNames = collection;\n } else {\n console.error(\n 'Error: You need to provide at least one collection name. Provide it either through \"--config\" file or as a \"--collection\" parameter.',\n );\n process.exit(1);\n }\n\n const driverType = `${databaseType}:${databaseDriver}` as const;\n\n const migrations = getMigrations({\n driverType,\n connectionString,\n databaseName,\n collectionNames,\n });\n\n const pool = dumbo({ connectionString, driverType });\n\n await runSQLMigrations(pool, migrations, {\n dryRun,\n });\n });\n\nmigrateCommand\n .command('sql')\n .description('Generate SQL for database migration')\n .option(\n '-dbt, --database-type <string>',\n 'Database type that should be used for connection (e.g., PostgreSQL or SQLite)',\n )\n .option(\n '-drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n )\n .option(\n '-dbn, --database-name <string>',\n 'Database name to connect to',\n undefined,\n )\n .option(\n '-col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option('-f, --config <path>', 'Path to configuration file with Pongo config')\n .option('--print', 'Print the SQL to the console (default)', true)\n //.option('--write <filename>', 'Write the SQL to a specified file')\n .action(async (options: MigrateSqlOptions) => {\n const { collection, databaseName, databaseType, databaseDriver } = options;\n\n let collectionNames: string[];\n\n if (options.config) {\n const config = await loadConfigFile(options.config);\n\n collectionNames = config.collections.map((c) => c.name);\n } else if (collection) {\n collectionNames = collection;\n } else {\n console.error(\n 'Error: You need to provide at least one collection name. Provide it either through \"--config\" file or as a \"--collection\" parameter.',\n );\n process.exit(1);\n }\n\n const driverType = `${databaseType}:${databaseDriver}` as const;\n\n const migrations = getMigrations({\n driverType,\n connectionString: undefined,\n databaseName,\n collectionNames,\n });\n\n console.log('Printing SQL:');\n console.log(combineMigrations(...migrations));\n });\n\nconst getMigrations = ({\n driverType,\n connectionString,\n databaseName,\n collectionNames,\n}: {\n driverType: DatabaseDriverType;\n connectionString: string | undefined;\n databaseName: string | undefined;\n collectionNames: string[];\n}) => {\n const driver = pongoDatabaseDriverRegistry.tryGet(driverType);\n\n if (driver === null) {\n console.error(\n `Error: No database driver found for driver type \"${driverType}\". Make sure the driver is registered and the connection string is correct.`,\n );\n process.exit(1);\n }\n\n const dbDefinition = pongoSchema.db.from(databaseName, collectionNames);\n\n const driverOptions: PongoDatabaseFactoryOptions<\n Record<string, PongoCollectionSchema<PongoDocument>>,\n AnyPongoDatabaseDriverOptions\n > = {\n schema: { definition: dbDefinition },\n serializer: JSONSerializer,\n };\n\n const customOptions = {\n connectionString,\n databaseName,\n };\n\n const db = driver.databaseFactory({ ...driverOptions, ...customOptions });\n\n return db.schema.component.migrations;\n};\n","import {\n color,\n LogLevel,\n LogStyle,\n parseConnectionString,\n prettyJson,\n SQL,\n type MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport { checkConnection } from '@event-driven-io/dumbo/pg';\nimport Table from 'cli-table3';\nimport { Command } from 'commander';\nimport repl from 'node:repl';\nimport {\n pongoClient,\n pongoDatabaseDriverRegistry,\n pongoSchema,\n type PongoClient,\n type PongoClientOptions,\n type PongoCollectionSchema,\n type PongoDb,\n} from '../core';\n\nlet pongo: PongoClient;\n\nconst calculateColumnWidths = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n results: any[],\n columnNames: string[],\n): number[] => {\n const columnWidths = columnNames.map((col) => {\n const maxWidth = Math.max(\n col.length, // Header size\n ...results.map((result) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n result[col] ? String(result[col]).length : 0,\n ),\n );\n return maxWidth + 2; // Add padding\n });\n return columnWidths;\n};\n\nlet shouldDisplayResultsAsTable = false;\n\nconst printResultsAsTable = (print?: boolean) =>\n (shouldDisplayResultsAsTable = print === undefined || print === true);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst printOutput = (obj: any): string =>\n Array.isArray(obj) && shouldDisplayResultsAsTable\n ? displayResultsAsTable(obj)\n : prettyJson(obj);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst displayResultsAsTable = (results: any[]): string => {\n if (results.length === 0) {\n return color.yellow('No documents found.');\n }\n\n const columnNames = results\n\n .flatMap((result) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n typeof result === 'object' ? Object.keys(result) : typeof result,\n )\n .filter((value, index, array) => array.indexOf(value) === index);\n\n const columnWidths = calculateColumnWidths(results, columnNames);\n\n const table = new Table({\n head: columnNames.map((col) => color.cyan(col)),\n colWidths: columnWidths,\n });\n\n results.forEach((result) => {\n table.push(\n columnNames.map((col) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n result[col] !== undefined\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n Array.isArray(result[col])\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n displayResultsAsTable(result[col])\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n prettyJson(result[col])\n : typeof result === 'object'\n ? ''\n : result != undefined && result != undefined\n ? prettyJson(result)\n : '',\n ),\n );\n });\n\n return table.toString();\n};\n\nconst setLogLevel = (logLevel: string) => {\n process.env.DUMBO_LOG_LEVEL = logLevel;\n};\n\nconst setLogStyle = (logLevel: string) => {\n process.env.DUMBO_LOG_STYLE = logLevel;\n};\n\nconst prettifyLogs = (logLevel?: string) => {\n if (logLevel !== undefined) setLogLevel(logLevel);\n setLogStyle(LogStyle.PRETTY);\n};\n\nconst startRepl = async (options: {\n logging: {\n printOptions: boolean;\n logLevel: LogLevel;\n logStyle: LogStyle;\n };\n schema: {\n database: string;\n collections: string[];\n autoMigration: MigrationStyle;\n };\n connectionString: string | undefined;\n databaseDriver: string;\n}) => {\n // TODO: This will change when we have proper tracing and logging config\n // For now, that's enough\n setLogLevel(process.env.DUMBO_LOG_LEVEL ?? options.logging.logLevel);\n setLogStyle(process.env.DUMBO_LOG_STYLE ?? options.logging.logStyle);\n\n console.log(color.green('Starting Pongo Shell (version: 0.17.0-beta.17)'));\n\n if (options.logging.printOptions) {\n console.log(color.green('With Options:'));\n console.log(prettyJson(options));\n }\n\n const connectionString =\n options.connectionString ??\n process.env.DB_CONNECTION_STRING ??\n 'postgresql://postgres:postgres@localhost:5432/postgres';\n\n if (!(options.connectionString ?? process.env.DB_CONNECTION_STRING)) {\n console.log(\n color.yellow(\n `No connection string provided, using: 'postgresql://postgres:postgres@localhost:5432/postgres'`,\n ),\n );\n }\n\n const { databaseType } = parseConnectionString(connectionString);\n const driverType = `${databaseType}:${options.databaseDriver}` as const;\n\n const driver = pongoDatabaseDriverRegistry.tryGet(driverType);\n\n if (driver === null) {\n console.error(\n `Error: No database driver found for driver type \"${driverType}\". Make sure the driver is installed and the connection string is correct.`,\n );\n process.exit(1);\n }\n\n const connectionCheck = await checkConnection(connectionString);\n\n if (!connectionCheck.successful) {\n if (connectionCheck.errorType === 'ConnectionRefused') {\n console.error(\n color.red(\n `Connection was refused. Check if the PostgreSQL server is running and accessible.`,\n ),\n );\n } else if (connectionCheck.errorType === 'Authentication') {\n console.error(\n color.red(\n `Authentication failed. Check the username and password in the connection string.`,\n ),\n );\n } else {\n console.error(color.red('Error connecting to PostgreSQL server'));\n }\n console.log(color.red('Exiting Pongo Shell...'));\n process.exit();\n }\n\n console.log(color.green(`Successfully connected`));\n console.log(color.green('Use db.<collection>.<method>() to query.'));\n\n const shell = repl.start({\n prompt: color.green('pongo> '),\n useGlobal: true,\n breakEvalOnSigint: true,\n writer: printOutput,\n });\n\n let db: PongoDb;\n\n if (options.schema.collections.length > 0) {\n const collectionsSchema: Record<string, PongoCollectionSchema> = {};\n\n for (const collectionName of options.schema.collections) {\n collectionsSchema[collectionName] =\n pongoSchema.collection(collectionName);\n }\n\n const schema = pongoSchema.client({\n database: pongoSchema.db(options.schema.database, collectionsSchema),\n });\n\n const driverOptions: PongoClientOptions = {\n driver,\n schema: {\n definition: schema,\n autoMigration: options.schema.autoMigration,\n },\n };\n\n // TODO: Find a better way to pass custom driver settings\n const customOptions = {\n connectionString,\n };\n\n const typedClient = pongoClient({\n ...driverOptions,\n ...customOptions,\n });\n\n db = typedClient.database!;\n\n for (const collectionName of options.schema.collections) {\n shell.context[collectionName] = typedClient.database![collectionName];\n }\n\n pongo = typedClient;\n } else {\n const driverOptions: PongoClientOptions = {\n driver,\n schema: {\n autoMigration: options.schema.autoMigration,\n },\n };\n\n // TODO: Find a better way to pass custom driver settings\n const customOptions = {\n connectionString,\n };\n\n pongo = pongoClient({\n ...driverOptions,\n ...customOptions,\n });\n\n db = pongo.db(options.schema.database);\n }\n\n shell.context.pongo = pongo;\n shell.context.db = db;\n\n // helpers\n shell.context.SQL = SQL;\n shell.context.setLogLevel = setLogLevel;\n shell.context.setLogStyle = setLogStyle;\n shell.context.prettifyLogs = prettifyLogs;\n shell.context.printResultsAsTable = printResultsAsTable;\n shell.context.LogStyle = LogStyle;\n shell.context.LogLevel = LogLevel;\n\n // Intercept REPL output to display results as a table if they are arrays\n shell.on('exit', async () => {\n await teardown();\n process.exit();\n });\n\n shell.on('SIGINT', async () => {\n await teardown();\n process.exit();\n });\n};\n\nconst teardown = async () => {\n console.log(color.yellow('Exiting Pongo Shell...'));\n await pongo.close();\n};\n\nprocess.on('uncaughtException', teardown);\nprocess.on('SIGINT', teardown);\n\ninterface ShellOptions {\n database: string;\n collection: string[];\n databaseDriver: string;\n connectionString?: string;\n disableAutoMigrations: boolean;\n logStyle?: string;\n logLevel?: string;\n prettyLog?: boolean;\n printOptions?: boolean;\n}\n\nconst shellCommand = new Command('shell')\n .description('Start an interactive Pongo shell')\n .option(\n '-drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n 'pg',\n )\n .option(\n '-cs, --connectionString <string>',\n 'Connection string for the database',\n )\n .option('-db, --database <string>', 'Database name to connect', 'postgres')\n .option(\n '-col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option(\n '-no-migrations, --disable-auto-migrations',\n 'Disable automatic migrations',\n )\n .option('-o, --print-options', 'Print shell options')\n .option(\n '-ll, --log-level <logLevel>',\n 'Log level: DISABLED, INFO, LOG, WARN, ERROR',\n 'DISABLED',\n )\n .option('-ls, --log-style', 'Log style: RAW, PRETTY', 'RAW')\n .option('-p, --pretty-log', 'Turn on logging with prettified output')\n .action(async (options: ShellOptions) => {\n const { collection, database } = options;\n const connectionString = options.connectionString;\n\n await startRepl({\n logging: {\n printOptions: options.printOptions === true,\n logStyle: options.prettyLog\n ? LogStyle.PRETTY\n : ((options.logStyle as LogStyle | undefined) ?? LogStyle.RAW),\n logLevel: options.logLevel\n ? (options.logLevel as LogLevel)\n : options.prettyLog\n ? LogLevel.INFO\n : LogLevel.DISABLED,\n },\n schema: {\n collections: collection,\n database,\n autoMigration: options.disableAutoMigrations\n ? 'None'\n : 'CreateOrUpdate',\n },\n connectionString,\n databaseDriver: options.databaseDriver,\n });\n });\n\nexport { shellCommand };\n"]}
1
+ {"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/cli.cjs","../src/cli.ts","../src/commandLine/configFile.ts","../src/commandLine/migrate.ts","../src/commandLine/shell.ts"],"names":[],"mappings":"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","file":"/home/runner/work/Pongo/Pongo/src/packages/pongo/dist/cli.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { configCommand, migrateCommand, shellCommand } from './commandLine';\n\nconst program = new Command();\n\nprogram.name('pongo').description('CLI tool for Pongo');\n\nprogram.addCommand(configCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(shellCommand);\n\nprogram.parse(process.argv);\n\nexport default program;\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport {\n objectEntries,\n toDbSchemaMetadata,\n type PongoDbSchemaMetadata,\n type PongoSchemaConfig,\n} from '../core';\n\nconst formatTypeName = (input: string): string => {\n if (input.length === 0) {\n return input;\n }\n\n let formatted = input.charAt(0).toUpperCase() + input.slice(1);\n\n if (formatted.endsWith('s')) {\n formatted = formatted.slice(0, -1);\n }\n\n return formatted;\n};\n\nconst sampleConfig = (collectionNames: string[] = ['users']) => {\n const types = collectionNames\n .map(\n (name) =>\n `export type ${formatTypeName(name)} = { name: string; description: string; date: Date }`,\n )\n .join('\\n');\n\n const collections = collectionNames\n .map(\n (name) =>\n ` ${name}: pongoSchema.collection<${formatTypeName(name)}>('${name}'),`,\n )\n .join('\\n');\n\n return `import { pongoSchema } from '@event-driven-io/pongo';\n\n${types}\n\nexport default {\n schema: pongoSchema.client({\n database: pongoSchema.db({\n${collections}\n }),\n }),\n};`;\n};\n\nconst missingDefaultExport = `Error: Config should contain default export, e.g.\\n\\n${sampleConfig()}`;\nconst missingSchema = `Error: Config should contain schema property, e.g.\\n\\n${sampleConfig()}`;\nconst missingDbs = `Error: Config should have at least a single database defined, e.g.\\n\\n${sampleConfig()}`;\nconst missingDefaultDb = `Error: Config should have a default database defined (without name or or with default database name), e.g.\\n\\n${sampleConfig()}`;\nconst missingCollections = `Error: Database should have defined at least one collection, e.g.\\n\\n${sampleConfig()}`;\n\nexport const loadConfigFile = async (\n configPath: string,\n): Promise<PongoDbSchemaMetadata> => {\n const configUrl = new URL(configPath, `file://${process.cwd()}/`);\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const imported: Partial<{ default: PongoSchemaConfig }> = await import(\n configUrl.href\n );\n\n const parsed = parseDefaultDbSchema(imported);\n\n if (typeof parsed === 'string') {\n console.error(parsed);\n process.exit(1);\n }\n\n return parsed;\n } catch {\n console.error(`Error: Couldn't load file: ${configUrl.href}`);\n process.exit(1);\n }\n};\n\nexport const generateConfigFile = (\n configPath: string,\n collectionNames: string[],\n): void => {\n try {\n fs.writeFileSync(configPath, sampleConfig(collectionNames), 'utf8');\n console.log(`Configuration file stored at: ${configPath}`);\n } catch (error) {\n console.error(`Error: Couldn't store config file: ${configPath}!`);\n console.error(error);\n process.exit(1);\n }\n};\n\nexport const parseDefaultDbSchema = (\n imported: Partial<{ default: PongoSchemaConfig }>,\n): PongoDbSchemaMetadata | string => {\n if (!imported.default) {\n return missingDefaultExport;\n }\n\n if (!imported.default.schema) {\n return missingSchema;\n }\n\n if (!imported.default.schema.dbs) {\n return missingDbs;\n }\n\n const dbs = objectEntries(imported.default.schema.dbs).map((db) => db[1]);\n\n const defaultDb = dbs.find((db) => db.name === undefined);\n\n if (!defaultDb) {\n return missingDefaultDb;\n }\n\n if (!defaultDb.collections) {\n return missingCollections;\n }\n\n const collections = objectEntries(defaultDb.collections).map((col) => col[1]);\n\n if (collections.length === 0) {\n return missingCollections;\n }\n\n return toDbSchemaMetadata(defaultDb);\n};\n\ntype SampleConfigOptions =\n | {\n collection: string[];\n print?: boolean;\n }\n | {\n collection: string[];\n generate?: boolean;\n file?: string;\n };\n\nexport const configCommand = new Command('config').description(\n 'Manage Pongo configuration',\n);\n\nconfigCommand\n .command('sample')\n .description('Generate or print sample configuration')\n .option(\n '--col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option(\n '-f, --file <path>',\n 'Path to configuration file with collection list',\n )\n .option('-g, --generate', 'Generate sample config file')\n .option('-p, --print', 'Print sample config file')\n .action((options: SampleConfigOptions) => {\n const collectionNames =\n options.collection.length > 0 ? options.collection : ['users'];\n\n if (!('print' in options) && !('generate' in options)) {\n console.error(\n 'Error: Please provide either:\\n--print param to print sample config or\\n--generate to generate sample config file',\n );\n process.exit(1);\n }\n\n if ('print' in options) {\n console.log(`${sampleConfig(collectionNames)}`);\n } else if ('generate' in options) {\n if (!options.file) {\n console.error(\n 'Error: You need to provide a config file through a --file',\n );\n process.exit(1);\n }\n\n generateConfigFile(options.file, collectionNames);\n }\n });\n","import {\n combineMigrations,\n dumbo,\n JSONSerializer,\n parseConnectionString,\n runSQLMigrations,\n type DatabaseDriverType,\n} from '@event-driven-io/dumbo';\nimport { Command } from 'commander';\nimport {\n pongoDatabaseDriverRegistry,\n pongoSchema,\n type AnyPongoDatabaseDriverOptions,\n type PongoCollectionSchema,\n type PongoDatabaseFactoryOptions,\n type PongoDocument,\n} from '../core';\nimport { loadConfigFile } from './configFile';\n\ninterface MigrateRunOptions {\n collection: string[];\n connectionString: string;\n databaseType?: string;\n databaseName?: string | undefined;\n databaseDriver: string;\n config?: string;\n dryRun?: boolean;\n}\n\ninterface MigrateSqlOptions {\n print?: boolean;\n write?: string;\n databaseType: string;\n databaseName?: string | undefined;\n databaseDriver: string;\n config?: string;\n collection: string[];\n}\n\nexport const migrateCommand = new Command('migrate').description(\n 'Manage database migrations',\n);\n\nmigrateCommand\n .command('run')\n .description('Run database migrations')\n .option(\n '--dbt, --database-type <string>',\n 'Database type that should be used for connection (e.g., PostgreSQL or SQLite)',\n undefined,\n )\n .option(\n '--drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n )\n .option(\n '--dbn, --database-name <string>',\n 'Database name to connect to',\n undefined,\n )\n .option(\n '--cs, --connection-string <string>',\n 'Connection string for the database',\n )\n .option(\n '--col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option('-f, --config <path>', 'Path to configuration file with Pongo config')\n .option('--dr, --dryRun', 'Perform dry run without commiting changes', false)\n .action(async (options: MigrateRunOptions) => {\n const { collection, dryRun, databaseName, databaseDriver } = options;\n const connectionString =\n options.connectionString ?? process.env.DB_CONNECTION_STRING;\n\n const databaseType =\n options.databaseType ??\n parseConnectionString(connectionString).databaseType;\n\n let collectionNames: string[];\n\n if (!connectionString) {\n console.error(\n 'Error: Connection string is required. Provide it either as a \"--connection-string\" parameter or through the DB_CONNECTION_STRING environment variable.' +\n '\\nFor instance: --connection-string postgresql://postgres:postgres@localhost:5432/postgres',\n );\n process.exit(1);\n }\n\n if (options.config) {\n const config = await loadConfigFile(options.config);\n\n collectionNames = config.collections.map((c) => c.name);\n } else if (collection) {\n collectionNames = collection;\n } else {\n console.error(\n 'Error: You need to provide at least one collection name. Provide it either through \"--config\" file or as a \"--collection\" parameter.',\n );\n process.exit(1);\n }\n\n const driverType = `${databaseType}:${databaseDriver}` as const;\n\n const migrations = getMigrations({\n driverType,\n connectionString,\n databaseName,\n collectionNames,\n });\n\n const pool = dumbo({ connectionString, driverType });\n\n await runSQLMigrations(pool, migrations, {\n dryRun,\n });\n });\n\nmigrateCommand\n .command('sql')\n .description('Generate SQL for database migration')\n .option(\n '--dbt, --database-type <string>',\n 'Database type that should be used for connection (e.g., PostgreSQL or SQLite)',\n )\n .option(\n '--drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n )\n .option(\n '--dbn, --database-name <string>',\n 'Database name to connect to',\n undefined,\n )\n .option(\n '--col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option('-f, --config <path>', 'Path to configuration file with Pongo config')\n .option('--print', 'Print the SQL to the console (default)', true)\n //.option('--write <filename>', 'Write the SQL to a specified file')\n .action(async (options: MigrateSqlOptions) => {\n const { collection, databaseName, databaseType, databaseDriver } = options;\n\n let collectionNames: string[];\n\n if (options.config) {\n const config = await loadConfigFile(options.config);\n\n collectionNames = config.collections.map((c) => c.name);\n } else if (collection) {\n collectionNames = collection;\n } else {\n console.error(\n 'Error: You need to provide at least one collection name. Provide it either through \"--config\" file or as a \"--collection\" parameter.',\n );\n process.exit(1);\n }\n\n const driverType = `${databaseType}:${databaseDriver}` as const;\n\n const migrations = getMigrations({\n driverType,\n connectionString: undefined,\n databaseName,\n collectionNames,\n });\n\n console.log('Printing SQL:');\n console.log(combineMigrations(...migrations));\n });\n\nconst getMigrations = ({\n driverType,\n connectionString,\n databaseName,\n collectionNames,\n}: {\n driverType: DatabaseDriverType;\n connectionString: string | undefined;\n databaseName: string | undefined;\n collectionNames: string[];\n}) => {\n const driver = pongoDatabaseDriverRegistry.tryGet(driverType);\n\n if (driver === null) {\n console.error(\n `Error: No database driver found for driver type \"${driverType}\". Make sure the driver is registered and the connection string is correct.`,\n );\n process.exit(1);\n }\n\n const dbDefinition = pongoSchema.db.from(databaseName, collectionNames);\n\n const driverOptions: PongoDatabaseFactoryOptions<\n Record<string, PongoCollectionSchema<PongoDocument>>,\n AnyPongoDatabaseDriverOptions\n > = {\n schema: { definition: dbDefinition },\n serializer: JSONSerializer,\n };\n\n const customOptions = {\n connectionString,\n databaseName,\n };\n\n const db = driver.databaseFactory({ ...driverOptions, ...customOptions });\n\n return db.schema.component.migrations;\n};\n","import {\n color,\n LogLevel,\n LogStyle,\n parseConnectionString,\n prettyJson,\n SQL,\n type MigrationStyle,\n} from '@event-driven-io/dumbo';\nimport { checkConnection } from '@event-driven-io/dumbo/pg';\nimport Table from 'cli-table3';\nimport { Command } from 'commander';\nimport repl from 'node:repl';\nimport {\n pongoClient,\n pongoDatabaseDriverRegistry,\n pongoSchema,\n type PongoClient,\n type PongoClientOptions,\n type PongoCollectionSchema,\n type PongoDb,\n} from '../core';\n\nlet pongo: PongoClient;\n\nconst calculateColumnWidths = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n results: any[],\n columnNames: string[],\n): number[] => {\n const columnWidths = columnNames.map((col) => {\n const maxWidth = Math.max(\n col.length, // Header size\n ...results.map((result) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n result[col] ? String(result[col]).length : 0,\n ),\n );\n return maxWidth + 2; // Add padding\n });\n return columnWidths;\n};\n\nlet shouldDisplayResultsAsTable = false;\n\nconst printResultsAsTable = (print?: boolean) =>\n (shouldDisplayResultsAsTable = print === undefined || print === true);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst printOutput = (obj: any): string =>\n Array.isArray(obj) && shouldDisplayResultsAsTable\n ? displayResultsAsTable(obj)\n : prettyJson(obj);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst displayResultsAsTable = (results: any[]): string => {\n if (results.length === 0) {\n return color.yellow('No documents found.');\n }\n\n const columnNames = results\n\n .flatMap((result) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n typeof result === 'object' ? Object.keys(result) : typeof result,\n )\n .filter((value, index, array) => array.indexOf(value) === index);\n\n const columnWidths = calculateColumnWidths(results, columnNames);\n\n const table = new Table({\n head: columnNames.map((col) => color.cyan(col)),\n colWidths: columnWidths,\n });\n\n results.forEach((result) => {\n table.push(\n columnNames.map((col) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n result[col] !== undefined\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n Array.isArray(result[col])\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n displayResultsAsTable(result[col])\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n prettyJson(result[col])\n : typeof result === 'object'\n ? ''\n : result != undefined && result != undefined\n ? prettyJson(result)\n : '',\n ),\n );\n });\n\n return table.toString();\n};\n\nconst setLogLevel = (logLevel: string) => {\n process.env.DUMBO_LOG_LEVEL = logLevel;\n};\n\nconst setLogStyle = (logLevel: string) => {\n process.env.DUMBO_LOG_STYLE = logLevel;\n};\n\nconst prettifyLogs = (logLevel?: string) => {\n if (logLevel !== undefined) setLogLevel(logLevel);\n setLogStyle(LogStyle.PRETTY);\n};\n\nconst startRepl = async (options: {\n logging: {\n printOptions: boolean;\n logLevel: LogLevel;\n logStyle: LogStyle;\n };\n schema: {\n database: string;\n collections: string[];\n autoMigration: MigrationStyle;\n };\n connectionString: string | undefined;\n databaseDriver: string;\n}) => {\n // TODO: This will change when we have proper tracing and logging config\n // For now, that's enough\n setLogLevel(process.env.DUMBO_LOG_LEVEL ?? options.logging.logLevel);\n setLogStyle(process.env.DUMBO_LOG_STYLE ?? options.logging.logStyle);\n\n console.log(color.green('Starting Pongo Shell (version: 0.17.0-beta.19)'));\n\n if (options.logging.printOptions) {\n console.log(color.green('With Options:'));\n console.log(prettyJson(options));\n }\n\n const connectionString =\n options.connectionString ??\n process.env.DB_CONNECTION_STRING ??\n 'postgresql://postgres:postgres@localhost:5432/postgres';\n\n if (!(options.connectionString ?? process.env.DB_CONNECTION_STRING)) {\n console.log(\n color.yellow(\n `No connection string provided, using: 'postgresql://postgres:postgres@localhost:5432/postgres'`,\n ),\n );\n }\n\n const { databaseType } = parseConnectionString(connectionString);\n const driverType = `${databaseType}:${options.databaseDriver}` as const;\n\n const driver = pongoDatabaseDriverRegistry.tryGet(driverType);\n\n if (driver === null) {\n console.error(\n `Error: No database driver found for driver type \"${driverType}\". Make sure the driver is installed and the connection string is correct.`,\n );\n process.exit(1);\n }\n\n const connectionCheck = await checkConnection(connectionString);\n\n if (!connectionCheck.successful) {\n if (connectionCheck.errorType === 'ConnectionRefused') {\n console.error(\n color.red(\n `Connection was refused. Check if the PostgreSQL server is running and accessible.`,\n ),\n );\n } else if (connectionCheck.errorType === 'Authentication') {\n console.error(\n color.red(\n `Authentication failed. Check the username and password in the connection string.`,\n ),\n );\n } else {\n console.error(color.red('Error connecting to PostgreSQL server'));\n }\n console.log(color.red('Exiting Pongo Shell...'));\n process.exit();\n }\n\n console.log(color.green(`Successfully connected`));\n console.log(color.green('Use db.<collection>.<method>() to query.'));\n\n const shell = repl.start({\n prompt: color.green('pongo> '),\n useGlobal: true,\n breakEvalOnSigint: true,\n writer: printOutput,\n });\n\n let db: PongoDb;\n\n if (options.schema.collections.length > 0) {\n const collectionsSchema: Record<string, PongoCollectionSchema> = {};\n\n for (const collectionName of options.schema.collections) {\n collectionsSchema[collectionName] =\n pongoSchema.collection(collectionName);\n }\n\n const schema = pongoSchema.client({\n database: pongoSchema.db(options.schema.database, collectionsSchema),\n });\n\n const driverOptions: PongoClientOptions = {\n driver,\n schema: {\n definition: schema,\n autoMigration: options.schema.autoMigration,\n },\n };\n\n // TODO: Find a better way to pass custom driver settings\n const customOptions = {\n connectionString,\n };\n\n const typedClient = pongoClient({\n ...driverOptions,\n ...customOptions,\n });\n\n db = typedClient.database!;\n\n for (const collectionName of options.schema.collections) {\n shell.context[collectionName] = typedClient.database![collectionName];\n }\n\n pongo = typedClient;\n } else {\n const driverOptions: PongoClientOptions = {\n driver,\n schema: {\n autoMigration: options.schema.autoMigration,\n },\n };\n\n // TODO: Find a better way to pass custom driver settings\n const customOptions = {\n connectionString,\n };\n\n pongo = pongoClient({\n ...driverOptions,\n ...customOptions,\n });\n\n db = pongo.db(options.schema.database);\n }\n\n shell.context.pongo = pongo;\n shell.context.db = db;\n\n // helpers\n shell.context.SQL = SQL;\n shell.context.setLogLevel = setLogLevel;\n shell.context.setLogStyle = setLogStyle;\n shell.context.prettifyLogs = prettifyLogs;\n shell.context.printResultsAsTable = printResultsAsTable;\n shell.context.LogStyle = LogStyle;\n shell.context.LogLevel = LogLevel;\n\n // Intercept REPL output to display results as a table if they are arrays\n shell.on('exit', async () => {\n await teardown();\n process.exit();\n });\n\n shell.on('SIGINT', async () => {\n await teardown();\n process.exit();\n });\n};\n\nconst teardown = async () => {\n console.log(color.yellow('Exiting Pongo Shell...'));\n await pongo.close();\n};\n\nprocess.on('uncaughtException', teardown);\nprocess.on('SIGINT', teardown);\n\ninterface ShellOptions {\n database: string;\n collection: string[];\n databaseDriver: string;\n connectionString?: string;\n disableAutoMigrations: boolean;\n logStyle?: string;\n logLevel?: string;\n prettyLog?: boolean;\n printOptions?: boolean;\n}\n\nconst shellCommand = new Command('shell')\n .description('Start an interactive Pongo shell')\n .option(\n '--drv, --database-driver <string>',\n 'Database driver that should be used for connection (e.g., \"pg\" for PostgreSQL, \"sqlite3\" for SQLite)',\n 'pg',\n )\n .option(\n '--cs, --connectionString <string>',\n 'Connection string for the database',\n )\n .option('--db, --database <string>', 'Database name to connect', 'postgres')\n .option(\n '--col, --collection <name>',\n 'Specify the collection name',\n (value: string, previous: string[]) => {\n // Accumulate collection names into an array (explicitly typing `previous` as `string[]`)\n return previous.concat([value]);\n },\n [] as string[],\n )\n .option(\n '--no-migrations, --disable-auto-migrations',\n 'Disable automatic migrations',\n )\n .option('-o, --print-options', 'Print shell options')\n .option(\n '--ll, --log-level <logLevel>',\n 'Log level: DISABLED, INFO, LOG, WARN, ERROR',\n 'DISABLED',\n )\n .option('--ls, --log-style', 'Log style: RAW, PRETTY', 'RAW')\n .option('-p, --pretty-log', 'Turn on logging with prettified output')\n .action(async (options: ShellOptions) => {\n const { collection, database } = options;\n const connectionString = options.connectionString;\n\n await startRepl({\n logging: {\n printOptions: options.printOptions === true,\n logStyle: options.prettyLog\n ? LogStyle.PRETTY\n : ((options.logStyle as LogStyle | undefined) ?? LogStyle.RAW),\n logLevel: options.logLevel\n ? (options.logLevel as LogLevel)\n : options.prettyLog\n ? LogLevel.INFO\n : LogLevel.DISABLED,\n },\n schema: {\n collections: collection,\n database,\n autoMigration: options.disableAutoMigrations\n ? 'None'\n : 'CreateOrUpdate',\n },\n connectionString,\n databaseDriver: options.databaseDriver,\n });\n });\n\nexport { shellCommand };\n"]}