@event-driven-io/dumbo 0.13.0-beta.2 → 0.13.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-65DKXURG.js +481 -0
- package/dist/chunk-65DKXURG.js.map +1 -0
- package/dist/chunk-7WEBHXZD.cjs +481 -0
- package/dist/chunk-7WEBHXZD.cjs.map +1 -0
- package/dist/chunk-AMACBMAZ.cjs +556 -0
- package/dist/chunk-AMACBMAZ.cjs.map +1 -0
- package/dist/chunk-FC4JR2R3.js +83 -0
- package/dist/chunk-FC4JR2R3.js.map +1 -0
- package/dist/chunk-H7ZKIJHB.cjs +83 -0
- package/dist/chunk-H7ZKIJHB.cjs.map +1 -0
- package/dist/chunk-IVJ3SNPJ.js +34 -0
- package/dist/chunk-IVJ3SNPJ.js.map +1 -0
- package/dist/chunk-R7P7CNMK.cjs +34 -0
- package/dist/chunk-R7P7CNMK.cjs.map +1 -0
- package/dist/{chunk-XVV3OOQX.js → chunk-T4A6BQRA.js} +209 -58
- package/dist/chunk-T4A6BQRA.js.map +1 -0
- package/dist/{chunk-N7RWT46K.js → chunk-XO5T5N5S.js} +2135 -1613
- package/dist/chunk-XO5T5N5S.js.map +1 -0
- package/dist/{chunk-OJ34O3Q2.cjs → chunk-XOQHZABK.cjs} +2161 -1639
- package/dist/chunk-XOQHZABK.cjs.map +1 -0
- package/dist/cloudflare.cjs +451 -0
- package/dist/cloudflare.cjs.map +1 -0
- package/dist/cloudflare.d.cts +92 -0
- package/dist/cloudflare.d.ts +92 -0
- package/dist/cloudflare.js +451 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/{columnProcessors-DMPpTPqM.d.ts → columnProcessors-C7fRa54L.d.ts} +1 -1
- package/dist/{columnProcessors-BX-sH7ah.d.cts → columnProcessors-Difrrk4c.d.cts} +1 -1
- package/dist/{connectionString-B1wm0TFc.d.cts → connectionString-oeg1LD5V.d.cts} +352 -137
- package/dist/{connectionString-B1wm0TFc.d.ts → connectionString-oeg1LD5V.d.ts} +352 -137
- package/dist/index.cjs +96 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -18
- package/dist/index.d.ts +23 -18
- package/dist/index.js +101 -9
- package/dist/index.js.map +1 -1
- package/dist/pg.cjs +382 -9
- package/dist/pg.cjs.map +1 -1
- package/dist/pg.d.cts +81 -105
- package/dist/pg.d.ts +81 -105
- package/dist/pg.js +434 -61
- package/dist/pg.js.map +1 -1
- package/dist/postgresql.cjs +50 -0
- package/dist/postgresql.cjs.map +1 -0
- package/dist/postgresql.d.cts +61 -0
- package/dist/postgresql.d.ts +61 -0
- package/dist/postgresql.js +50 -0
- package/dist/sqlite.cjs +56 -0
- package/dist/sqlite.cjs.map +1 -0
- package/dist/{index-C0h0c380.d.cts → sqlite.d.cts} +31 -10
- package/dist/{index-C2z_XBn6.d.ts → sqlite.d.ts} +31 -10
- package/dist/sqlite.js +56 -0
- package/dist/sqlite3.cjs +240 -11
- package/dist/sqlite3.cjs.map +1 -1
- package/dist/sqlite3.d.cts +39 -19
- package/dist/sqlite3.d.ts +39 -19
- package/dist/sqlite3.js +251 -22
- package/dist/sqlite3.js.map +1 -1
- package/package.json +69 -29
- package/dist/chunk-A7TC7IOP.cjs +0 -55
- package/dist/chunk-A7TC7IOP.cjs.map +0 -1
- package/dist/chunk-F7JQ7BX7.js +0 -240
- package/dist/chunk-F7JQ7BX7.js.map +0 -1
- package/dist/chunk-I34X53VL.js +0 -688
- package/dist/chunk-I34X53VL.js.map +0 -1
- package/dist/chunk-ISNF6USX.cjs +0 -688
- package/dist/chunk-ISNF6USX.cjs.map +0 -1
- package/dist/chunk-IYEHOE4S.cjs +0 -405
- package/dist/chunk-IYEHOE4S.cjs.map +0 -1
- package/dist/chunk-L2YZQAG3.cjs +0 -240
- package/dist/chunk-L2YZQAG3.cjs.map +0 -1
- package/dist/chunk-N7RWT46K.js.map +0 -1
- package/dist/chunk-OJ34O3Q2.cjs.map +0 -1
- package/dist/chunk-TXSETOGH.js +0 -55
- package/dist/chunk-TXSETOGH.js.map +0 -1
- package/dist/chunk-XVV3OOQX.js.map +0 -1
- package/dist/d1.cjs +0 -277
- package/dist/d1.cjs.map +0 -1
- package/dist/d1.d.cts +0 -72
- package/dist/d1.d.ts +0 -72
- package/dist/d1.js +0 -277
- package/dist/d1.js.map +0 -1
- package/dist/pg-3ACXFMU4.cjs +0 -59
- package/dist/pg-3ACXFMU4.cjs.map +0 -1
- package/dist/pg-GHOW3XSG.js +0 -59
- package/dist/sqlite3-EEIKQCJR.js +0 -25
- package/dist/sqlite3-SE4DDYZE.cjs +0 -25
- package/dist/sqlite3-SE4DDYZE.cjs.map +0 -1
- /package/dist/{pg-GHOW3XSG.js.map → postgresql.js.map} +0 -0
- /package/dist/{sqlite3-EEIKQCJR.js.map → sqlite.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/schema/schemaComponent.ts","../src/core/schema/components/columnSchemaComponent.ts","../src/core/schema/components/indexSchemaComponent.ts","../src/core/schema/components/tableSchemaComponent.ts","../src/core/schema/components/databaseSchemaSchemaComponent.ts","../src/core/schema/components/databaseSchemaComponent.ts","../src/core/schema/components/relationships/relationshipTypes.ts","../src/core/schema/components/index.ts","../src/core/drivers/databaseDriver.ts","../src/core/drivers/index.ts","../src/core/schema/databaseMetadata/databaseMetadata.ts","../src/core/schema/dumboSchema/dumboSchema.ts","../src/core/locks/databaseLock.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/serializer/json/index.ts","../src/core/sql/parametrizedSQL/parametrizedSQL.ts","../src/core/sql/tokens/sqlToken.ts","../src/core/sql/tokens/columnTokens.ts","../src/core/sql/processors/sqlProcessor.ts","../src/core/sql/processors/defaultProcessors.ts","../src/core/sql/processors/sqlProcessorRegistry.ts","../src/core/sql/processors/columnProcessors.ts","../src/core/sql/processors/index.ts","../src/core/sql/tokenizedSQL/tokenizedSQL.ts","../src/core/sql/valueMappers/reservedSqlWords.ts","../src/core/sql/valueMappers/sqlValueMapper.ts","../src/core/sql/formatters/sqlFormatter.ts","../src/core/sql/sql.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/schema/sqlMigration.ts","../src/core/errors/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/index.ts","../src/core/schema/migrators/migrator.ts","../src/core/schema/migrators/schemaComponentMigrator.ts"],"sourcesContent":["import type { SQLMigration } from './sqlMigration';\n\nexport type SchemaComponent<\n ComponentKey extends string = string,\n AdditionalData extends\n | Exclude<\n Record<string, unknown>,\n | 'schemaComponentKey'\n | 'components'\n | 'migrations'\n | 'addComponent'\n | 'addMigration'\n >\n | undefined = undefined,\n> = {\n schemaComponentKey: ComponentKey;\n components: ReadonlyMap<string, SchemaComponent>;\n migrations: ReadonlyArray<SQLMigration>;\n\n addComponent: <\n SchemaComponentType extends SchemaComponent<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n > = SchemaComponent<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >,\n >(\n component: SchemaComponentType,\n ) => SchemaComponentType;\n addMigration: (migration: SQLMigration) => void;\n} & Exclude<\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n AdditionalData extends undefined ? {} : AdditionalData,\n | 'schemaComponentKey'\n | 'components'\n | 'migrations'\n | 'addComponent'\n | 'addMigration'\n>;\n\nexport type ExtractAdditionalData<T> =\n T extends SchemaComponent<infer _ComponentType, infer Data> ? Data : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySchemaComponent = SchemaComponent<string, Record<string, any>>;\n\nexport type AnySchemaComponentOfType<ComponentType extends string = string> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SchemaComponent<ComponentType, any>;\n\nexport type SchemaComponentOptions<\n AdditionalOptions extends Record<string, unknown> = Record<string, unknown>,\n> = {\n migrations?: ReadonlyArray<SQLMigration>;\n components?: ReadonlyArray<SchemaComponent>;\n} & Omit<AdditionalOptions, 'migrations' | 'components'>;\n\nexport type SchemaComponentType<Kind extends string = string> = `sc:${Kind}`;\n\nexport type DumboSchemaComponentType<Kind extends string = string> =\n SchemaComponentType<`dumbo:${Kind}`>;\n\nexport const schemaComponent = <const ComponentKey extends string = string>(\n key: ComponentKey,\n options: SchemaComponentOptions,\n): SchemaComponent<ComponentKey> => {\n const componentsMap = new Map<string, AnySchemaComponent>(\n options.components?.map((comp) => [comp.schemaComponentKey, comp]),\n );\n\n const migrations: SQLMigration[] = [...(options.migrations ?? [])];\n\n return {\n schemaComponentKey: key,\n components: componentsMap,\n get migrations(): SQLMigration[] {\n return [\n ...migrations,\n ...Array.from(componentsMap.values()).flatMap((c) => c.migrations),\n ];\n },\n addComponent: <\n SchemaComponentType extends AnySchemaComponent = AnySchemaComponent,\n >(\n component: SchemaComponentType,\n ): SchemaComponentType => {\n componentsMap.set(component.schemaComponentKey, component);\n migrations.push(...component.migrations);\n return component;\n },\n addMigration: (migration: SQLMigration) => {\n migrations.push(migration);\n },\n };\n};\n\nexport const isSchemaComponentOfType = <\n SchemaComponentOfType extends AnySchemaComponent = AnySchemaComponent,\n>(\n component: AnySchemaComponent,\n prefix: string,\n): component is SchemaComponentOfType =>\n component.schemaComponentKey.startsWith(prefix);\n\nexport const filterSchemaComponentsOfType = <T extends AnySchemaComponent>(\n components: ReadonlyMap<string, AnySchemaComponent>,\n prefix: string,\n): ReadonlyMap<string, T> => mapSchemaComponentsOfType<T>(components, prefix);\n\nexport const mapSchemaComponentsOfType = <T extends AnySchemaComponent>(\n components: ReadonlyMap<string, AnySchemaComponent>,\n prefix: string,\n keyMapper?: (component: T) => string,\n): ReadonlyMap<string, T> =>\n new Map(\n Array.from(components.entries())\n .filter(([urn]) => urn.startsWith(prefix))\n .map(([urn, component]) => [\n keyMapper ? keyMapper(component as T) : urn,\n component as T,\n ]),\n );\n\nexport const findSchemaComponentsOfType = <T extends AnySchemaComponent>(\n root: AnySchemaComponent,\n prefix: string,\n): T[] => {\n const results: T[] = [];\n\n const traverse = (component: AnySchemaComponent) => {\n if (component.schemaComponentKey.startsWith(prefix)) {\n results.push(component as T);\n }\n for (const child of component.components.values()) {\n traverse(child);\n }\n };\n\n traverse(root);\n\n return results;\n};\n","import type { AnyColumnTypeToken, SQLColumnToken } from '../../sql';\nimport {\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\n\nexport type ColumnURNType = 'sc:dumbo:column';\nexport type ColumnURN<ColumnName extends string = string> =\n `${ColumnURNType}:${ColumnName}`;\n\nexport const ColumnURNType: ColumnURNType = 'sc:dumbo:column';\nexport const ColumnURN = <ColumnName extends string = string>({\n name,\n}: {\n name: ColumnName;\n}): ColumnURN<ColumnName> => `${ColumnURNType}:${name}`;\n\nexport type ColumnSchemaComponent<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n ColumnName extends string = string,\n> = SchemaComponent<\n ColumnURN<ColumnName>,\n Readonly<{\n columnName: ColumnName;\n }>\n> &\n SQLColumnToken<ColumnType>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyColumnSchemaComponent = ColumnSchemaComponent<any>;\n\nexport type ColumnSchemaComponentOptions<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = Omit<SQLColumnToken<ColumnType>, 'name' | 'sqlTokenType'> &\n SchemaComponentOptions;\n\nexport const columnSchemaComponent = <\n const ColumnType extends AnyColumnTypeToken | string =\n | AnyColumnTypeToken\n | string,\n const TOptions extends ColumnSchemaComponentOptions<ColumnType> =\n ColumnSchemaComponentOptions<ColumnType>,\n const ColumnName extends string = string,\n>(\n params: {\n columnName: ColumnName;\n } & TOptions,\n): ColumnSchemaComponent<ColumnType, ColumnName> &\n (TOptions extends { notNull: true } | { primaryKey: true }\n ? { notNull: true }\n : { notNull?: false }) => {\n const {\n columnName,\n type,\n notNull,\n unique,\n primaryKey,\n default: defaultValue,\n ...schemaOptions\n } = params;\n\n const sc = schemaComponent(ColumnURN({ name: columnName }), schemaOptions);\n\n const result: Record<string, unknown> = {\n ...sc,\n columnName,\n notNull,\n unique,\n primaryKey,\n defaultValue,\n sqlTokenType: 'SQL_COLUMN',\n name: columnName,\n type,\n };\n\n return result as ColumnSchemaComponent<ColumnType, ColumnName> &\n (TOptions extends { notNull: true } | { primaryKey: true }\n ? { notNull: true }\n : { notNull?: false });\n};\n","import {\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport type { ColumnSchemaComponent } from './columnSchemaComponent';\n\nexport type IndexURNType = 'sc:dumbo:index';\nexport type IndexURN = `${IndexURNType}:${string}`;\n\nexport type IndexSchemaComponent = SchemaComponent<\n IndexURN,\n Readonly<{\n indexName: string;\n columnNames: ReadonlyArray<string>;\n isUnique: boolean;\n addColumn: (column: string | ColumnSchemaComponent) => void;\n }>\n>;\n\nexport const IndexURNType: IndexURNType = 'sc:dumbo:index';\nexport const IndexURN = ({ name }: { name: string }): IndexURN =>\n `${IndexURNType}:${name}`;\n\nexport const indexSchemaComponent = ({\n indexName,\n columnNames,\n isUnique,\n ...migrationsOrComponents\n}: {\n indexName: string;\n columnNames: string[];\n isUnique: boolean;\n} & SchemaComponentOptions): IndexSchemaComponent => {\n const sc = schemaComponent(IndexURN({ name: indexName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [...(migrationsOrComponents.components ?? [])],\n });\n\n return {\n ...sc,\n indexName,\n get columnNames() {\n return columnNames;\n },\n addColumn: (column: string | ColumnSchemaComponent) =>\n columnNames.push(typeof column === 'string' ? column : column.columnName),\n isUnique,\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n ColumnURNType,\n type AnyColumnSchemaComponent,\n} from './columnSchemaComponent';\nimport {\n IndexURNType,\n type IndexSchemaComponent,\n} from './indexSchemaComponent';\nimport type { TableRelationships } from './relationships/relationshipTypes';\nimport type { TableColumnNames } from './tableTypesInference';\n\nexport type TableURNType = 'sc:dumbo:table';\nexport type TableURN = `${TableURNType}:${string}`;\n\nexport const TableURNType: TableURNType = 'sc:dumbo:table';\nexport const TableURN = ({ name }: { name: string }): TableURN =>\n `${TableURNType}:${name}`;\n\nexport type TableColumns = Record<string, AnyColumnSchemaComponent>;\n\nexport type TableSchemaComponent<\n Columns extends TableColumns = TableColumns,\n TableName extends string = string,\n Relationships extends TableRelationships<keyof Columns & string> =\n {} & TableRelationships<keyof Columns & string>,\n> = SchemaComponent<\n TableURN,\n Readonly<{\n tableName: TableName;\n columns: ReadonlyMap<string, AnyColumnSchemaComponent> & Columns;\n primaryKey: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships: Relationships;\n indexes: ReadonlyMap<string, IndexSchemaComponent>;\n addColumn: (column: AnyColumnSchemaComponent) => AnyColumnSchemaComponent;\n addIndex: (index: IndexSchemaComponent) => IndexSchemaComponent;\n }>\n>;\n\nexport type InferTableSchemaComponentTypes<T extends AnyTableSchemaComponent> =\n T extends TableSchemaComponent<\n infer Columns,\n infer TableName,\n infer Relationships\n >\n ? [Columns, TableName, Relationships]\n : never;\n\nexport type InferTableSchemaComponentColumns<\n T extends AnyTableSchemaComponent,\n> = InferTableSchemaComponentTypes<T>[0];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyTableSchemaComponent = TableSchemaComponent<any, any, any>;\n\nexport const tableSchemaComponent = <\n const Columns extends TableColumns = TableColumns,\n const TableName extends string = string,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n const Relationships extends TableRelationships<keyof Columns & string> = {},\n>({\n tableName,\n columns,\n primaryKey,\n relationships,\n ...migrationsOrComponents\n}: {\n tableName: TableName;\n columns?: Columns;\n primaryKey?: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships?: Relationships;\n} & SchemaComponentOptions): TableSchemaComponent<\n Columns,\n TableName,\n Relationships\n> & {\n relationships: Relationships;\n} => {\n columns ??= {} as Columns;\n relationships ??= {} as Relationships;\n\n const base = schemaComponent(TableURN({ name: tableName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(columns),\n ],\n });\n\n return {\n ...base,\n tableName,\n primaryKey: primaryKey ?? [],\n relationships,\n get columns() {\n const columnsMap = mapSchemaComponentsOfType<AnyColumnSchemaComponent>(\n base.components,\n ColumnURNType,\n (c) => c.columnName,\n );\n\n return Object.assign(columnsMap, columns);\n },\n get indexes() {\n return mapSchemaComponentsOfType<IndexSchemaComponent>(\n base.components,\n IndexURNType,\n (c) => c.indexName,\n );\n },\n addColumn: (column: AnyColumnSchemaComponent) => base.addComponent(column),\n addIndex: (index: IndexSchemaComponent) => base.addComponent(index),\n } as TableSchemaComponent<Columns, TableName, Relationships> & {\n relationships: Relationships;\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n TableURNType,\n tableSchemaComponent,\n type AnyTableSchemaComponent,\n type TableSchemaComponent,\n} from './tableSchemaComponent';\n\nexport type DatabaseSchemaURNType = 'sc:dumbo:database_schema';\nexport type DatabaseSchemaURN<SchemaName extends string = string> =\n `${DatabaseSchemaURNType}:${SchemaName}`;\n\nexport const DatabaseSchemaURNType: DatabaseSchemaURNType =\n 'sc:dumbo:database_schema';\nexport const DatabaseSchemaURN = <SchemaName extends string = string>({\n name,\n}: {\n name: SchemaName;\n}): DatabaseSchemaURN<SchemaName> => `${DatabaseSchemaURNType}:${name}`;\n\nexport type DatabaseSchemaTables<\n Tables extends AnyTableSchemaComponent = AnyTableSchemaComponent,\n> = Record<string, Tables>;\n\nexport type DatabaseSchemaSchemaComponent<\n Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n SchemaName extends string = string,\n> = SchemaComponent<\n DatabaseSchemaURN<SchemaName>,\n Readonly<{\n schemaName: SchemaName;\n tables: ReadonlyMap<string, TableSchemaComponent> & Tables;\n addTable: (table: string | TableSchemaComponent) => TableSchemaComponent;\n }>\n>;\n\nexport type AnyDatabaseSchemaSchemaComponent =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseSchemaSchemaComponent<any, any>;\n\nexport const databaseSchemaSchemaComponent = <\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>({\n schemaName,\n tables,\n ...migrationsOrComponents\n}: {\n schemaName: SchemaName;\n tables?: Tables;\n} & SchemaComponentOptions): DatabaseSchemaSchemaComponent<\n Tables,\n SchemaName\n> => {\n const base = schemaComponent(DatabaseSchemaURN({ name: schemaName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(tables ?? {}),\n ],\n });\n\n return {\n ...base,\n schemaName,\n get tables() {\n const tablesMap = mapSchemaComponentsOfType<TableSchemaComponent>(\n base.components,\n TableURNType,\n (c) => c.tableName,\n );\n\n return Object.assign(tablesMap, tables);\n },\n addTable: (table: string | TableSchemaComponent) =>\n base.addComponent(\n typeof table === 'string'\n ? tableSchemaComponent({ tableName: table })\n : table,\n ),\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n DatabaseSchemaURNType,\n databaseSchemaSchemaComponent,\n type AnyDatabaseSchemaSchemaComponent,\n type DatabaseSchemaSchemaComponent,\n} from './databaseSchemaSchemaComponent';\n\nexport type DatabaseURNType = 'sc:dumbo:database';\nexport type DatabaseURN = `${DatabaseURNType}:${string}`;\n\nexport const DatabaseURNType: DatabaseURNType = 'sc:dumbo:database';\nexport const DatabaseURN = ({ name }: { name: string }): DatabaseURN =>\n `${DatabaseURNType}:${name}`;\n\nexport type DatabaseSchemas<\n Schemas extends AnyDatabaseSchemaSchemaComponent =\n AnyDatabaseSchemaSchemaComponent,\n> = Record<string, Schemas>;\n\nexport type DatabaseSchemaComponent<\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n> = SchemaComponent<\n DatabaseURN,\n Readonly<{\n databaseName: string;\n schemas: ReadonlyMap<string, DatabaseSchemaSchemaComponent> & Schemas;\n addSchema: (\n schema: string | DatabaseSchemaSchemaComponent,\n ) => DatabaseSchemaSchemaComponent;\n }>\n>;\n\nexport type AnyDatabaseSchemaComponent =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseSchemaComponent<any>;\n\nexport const databaseSchemaComponent = <\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n>({\n databaseName,\n schemas,\n ...migrationsOrComponents\n}: {\n databaseName: string;\n schemas?: Schemas;\n} & SchemaComponentOptions): DatabaseSchemaComponent<Schemas> => {\n schemas ??= {} as Schemas;\n\n const base = schemaComponent(DatabaseURN({ name: databaseName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(schemas),\n ],\n });\n\n return {\n ...base,\n databaseName,\n get schemas() {\n const schemasMap =\n mapSchemaComponentsOfType<DatabaseSchemaSchemaComponent>(\n base.components,\n DatabaseSchemaURNType,\n (c) => c.schemaName,\n );\n\n return Object.assign(schemasMap, schemas);\n },\n addSchema: (schema: string | DatabaseSchemaSchemaComponent) =>\n base.addComponent(\n typeof schema === 'string'\n ? databaseSchemaSchemaComponent({ schemaName: schema })\n : schema,\n ),\n };\n};\n","import type {\n AnyDatabaseSchemaSchemaComponent,\n AnyTableSchemaComponent,\n DatabaseSchemaComponent,\n DatabaseSchemas,\n DatabaseSchemaSchemaComponent,\n DatabaseSchemaTables,\n TableColumnNames,\n TableColumns,\n TableSchemaComponent,\n Writable,\n} from '..';\nimport type { ColumnTypeToken } from '../../../sql/tokens/columnTokens';\nimport type { NotEmptyTuple } from '../../../typing';\n\nexport type ExtractSchemaNames<DB> =\n DB extends DatabaseSchemaComponent<infer Schemas extends DatabaseSchemas>\n ? keyof Schemas\n : never;\n\nexport type ExtractTableNames<Schema extends AnyDatabaseSchemaSchemaComponent> =\n Schema extends DatabaseSchemaSchemaComponent<\n infer Tables extends DatabaseSchemaTables\n >\n ? keyof Tables\n : never;\n\nexport type ExtractColumnNames<Table extends AnyTableSchemaComponent> =\n Table extends TableSchemaComponent<infer Columns extends TableColumns>\n ? TableColumnNames<TableSchemaComponent<Columns>>\n : never;\n\nexport type ExtractColumnTypeName<T> =\n T extends ColumnTypeToken<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n infer TypeName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >\n ? Uppercase<TypeName>\n : never;\n\nexport type AllColumnTypes<Schemas extends DatabaseSchemas> = {\n [SchemaName in keyof Schemas]: Schemas[SchemaName] extends DatabaseSchemaSchemaComponent<\n infer Tables\n >\n ? Writable<{\n [TableName in keyof Tables]: Tables[TableName] extends TableSchemaComponent<\n infer Columns\n >\n ? Writable<{\n [ColumnName in keyof Columns]: {\n columnTypeName: ExtractColumnTypeName<\n Columns[ColumnName]['type']\n >;\n };\n }>\n : never;\n }>\n : never;\n};\n\nexport type AllColumnReferences<Schemas extends DatabaseSchemas> = {\n [SchemaName in keyof Schemas]: Schemas[SchemaName] extends DatabaseSchemaSchemaComponent<\n infer Tables\n >\n ? {\n [TableName in keyof Tables]: Tables[TableName] extends TableSchemaComponent<\n infer Columns\n >\n ? {\n [ColumnName in keyof Columns]: `${SchemaName &\n string}.${TableName & string}.${ColumnName & string}`;\n }[keyof Columns]\n : never;\n }[keyof Tables]\n : never;\n}[keyof Schemas];\n\nexport type AllColumnTypesInSchema<\n Schema extends AnyDatabaseSchemaSchemaComponent,\n> =\n Schema extends DatabaseSchemaSchemaComponent<infer Tables>\n ? {\n [TableName in keyof Tables]: Tables[TableName] extends TableSchemaComponent<\n infer Columns\n >\n ? {\n [ColumnName in keyof Columns]: {\n columnTypeName: ExtractColumnTypeName<\n Columns[ColumnName]['type']\n >;\n };\n }\n : never;\n }\n : never;\n\nexport type AllColumnReferencesInSchema<\n Schema extends AnyDatabaseSchemaSchemaComponent,\n SchemaName extends string,\n> =\n Schema extends DatabaseSchemaSchemaComponent<infer Tables>\n ? {\n [TableName in keyof Tables]: Tables[TableName] extends TableSchemaComponent<\n infer Columns\n >\n ? {\n [ColumnName in keyof Columns]: `${SchemaName & string}.${TableName &\n string}.${ColumnName & string}`;\n }[keyof Columns]\n : never;\n }[keyof Tables]\n : never;\n\nexport type NormalizeReference<\n Path extends string,\n CurrentSchema extends string,\n CurrentTable extends string,\n> = Path extends `${infer Schema}.${infer Table}.${infer Column}`\n ? `${Schema}.${Table}.${Column}`\n : Path extends `${infer Table}.${infer Column}`\n ? `${CurrentSchema}.${Table}.${Column}`\n : Path extends string\n ? `${CurrentSchema}.${CurrentTable}.${Path}`\n : never;\n\nexport type NormalizeColumnPath<\n References extends readonly string[],\n SchemaName extends string,\n TableName extends string,\n> = References extends readonly [infer First, ...infer Rest]\n ? First extends string\n ? Rest extends readonly string[]\n ? readonly [\n NormalizeReference<First, SchemaName, TableName>,\n ...NormalizeColumnPath<Rest, SchemaName, TableName>,\n ]\n : readonly []\n : readonly []\n : readonly [];\n\nexport type ColumnName<ColName extends string = string> = `${ColName}`;\n\nexport type TableColumnName<\n TableName extends string = string,\n ColName extends string = string,\n> = `${TableName}.${ColName}`;\n\nexport type SchemaColumnName<\n SchemaName extends string = string,\n TableName extends string = string,\n ColumnName extends string = string,\n> = `${SchemaName}.${TableName}.${ColumnName}`;\n\nexport type ColumnPath<\n SchemaName extends string = string,\n TableName extends string = string,\n ColName extends string = string,\n> =\n | SchemaColumnName<SchemaName, TableName, ColName>\n | TableColumnName<TableName, ColName>\n | ColumnName<ColName>;\n\nexport type ColumnReference<\n SchemaName extends string = string,\n TableName extends string = string,\n ColumnName extends string = string,\n> = { schemaName: SchemaName; tableName: TableName; columnName: ColumnName };\n\nexport type ColumnPathToReference<\n Reference extends ColumnPath = ColumnPath,\n CurrentSchema extends string = string,\n CurrentTable extends string = string,\n> =\n NormalizeReference<\n Reference,\n CurrentSchema,\n CurrentTable\n > extends `${infer S}.${infer T}.${infer C}`\n ? { schemaName: S; tableName: T; columnName: C }\n : never;\n\nexport type ParseReferencePath<Path extends string> =\n Path extends `${infer Schema}.${infer Table}.${infer Column}`\n ? { schema: Schema; table: Table; column: Column }\n : never;\n\nexport type LookupColumnType<AllTypes, Path extends string> =\n ParseReferencePath<Path> extends {\n schema: infer S;\n table: infer T;\n column: infer C;\n }\n ? S extends keyof AllTypes\n ? T extends keyof AllTypes[S]\n ? C extends keyof AllTypes[S][T]\n ? AllTypes[S][T][C] extends { columnTypeName: infer TypeName }\n ? TypeName\n : never\n : never\n : never\n : never\n : never;\n\nexport type RelationshipType =\n | 'one-to-one'\n | 'one-to-many'\n | 'many-to-one'\n | 'many-to-many';\n\nexport type RelationshipDefinition<\n Columns extends string = string,\n Reference extends string = string,\n RelType extends RelationshipType = RelationshipType,\n> = {\n readonly columns: NotEmptyTuple<readonly Columns[]>;\n readonly references: NotEmptyTuple<readonly Reference[]>;\n readonly type: RelType;\n};\n\nexport type AnyTableRelationshipDefinition = RelationshipDefinition<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\nexport type AnyTableRelationshipDefinitionWithColumns<\n Columns extends string = string,\n> = RelationshipDefinition<\n Columns,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n>;\n\nexport type TableRelationships<Columns extends string = string> = Record<\n string,\n AnyTableRelationshipDefinitionWithColumns<Columns>\n>;\n\nexport const relationship = <\n const Columns extends readonly string[],\n const References extends readonly string[],\n const RelType extends RelationshipType = RelationshipType,\n>(\n columns: Columns,\n references: References,\n type: RelType,\n) => {\n return {\n columns,\n references,\n type,\n } as const;\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRelationshipDefinition = RelationshipDefinition<any, any, any>;\n","import { ColumnURN } from './columnSchemaComponent';\nimport { DatabaseURN } from './databaseSchemaComponent';\nimport { DatabaseSchemaURN } from './databaseSchemaSchemaComponent';\nimport { IndexURN } from './indexSchemaComponent';\nimport { TableURN } from './tableSchemaComponent';\n\nexport * from './columnSchemaComponent';\nexport * from './databaseSchemaComponent';\nexport * from './databaseSchemaSchemaComponent';\nexport * from './indexSchemaComponent';\nexport * from './relationships';\nexport * from './tableSchemaComponent';\nexport * from './tableTypesInference';\n\nexport const schemaComponentURN = {\n database: DatabaseURN,\n schema: DatabaseSchemaURN,\n table: TableURN,\n column: ColumnURN,\n index: IndexURN,\n extractName: (urn: string): string => {\n const parts = urn.split(':');\n return parts[parts.length - 1] || '';\n },\n} as const;\n","import type { DatabaseDriverType } from '.';\nimport type { Dumbo, DumboConnectionOptions } from '..';\nimport type { AnyConnection } from '../connections';\nimport type { MigratorOptions } from '../schema';\nimport type { DatabaseMetadata } from '../schema/databaseMetadata/databaseMetadata';\nimport type { SQLFormatter } from '../sql';\n\nexport interface DumboDatabaseDriver<\n ConnectionType extends AnyConnection = AnyConnection,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint, @typescript-eslint/no-unused-vars\n DriverOptions extends unknown = unknown,\n DumboType extends Dumbo<ConnectionType['driverType'], ConnectionType> = Dumbo<\n ConnectionType['driverType'],\n ConnectionType\n >,\n> {\n readonly driverType: ConnectionType['driverType'];\n readonly sqlFormatter: SQLFormatter;\n readonly defaultMigratorOptions: MigratorOptions;\n readonly databaseMetadata: DatabaseMetadata;\n\n createPool(options: DumboConnectionOptions<this>): DumboType;\n\n canHandle(options: DumboConnectionOptions<this>): boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyDumboDatabaseDriver = DumboDatabaseDriver<AnyConnection, any>;\n\nexport type ExtractDumboDatabaseDriverOptions<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends DumboDatabaseDriver<any, infer O, any> ? O : never;\n\nexport type ExtractDumboTypeFromDriver<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends DumboDatabaseDriver<any, any, infer D> ? D : never;\n\nexport const canHandleDriverWithConnectionString =\n <\n DatabaseDriver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<DatabaseDriver> =\n DumboConnectionOptions<DatabaseDriver>,\n >(\n driver: DatabaseDriver['driverType'],\n tryParseConnectionString: (connectionString: string) => string | null,\n ) =>\n (options: ConnectionOptions): boolean => {\n if ('driverType' in options) return options.driverType === driver;\n\n if (\n 'connectionString' in options &&\n typeof options.connectionString === 'string'\n )\n return tryParseConnectionString(options.connectionString) !== null;\n\n return false;\n };\n\nexport const DumboDatabaseDriverRegistry = () => {\n const drivers = new Map<\n DatabaseDriverType,\n DumboDatabaseDriver | (() => Promise<DumboDatabaseDriver>)\n >();\n\n const register = <Driver extends AnyDumboDatabaseDriver>(\n driverType: Driver['driverType'],\n plugin: Driver | (() => Promise<Driver>),\n ): void => {\n const entry = drivers.get(driverType);\n if (\n entry &&\n (typeof entry !== 'function' || typeof plugin === 'function')\n ) {\n return;\n }\n drivers.set(driverType, plugin);\n };\n\n const getDriver = <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ) =>\n options.driverType\n ? drivers.get(options.driverType)\n : [...drivers.values()].find(\n (d) => typeof d !== 'function' && d.canHandle(options),\n );\n\n const tryResolve = async <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ): Promise<Driver | null> => {\n const driver = getDriver(options);\n\n if (!driver) return null;\n\n if (typeof driver !== 'function') return driver as Driver;\n\n const plugin = await driver();\n\n register(plugin.driverType, plugin);\n return plugin as Driver;\n };\n\n const tryGet = <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ): Driver | null => {\n const driver = getDriver(options);\n\n return driver && typeof driver !== 'function' ? (driver 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 dumboDatabaseDriverRegistry: ReturnType<\n typeof DumboDatabaseDriverRegistry\n >;\n}\n\nexport const dumboDatabaseDriverRegistry =\n (globalThis.dumboDatabaseDriverRegistry =\n globalThis.dumboDatabaseDriverRegistry ?? DumboDatabaseDriverRegistry());\n","export type DatabaseType = string;\nexport type DatabaseDriverName = string;\n\nexport type DatabaseDriverType<\n DatabaseTypeName extends DatabaseType = DatabaseType,\n DriverName extends DatabaseDriverName = DatabaseDriverName,\n> = `${DatabaseTypeName}:${DriverName}`;\n\nexport type InferDriverDatabaseType<T extends string> =\n T extends `${infer DatabaseType}:${string}` ? DatabaseType : never;\n\nexport type DatabaseDriverTypeParts<T extends DatabaseType = DatabaseType> = {\n databaseType: T;\n driverName: string;\n};\n\n/**\n * Accepts a `databaseType` (e.g. PostgreSQL, SQLite) and a `driverName`\n * (the library name, e.g. pg, sqlite3) and combines them to a singular\n * `databaseDriverType` which can be used in database handling.\n */\nexport function toDatabaseDriverType<T extends DatabaseType>(\n databaseType: T,\n driverName: string,\n): DatabaseDriverType<T> {\n return `${databaseType}:${driverName}`;\n}\n\n/**\n * Accepts a fully formatted `driverType` and returns the broken down\n * `databaseType` and `driverName`.\n */\nexport function fromDatabaseDriverType<T extends DatabaseType>(\n databaseDriverType: DatabaseDriverType<T>,\n): DatabaseDriverTypeParts<T> {\n const parts = databaseDriverType.split(':') as [T, string];\n return {\n databaseType: parts[0],\n driverName: parts[1],\n };\n}\n\n/**\n * Accepts a fully formatted `databaseDriverType` and returns the `driverName`.\n */\nexport function getDatabaseDriverName<T extends DatabaseType>(\n databaseDriverType: DatabaseDriverType<T>,\n): DatabaseDriverName {\n const { driverName } = fromDatabaseDriverType(databaseDriverType);\n return driverName;\n}\n\n/**\n * Accepts a fully formatted `databaseDriverType` and returns the `databaseType`.\n */\nexport function getDatabaseType<T extends DatabaseType>(\n databaseDriverType: DatabaseDriverType<T>,\n): DatabaseType {\n const { databaseType } = fromDatabaseDriverType(databaseDriverType);\n return databaseType;\n}\n\nexport * from './databaseDriver';\n","import {\n fromDatabaseDriverType,\n type DatabaseDriverType,\n type DatabaseType,\n} from '../../drivers';\nimport type { SQLExecutor } from '../../execute';\n\nexport interface DatabaseCapabilities<\n SupportsMultipleDatabases extends boolean,\n SupportsSchemas extends boolean,\n SupportsFunctions extends boolean,\n> {\n readonly supportsMultipleDatabases: SupportsMultipleDatabases;\n readonly supportsSchemas: SupportsSchemas;\n readonly supportsFunctions: SupportsFunctions;\n}\n\nexport type DatabaseMetadata<\n SupportsMultipleDatabases extends boolean = boolean,\n SupportsSchemas extends boolean = boolean,\n SupportsFunctions extends boolean = boolean,\n> = {\n readonly databaseType: DatabaseType;\n readonly capabilities: DatabaseCapabilities<\n SupportsMultipleDatabases,\n SupportsSchemas,\n SupportsFunctions\n >;\n readonly tableExists: (\n pool: SQLExecutor,\n tableName: string,\n ) => Promise<boolean>;\n} & (SupportsMultipleDatabases extends true\n ? {\n readonly defaultDatabaseName: string;\n readonly parseDatabaseName: (\n connectionString?: string,\n ) => string | undefined;\n }\n : {\n readonly defaultDatabaseName?: never;\n readonly parseDatabaseName?: never;\n }) &\n (SupportsFunctions extends true\n ? {\n readonly functionExists: (\n pool: SQLExecutor,\n functionName: string,\n ) => Promise<boolean>;\n }\n : {\n readonly functionExists?: (\n pool: SQLExecutor,\n functionName: string,\n ) => Promise<boolean>;\n });\n\nexport const DumboDatabaseMetadataRegistry = () => {\n const infos = new Map<\n DatabaseType,\n DatabaseMetadata | (() => Promise<DatabaseMetadata>)\n >();\n\n const register = (\n databaseType: DatabaseType,\n info: DatabaseMetadata | (() => Promise<DatabaseMetadata>),\n ): void => {\n const entry = infos.get(databaseType);\n if (entry && (typeof entry !== 'function' || typeof info === 'function')) {\n return;\n }\n infos.set(databaseType, info);\n };\n\n const tryResolve = async (\n databaseType: DatabaseType,\n ): Promise<DatabaseMetadata | null> => {\n const entry = infos.get(databaseType);\n\n if (!entry) return null;\n\n if (typeof entry !== 'function') return entry;\n\n const resolved = await entry();\n register(databaseType, resolved);\n return resolved;\n };\n\n const tryGet = (databaseType: DatabaseType): DatabaseMetadata | null => {\n const entry = infos.get(databaseType);\n return entry && typeof entry !== 'function' ? entry : null;\n };\n\n const has = (databaseType: DatabaseType): boolean => infos.has(databaseType);\n\n return {\n register,\n tryResolve,\n tryGet,\n has,\n get databaseTypes(): DatabaseType[] {\n return Array.from(infos.keys());\n },\n };\n};\n\ndeclare global {\n var dumboDatabaseMetadataRegistry: ReturnType<\n typeof DumboDatabaseMetadataRegistry\n >;\n}\n\nexport const dumboDatabaseMetadataRegistry =\n (globalThis.dumboDatabaseMetadataRegistry =\n globalThis.dumboDatabaseMetadataRegistry ??\n DumboDatabaseMetadataRegistry());\n\nexport const getDatabaseMetadata = (\n driverType: DatabaseDriverType,\n): DatabaseMetadata | null => {\n const { databaseType } = fromDatabaseDriverType(driverType);\n return dumboDatabaseMetadataRegistry.tryGet(databaseType);\n};\n\nexport const resolveDatabaseMetadata = async (\n driverType: DatabaseDriverType,\n driverOverride?: DatabaseMetadata,\n): Promise<DatabaseMetadata | null> => {\n if (driverOverride) return driverOverride;\n const { databaseType } = fromDatabaseDriverType(driverType);\n return dumboDatabaseMetadataRegistry.tryResolve(databaseType);\n};\n\nexport const getDefaultDatabase = (\n driverType: DatabaseDriverType,\n): string | undefined => {\n const metadata = getDatabaseMetadata(driverType);\n return metadata?.defaultDatabaseName;\n};\n\nexport const getDefaultDatabaseAsync = async (\n driverType: DatabaseDriverType,\n): Promise<string | undefined> => {\n const metadata = await resolveDatabaseMetadata(driverType);\n return metadata?.defaultDatabaseName;\n};\n","import type { AnyColumnTypeToken, SQLColumnToken } from '../../sql';\nimport type { ValidateDatabaseSchemas } from '../components';\nimport {\n type AnyDatabaseSchemaSchemaComponent,\n columnSchemaComponent,\n type ColumnSchemaComponentOptions,\n databaseSchemaComponent,\n type DatabaseSchemaComponent,\n type DatabaseSchemas,\n databaseSchemaSchemaComponent,\n type DatabaseSchemaSchemaComponent,\n type DatabaseSchemaTables,\n indexSchemaComponent,\n type IndexSchemaComponent,\n type TableColumnNames,\n type TableColumns,\n type TableRelationships,\n tableSchemaComponent,\n type TableSchemaComponent,\n} from '../components';\nimport {\n type AnySchemaComponent,\n isSchemaComponentOfType,\n type SchemaComponentOptions,\n} from '../schemaComponent';\n\nconst DEFAULT_DATABASE_NAME = '__default_database__';\nconst DEFAULT_DATABASE_SCHEMA_NAME = '__default_database_schema__';\n\nconst dumboColumn = <\n const ColumnType extends AnyColumnTypeToken | string =\n | AnyColumnTypeToken\n | string,\n const TOptions extends SchemaComponentOptions &\n Omit<SQLColumnToken<ColumnType>, 'name' | 'type' | 'sqlTokenType'> = Omit<\n ColumnSchemaComponentOptions<ColumnType>,\n 'type'\n >,\n const ColumnName extends string = string,\n>(\n name: ColumnName,\n type: ColumnType,\n options?: TOptions,\n) =>\n columnSchemaComponent<\n ColumnType,\n TOptions & { type: ColumnType },\n ColumnName\n >({\n columnName: name,\n type,\n ...options,\n } as { columnName: ColumnName } & TOptions & { type: ColumnType });\n\nconst dumboIndex = (\n name: string,\n columnNames: string[],\n options?: { unique?: boolean } & SchemaComponentOptions,\n): IndexSchemaComponent =>\n indexSchemaComponent({\n indexName: name,\n columnNames,\n isUnique: options?.unique ?? false,\n ...options,\n });\n\nconst dumboTable = <\n const Columns extends TableColumns = TableColumns,\n const TableName extends string = string,\n const Relationships extends TableRelationships<keyof Columns & string> =\n TableRelationships<keyof Columns & string>,\n>(\n name: TableName,\n definition: {\n columns?: Columns;\n primaryKey?: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships?: Relationships;\n indexes?: Record<string, IndexSchemaComponent>;\n } & SchemaComponentOptions,\n): TableSchemaComponent<Columns, TableName, Relationships> => {\n const { columns, indexes, primaryKey, relationships, ...options } =\n definition;\n\n const components = [...(indexes ? Object.values(indexes) : [])];\n\n return tableSchemaComponent({\n tableName: name,\n columns: columns ?? ({} as Columns),\n primaryKey: primaryKey ?? [],\n ...(relationships !== undefined ? { relationships } : {}),\n components,\n ...options,\n });\n};\n\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n>(\n tables: Tables,\n): DatabaseSchemaSchemaComponent<Tables, typeof DEFAULT_DATABASE_SCHEMA_NAME>;\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>(\n schemaName: SchemaName,\n tables: Tables,\n options?: SchemaComponentOptions,\n): DatabaseSchemaSchemaComponent<Tables, SchemaName>;\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>(\n nameOrTables: SchemaName | Tables,\n tables?: Tables,\n options?: SchemaComponentOptions,\n): DatabaseSchemaSchemaComponent<Tables, SchemaName> {\n const schemaName =\n typeof nameOrTables === 'string'\n ? nameOrTables\n : (DEFAULT_DATABASE_SCHEMA_NAME as SchemaName);\n const tablesMap =\n (typeof nameOrTables === 'string' ? tables : nameOrTables) ??\n ({} as Tables);\n return databaseSchemaSchemaComponent({\n schemaName,\n tables: tablesMap,\n ...options,\n });\n}\n\ndumboDatabaseSchema.from = (\n schemaName: string | undefined,\n tableNames: string[],\n): DatabaseSchemaSchemaComponent => {\n const tables = tableNames.reduce(\n (acc, tableName) => {\n acc[tableName] = dumboTable(tableName, {});\n return acc;\n },\n {} as Record<string, TableSchemaComponent>,\n );\n\n return schemaName\n ? dumboDatabaseSchema(schemaName, tables)\n : dumboDatabaseSchema(tables);\n};\n\ntype ValidatedDatabaseSchemaComponent<\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n> =\n ValidateDatabaseSchemas<Schemas> extends {\n valid: true;\n }\n ? DatabaseSchemaComponent<Schemas>\n : ValidateDatabaseSchemas<Schemas> extends {\n valid: false;\n error: infer E;\n }\n ? { valid: false; error: E }\n : DatabaseSchemaComponent<Schemas>;\n\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n schemas: Schemas,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n schema: DatabaseSchemaSchemaComponent,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string,\n schemas: Schemas,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string,\n schema: AnyDatabaseSchemaSchemaComponent,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n nameOrSchemas: string | DatabaseSchemaSchemaComponent | Schemas,\n schemasOrOptions?:\n | DatabaseSchemaSchemaComponent\n | Schemas\n | SchemaComponentOptions,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas> {\n const databaseName =\n typeof nameOrSchemas === 'string' ? nameOrSchemas : DEFAULT_DATABASE_NAME;\n\n const schemasOrSchema =\n typeof nameOrSchemas === 'string'\n ? (schemasOrOptions ?? {})\n : nameOrSchemas;\n const schemaMap: Record<string, DatabaseSchemaSchemaComponent> =\n 'schemaComponentKey' in schemasOrSchema &&\n isSchemaComponentOfType<DatabaseSchemaSchemaComponent>(\n schemasOrSchema as AnySchemaComponent,\n 'sc:dumbo:database_schema',\n )\n ? {\n [DEFAULT_DATABASE_SCHEMA_NAME]:\n schemasOrSchema as DatabaseSchemaSchemaComponent,\n }\n : (schemasOrSchema as Record<string, DatabaseSchemaSchemaComponent>);\n\n const dbOptions: typeof options =\n typeof nameOrSchemas === 'string'\n ? options\n : (schemasOrOptions as typeof options);\n\n return databaseSchemaComponent({\n databaseName,\n schemas: schemaMap as Schemas,\n ...dbOptions,\n }) as ValidatedDatabaseSchemaComponent<Schemas>;\n}\n\ndumboDatabase.from = <Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string | undefined,\n schemaNames: string[],\n): ValidatedDatabaseSchemaComponent<Schemas> => {\n const schemas = schemaNames.reduce(\n (acc, schemaName) => {\n acc[schemaName] = dumboDatabaseSchema(\n schemaName,\n {} as DatabaseSchemaTables,\n );\n return acc;\n },\n {} as Record<string, DatabaseSchemaSchemaComponent>,\n ) as Schemas;\n\n return databaseName\n ? dumboDatabase(databaseName, schemas)\n : dumboDatabase(schemas);\n};\n\ndumboDatabase.defaultName = DEFAULT_DATABASE_NAME;\ndumboDatabaseSchema.defaultName = DEFAULT_DATABASE_SCHEMA_NAME;\n\nexport const dumboSchema = {\n database: dumboDatabase,\n schema: dumboDatabaseSchema,\n table: dumboTable,\n column: dumboColumn,\n index: dumboIndex,\n};\n","import type { SQLExecutor } from '..';\n\nexport type DatabaseLockOptions = { lockId: number; timeoutMs?: number };\n\nexport type AcquireDatabaseLockMode = 'Permanent' | 'Session';\n\nexport type AcquireDatabaseLockOptions = DatabaseLockOptions & {\n mode?: AcquireDatabaseLockMode;\n};\nexport type ReleaseDatabaseLockOptions = DatabaseLockOptions;\n\nexport const defaultDatabaseLockOptions: Required<\n Omit<DatabaseLockOptions, 'lockId'>\n> = {\n timeoutMs: 10000,\n};\n\nexport type DatabaseLock = {\n acquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<void>;\n tryAcquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<boolean>;\n release(\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n ): Promise<boolean>;\n withAcquire: <Result = unknown>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => Promise<Result>;\n};\n\nexport const NoDatabaseLock: DatabaseLock = {\n acquire: () => Promise.resolve(),\n tryAcquire: () => Promise.resolve(true),\n release: () => Promise.resolve(true),\n withAcquire: <Result>(\n _execute: SQLExecutor,\n handle: () => Promise<Result>,\n _options: AcquireDatabaseLockOptions,\n ): Promise<Result> => handle(),\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const mapRows = async <\n Result extends QueryResultRow = QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: Record<string, unknown>,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return Number(result.count);\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean | 1 | 0 };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true || result.exists === 1;\n};\n","import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n failOnBigIntSerialization?: boolean;\n useDefaultDateSerialization?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONCodecSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = {\n serialization?:\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n options?: JSONSerializeOptions | JSONDeserializeOptions;\n }\n | undefined;\n};\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONCodecSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !Number.isSafeInteger(value)\n ) {\n try {\n return BigInt(context?.source ?? value.toString());\n } catch {\n return value;\n }\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.replacer,\n opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : undefined,\n opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : undefined,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.reviver,\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (\n options?: JSONSerializerOptions &\n JSONDeserializeOptions &\n JSONSerializeOptions,\n): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer: JSONSerializer & {\n from: <\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n >(\n options?: JSONSerializationOptions<SerializeOptions, DeserializeOptions>,\n ) => JSONSerializer<SerializeOptions, DeserializeOptions>;\n} = Object.assign(jsonSerializer(), {\n from: <\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n >(\n options?: JSONSerializationOptions<SerializeOptions, DeserializeOptions>,\n ) =>\n options?.serialization?.serializer ??\n (options?.serialization?.options\n ? jsonSerializer(options?.serialization?.options)\n : JSONSerializer),\n});\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n type JSONSerializerOptions,\n};\n","export interface ParametrizedSQL {\n query: string;\n params: unknown[];\n}\n\nexport interface ParametrizedSQLBuilder {\n addSQL: (str: string) => ParametrizedSQLBuilder;\n addParam(value: unknown): ParametrizedSQLBuilder;\n addParams(values: unknown[]): ParametrizedSQLBuilder;\n build: () => ParametrizedSQL;\n}\n\nexport const ParametrizedSQLBuilder = ({\n mapParamPlaceholder,\n}: {\n mapParamPlaceholder: (index: number, value: unknown) => string;\n}): ParametrizedSQLBuilder => {\n const sql: string[] = [];\n const params: unknown[] = [];\n\n return {\n addSQL(str: string): ParametrizedSQLBuilder {\n sql.push(str);\n return this;\n },\n addParam(value: unknown): ParametrizedSQLBuilder {\n sql.push(mapParamPlaceholder(params.length, value));\n params.push(value);\n return this;\n },\n addParams(values: unknown[]): ParametrizedSQLBuilder {\n const placeholders = values.map((value, i) =>\n mapParamPlaceholder(params.length + i, value),\n );\n this.addSQL(`${placeholders.join(', ')}`);\n params.push(...values);\n return this;\n },\n build(): ParametrizedSQL {\n return {\n query: sql.join(''),\n params,\n };\n },\n };\n};\n","export type SQLToken<\n TSymbol extends string = string,\n TProps extends Omit<Record<string, unknown>, 'sqlTokenType'> | undefined =\n | Omit<Record<string, unknown>, 'sqlTokenType'>\n | undefined,\n> = {\n sqlTokenType: TSymbol;\n} & (TProps extends undefined ? void : Omit<TProps, 'sqlTokenType'>);\n\nexport type ExtractSQLTokenType<T> = T extends (...args: never[]) => infer R\n ? R extends SQLToken\n ? R\n : never\n : T extends SQLToken\n ? T\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySQLToken = SQLToken<string, any>;\n\nexport const SQLToken = <\n SQLTokenType extends AnySQLToken,\n TInput = keyof Omit<SQLTokenType, 'sqlTokenType'> extends never\n ? void\n : Omit<SQLTokenType, 'sqlTokenType'>,\n>(\n sqlTokenType: SQLTokenType['sqlTokenType'],\n map?: (input: TInput) => Omit<SQLTokenType, 'sqlTokenType'>,\n) => {\n const factory = (input: TInput): SQLTokenType => {\n let props: Omit<SQLTokenType, 'sqlTokenType'>;\n\n if (map !== undefined) {\n props = map(input);\n } else if (input === undefined || input === null) {\n props = {} as Omit<SQLTokenType, 'sqlTokenType'>;\n } else if (typeof input === 'object' && !Array.isArray(input)) {\n // If input is already an object (but not array), spread it\n props = input as Omit<SQLTokenType, 'sqlTokenType'>;\n } else {\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Cannot create SQLToken of type ${sqlTokenType} with input: ${input}`,\n );\n }\n\n return {\n sqlTokenType: sqlTokenType,\n [sqlTokenType]: true,\n ...props,\n } as unknown as SQLTokenType;\n };\n\n const check = (token: unknown): token is SQLTokenType =>\n SQLToken.check(token) && token.sqlTokenType === sqlTokenType;\n\n return { from: factory, check: check, type: sqlTokenType };\n};\n\nSQLToken.check = <SQLTokenType extends AnySQLToken>(\n token: unknown,\n): token is SQLTokenType =>\n token !== null && typeof token === 'object' && 'sqlTokenType' in token;\n\nexport type SQLIdentifier = SQLToken<'SQL_IDENTIFIER', { value: string }>;\nexport const SQLIdentifier = SQLToken<SQLIdentifier, string>(\n 'SQL_IDENTIFIER',\n (value) => ({\n value,\n }),\n);\n\nexport type SQLPlain = SQLToken<'SQL_RAW', { value: string }>;\nexport const SQLPlain = SQLToken<SQLPlain, string>('SQL_RAW', (value) => ({\n value,\n}));\n\nexport type SQLLiteral = SQLToken<'SQL_LITERAL', { value: unknown }>;\nexport const SQLLiteral = SQLToken<SQLLiteral, unknown>(\n 'SQL_LITERAL',\n (value) => ({\n value,\n }),\n);\n\nexport type SQLArrayMode = 'params' | 'native';\n\nexport type SQLArray = SQLToken<\n 'SQL_ARRAY',\n { value: unknown[]; mode?: SQLArrayMode }\n>;\n\nexport const SQLArray = SQLToken<\n SQLArray,\n unknown[] | { value: unknown[]; mode?: SQLArrayMode }\n>('SQL_ARRAY', (input) => {\n if (Array.isArray(input)) {\n return { value: input };\n }\n return input.mode !== undefined\n ? { value: input.value, mode: input.mode }\n : { value: input.value };\n});\n\nexport type SQLIn = SQLToken<\n 'SQL_IN',\n { column: SQLIdentifier; values: SQLArray; mode?: SQLArrayMode }\n>;\n\nexport const SQLIn = SQLToken<\n SQLIn,\n { column: string; values: unknown[]; mode?: SQLArrayMode }\n>('SQL_IN', ({ column, values, mode }) =>\n mode !== undefined\n ? {\n column: SQLIdentifier.from(column),\n values: SQLArray.from(values),\n mode,\n }\n : {\n column: SQLIdentifier.from(column),\n values: SQLArray.from(values),\n },\n);\n\nexport type SQLDefaultTokens = SQLIdentifier | SQLPlain | SQLLiteral | SQLArray;\nexport type SQLDefaultTokensTypes = SQLDefaultTokens['sqlTokenType'];\n","import { SQLToken } from './sqlToken';\n\nexport type JSONValueType =\n | Record<string, unknown>\n | Array<unknown>\n | string\n | number\n | boolean\n | null;\n\nexport type JSONValueTypeName =\n | 'value_type:json:object'\n | 'value_type:json:array'\n | 'value_type:json:string'\n | 'value_type:json:number'\n | 'value_type:json:boolean'\n | 'value_type:json:null';\n\nexport type JavaScriptValueType =\n | Record<string, unknown>\n | Array<unknown>\n | string\n | number\n | boolean\n | null\n | undefined\n | Date\n | bigint;\n\nexport type JavaScriptValueTypeName =\n | 'value_type:js:object'\n | 'value_type:js:array'\n | 'value_type:js:string'\n | 'value_type:js:number'\n | 'value_type:js:boolean'\n | 'value_type:js:null'\n | 'value_type:js:undefined'\n | 'value_type:js:date'\n | 'value_type:js:bigint';\n\nexport type JavaScriptValueTypeToNameMap = {\n [K in JavaScriptValueType as K extends Record<string, unknown>\n ? 'value_type:js:object'\n : K extends Array<unknown>\n ? 'value_type:js:array'\n : K extends string\n ? 'value_type:js:string'\n : K extends number\n ? 'value_type:js:number'\n : K extends boolean\n ? 'value_type:js:boolean'\n : K extends null\n ? 'value_type:js:null'\n : K extends undefined\n ? 'value_type:js:undefined'\n : K extends Date\n ? 'value_type:js:date'\n : K extends bigint\n ? 'value_type:js:bigint'\n : never]: K;\n};\n\n// TODO: Use URNs for sqltoken\nexport type ColumnTypeToken<\n JSValueTypeName extends JavaScriptValueTypeName = JavaScriptValueTypeName,\n ColumnTypeName extends string = string,\n TProps extends Omit<Record<string, unknown>, 'sqlTokenType'> | undefined =\n | Omit<Record<string, unknown>, 'sqlTokenType'>\n | undefined,\n ValueType = undefined,\n> = SQLToken<`SQL_COLUMN_${ColumnTypeName}`, TProps> & {\n __brand: ValueType extends undefined\n ? JavaScriptValueTypeToNameMap[JSValueTypeName]\n : ValueType;\n jsTypeName: JSValueTypeName;\n};\n\nexport const ColumnTypeToken = <\n SQLTokenType extends AnyColumnTypeToken,\n TInput = keyof Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n > extends never\n ? void\n : Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>,\n>(\n sqlTokenType: SQLTokenType['sqlTokenType'],\n jsTypeName: SQLTokenType['jsTypeName'],\n map?: (\n input: TInput,\n ) => Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>,\n) => {\n const factory = (input: TInput): SQLTokenType => {\n let props: Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>;\n\n if (map !== undefined) {\n props = map(input) as SQLTokenType;\n } else if (input === undefined || input === null) {\n props = {} as Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n >;\n } else if (typeof input === 'object' && !Array.isArray(input)) {\n // If input is already an object (but not array), spread it\n props = input as Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n >;\n } else {\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Cannot create SQLToken of type ${sqlTokenType} with input: ${input}`,\n );\n }\n\n return {\n sqlTokenType: sqlTokenType,\n [sqlTokenType]: true,\n jsTypeName,\n ...props,\n } as unknown as SQLTokenType;\n };\n\n const check = (token: unknown): token is SQLTokenType =>\n SQLToken.check(token) && token.sqlTokenType === sqlTokenType;\n\n return { from: factory, check: check, type: sqlTokenType };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyColumnTypeToken = ColumnTypeToken<any, string, any>;\n\nexport type SerialToken = ColumnTypeToken<'value_type:js:number', 'SERIAL'>;\nexport const SerialToken = ColumnTypeToken<SerialToken>(\n 'SQL_COLUMN_SERIAL',\n 'value_type:js:number',\n);\n\nexport type BigSerialToken = ColumnTypeToken<\n 'value_type:js:bigint',\n 'BIGSERIAL'\n>;\nexport const BigSerialToken = ColumnTypeToken<BigSerialToken>(\n 'SQL_COLUMN_BIGSERIAL',\n 'value_type:js:bigint',\n);\n\nexport type IntegerToken = ColumnTypeToken<'value_type:js:number', 'INTEGER'>;\nexport const IntegerToken = ColumnTypeToken<IntegerToken>(\n 'SQL_COLUMN_INTEGER',\n 'value_type:js:number',\n);\n\nexport type BigIntegerToken = ColumnTypeToken<'value_type:js:bigint', 'BIGINT'>;\nexport const BigIntegerToken = ColumnTypeToken<BigIntegerToken>(\n 'SQL_COLUMN_BIGINT',\n 'value_type:js:bigint',\n);\n\nexport type JSONBToken<\n ValueType extends Record<string, unknown> = Record<string, unknown>,\n> = ColumnTypeToken<'value_type:js:object', 'JSONB', undefined, ValueType>;\n\nexport const JSONBToken = {\n type: 'SQL_COLUMN_JSONB',\n from: <\n ValueType extends Record<string, unknown> = Record<string, unknown>,\n >(): JSONBToken<ValueType> => {\n return {\n sqlTokenType: 'SQL_COLUMN_JSONB',\n ['SQL_COLUMN_JSONB']: true,\n } as unknown as JSONBToken<ValueType>;\n },\n check: <ValueType extends Record<string, unknown> = Record<string, unknown>>(\n token: unknown,\n ): token is JSONBToken<ValueType> =>\n SQLToken.check(token) && token.sqlTokenType === 'SQL_COLUMN_JSONB',\n};\n\nexport type TimestampToken = ColumnTypeToken<'value_type:js:date', 'TIMESTAMP'>;\nexport const TimestampToken = ColumnTypeToken<TimestampToken>(\n 'SQL_COLUMN_TIMESTAMP',\n 'value_type:js:date',\n);\n\nexport type TimestamptzToken = ColumnTypeToken<\n 'value_type:js:date',\n 'TIMESTAMPTZ'\n>;\nexport const TimestamptzToken = ColumnTypeToken<TimestamptzToken>(\n 'SQL_COLUMN_TIMESTAMPTZ',\n 'value_type:js:date',\n);\n\nexport type VarcharToken = ColumnTypeToken<\n 'value_type:js:string',\n 'VARCHAR',\n { length: number | 'max' }\n>;\nexport const VarcharToken = ColumnTypeToken<VarcharToken, number | 'max'>(\n 'SQL_COLUMN_VARCHAR',\n 'value_type:js:string',\n (length?: number | 'max') =>\n ({\n length: length ?? 'max',\n jsTypeName: 'value_type:js:string',\n }) as Omit<VarcharToken, 'sqlTokenType'>,\n);\n\nexport type NotNullableSQLColumnTokenProps<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> =\n | {\n name: string;\n type: ColumnType;\n notNull: true;\n unique?: boolean;\n primaryKey?: boolean;\n default?: ColumnType | SQLToken;\n }\n | {\n name: string;\n type: ColumnType;\n notNull?: false;\n unique?: boolean;\n primaryKey: never;\n default?: ColumnType | SQLToken;\n };\n\nexport type NullableSQLColumnTokenProps<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = {\n name: string;\n type: ColumnType;\n notNull?: false;\n unique?: boolean;\n primaryKey?: false;\n default?: ColumnType | SQLToken;\n};\n\nexport type SQLColumnToken<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = SQLToken<\n 'SQL_COLUMN',\n | NotNullableSQLColumnTokenProps<ColumnType>\n | NullableSQLColumnTokenProps<ColumnType>\n>;\n\nexport type AutoIncrementSQLColumnToken = ColumnTypeToken<\n 'value_type:js:bigint',\n 'AUTO_INCREMENT',\n {\n primaryKey: boolean;\n bigint?: boolean;\n },\n bigint\n>;\nexport const AutoIncrementSQLColumnToken =\n ColumnTypeToken<AutoIncrementSQLColumnToken>(\n 'SQL_COLUMN_AUTO_INCREMENT',\n 'value_type:js:bigint',\n );\n\nexport const SQLColumnTypeTokens = {\n AutoIncrement: AutoIncrementSQLColumnToken,\n BigInteger: BigIntegerToken,\n BigSerial: BigSerialToken,\n Integer: IntegerToken,\n JSONB: JSONBToken,\n Serial: SerialToken,\n Timestamp: TimestampToken,\n Timestamptz: TimestamptzToken,\n Varchar: VarcharToken,\n};\n\nexport type SQLColumnTypeTokens = {\n AutoIncrement: AutoIncrementSQLColumnToken;\n BigInteger: BigIntegerToken;\n BigSerial: BigSerialToken;\n Integer: IntegerToken;\n JSONB: JSONBToken;\n Serial: SerialToken;\n Timestamp: TimestampToken;\n Timestamptz: TimestamptzToken;\n Varchar: VarcharToken;\n};\n\nexport const SQLColumnTypeTokensFactory = {\n AutoIncrement: AutoIncrementSQLColumnToken.from,\n BigInteger: BigIntegerToken.from(),\n BigSerial: BigSerialToken.from(),\n Integer: IntegerToken.from(),\n JSONB: JSONBToken.from,\n Serial: SerialToken.from(),\n Timestamp: TimestampToken.from(),\n Timestamptz: TimestamptzToken.from(),\n Varchar: VarcharToken.from,\n};\n\nexport type DefaultSQLColumnToken =\n | AutoIncrementSQLColumnToken\n | SerialToken\n | BigSerialToken\n | IntegerToken\n | JSONBToken\n | BigIntegerToken\n | TimestampToken\n | TimestamptzToken\n | VarcharToken;\n\nexport const SQLColumnToken = SQLToken<SQLColumnToken>('SQL_COLUMN');\n","import type { JSONSerializer } from '../../serializer';\nimport type { ParametrizedSQLBuilder } from '../parametrizedSQL';\nimport type { AnySQLToken } from '../tokens';\nimport type { SQLValueMapper } from '../valueMappers';\nimport type { SQLProcessorsReadonlyRegistry } from './sqlProcessorRegistry';\n\nexport type SQLProcessorContext = {\n mapper: SQLValueMapper;\n builder: ParametrizedSQLBuilder;\n processorsRegistry: SQLProcessorsReadonlyRegistry;\n serializer: JSONSerializer;\n};\n\nexport type SQLProcessor<Token extends AnySQLToken = AnySQLToken> = {\n canHandle: Token['sqlTokenType'];\n handle: (value: Token, context: SQLProcessorContext) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySQLProcessor = SQLProcessor<any>;\n\nexport type SQLProcessorOptions<Token extends AnySQLToken = AnySQLToken> = {\n canHandle: Token['sqlTokenType'];\n handle: (value: Token, context: SQLProcessorContext) => void;\n};\n\nexport const SQLProcessor = <Token extends AnySQLToken = AnySQLToken>(\n options: SQLProcessorOptions<Token>,\n): SQLProcessor<Token> => options;\n","import type { SQLIdentifier, SQLIn, SQLLiteral } from '../tokens';\nimport { SQLArray } from '../tokens';\nimport { SQLProcessor, type SQLProcessorContext } from './sqlProcessor';\n\nexport const ExpandArrayProcessor: SQLProcessor<SQLArray> = SQLProcessor({\n canHandle: 'SQL_ARRAY',\n handle: (\n token: SQLArray,\n { builder, serializer, mapper }: SQLProcessorContext,\n ) => {\n if (token.value.length === 0) {\n throw new Error(\n \"Empty arrays are not supported. If you're using it with SELECT IN statement Use SQL.in(column, array) helper instead.\",\n );\n }\n builder.addParams(mapper.mapValue(token.value, serializer) as unknown[]);\n },\n});\n\nexport const ExpandSQLInProcessor: SQLProcessor<SQLIn> = SQLProcessor({\n canHandle: 'SQL_IN',\n handle: (token: SQLIn, context: SQLProcessorContext) => {\n const { builder, mapper, processorsRegistry, serializer } = context;\n const { values: inValues, column } = token;\n\n if (inValues.value.length === 0) {\n builder.addParam(mapper.mapValue(false, serializer));\n return;\n }\n\n builder.addSQL(mapper.mapValue(column.value, serializer) as string);\n builder.addSQL(` IN (`);\n\n const arrayProcessor = processorsRegistry.get(SQLArray.type);\n\n if (!arrayProcessor) {\n throw new Error(\n 'No sql processor registered for an array. Cannot expand IN statement',\n );\n }\n\n arrayProcessor.handle(inValues, {\n builder,\n mapper,\n processorsRegistry,\n serializer: serializer,\n });\n builder.addSQL(`)`);\n },\n});\n\nexport const FormatIdentifierProcessor: SQLProcessor<SQLIdentifier> =\n SQLProcessor({\n canHandle: 'SQL_IDENTIFIER',\n handle: (\n token: SQLIdentifier,\n { builder, mapper, serializer }: SQLProcessorContext,\n ) => {\n // TODO: use MapIdentifier from mapper\n builder.addSQL(mapper.mapValue(token, serializer) as string);\n },\n });\n\nexport const MapLiteralProcessor: SQLProcessor<SQLLiteral> = SQLProcessor({\n canHandle: 'SQL_LITERAL',\n handle: (\n token: SQLLiteral,\n { builder, mapper, serializer }: SQLProcessorContext,\n ) => builder.addParam(mapper.mapValue(token.value, serializer)),\n});\n","import type { AnySQLToken } from '../tokens';\nimport type { AnySQLProcessor, SQLProcessor } from './sqlProcessor';\n\nexport interface SQLProcessorsReadonlyRegistry {\n get<Token extends AnySQLToken = AnySQLToken>(\n tokenType: Token['sqlTokenType'],\n ): SQLProcessor<Token> | null;\n all(): ReadonlyMap<string, AnySQLProcessor>;\n}\n\nexport interface SQLProcessorsRegistry extends SQLProcessorsReadonlyRegistry {\n register(...processor: AnySQLProcessor[]): SQLProcessorsRegistry;\n register(processor: Record<string, AnySQLProcessor>): SQLProcessorsRegistry;\n}\n\nexport const SQLProcessorsRegistry = (options?: {\n from: SQLProcessorsRegistry;\n}): SQLProcessorsRegistry => {\n const processors = options\n ? new Map<string, AnySQLProcessor>(options.from.all())\n : new Map<string, AnySQLProcessor>();\n\n function register(...processor: AnySQLProcessor[]): SQLProcessorsRegistry;\n function register(\n processor: Record<string, AnySQLProcessor>,\n ): SQLProcessorsRegistry;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function register(...args: any[]): SQLProcessorsRegistry {\n if (\n args.length === 1 &&\n typeof args[0] === 'object' &&\n !Array.isArray(args[0])\n ) {\n Object.entries(args[0] as Record<string, AnySQLProcessor>).forEach(\n ([_, processor]) => {\n processors.set(processor.canHandle as string, processor);\n },\n );\n } else {\n args.forEach((p: AnySQLProcessor) =>\n processors.set(p.canHandle as string, p),\n );\n }\n return registry;\n }\n\n const registry = {\n register,\n get: <Token extends AnySQLToken = AnySQLToken>(\n tokenType: string,\n ): SQLProcessor<Token> | null => {\n return processors.get(tokenType) ?? null;\n },\n all: (): ReadonlyMap<string, AnySQLProcessor> => processors,\n };\n return registry;\n};\n","import type { BigIntegerToken, DefaultSQLColumnToken } from '../tokens';\nimport type {\n AutoIncrementSQLColumnToken,\n SQLColumnTypeTokens,\n} from '../tokens';\nimport { SQLProcessor, type SQLProcessorContext } from './sqlProcessor';\n\nexport type DefaultSQLColumnProcessors = {\n [key in keyof SQLColumnTypeTokens]: SQLProcessor<SQLColumnTypeTokens[key]>;\n};\n\nexport const mapDefaultSQLColumnProcessors = (\n mapColumnType: (\n token: DefaultSQLColumnToken,\n context: SQLProcessorContext,\n ) => void,\n): DefaultSQLColumnProcessors => ({\n AutoIncrement: SQLProcessor<AutoIncrementSQLColumnToken>({\n canHandle: 'SQL_COLUMN_AUTO_INCREMENT',\n handle: (token: AutoIncrementSQLColumnToken, context) => {\n mapColumnType(token, context);\n },\n }),\n BigInteger: SQLProcessor({\n canHandle: 'SQL_COLUMN_BIGINT',\n handle: (token: BigIntegerToken, context: SQLProcessorContext) =>\n mapColumnType(token, context),\n }),\n BigSerial: SQLProcessor({\n canHandle: 'SQL_COLUMN_BIGSERIAL',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Serial: SQLProcessor({\n canHandle: 'SQL_COLUMN_SERIAL',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Integer: SQLProcessor({\n canHandle: 'SQL_COLUMN_INTEGER',\n handle: (token, context) => mapColumnType(token, context),\n }),\n JSONB: SQLProcessor({\n canHandle: 'SQL_COLUMN_JSONB',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Timestamp: SQLProcessor({\n canHandle: 'SQL_COLUMN_TIMESTAMP',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Timestamptz: SQLProcessor({\n canHandle: 'SQL_COLUMN_TIMESTAMPTZ',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Varchar: SQLProcessor({\n canHandle: 'SQL_COLUMN_VARCHAR',\n handle: (token, context) => mapColumnType(token, context),\n }),\n});\n","import {\n ExpandArrayProcessor,\n ExpandSQLInProcessor,\n FormatIdentifierProcessor,\n MapLiteralProcessor,\n} from './defaultProcessors';\nimport { SQLProcessorsRegistry } from './sqlProcessorRegistry';\n\nexport * from './columnProcessors';\nexport * from './defaultProcessors';\nexport * from './sqlProcessor';\nexport * from './sqlProcessorRegistry';\n\ndeclare global {\n var defaultProcessorsRegistry: ReturnType<typeof SQLProcessorsRegistry>;\n}\n\nexport const defaultProcessorsRegistry = (globalThis.defaultProcessorsRegistry =\n globalThis.defaultProcessorsRegistry ??\n SQLProcessorsRegistry().register(\n FormatIdentifierProcessor,\n MapLiteralProcessor,\n ExpandArrayProcessor,\n ExpandSQLInProcessor,\n ));\n","import {\n SQLArray,\n SQLLiteral,\n SQLPlain,\n SQLToken,\n type AnySQLToken,\n} from '../tokens';\n\nexport type TokenizedSQL = Readonly<{\n __brand: 'tokenized-sql';\n sqlChunks: ReadonlyArray<string>;\n sqlTokens: ReadonlyArray<AnySQLToken>;\n}>;\n\nconst TokenizedSQLBuilder = () => {\n const sqlChunks: string[] = [];\n const sqlTokens: AnySQLToken[] = [];\n\n return {\n addSQL(str: string): void {\n sqlChunks.push(str);\n },\n addSQLs(str: ReadonlyArray<string>): void {\n sqlChunks.push(...str);\n },\n addToken(value: AnySQLToken): void {\n sqlTokens.push(value);\n },\n addTokens(vals: ReadonlyArray<AnySQLToken>): void {\n sqlTokens.push(...vals);\n },\n build(): TokenizedSQL {\n return sqlChunks.length > 0\n ? {\n __brand: 'tokenized-sql',\n sqlChunks,\n sqlTokens,\n }\n : TokenizedSQL.empty;\n },\n };\n};\n\nexport const TokenizedSQL = (\n strings: ReadonlyArray<string>,\n values: unknown[],\n): TokenizedSQL => {\n const builder = TokenizedSQLBuilder();\n\n for (let i = 0; i < strings.length; i++) {\n if (strings[i] !== '') builder.addSQL(strings[i]!);\n\n if (i >= values.length) break;\n\n const value = values[i];\n\n if (isTokenizedSQL(value)) {\n builder.addSQLs(value.sqlChunks);\n builder.addTokens(value.sqlTokens);\n } else if (SQLPlain.check(value)) {\n builder.addSQL(value.value);\n } else {\n builder.addSQL(TokenizedSQL.paramPlaceholder);\n builder.addToken(\n SQLToken.check(value)\n ? value\n : Array.isArray(value)\n ? SQLArray.from(value)\n : SQLLiteral.from(value),\n );\n }\n }\n\n return builder.build();\n};\n\nexport const isTokenizedSQL = (value: unknown): value is TokenizedSQL => {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__brand' in value &&\n value.__brand === 'tokenized-sql'\n );\n};\n\nTokenizedSQL.paramPlaceholder = `__P__`;\n\nTokenizedSQL.empty = {\n __brand: 'tokenized-sql',\n sqlChunks: [''],\n sqlTokens: [],\n} satisfies TokenizedSQL;\n","export const ansiSqlReservedMap: { [key: string]: boolean } = {\n ALL: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BETWEEN: true,\n BINARY: true,\n BOTH: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DESC: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n END: true,\n EXCEPT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FROM: true,\n FULL: true,\n GRANT: true,\n GROUP: true,\n HAVING: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NULL: true,\n NULLS: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARTITION: true,\n PLACING: true,\n PRIMARY: true,\n REFERENCES: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n TABLE: true,\n THEN: true,\n TO: true,\n TRAILING: true,\n TRUE: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n ADD: true,\n ALTER: true,\n ARE: true,\n AT: true,\n BEGIN: true,\n BY: true,\n CASCADE: true,\n CLOSE: true,\n COMMIT: true,\n CONNECT: true,\n CONTINUE: true,\n CORRESPONDING: true,\n CURSOR: true,\n DEALLOCATE: true,\n DECLARE: true,\n DELETE: true,\n DESCRIBE: true,\n DISCONNECT: true,\n DROP: true,\n ESCAPE: true,\n EXECUTE: true,\n EXISTS: true,\n FETCH: true,\n FIRST: true,\n FLOAT: true,\n GET: true,\n GLOBAL: true,\n GO: true,\n GOTO: true,\n HOUR: true,\n IMMEDIATE: true,\n INDICATOR: true,\n INPUT: true,\n INSERT: true,\n INT: true,\n INTEGER: true,\n INTERVAL: true,\n LANGUAGE: true,\n LAST: true,\n LOCAL: true,\n MATCH: true,\n MINUTE: true,\n MODULE: true,\n MONTH: true,\n NATIONAL: true,\n NEXT: true,\n NO: true,\n OF: true,\n OUTPUT: true,\n PARTIAL: true,\n PREPARE: true,\n PRESERVE: true,\n PRIOR: true,\n PRIVILEGES: true,\n PROCEDURE: true,\n PUBLIC: true,\n READ: true,\n REAL: true,\n RESTRICT: true,\n REVOKE: true,\n ROLLBACK: true,\n ROWS: true,\n SCHEMA: true,\n SCROLL: true,\n SECOND: true,\n SECTION: true,\n SET: true,\n SIZE: true,\n SMALLINT: true,\n SQL: true,\n SQLCODE: true,\n SQLERROR: true,\n SQLSTATE: true,\n TEMPORARY: true,\n TIMEZONE_HOUR: true,\n TIMEZONE_MINUTE: true,\n TRANSACTION: true,\n TRANSLATE: true,\n TRANSLATION: true,\n UNKNOWN: true,\n UPDATE: true,\n VALUE: true,\n VALUES: true,\n VARCHAR: true,\n VARYING: true,\n VIEW: true,\n WHENEVER: true,\n WORK: true,\n WRITE: true,\n YEAR: true,\n ZONE: true,\n};\n","import type { JSONSerializer } from '../../serializer';\nimport { SQL } from '../sql';\nimport { ansiSqlReservedMap as ansiSqlReservedWordsMap } from './reservedSqlWords';\n\nexport interface SQLValueMapper {\n mapValue: MapSQLParamValue;\n mapPlaceholder: (index: number, value: unknown) => string;\n mapIdentifier: (value: string) => string;\n}\n\nexport type MapSQLParamValue = (\n value: unknown,\n serializer: JSONSerializer,\n options?: MapSQLParamValueOptions,\n) => unknown;\n\nexport interface MapSQLParamValueOptions {\n mapBoolean?: (value: boolean) => unknown;\n mapArray?: (array: unknown[], mapValue: MapSQLParamValue) => unknown[];\n mapDate?: (value: Date) => unknown;\n mapObject?: (value: object) => unknown;\n mapBigInt?: (value: bigint) => unknown;\n mapValue?: MapSQLParamValue;\n mapPlaceholder?: (index: number, value: unknown) => string;\n mapIdentifier?: (value: string) => string;\n}\n\nexport const ANSISQLParamPlaceholder = '?';\nexport const ANSISQLIdentifierQuote = '\"';\n\nexport const mapANSISQLParamPlaceholder = () => ANSISQLParamPlaceholder;\n\nconst isReserved = (\n value: string,\n reserved: {\n [key: string]: boolean;\n },\n): boolean => !!reserved[value.toUpperCase()];\n\nexport const mapSQLIdentifier = (\n value: string,\n options?: {\n reservedWords: {\n [key: string]: boolean;\n };\n quote?: string;\n },\n): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n }\n\n const ident = value.toString().slice(0); // create copy\n const quoteSign = options?.quote ?? ANSISQLIdentifierQuote;\n\n // do not quote a valid, unquoted identifier\n if (\n /^[a-z_][a-z0-9_$]*$/.test(ident) &&\n !isReserved(ident, options?.reservedWords ?? ansiSqlReservedWordsMap)\n ) {\n return ident;\n }\n\n let quoted = quoteSign;\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === quoteSign ? c + c : c;\n }\n quoted += quoteSign;\n return quoted;\n};\n\nexport const DefaultMapSQLParamValueOptions = {\n mapPlaceholder: mapANSISQLParamPlaceholder,\n mapIdentifier: mapSQLIdentifier,\n};\n\nexport const SQLValueMapper = (\n options?: MapSQLParamValueOptions,\n): SQLValueMapper => {\n const mapSQLParamValueOptions = {\n ...DefaultMapSQLParamValueOptions,\n ...(options ?? {}),\n };\n\n const resultMapper: SQLValueMapper = {\n mapValue: (\n value: unknown,\n serializer: JSONSerializer,\n mapOptions?: MapSQLParamValueOptions,\n ) =>\n mapSQLParamValue(value, serializer, {\n ...mapSQLParamValueOptions,\n ...mapOptions,\n }),\n mapPlaceholder: mapSQLParamValueOptions.mapPlaceholder,\n mapIdentifier: mapSQLParamValueOptions.mapIdentifier,\n };\n return resultMapper;\n};\n\nexport function mapSQLParamValue(\n value: unknown,\n serializer: JSONSerializer,\n options?: MapSQLParamValueOptions,\n): unknown {\n if (value === null || value === undefined) {\n return null;\n } else if (typeof value === 'number') {\n return value;\n } else if (typeof value === 'string') {\n return value;\n } else if (Array.isArray(value)) {\n const mapValue: MapSQLParamValue = options?.mapValue ?? mapSQLParamValue;\n return options?.mapArray\n ? options.mapArray(value, mapValue)\n : value.map((item) => mapValue(item, serializer, options));\n } else if (typeof value === 'boolean') {\n return options?.mapBoolean ? options.mapBoolean(value) : value;\n } else if (typeof value === 'bigint') {\n return options?.mapBigInt ? options.mapBigInt(value) : value.toString();\n } else if (value instanceof Date) {\n return options?.mapDate ? options.mapDate(value) : value.toISOString();\n } else if (SQL.check.isIdentifier(value)) {\n return (options?.mapIdentifier ?? mapSQLIdentifier)(value.value);\n } else if (typeof value === 'object') {\n return options?.mapObject\n ? options.mapObject(value)\n : `${serializer.serialize(value).replace(/'/g, \"''\")}`;\n } else {\n return serializer.serialize(value);\n }\n}\n","import { JSONSerializer } from '../../serializer';\nimport {\n ParametrizedSQLBuilder,\n type ParametrizedSQL,\n} from '../parametrizedSQL';\nimport {\n defaultProcessorsRegistry,\n type SQLProcessorContext,\n type SQLProcessorsReadonlyRegistry,\n} from '../processors';\nimport { SQL } from '../sql';\nimport { isTokenizedSQL, TokenizedSQL } from '../tokenizedSQL';\nimport { SQLValueMapper, type MapSQLParamValueOptions } from '../valueMappers';\n\nexport type FormatContext = Partial<SQLProcessorContext> &\n Pick<SQLProcessorContext, 'serializer'>;\n\nexport interface SQLFormatter {\n format: (sql: SQL | SQL[], context: FormatContext) => ParametrizedSQL;\n describe: (sql: SQL | SQL[], context: FormatContext) => string;\n valueMapper: SQLValueMapper;\n}\n\nexport type FormatSQLOptions = {\n mapper?: MapSQLParamValueOptions;\n processorsRegistry?: SQLProcessorsReadonlyRegistry;\n serializer?: JSONSerializer;\n};\n\nexport type SQLFormatterOptions = Partial<Omit<SQLFormatter, 'valueMapper'>> & {\n valueMapper?: MapSQLParamValueOptions;\n processorsRegistry?: SQLProcessorsReadonlyRegistry;\n};\n\nexport const SQLFormatter = ({\n format,\n describe,\n valueMapper: valueMapperOptions,\n processorsRegistry,\n}: SQLFormatterOptions): SQLFormatter => {\n const valueMapper = SQLValueMapper(valueMapperOptions);\n const options = {\n builder: ParametrizedSQLBuilder({\n mapParamPlaceholder: valueMapper.mapPlaceholder,\n }),\n mapper: valueMapper,\n processorsRegistry: processorsRegistry ?? defaultProcessorsRegistry,\n };\n\n const resultFormatter: SQLFormatter = {\n format:\n format ??\n ((sql: SQL | SQL[], methodOptions) =>\n formatSQL(\n sql,\n resultFormatter,\n methodOptions?.serializer ?? JSONSerializer,\n {\n ...options,\n ...(methodOptions ?? {}),\n },\n )),\n describe:\n describe ??\n ((sql: SQL | SQL[], methodOptions) =>\n describeSQL(\n sql,\n resultFormatter,\n methodOptions?.serializer ?? JSONSerializer,\n {\n ...options,\n ...(methodOptions ?? {}),\n },\n )),\n valueMapper,\n };\n\n return resultFormatter;\n};\n\ndeclare global {\n var dumboSQLFormatters: Record<string, SQLFormatter>;\n}\n\nconst dumboSQLFormatters = (globalThis.dumboSQLFormatters =\n globalThis.dumboSQLFormatters ?? ({} as Record<string, SQLFormatter>));\n\nexport const registerFormatter = (\n dialect: string,\n formatter: SQLFormatter,\n): void => {\n dumboSQLFormatters[dialect] = formatter;\n};\n\nexport const getFormatter = (dialect: string): SQLFormatter => {\n const formatterKey = dialect;\n if (!dumboSQLFormatters[formatterKey]) {\n throw new Error(`No SQL formatter registered for dialect: ${dialect}`);\n }\n return dumboSQLFormatters[formatterKey];\n};\n\nexport function formatSQL(\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n serializer: JSONSerializer,\n context?: FormatSQLOptions,\n): ParametrizedSQL {\n const mapper: SQLValueMapper =\n context?.mapper == undefined\n ? formatter.valueMapper\n : {\n ...formatter.valueMapper,\n ...context.mapper,\n };\n const processorsRegistry =\n context?.processorsRegistry ?? defaultProcessorsRegistry;\n\n const merged = (Array.isArray(sql)\n ? SQL.merge(sql, '\\n')\n : sql) as unknown as TokenizedSQL;\n\n if (!isTokenizedSQL(merged)) {\n throw new Error('Expected TokenizedSQL, got string-based SQL');\n }\n\n const builder = ParametrizedSQLBuilder({\n mapParamPlaceholder: mapper.mapPlaceholder,\n });\n\n let paramIndex = 0;\n\n for (let i = 0; i < merged.sqlChunks.length; i++) {\n const sqlChunk = merged.sqlChunks[i]!;\n\n if (sqlChunk !== TokenizedSQL.paramPlaceholder) {\n builder.addSQL(sqlChunk);\n continue;\n }\n\n const token = merged.sqlTokens[paramIndex++]!;\n\n const processor = processorsRegistry.get(token.sqlTokenType);\n\n if (!processor) {\n throw new Error(\n `No SQL processor registered for token type: ${token.sqlTokenType}`,\n );\n }\n\n processor.handle(token, {\n builder,\n processorsRegistry,\n serializer,\n mapper,\n });\n }\n\n return builder.build();\n}\n\nexport const describeSQL = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n serializer: JSONSerializer,\n options?: FormatSQLOptions,\n): string =>\n formatSQL(sql, formatter, serializer, {\n ...(options ?? {}),\n mapper: {\n mapPlaceholder: (_, value) => serializer.serialize(value),\n },\n }).query;\n","import { JSONSerializer } from '../serializer';\nimport type { SQLFormatter } from './formatters';\nimport { describeSQL, formatSQL, type FormatSQLOptions } from './formatters';\nimport type { ParametrizedSQL } from './parametrizedSQL';\nimport { isTokenizedSQL, TokenizedSQL } from './tokenizedSQL';\nimport {\n SQLArray,\n SQLColumnToken,\n SQLColumnTypeTokensFactory,\n SQLIdentifier,\n SQLIn,\n SQLPlain,\n type SQLArrayMode,\n} from './tokens';\n\nexport type SQL = string & { __brand: 'sql' };\n\nexport function SQL(strings: TemplateStringsArray, ...values: unknown[]): SQL {\n const parametrized = TokenizedSQL(strings, values);\n return parametrized as unknown as SQL;\n}\n\nexport function RawSQL(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): SQL {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n result += String(values[i]);\n }\n }\n\n return {\n __brand: 'tokenized-sql',\n sqlChunks: [result],\n sqlTokens: [],\n } as unknown as SQL;\n}\n\nexport const isSQL = (value: unknown): value is SQL => {\n if (value === undefined || value === null) {\n return false;\n }\n\n return isTokenizedSQL(value);\n};\n\nconst emptySQL = {\n __brand: 'tokenized-sql',\n sqlChunks: [''],\n sqlTokens: [],\n} satisfies TokenizedSQL as unknown as SQL;\n\nconst mergeSQL = (sqls: SQL[], separator: string = ' '): SQL => {\n const parametrized = sqls\n .filter((sql) => !isEmpty(sql))\n .map((sql) => sql as unknown as TokenizedSQL);\n\n const params = parametrized.flatMap((p) => p.sqlTokens);\n const sqlChunks = parametrized.flatMap((p, i) =>\n i == parametrized.length - 1 || separator === ''\n ? p.sqlChunks\n : [...p.sqlChunks, separator],\n );\n\n const merged: TokenizedSQL =\n sqlChunks.length > 0\n ? {\n __brand: 'tokenized-sql',\n sqlChunks: sqlChunks,\n sqlTokens: params,\n }\n : TokenizedSQL.empty;\n\n return merged as unknown as SQL;\n};\n\nconst concatSQL = (...sqls: SQL[]): SQL => mergeSQL(sqls, '');\n\nconst isEmpty = (sql: SQL): boolean => {\n if (isTokenizedSQL(sql)) {\n const parametrized = sql as unknown as TokenizedSQL;\n return (\n parametrized.sqlChunks.every((chunk) => chunk.trim() === '') &&\n parametrized.sqlTokens.length === 0\n );\n }\n\n return false;\n};\n\nSQL.EMPTY = emptySQL;\nSQL.concat = concatSQL;\nSQL.merge = mergeSQL;\nSQL.format = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n): ParametrizedSQL =>\n formatSQL(sql, formatter, options?.serializer ?? JSONSerializer, options);\nSQL.describe = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n): string =>\n describeSQL(sql, formatter, options?.serializer ?? JSONSerializer, options);\nSQL.in = (\n column: string,\n values: unknown[],\n options?: { mode?: SQLArrayMode },\n) =>\n options?.mode\n ? SQLIn.from({ column, values, mode: options.mode })\n : SQLIn.from({ column, values });\nSQL.array = (values: unknown[], options?: { mode?: SQLArrayMode }) =>\n SQLArray.from(options?.mode ? { value: values, mode: options.mode } : values);\nSQL.identifier = SQLIdentifier.from;\nSQL.plain = SQLPlain.from;\n\nSQL.check = {\n isSQL,\n isTokenizedSQL: (value: unknown) => isTokenizedSQL(value),\n isEmpty,\n isIdentifier: SQLIdentifier.check,\n isPlain: SQLPlain.check,\n isSQLIn: SQLIn.check,\n};\n\nconst columnFactory: typeof SQLColumnToken.from & {\n type: typeof SQLColumnTypeTokensFactory;\n} = SQLColumnToken.from as unknown as typeof SQLColumnToken.from & {\n type: typeof SQLColumnTypeTokensFactory;\n};\ncolumnFactory.type =\n SQLColumnTypeTokensFactory as unknown as typeof SQLColumnTypeTokensFactory;\n\nSQL.column = columnFactory;\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst getEnvVariable = (name: string): string | undefined => {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = getEnvVariable('DUMBO_LOG_LEVEL') ?? LogLevel.ERROR;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (\n logStyle: LogStyle,\n serializer: JSONSerializer = JSONSerializer,\n ): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return serializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (getEnvVariable('DUMBO_LOG_STYLE') as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import type { SQL } from '../sql';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: SQL[];\n};\n\nexport const sqlMigration = (name: string, sqls: SQL[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\n","const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nconst isString = (val: unknown): val is string => typeof val === 'string';\n\nexport class DumboError extends Error {\n static readonly ErrorCode: number = 500;\n static readonly ErrorType: string = 'DumboError';\n\n public errorCode: number;\n public errorType: string;\n public innerError: Error | undefined;\n\n constructor(\n options?:\n | {\n errorCode: number;\n errorType?: string;\n message?: string | undefined;\n innerError?: Error | undefined;\n }\n | string\n | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : DumboError.ErrorCode;\n const errorType =\n options && typeof options === 'object' && 'errorType' in options\n ? (options.errorType ?? DumboError.ErrorType)\n : DumboError.ErrorType;\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 DumboError processing`;\n const innerError =\n options && typeof options === 'object' && 'innerError' in options\n ? options.innerError\n : undefined;\n\n super(message, { cause: innerError });\n this.errorCode = errorCode;\n this.errorType = errorType;\n this.innerError = innerError;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, DumboError.prototype);\n }\n\n public static isInstanceOf<ErrorType extends DumboError = DumboError>(\n error: unknown,\n options?: { errorCode?: number; errorType?: string },\n ): error is ErrorType {\n if (\n typeof error !== 'object' ||\n error === null ||\n !('errorCode' in error) ||\n !isNumber(error.errorCode) ||\n !('errorType' in error) ||\n !isString(error.errorType)\n )\n return false;\n\n if (!options) return true;\n\n if (\n options.errorCode !== undefined &&\n error.errorCode !== options.errorCode\n )\n return false;\n if (\n options.errorType !== undefined &&\n error.errorType !== options.errorType\n )\n return false;\n\n return true;\n }\n}\n\nexport class ConcurrencyError extends DumboError {\n static readonly ErrorCode: number = 412;\n static readonly ErrorType: string = 'ConcurrencyError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: ConcurrencyError.ErrorCode,\n errorType: ConcurrencyError.ErrorType,\n message: message ?? `Expected document state does not match current one!`,\n innerError,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n\nexport class TransientDatabaseError extends DumboError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'TransientDatabaseError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: TransientDatabaseError.ErrorCode,\n errorType: TransientDatabaseError.ErrorType,\n message:\n message ??\n `A transient error occurred during database operation. Retrying the operation might succeed.`,\n innerError,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, TransientDatabaseError.prototype);\n }\n}\n\nexport class ConnectionError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'ConnectionError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A connection error occurred during database operation.`,\n innerError,\n );\n this.errorType = ConnectionError.ErrorType;\n\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\n\nexport class SerializationError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'SerializationError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `A serialization failure occurred. The transaction can be retried.`,\n innerError,\n );\n this.errorType = SerializationError.ErrorType;\n\n Object.setPrototypeOf(this, SerializationError.prototype);\n }\n}\n\nexport class DeadlockError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'DeadlockError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A deadlock was detected. The transaction can be retried.`,\n innerError,\n );\n this.errorType = DeadlockError.ErrorType;\n\n Object.setPrototypeOf(this, DeadlockError.prototype);\n }\n}\n\nexport class LockNotAvailableError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'LockNotAvailableError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `The requested lock is not available.`, innerError);\n this.errorType = LockNotAvailableError.ErrorType;\n\n Object.setPrototypeOf(this, LockNotAvailableError.prototype);\n }\n}\n\nexport class InsufficientResourcesError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'InsufficientResourcesError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `Insufficient resources to complete the database operation (e.g. disk full, out of memory, too many connections).`,\n innerError,\n );\n this.errorType = InsufficientResourcesError.ErrorType;\n\n Object.setPrototypeOf(this, InsufficientResourcesError.prototype);\n }\n}\n\nexport class SystemError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'SystemError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A system-level error occurred (e.g. I/O error).`,\n innerError,\n );\n this.errorType = SystemError.ErrorType;\n\n Object.setPrototypeOf(this, SystemError.prototype);\n }\n}\n\nexport class AdminShutdownError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'AdminShutdownError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `The database server is shutting down or restarting.`,\n innerError,\n );\n this.errorType = AdminShutdownError.ErrorType;\n\n Object.setPrototypeOf(this, AdminShutdownError.prototype);\n }\n}\n\nexport class QueryCanceledError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'QueryCanceledError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `The query was canceled, e.g. due to statement timeout or user request.`,\n innerError,\n );\n this.errorType = QueryCanceledError.ErrorType;\n\n Object.setPrototypeOf(this, QueryCanceledError.prototype);\n }\n}\n\nexport class IntegrityConstraintViolationError extends DumboError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'IntegrityConstraintViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: IntegrityConstraintViolationError.ErrorCode,\n errorType: IntegrityConstraintViolationError.ErrorType,\n message: message ?? `An integrity constraint violation occurred!`,\n innerError,\n });\n\n Object.setPrototypeOf(this, IntegrityConstraintViolationError.prototype);\n }\n}\n\nexport class UniqueConstraintError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'UniqueConstraintError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Unique constraint violation occurred!`, innerError);\n this.errorType = UniqueConstraintError.ErrorType;\n\n Object.setPrototypeOf(this, UniqueConstraintError.prototype);\n }\n}\n\nexport class ForeignKeyViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'ForeignKeyViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Foreign key constraint violation occurred!`, innerError);\n this.errorType = ForeignKeyViolationError.ErrorType;\n\n Object.setPrototypeOf(this, ForeignKeyViolationError.prototype);\n }\n}\n\nexport class NotNullViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'NotNullViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `NOT NULL constraint violation occurred!`, innerError);\n this.errorType = NotNullViolationError.ErrorType;\n\n Object.setPrototypeOf(this, NotNullViolationError.prototype);\n }\n}\n\nexport class CheckViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'CheckViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `CHECK constraint violation occurred!`, innerError);\n this.errorType = CheckViolationError.ErrorType;\n\n Object.setPrototypeOf(this, CheckViolationError.prototype);\n }\n}\n\nexport class ExclusionViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'ExclusionViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Exclusion constraint violation occurred!`, innerError);\n this.errorType = ExclusionViolationError.ErrorType;\n\n Object.setPrototypeOf(this, ExclusionViolationError.prototype);\n }\n}\n\nexport class DataError extends DumboError {\n static readonly ErrorCode: number = 400;\n static readonly ErrorType: string = 'DataError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: DataError.ErrorCode,\n errorType: DataError.ErrorType,\n message:\n message ?? `A data error occurred (e.g. invalid value, type mismatch).`,\n innerError,\n });\n\n Object.setPrototypeOf(this, DataError.prototype);\n }\n}\n\nexport class InvalidOperationError extends DumboError {\n static readonly ErrorCode: number = 400;\n static readonly ErrorType: string = 'InvalidOperationError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: InvalidOperationError.ErrorCode,\n errorType: InvalidOperationError.ErrorType,\n message:\n message ??\n `Invalid operation (e.g. syntax error, insufficient privileges, undefined table).`,\n innerError,\n });\n\n Object.setPrototypeOf(this, InvalidOperationError.prototype);\n }\n}\n","import type { Connection } from '../connections';\nimport type { DatabaseDriverType } from '../drivers';\nimport { DumboError } from '../errors';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport type { JSONDeserializeOptions, JSONSerializer } from '../serializer';\nimport type { SQL, SQLFormatter } from '../sql';\n\nexport const mapColumnToJSON = (\n column: string,\n serializer: JSONSerializer,\n options?: JSONDeserializeOptions,\n) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'string') {\n try {\n return serializer.deserialize(value, options);\n } catch {\n // ignore\n }\n }\n\n return value;\n },\n});\n\nexport const mapColumnToBigint = (column: string) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'number' || typeof value === 'string') {\n return BigInt(value);\n }\n\n return value;\n },\n});\n\nexport const mapColumnToDate = (column: string) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'number' || typeof value === 'string') {\n return new Date(value);\n }\n\n return value;\n },\n});\n\nexport const mapSQLQueryResult = <T>(\n result: T,\n mapping: SQLQueryResultColumnMapping,\n) => {\n if (typeof result !== 'object' || result === null) return result;\n\n const mappedResult: Record<string, unknown> = {\n ...(result as Record<string, unknown>),\n };\n\n for (const column of Object.keys(mapping)) {\n if (column in mappedResult) {\n mappedResult[column] = mapping[column]!(mappedResult[column]);\n }\n }\n\n return mappedResult as T;\n};\n\nexport type SQLQueryResultColumnMapping = {\n [column: string]: (value: unknown) => unknown;\n};\n\nexport type SQLQueryOptions = {\n timeoutMs?: number | undefined;\n mapping?: SQLQueryResultColumnMapping;\n};\n\nexport type SQLCommandOptions = {\n timeoutMs?: number | undefined;\n mapping?: SQLQueryResultColumnMapping;\n};\n\nexport type BatchSQLCommandOptions = SQLCommandOptions & {\n assertChanges?: boolean;\n};\n\nexport class BatchCommandNoChangesError extends DumboError {\n readonly statementIndex: number;\n\n constructor(statementIndex: number) {\n super({\n errorCode: 409,\n message: `Batch command at index ${statementIndex} affected no rows`,\n });\n this.name = 'BatchCommandNoChangesError';\n this.statementIndex = statementIndex;\n\n Object.setPrototypeOf(this, BatchCommandNoChangesError.prototype);\n }\n}\n\nexport type DbSQLExecutorOptions = {\n serializer: JSONSerializer;\n};\n\nexport interface DbSQLExecutor<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n DbClient = unknown,\n> {\n driverType: DriverType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n formatter: SQLFormatter;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchCommand(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n driverType: ConnectionType['driverType'];\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInAmbientConnection = <\n ConnectionType extends Connection,\n>(options: {\n driverType: ConnectionType['driverType'];\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.query(sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.batchQuery(sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.command(sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.batchCommand(sqls, commandOptions),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n\nexport const executeInAmbientConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n // Do not close the connection in ambient connection context\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport type {\n AnyConnection,\n Connection,\n InferDbClientFromConnection,\n} from './connection';\n\nexport interface DatabaseTransaction<\n ConnectionType extends AnyConnection = AnyConnection,\n> extends WithSQLExecutor {\n driverType: ConnectionType['driverType'];\n connection: ConnectionType;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyDatabaseTransaction = DatabaseTransaction<any>;\n\nexport type DatabaseTransactionOptions = {\n allowNestedTransactions?: boolean;\n readonly?: boolean;\n};\n\nexport interface WithDatabaseTransactionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> {\n transaction: (options?: TransactionOptionsType) => TransactionType;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: TransactionType,\n ) => Promise<TransactionResult<Result> | Result>,\n options?: TransactionOptionsType,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n DatabaseTransactionType extends AnyDatabaseTransaction =\n AnyDatabaseTransaction,\n Result = void,\n>(\n transaction: DatabaseTransactionType,\n handle: (\n transaction: DatabaseTransactionType,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n>(\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>,\n initTransaction: (\n client: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: TransactionOptionsType & {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n },\n ) => TransactionType,\n): WithDatabaseTransactionFactory<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n> => {\n let currentTransaction: TransactionType | undefined = undefined;\n\n const getOrInitCurrentTransaction = (options?: TransactionOptionsType) =>\n currentTransaction ??\n (currentTransaction = initTransaction(connect(), {\n close: () => {\n currentTransaction = undefined;\n return Promise.resolve();\n },\n ...(options ?? ({} as TransactionOptionsType)),\n }));\n\n return {\n transaction: getOrInitCurrentTransaction,\n withTransaction: (handle, options) =>\n executeInTransaction(getOrInitCurrentTransaction(options), handle),\n };\n};\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends AnyConnection = AnyConnection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n>(\n connect: () => ConnectionType,\n): WithDatabaseTransactionFactory<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n> => ({\n transaction: (options) => {\n const connection = connect();\n const transaction = connection.transaction(options) as TransactionType;\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle, options) => {\n const connection = connect() as unknown as Connection<\n ConnectionType,\n ConnectionType['driverType'],\n InferDbClientFromConnection<ConnectionType>,\n TransactionType,\n TransactionOptionsType\n >;\n return wrapInConnectionClosure(\n connection as unknown as ConnectionType,\n () => connection.withTransaction(handle, options),\n );\n },\n});\n\nexport const transactionFactoryWithAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n>(\n connect: () => ConnectionType,\n): WithDatabaseTransactionFactory<ConnectionType> => ({\n transaction: (options) => {\n const connection = connect();\n const transaction = connection.transaction(options);\n\n return {\n ...transaction,\n commit: () => transaction.commit(),\n rollback: () => transaction.rollback(),\n };\n },\n withTransaction: (handle, options) => {\n const connection = connect();\n return connection.withTransaction(handle, options);\n },\n});\n","import type { DatabaseDriverType } from '../drivers';\nimport {\n sqlExecutor,\n type DbSQLExecutor,\n type DbSQLExecutorOptions,\n type WithSQLExecutor,\n} from '../execute';\nimport type { JSONSerializer } from '../serializer';\nimport {\n transactionFactoryWithDbClient,\n type AnyDatabaseTransaction,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n type WithDatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n DbClient = unknown,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n>\n extends\n WithSQLExecutor,\n WithDatabaseTransactionFactory<\n Self,\n TransactionType,\n TransactionOptionsType\n > {\n driverType: DriverType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n}\n\nexport type AnyConnection = Connection<\n AnyConnection,\n DatabaseDriverType,\n unknown,\n AnyDatabaseTransaction,\n DatabaseTransactionOptions\n>;\n\nexport type InferDriverTypeFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, infer DT, any, any, any> ? DT : never;\n\nexport type InferDbClientFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, any, infer DC, any, any> ? DC : never;\n\nexport type InferTransactionFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, any, any, infer DT, any> ? DT : never;\n\nexport type InferTransactionOptionsFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, any, any, any, infer TO> ? TO : never;\n\nexport type ConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n> = {\n driverType?: ConnectionType['driverType'];\n transactionOptions?: InferTransactionOptionsFromConnection<ConnectionType>;\n};\n\nexport type ConnectionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> = (options: ConnectionOptions<ConnectionType>) => ConnectionType;\n\nexport type WithConnectionOptions = {\n readonly?: boolean;\n};\n\nexport interface WithConnectionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options?: WithConnectionOptions,\n ) => Promise<Result>;\n}\n\nexport type InitTransaction<\n ConnectionType extends AnyConnection = AnyConnection,\n TreansactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> = (connection: () => ConnectionType) => (\n client: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: TransactionOptionsType & {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n },\n) => TreansactionType;\n\nexport type CreateConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: (client: InferDbClientFromConnection<ConnectionType>) => Promise<void>;\n initTransaction: InitTransaction<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport type CreateAmbientConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n client: InferDbClientFromConnection<ConnectionType>;\n serializer: JSONSerializer;\n initTransaction: InitTransaction<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n>(\n options: CreateAmbientConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, client, executor, initTransaction, serializer } = options;\n\n const clientPromise = Promise.resolve(client);\n const closePromise = Promise.resolve();\n const open = () => clientPromise;\n const close = () => closePromise;\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n TransactionType\n > = {\n driverType,\n open,\n close,\n ...transactionFactoryWithDbClient<ConnectionType, TransactionType>(\n open,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: open }),\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport type CreateSingletonConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: (client: InferDbClientFromConnection<ConnectionType>) => Promise<void>;\n initTransaction: InitTransaction<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createSingletonConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n>(\n options: CreateSingletonConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor, serializer } =\n options;\n\n let client: InferDbClientFromConnection<ConnectionType> | null = null;\n let connectPromise: Promise<\n InferDbClientFromConnection<ConnectionType>\n > | null = null;\n\n const getClient = async () => {\n if (client) return client;\n if (!connectPromise) {\n connectPromise = connect().then((c) => {\n client = c;\n return c;\n });\n }\n return connectPromise;\n };\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n DatabaseTransaction<ConnectionType>\n > = {\n driverType,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient<ConnectionType>(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: getClient }),\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport type CreateTransientConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n open: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: () => Promise<void>;\n initTransaction: InitTransaction<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createTransientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n>(\n options: CreateTransientConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, open, close, initTransaction, executor, serializer } =\n options;\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n DatabaseTransaction<ConnectionType>\n > = {\n driverType,\n open,\n close,\n ...transactionFactoryWithDbClient<ConnectionType>(\n open,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: open }),\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport const createConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n>(\n options: CreateConnectionOptions<ConnectionType, Executor, TransactionType>,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor, serializer } =\n options;\n\n let client: InferDbClientFromConnection<ConnectionType> | null = null;\n let connectPromise: Promise<\n InferDbClientFromConnection<ConnectionType>\n > | null = null;\n\n const getClient = async () => {\n if (client) return client;\n if (!connectPromise) {\n connectPromise = connect().then((c) => {\n client = c;\n return c;\n });\n }\n return connectPromise;\n };\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n DatabaseTransaction<ConnectionType>\n > = {\n driverType,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient<ConnectionType>(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: getClient }),\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInAmbientConnection,\n executeInNewConnection,\n sqlExecutorInAmbientConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport type {\n AnyConnection,\n InferDbClientFromConnection,\n WithConnectionFactory,\n WithConnectionOptions,\n} from './connection';\nimport {\n transactionFactoryWithAmbientConnection,\n transactionFactoryWithNewConnection,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n type WithDatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionType extends DatabaseTransaction<ConnectionType> =\n DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n>\n extends\n WithSQLExecutor,\n WithConnectionFactory<ConnectionType>,\n WithDatabaseTransactionFactory<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n > {\n driverType: ConnectionType['driverType'];\n close: () => Promise<void>;\n}\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport type AmbientConnectionPoolOptions<ConnectionType extends AnyConnection> =\n {\n driverType: ConnectionType['driverType'];\n connection: ConnectionType;\n };\n\nexport const createAmbientConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: AmbientConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, connection } = options;\n\n return createConnectionPool<ConnectionType>({\n driverType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: (options) => connection.transaction(options),\n withConnection: (handle, _options?) => handle(connection),\n withTransaction: (handle, options) =>\n connection.withTransaction(handle, options),\n });\n};\n\nexport type SingletonConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n> = {\n driverType: ConnectionType['driverType'];\n getConnection: () => ConnectionType;\n connectionOptions?: never;\n};\n\nexport const createSingletonConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: SingletonConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection } = options;\n let connection: ConnectionType | null = null;\n\n const getExistingOrNewConnection = () =>\n connection ?? (connection = getConnection());\n\n const getExistingOrNewConnectionAsync = () =>\n Promise.resolve(getExistingOrNewConnection());\n\n const result: ConnectionPool<ConnectionType> = {\n driverType,\n connection: getExistingOrNewConnectionAsync,\n execute: sqlExecutorInAmbientConnection({\n driverType,\n connection: getExistingOrNewConnectionAsync,\n }),\n withConnection: <Result>(\n handle: (connection: ConnectionType) => Promise<Result>,\n _options?: WithConnectionOptions,\n ) =>\n executeInAmbientConnection<ConnectionType, Result>(handle, {\n connection: getExistingOrNewConnectionAsync,\n }),\n ...transactionFactoryWithAmbientConnection(getExistingOrNewConnection),\n close: () => {\n return connection !== null ? connection.close() : Promise.resolve();\n },\n };\n\n return result;\n};\n\nexport type SingletonClientConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n> = {\n driverType: ConnectionType['driverType'];\n dbClient: InferDbClientFromConnection<ConnectionType>;\n connectionFactory: (options: {\n dbClient: InferDbClientFromConnection<ConnectionType>;\n }) => ConnectionType;\n};\n\nexport const createSingletonClientConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: SingletonClientConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, dbClient } = options;\n\n return createSingletonConnectionPool({\n getConnection: () => options.connectionFactory({ dbClient }),\n driverType,\n });\n};\n\nexport type CreateAlwaysNewConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n ConnectionOptions extends Record<string, unknown> | undefined = undefined,\n> = ConnectionOptions extends undefined\n ? {\n driverType: ConnectionType['driverType'];\n getConnection: () => ConnectionType;\n connectionOptions?: never;\n }\n : {\n driverType: ConnectionType['driverType'];\n getConnection: (options: ConnectionOptions) => ConnectionType;\n connectionOptions: ConnectionOptions;\n };\n\nexport const createAlwaysNewConnectionPool = <\n ConnectionType extends AnyConnection,\n ConnectionOptions extends Record<string, unknown> | undefined = undefined,\n>(\n options: CreateAlwaysNewConnectionPoolOptions<\n ConnectionType,\n ConnectionOptions\n >,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection, connectionOptions } = options;\n\n return createConnectionPool({\n driverType,\n getConnection: () =>\n connectionOptions ? getConnection(connectionOptions) : getConnection(),\n });\n};\n\nexport type CreateConnectionPoolOptions<ConnectionType extends AnyConnection> =\n Pick<ConnectionPool<ConnectionType>, 'driverType'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n };\n\nexport const createConnectionPool = <ConnectionType extends AnyConnection>(\n pool: CreateConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(\n handle: (connection: ConnectionType) => Promise<Result>,\n _options?: WithConnectionOptions,\n ) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({\n driverType,\n connection,\n });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n driverType,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result;\n};\n","import type { AnyConnection, ConnectionPool } from './connections';\nimport type {\n AnyDumboDatabaseDriver,\n DatabaseDriverType,\n ExtractDumboDatabaseDriverOptions,\n} from './drivers';\nimport { dumboSchema } from './schema';\nimport { SQL, SQLColumnTypeTokensFactory } from './sql';\n\nexport * from './connections';\nexport * from './drivers';\nexport * from './errors';\nexport * from './execute';\nexport * from './locks';\nexport * from './query';\nexport * from './schema';\nexport * from './serializer';\nexport * from './sql';\nexport * from './testing';\nexport * from './tracing';\n\nexport type Dumbo<\n // TODO: Get Rid of DumboType generic parameter if possible\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n ConnectionType extends AnyConnection = AnyConnection,\n> = ConnectionPool<ConnectionType>;\n\nexport type DumboConnectionOptions<\n DatabaseDriver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n> =\n ExtractDumboDatabaseDriverOptions<DatabaseDriver> extends infer Options\n ? Options extends unknown\n ? {\n driver?: DatabaseDriver;\n driverType?: DatabaseDriver['driverType'];\n } & Omit<Options, 'driver' | 'driverType' | 'connectionString'>\n : never\n : never;\n\ndeclare module './sql' {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace SQL {\n export const columnN: typeof dumboSchema.column & {\n type: typeof SQLColumnTypeTokensFactory;\n };\n }\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n(SQL as any).columnN = Object.assign(dumboSchema.column, {\n type: SQLColumnTypeTokensFactory,\n});\n","import { type Dumbo, JSONSerializer } from '../..';\nimport { type DatabaseType, fromDatabaseDriverType } from '../../drivers';\nimport type { SQLExecutor } from '../../execute';\nimport {\n type DatabaseLock,\n type DatabaseLockOptions,\n NoDatabaseLock,\n} from '../../locks';\nimport { singleOrNull } from '../../query';\nimport type { SQLFormatter } from '../../sql';\nimport { SQL, getFormatter } from '../../sql';\nimport { tracer } from '../../tracing';\nimport type { SchemaComponent } from '../schemaComponent';\nimport type { SQLMigration } from '../sqlMigration';\nimport { migrationTableSchemaComponent } from './schemaComponentMigrator';\n\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\ndeclare global {\n var defaultMigratorOptions: Record<DatabaseType, MigratorOptions>;\n}\n\nconst defaultMigratorOptions = (globalThis.defaultMigratorOptions =\n globalThis.defaultMigratorOptions ??\n ({} as Record<DatabaseType, MigratorOptions>));\n\nexport const registerDefaultMigratorOptions = (\n databaseType: DatabaseType,\n options: MigratorOptions,\n): void => {\n defaultMigratorOptions[databaseType] = options;\n};\n\nexport const getDefaultMigratorOptionsFromRegistry = (\n databaseType: DatabaseType,\n): MigratorOptions => {\n if (!defaultMigratorOptions[databaseType]) {\n throw new Error(\n `No default migrator options registered for database type: ${databaseType}`,\n );\n }\n return defaultMigratorOptions[databaseType];\n};\n\nexport type MigratorOptions = {\n schema?: {\n migrationTable?: SchemaComponent;\n };\n lock?: {\n databaseLock?: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n ignoreMigrationHashMismatch?: boolean | undefined;\n migrationTimeoutMs?: number | undefined;\n};\n\nexport type RunSQLMigrationsResult = {\n applied: SQLMigration[];\n skipped: SQLMigration[];\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n partialOptions?: Partial<MigratorOptions>,\n): Promise<RunSQLMigrationsResult> =>\n pool.withTransaction(async ({ execute }) => {\n const databaseType = fromDatabaseDriverType(pool.driverType).databaseType;\n const defaultOptions = getDefaultMigratorOptionsFromRegistry(databaseType);\n partialOptions ??= {};\n\n const options: MigratorOptions = {\n ...defaultOptions,\n ...partialOptions,\n schema: {\n ...defaultOptions.schema,\n ...(partialOptions?.schema ?? {}),\n },\n lock: {\n ...defaultOptions.lock,\n ...partialOptions?.lock,\n options: {\n lockId: MIGRATIONS_LOCK_ID,\n ...defaultOptions.lock?.options,\n ...partialOptions?.lock?.options,\n },\n },\n dryRun: defaultOptions.dryRun ?? partialOptions?.dryRun,\n ignoreMigrationHashMismatch:\n defaultOptions.ignoreMigrationHashMismatch ??\n partialOptions?.ignoreMigrationHashMismatch,\n migrationTimeoutMs:\n defaultOptions.migrationTimeoutMs ?? partialOptions?.migrationTimeoutMs,\n };\n\n const { databaseLock: _, ...rest } = options.lock ?? {};\n\n const databaseLock = options.lock?.databaseLock ?? NoDatabaseLock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const migrationTable =\n options.schema?.migrationTable ?? migrationTableSchemaComponent;\n\n const coreMigrations = migrationTable.migrations;\n\n const result: RunSQLMigrationsResult = { applied: [], skipped: [] };\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n await execute.batchCommand(migration.sqls, {\n timeoutMs: options.migrationTimeoutMs,\n });\n }\n\n for (const migration of migrations) {\n const wasApplied = await runSQLMigration(\n databaseType,\n execute,\n migration,\n {\n ignoreMigrationHashMismatch:\n options.ignoreMigrationHashMismatch ?? false,\n migrationTimeoutMs: options.migrationTimeoutMs,\n },\n );\n if (wasApplied) {\n result.applied.push(migration);\n } else {\n result.skipped.push(migration);\n }\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result };\n });\n\nconst runSQLMigration = async (\n databaseType: DatabaseType,\n execute: SQLExecutor,\n migration: SQLMigration,\n options?: {\n ignoreMigrationHashMismatch?: boolean;\n migrationTimeoutMs?: number | undefined;\n },\n): Promise<boolean> => {\n const sqls = combineMigrations(migration);\n const sqlHash = await getMigrationHash(migration, getFormatter(databaseType));\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const checkResult = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (checkResult.exists === true) {\n if (checkResult.hashesMatch === true) {\n tracer.info('migration-already-applied', {\n migrationName: migration.name,\n });\n return false;\n }\n if (options?.ignoreMigrationHashMismatch !== true)\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n\n tracer.warn('migration-hash-mismatch', {\n migrationName: migration.name,\n expectedHash: sqlHash,\n actualHash: checkResult.hashFromDB,\n });\n\n await updateMigrationHash(execute, newMigration);\n\n return false;\n }\n\n await execute.batchCommand(sqls, {\n timeoutMs: options?.migrationTimeoutMs,\n });\n\n await recordMigration(execute, newMigration);\n return true;\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (\n sqlMigration: SQLMigration,\n sqlFormatter: SQLFormatter,\n): Promise<string> => {\n const content = sqlFormatter.describe(sqlMigration.sqls, {\n serializer: JSONSerializer,\n });\n\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (\n ...migration: Pick<SQLMigration, 'sqls'>[]\n): SQL[] => migration.flatMap((m) => m.sqls);\n\ntype EnsureMigrationResult =\n | { exists: false }\n | { exists: true; hashesMatch: true }\n | { exists: true; hashesMatch: false; hashFromDB: string };\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<EnsureMigrationResult> => {\n const result = await singleOrNull(\n execute.query<{ sqlHash: string }>(\n SQL`SELECT sql_hash as \"sqlHash\" FROM dmb_migrations WHERE name = ${migration.name}`,\n ),\n );\n\n if (result === null) return { exists: false };\n\n const { sqlHash } = result;\n\n return {\n exists: true,\n hashesMatch: sqlHash === migration.sqlHash,\n hashFromDB: sqlHash,\n };\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n SQL`\n INSERT INTO dmb_migrations (name, sql_hash)\n VALUES (${migration.name}, ${migration.sqlHash})`,\n );\n};\n\nconst updateMigrationHash = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n SQL`\n UPDATE dmb_migrations\n SET sql_hash = ${migration.sqlHash}, timestamp = ${new Date()}\n WHERE name = ${migration.name}\n `,\n );\n};\n","import type { Dumbo } from '../..';\nimport type { DatabaseDriverType } from '../../drivers';\nimport { SQL } from '../../sql';\nimport { schemaComponent, type SchemaComponent } from '../schemaComponent';\nimport { sqlMigration } from '../sqlMigration';\nimport { type MigratorOptions, runSQLMigrations } from './migrator';\n\nconst { AutoIncrement, Varchar, Timestamp } = SQL.column.type;\n\nconst migrationTableSQL = SQL`\n CREATE TABLE IF NOT EXISTS dmb_migrations (\n id ${AutoIncrement({ primaryKey: true })},\n name ${Varchar(255)} NOT NULL UNIQUE,\n application ${Varchar(255)} NOT NULL DEFAULT 'default',\n sql_hash ${Varchar(64)} NOT NULL,\n timestamp ${Timestamp} NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`;\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: [sqlMigration('dumbo:migrationTable:001', [migrationTableSQL])],\n },\n);\n\nexport type SchemaComponentMigrator = {\n component: SchemaComponent;\n run: (options?: Partial<MigratorOptions>) => Promise<void>;\n};\n\nexport const SchemaComponentMigrator = <DriverType extends DatabaseDriverType>(\n component: SchemaComponent,\n dumbo: Dumbo<DriverType>,\n): SchemaComponentMigrator => {\n const completedMigrations: string[] = [];\n\n return {\n component,\n run: async (options) => {\n const pendingMigrations = component.migrations.filter(\n (m) =>\n !completedMigrations.includes(\n `${component.schemaComponentKey}:${m.name}`,\n ),\n );\n\n if (pendingMigrations.length === 0) return;\n\n await runSQLMigrations(dumbo, pendingMigrations, options);\n\n completedMigrations.push(\n ...pendingMigrations.map(\n (m) => `${component.schemaComponentKey}:${m.name}`,\n ),\n );\n },\n };\n};\n"],"mappings":"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","names":["sqlExecutor","options","sqlMigration"]}
|