@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/chunk-OJ34O3Q2.cjs","../src/core/drivers/index.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/sql.ts","../src/core/sql/valueMappers/reservedSqlWords.ts","../src/core/sql/valueMappers/sqlValueMapper.ts","../src/core/sql/formatters/sqlFormatter.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/schema/sqlMigration.ts","../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/schema/dumboSchema/dumboSchema.ts","../src/core/locks/databaseLock.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/schema/migrators/schemaComponentMigrator.ts","../src/core/schema/migrators/migrator.ts","../src/core/index.ts","../src/core/drivers/databaseDriver.ts"],"names":["SQLFormatter"],"mappings":"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F,EAAA;AAEM,EAAA;AAGC,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAQa;AvCusDH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/chunk-OJ34O3Q2.cjs","sourcesContent":[null,"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 type { ObjectCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions = JSONSerializeOptions,\n DeserializeOptions = 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\nexport type JSONSerializerOptions = {\n disableBigIntSerialization?: boolean;\n};\n\nexport type JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\nexport type JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONObjectCodec<\n T,\n SerializeOptions = JSONSerializeOptions,\n DeserializeOptions = JSONDeserializeOptions,\n> extends ObjectCodec<T, string> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONObjectCodecOptions<\n SerializeOptions = JSONSerializeOptions,\n DeserializeOptions = JSONDeserializeOptions,\n> =\n | { serializer?: JSONSerializer<SerializeOptions, DeserializeOptions> }\n | { serializerOptions?: JSONSerializerOptions };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReviver = (this: any, key: string, value: any) => any;\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 bigIntReviver: JSONReviver = (_key, value) => {\n if (typeof value === 'string' && /^[+-]?\\d+n?$/.test(value)) {\n return BigInt(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers =\n (...replacers: JSONReplacer[]): JSONReplacer =>\n (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n replacers.reduce((accValue, replacer) => replacer(key, accValue), value);\n\nconst composeJSONRevivers =\n (...revivers: JSONReviver[]): JSONReviver =>\n (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n revivers.reduce((accValue, reviver) => reviver(key, accValue), value);\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n opts?.disableBigIntSerialization == true\n ? opts.replacer\n ? opts.replacer\n : undefined\n : opts?.replacer\n ? composeJSONReplacers(JSONReplacers.bigInt, opts.replacer)\n : JSONReplacers.bigInt;\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n opts?.disableBigIntSerialization == true\n ? opts.reviver\n ? opts.reviver\n : undefined\n : opts?.reviver\n ? composeJSONRevivers(JSONRevivers.bigInt, opts.reviver)\n : JSONRevivers.bigInt;\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n};\n\nconst jsonSerializer = (options?: JSONSerializerOptions): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(object: T, options?: JSONSerializeOptions): string =>\n JSON.stringify(object, options ? JSONReplacer(options) : defaultReplacer),\n deserialize: <T>(payload: string, options?: JSONDeserializeOptions): T =>\n JSON.parse(payload, options ? JSONReviver(options) : defaultReviver) as T,\n };\n};\n\nconst JSONSerializer = jsonSerializer({ disableBigIntSerialization: false });\n\nconst RawJSONSerializer = jsonSerializer({ disableBigIntSerialization: true });\n\nconst JSONObjectCodec = <\n T,\n SerializeOptions = JSONSerializeOptions,\n DeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONObjectCodecOptions<SerializeOptions, DeserializeOptions>,\n): JSONObjectCodec<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 return {\n decode: <T>(payload: string, options?: DeserializeOptions) =>\n options\n ? serializer.deserialize<T>(payload, options)\n : serializer.deserialize(payload),\n encode: <T>(object: T, options?: SerializeOptions) =>\n options\n ? serializer.serialize<T>(object, options)\n : serializer.serialize(object),\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n RawJSONSerializer,\n type JSONObjectCodec,\n type JSONObjectCodecOptions,\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 SQLArray = SQLToken<'SQL_ARRAY', { value: unknown[] }>;\nexport const SQLArray = SQLToken<SQLArray, unknown[]>('SQL_ARRAY', (value) => ({\n value,\n}));\n\nexport type SQLIn = SQLToken<\n 'SQL_IN',\n { column: SQLIdentifier; values: SQLArray }\n>;\n\nexport const SQLIn = SQLToken<SQLIn, { column: string; values: unknown[] }>(\n 'SQL_IN',\n ({ column, values }) => ({\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 { 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};\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 { SQLArray, SQLIdentifier, SQLIn, SQLLiteral } from '../tokens';\nimport { SQLProcessor, type SQLProcessorContext } from './sqlProcessor';\n\nexport const ExpandArrayProcessor: SQLProcessor<SQLArray> = SQLProcessor({\n canHandle: 'SQL_ARRAY',\n handle: (token: SQLArray, { builder, mapper }: SQLProcessorContext) => {\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) 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 } = context;\n const { values: inValues, column } = token;\n\n if (inValues.value.length === 0) {\n builder.addParam(mapper.mapValue(false));\n return;\n }\n\n builder.addSQL(mapper.mapValue(column.value) 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, { builder, mapper, processorsRegistry });\n },\n});\n\nexport const FormatIdentifierProcessor: SQLProcessor<SQLIdentifier> =\n SQLProcessor({\n canHandle: 'SQL_IDENTIFIER',\n handle: (\n token: SQLIdentifier,\n { builder, mapper }: SQLProcessorContext,\n ) => {\n // TODO: use MapIdentifier from mapper\n builder.addSQL(mapper.mapValue(token) as string);\n },\n });\n\nexport const MapLiteralProcessor: SQLProcessor<SQLLiteral> = SQLProcessor({\n canHandle: 'SQL_LITERAL',\n handle: (token: SQLLiteral, { builder, mapper }: SQLProcessorContext) =>\n builder.addParam(mapper.mapValue(token.value)),\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 { AutoIncrementSQLColumnToken, SQLColumnTypeTokens } 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","import {\n describeSQL,\n formatSQL,\n SQLFormatter,\n type FormatSQLOptions,\n} from './formatters';\nimport type { ParametrizedSQL } from './parametrizedSQL';\nimport { isTokenizedSQL, TokenizedSQL } from './tokenizedSQL';\nimport {\n SQLColumnToken,\n SQLColumnTypeTokensFactory,\n SQLIdentifier,\n SQLIn,\n SQLPlain,\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 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 => formatSQL(sql, formatter, options);\nSQL.describe = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n): string => describeSQL(sql, formatter, options);\nSQL.in = (column: string, values: unknown[]) => SQLIn.from({ column, 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","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 { 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 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: (value: unknown) =>\n mapSQLParamValue(value, mapSQLParamValueOptions),\n mapPlaceholder: mapSQLParamValueOptions.mapPlaceholder,\n mapIdentifier: mapSQLParamValueOptions.mapIdentifier,\n };\n return resultMapper;\n};\n\nexport function mapSQLParamValue(\n value: unknown,\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, 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 : `${JSONSerializer.serialize(value).replace(/'/g, \"''\")}`;\n } else {\n return JSONSerializer.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 interface SQLFormatter {\n format: (sql: SQL | SQL[], context?: SQLProcessorContext) => ParametrizedSQL;\n describe: (sql: SQL | SQL[], context?: SQLProcessorContext) => string;\n valueMapper: SQLValueMapper;\n}\n\nexport type FormatSQLOptions = {\n mapper?: MapSQLParamValueOptions;\n processorsRegistry?: SQLProcessorsReadonlyRegistry;\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(sql, resultFormatter, {\n ...options,\n ...(methodOptions ?? {}),\n })),\n describe:\n describe ??\n ((sql: SQL | SQL[], methodOptions) =>\n describeSQL(sql, resultFormatter, {\n ...options,\n ...(methodOptions ?? {}),\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 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 mapper,\n });\n }\n\n return builder.build();\n}\n\nexport const describeSQL = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n): string =>\n formatSQL(sql, formatter, {\n ...(options ?? {}),\n mapper: {\n mapPlaceholder: (_, value) => JSONSerializer.serialize(value),\n },\n }).query;\n","import type { Connection } from '../connections';\nimport { type DatabaseDriverType } from '../drivers';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport { JSONSerializer, type JSONDeserializeOptions } from '../serializer';\nimport { type SQL, type SQLFormatter } from '../sql';\n\nexport const mapColumnToJSON = (\n column: string,\n options?: JSONDeserializeOptions,\n) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'string') {\n try {\n return JSONSerializer.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 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;\n mapping?: SQLQueryResultColumnMapping;\n};\n\nexport type SQLCommandOptions = {\n timeoutMs?: number;\n mapping?: SQLQueryResultColumnMapping;\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?: SQLCommandOptions,\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?: SQLCommandOptions,\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 {\n type AnyConnection,\n type Connection,\n type 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};\n\nexport interface WithDatabaseTransactionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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\n AnyDatabaseTransaction = 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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 WithSQLExecutor,\n} from '../execute';\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\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> extends 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 interface WithConnectionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n ) => Promise<Result>;\n}\n\nexport type InitTransaction<\n ConnectionType extends AnyConnection = AnyConnection,\n TreansactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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 executor: () => Executor;\n};\n\nexport type CreateAmbientConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n client: InferDbClientFromConnection<ConnectionType>;\n initTransaction: InitTransaction<\n ConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n executor: () => Executor;\n};\n\nexport const createAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n>(\n options: CreateAmbientConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, client, executor, initTransaction } = 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(), { 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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 executor: () => Executor;\n};\n\nexport const createSingletonConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n>(\n options: CreateSingletonConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor } = 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(), { 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = 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 executor: () => Executor;\n};\n\nexport const createTransientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n TransactionType extends\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n>(\n options: CreateTransientConnectionOptions<\n ConnectionType,\n Executor,\n TransactionType\n >,\n): ConnectionType => {\n const { driverType, open, close, initTransaction, executor } = 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(), { 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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n>(\n options: CreateConnectionOptions<ConnectionType, Executor, TransactionType>,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor } = 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(), { 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 {\n type AnyConnection,\n type InferDbClientFromConnection,\n type WithConnectionFactory,\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\n DatabaseTransaction<ConnectionType> = DatabaseTransaction<ConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> extends 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 const createAmbientConnectionPool = <\n ConnectionType extends AnyConnection,\n>(options: {\n driverType: ConnectionType['driverType'];\n connection: 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 withTransaction: (handle, options) =>\n connection.withTransaction(handle, options),\n });\n};\n\nexport type CreateSingletonConnectionPoolOptions<\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: CreateSingletonConnectionPoolOptions<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 ) =>\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 CreateSingletonClientPoolOptions<\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 createSingletonClientPool = <ConnectionType extends AnyConnection>(\n options: CreateSingletonClientPoolOptions<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>(handle: (connection: ConnectionType) => Promise<Result>) =>\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 { 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","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\n ColumnSchemaComponentOptions<ColumnType> = 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<\n 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\n AnyDatabaseSchemaSchemaComponent = 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 { 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<\n 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 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 shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = process.env.DUMBO_LOG_LEVEL ?? LogLevel.DISABLED;\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 (logStyle: LogStyle): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return JSONSerializer.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 (process.env.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 { 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 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","import { type Dumbo } 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 { mapToCamelCase, singleOrNull } from '../../query';\nimport { SQL, SQLFormatter, getFormatter } from '../../sql';\nimport { tracer } from '../../tracing';\nimport { type SchemaComponent } from '../schemaComponent';\nimport type { MigrationRecord, 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};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n partialOptions?: Partial<MigratorOptions>,\n): Promise<void> =>\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 };\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 await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n await execute.batchCommand(migration.sqls);\n }\n\n for (const migration of migrations) {\n await runSQLMigration(databaseType, execute, migration);\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result: undefined };\n });\n\nconst runSQLMigration = async (\n databaseType: DatabaseType,\n execute: SQLExecutor,\n migration: SQLMigration,\n): Promise<void> => {\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 wasMigrationApplied = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (wasMigrationApplied) return;\n\n await execute.batchCommand(sqls);\n\n await recordMigration(execute, newMigration);\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\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\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<boolean> => {\n const result = await singleOrNull(\n execute.query<{ sql_hash: string }>(\n SQL`SELECT sql_hash FROM migrations WHERE name = ${migration.name}`,\n ),\n );\n\n if (result === null) return false;\n\n const { sqlHash } = mapToCamelCase<Pick<MigrationRecord, 'sqlHash'>>(result);\n\n if (sqlHash !== migration.sqlHash) {\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n }\n\n //console.log(`Migration \"${migration.name}\" already applied. Skipping.`);\n return true;\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 migrations (name, sql_hash)\n VALUES (${migration.name}, ${migration.sqlHash})`,\n );\n};\n","import { type AnyConnection, type 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 './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 { DatabaseDriverType } from '.';\nimport { type Dumbo, type DumboConnectionOptions } from '..';\nimport type { AnyConnection } from '../connections';\nimport type { MigratorOptions } from '../schema';\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\n getDatabaseNameOrDefault(connectionString: string): string;\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\n DumboConnectionOptions<DatabaseDriver> = 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\n DumboConnectionOptions<Driver> = 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\n DumboConnectionOptions<Driver> = 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\n DumboConnectionOptions<Driver> = 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"]}
|
package/dist/chunk-TXSETOGH.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
dumboDatabaseDriverRegistry
|
|
3
|
-
} from "./chunk-N7RWT46K.js";
|
|
4
|
-
|
|
5
|
-
// src/storage/all/connections/connectionString.ts
|
|
6
|
-
var parseConnectionString = (connectionString) => {
|
|
7
|
-
if (connectionString.startsWith("postgresql://") || connectionString.startsWith("postgres://")) {
|
|
8
|
-
return {
|
|
9
|
-
databaseType: "PostgreSQL",
|
|
10
|
-
driverName: "pg"
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
if (connectionString.startsWith("file:") || connectionString === ":memory:" || connectionString.startsWith("/") || connectionString.startsWith("./")) {
|
|
14
|
-
return {
|
|
15
|
-
databaseType: "SQLite",
|
|
16
|
-
driverName: "sqlite3"
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
if (connectionString.startsWith("d1:")) {
|
|
20
|
-
return {
|
|
21
|
-
databaseType: "SQLite",
|
|
22
|
-
driverName: "d1"
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
throw new Error(
|
|
26
|
-
`Unsupported database connection string: ${connectionString}`
|
|
27
|
-
);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// src/storage/all/index.ts
|
|
31
|
-
dumboDatabaseDriverRegistry.register(
|
|
32
|
-
"PostgreSQL:pg",
|
|
33
|
-
() => import("./pg-GHOW3XSG.js").then((m) => m.databaseDriver)
|
|
34
|
-
);
|
|
35
|
-
dumboDatabaseDriverRegistry.register(
|
|
36
|
-
"SQLite:sqlite3",
|
|
37
|
-
() => import("./sqlite3-EEIKQCJR.js").then((m) => m.databaseDriver)
|
|
38
|
-
);
|
|
39
|
-
function dumbo(options) {
|
|
40
|
-
const { driverType } = options;
|
|
41
|
-
const driver = options.driver ?? dumboDatabaseDriverRegistry.tryGet(options);
|
|
42
|
-
if (driver === null) {
|
|
43
|
-
throw new Error(`No plugin found for driver type: ${driverType}`);
|
|
44
|
-
}
|
|
45
|
-
return driver.createPool({
|
|
46
|
-
...options,
|
|
47
|
-
driverType: driver.driverType
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export {
|
|
52
|
-
parseConnectionString,
|
|
53
|
-
dumbo
|
|
54
|
-
};
|
|
55
|
-
//# sourceMappingURL=chunk-TXSETOGH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/all/connections/connectionString.ts","../src/storage/all/index.ts"],"sourcesContent":["import type { DatabaseDriverTypeParts, DatabaseType } from '../../../core';\n\nexport type DatabaseConnectionString<\n DatabaseTypeName extends DatabaseType = DatabaseType,\n Format extends string = string,\n> = Format & {\n _databaseType: DatabaseTypeName;\n};\n\nexport const parseConnectionString = (\n connectionString: DatabaseConnectionString | string,\n): DatabaseDriverTypeParts => {\n if (\n connectionString.startsWith('postgresql://') ||\n connectionString.startsWith('postgres://')\n ) {\n return {\n databaseType: 'PostgreSQL',\n driverName: 'pg',\n };\n }\n\n if (\n connectionString.startsWith('file:') ||\n connectionString === ':memory:' ||\n connectionString.startsWith('/') ||\n connectionString.startsWith('./')\n ) {\n return {\n databaseType: 'SQLite',\n driverName: 'sqlite3',\n };\n }\n\n if (connectionString.startsWith('d1:')) {\n return {\n databaseType: 'SQLite',\n driverName: 'd1',\n };\n }\n\n throw new Error(\n `Unsupported database connection string: ${connectionString}`,\n );\n};\n","import {\n dumboDatabaseDriverRegistry,\n type AnyDumboDatabaseDriver,\n type DumboConnectionOptions,\n type ExtractDumboTypeFromDriver,\n} from '../../core';\n\nexport * from './connections';\n\ndumboDatabaseDriverRegistry.register('PostgreSQL:pg', () =>\n import('../postgresql/pg').then((m) => m.databaseDriver),\n);\n\ndumboDatabaseDriverRegistry.register('SQLite:sqlite3', () =>\n import('../sqlite/sqlite3').then((m) => m.databaseDriver),\n);\n\nexport function dumbo<\n DatabaseDriver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends\n DumboConnectionOptions<DatabaseDriver> = DumboConnectionOptions<DatabaseDriver>,\n>(options: ConnectionOptions): ExtractDumboTypeFromDriver<DatabaseDriver> {\n const { driverType } = options;\n\n const driver =\n options.driver ??\n dumboDatabaseDriverRegistry.tryGet<DatabaseDriver>(options);\n\n if (driver === null) {\n throw new Error(`No plugin found for driver type: ${driverType}`);\n }\n\n return driver.createPool({\n ...options,\n driverType: driver.driverType,\n }) as ExtractDumboTypeFromDriver<DatabaseDriver>;\n}\n"],"mappings":";;;;;AASO,IAAM,wBAAwB,CACnC,qBAC4B;AAC5B,MACE,iBAAiB,WAAW,eAAe,KAC3C,iBAAiB,WAAW,aAAa,GACzC;AACA,WAAO;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MACE,iBAAiB,WAAW,OAAO,KACnC,qBAAqB,cACrB,iBAAiB,WAAW,GAAG,KAC/B,iBAAiB,WAAW,IAAI,GAChC;AACA,WAAO;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW,KAAK,GAAG;AACtC,WAAO;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,2CAA2C,gBAAgB;AAAA,EAC7D;AACF;;;ACnCA,4BAA4B;AAAA,EAAS;AAAA,EAAiB,MACpD,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc;AACzD;AAEA,4BAA4B;AAAA,EAAS;AAAA,EAAkB,MACrD,OAAO,uBAAmB,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc;AAC1D;AAEO,SAAS,MAId,SAAwE;AACxE,QAAM,EAAE,WAAW,IAAI;AAEvB,QAAM,SACJ,QAAQ,UACR,4BAA4B,OAAuB,OAAO;AAE5D,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI,MAAM,oCAAoC,UAAU,EAAE;AAAA,EAClE;AAEA,SAAO,OAAO,WAAW;AAAA,IACvB,GAAG;AAAA,IACH,YAAY,OAAO;AAAA,EACrB,CAAC;AACH;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/sqlite/core/sql/processors/columProcessors.ts","../src/storage/sqlite/core/sql/formatter/index.ts","../src/storage/sqlite/core/execute/execute.ts","../src/storage/sqlite/core/pool/pool.ts","../src/storage/sqlite/core/schema/migrations.ts","../src/storage/sqlite/core/schema/schema.ts","../src/storage/sqlite/core/index.ts","../src/storage/sqlite/core/connections/connectionString.ts","../src/storage/sqlite/core/connections/index.ts","../src/storage/sqlite/core/transactions/index.ts"],"sourcesContent":["import {\n mapDefaultSQLColumnProcessors,\n type DefaultSQLColumnProcessors,\n type DefaultSQLColumnToken,\n type SQLProcessorContext,\n} from '../../../../../core';\n\nconst mapColumnType = (\n token: DefaultSQLColumnToken,\n { builder }: SQLProcessorContext,\n): void => {\n let columnSQL: string;\n const { sqlTokenType } = token;\n switch (sqlTokenType) {\n case 'SQL_COLUMN_AUTO_INCREMENT':\n columnSQL = `INTEGER ${token.primaryKey ? 'PRIMARY KEY' : ''} AUTOINCREMENT`;\n break;\n case 'SQL_COLUMN_BIGINT':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_SERIAL':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_INTEGER':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_JSONB':\n columnSQL = 'BLOB';\n break;\n case 'SQL_COLUMN_BIGSERIAL':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_TIMESTAMP':\n columnSQL = 'DATETIME';\n break;\n case 'SQL_COLUMN_TIMESTAMPTZ':\n columnSQL = 'DATETIME';\n break;\n case 'SQL_COLUMN_VARCHAR':\n columnSQL = `VARCHAR ${Number.isNaN(token.length) ? '' : `(${token.length})`}`;\n break;\n default: {\n const exhaustiveCheck: never = sqlTokenType;\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Unknown column type: ${exhaustiveCheck}`);\n }\n }\n builder.addSQL(columnSQL);\n};\n\nexport const sqliteColumnProcessors: DefaultSQLColumnProcessors =\n mapDefaultSQLColumnProcessors(mapColumnType);\n","import {\n defaultProcessorsRegistry,\n registerFormatter,\n SQLFormatter,\n SQLProcessorsRegistry,\n} from '../../../../../core/sql';\nimport { sqliteColumnProcessors } from '../processors';\n\nconst sqliteSQLProcessorsRegistry = SQLProcessorsRegistry({\n from: defaultProcessorsRegistry,\n}).register(sqliteColumnProcessors);\n\nconst sqliteFormatter: SQLFormatter = SQLFormatter({\n processorsRegistry: sqliteSQLProcessorsRegistry,\n});\n\nregisterFormatter('SQLite', sqliteFormatter);\n\nexport { sqliteFormatter };\n","import type { SQLiteDriverType } from '..';\nimport {\n mapSQLQueryResult,\n SQL,\n SQLFormatter,\n tracer,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '../../../../core';\nimport type { SQLiteClient } from '../connections';\nimport { sqliteFormatter } from '../sql/formatter';\n\nexport const sqliteExecute = async <Result = void>(\n database: SQLiteClient,\n handle: (client: SQLiteClient) => Promise<Result>,\n) => {\n try {\n return await handle(database);\n } finally {\n await database.close();\n }\n};\n\nexport type SQLiteSQLExecutor<\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n> = DbSQLExecutor<DriverType, SQLiteClient>;\n\nexport const sqliteSQLExecutor = <\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n>(\n driverType: DriverType,\n formatter?: SQLFormatter,\n): SQLiteSQLExecutor<DriverType> => ({\n driverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n if (options?.timeoutMs) {\n await client.query(SQL`PRAGMA busy_timeout = ${options.timeoutMs}`);\n }\n\n tracer.info('db:sql:query', {\n query: (formatter ?? sqliteFormatter).format(sql).query,\n params: (formatter ?? sqliteFormatter).format(sql).params,\n debugSQL: (formatter ?? sqliteFormatter).describe(sql),\n });\n\n let result = await client.query<Result>(sql, options);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n return result;\n },\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n if (options?.timeoutMs) {\n await client.query(SQL`PRAGMA busy_timeout = ${options.timeoutMs}`);\n }\n\n const results = await client.batchQuery<Result>(sqls, options);\n\n if (options?.mapping) {\n return results.map((result) => ({\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n }));\n }\n\n return results;\n },\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n if (options?.timeoutMs) {\n await client.query(SQL`PRAGMA busy_timeout = ${options.timeoutMs}`);\n }\n\n tracer.info('db:sql:command', {\n query: (formatter ?? sqliteFormatter).format(sql).query,\n params: (formatter ?? sqliteFormatter).format(sql).params,\n debugSQL: (formatter ?? sqliteFormatter).describe(sql),\n });\n\n return await client.command<Result>(sql, options);\n },\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n if (options?.timeoutMs) {\n await client.query(SQL`PRAGMA busy_timeout = ${options.timeoutMs}`);\n }\n\n return await client.batchCommand<Result>(sqls, options);\n },\n formatter: formatter ?? sqliteFormatter,\n});\n","import {\n InMemorySQLiteDatabase,\n SQLiteConnectionString,\n type AnySQLiteConnection,\n type SQLiteConnectionFactory,\n type SQLiteConnectionOptions,\n} from '..';\nimport {\n createAlwaysNewConnectionPool,\n createAmbientConnectionPool,\n createSingletonConnectionPool,\n JSONSerializer,\n type ConnectionPool,\n} from '../../../../core';\n\nexport type SQLiteFileNameOrConnectionString =\n | {\n fileName: string | SQLiteConnectionString;\n connectionString?: never;\n }\n | {\n connectionString: string | SQLiteConnectionString;\n fileName?: never;\n };\n\nexport const isInMemoryDatabase = (\n options: Record<string, unknown>,\n): boolean => {\n if ('fileName' in options) {\n return options.fileName === InMemorySQLiteDatabase;\n }\n if ('connectionString' in options) {\n return options.connectionString === InMemorySQLiteDatabase;\n }\n return false;\n};\n\nexport type SQLiteAmbientConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\ntype SQLiteAmbientConnectionPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = {\n singleton?: true;\n pooled?: false;\n sqliteConnectionFactory?: never;\n connection: SQLiteConnectionType;\n connectionOptions?: never;\n};\n\nexport const sqliteAmbientConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType['driverType']>,\n): SQLiteAmbientConnectionPool<SQLiteConnectionType['driverType']> => {\n const { connection, driverType } = options;\n\n return createAmbientConnectionPool<SQLiteConnectionType>({\n driverType,\n connection: connection,\n });\n};\n\ntype SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = {\n singleton: true;\n pooled?: true;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connection?: never;\n connectionOptions: ConnectionOptions;\n};\n\nexport type SQLiteSingletonConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\nexport const sqliteSingletonConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions &\n Record<string, unknown> = SQLiteConnectionOptions & Record<string, unknown>,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >,\n): SQLiteSingletonConnectionPool<SQLiteConnectionType> => {\n const { driverType, sqliteConnectionFactory, connectionOptions } = options;\n\n return createSingletonConnectionPool<SQLiteConnectionType>({\n driverType,\n getConnection: () => sqliteConnectionFactory(connectionOptions),\n });\n};\n\ntype SQLiteAlwaysNewPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = {\n singleton?: false;\n pooled?: true;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connection?: never;\n connectionOptions: ConnectionOptions;\n};\n\nexport type SQLiteAlwaysNewConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\nexport const sqliteAlwaysNewConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions &\n Record<string, unknown> = SQLiteConnectionOptions & Record<string, unknown>,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteAlwaysNewPoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLiteAlwaysNewConnectionPool<SQLiteConnectionType> => {\n const { driverType, sqliteConnectionFactory, connectionOptions } = options;\n\n return createAlwaysNewConnectionPool<SQLiteConnectionType>({\n driverType,\n getConnection: () => sqliteConnectionFactory(connectionOptions),\n });\n};\n\nexport type SQLitePoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = (\n | SQLiteAlwaysNewPoolOptions<SQLiteConnectionType, ConnectionOptions>\n | SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >\n | SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType>\n) & {\n driverType: SQLiteConnectionType['driverType'];\n serializer?: JSONSerializer;\n};\n\nexport type SQLitePool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> =\n | SQLiteAmbientConnectionPool<SQLiteConnectionType>\n | SQLiteSingletonConnectionPool<SQLiteConnectionType>\n | SQLiteAlwaysNewConnectionPool<SQLiteConnectionType>;\n\nexport type SQLitePoolFactoryOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n> = Omit<\n SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions>,\n 'singleton'\n> & {\n singleton?: boolean;\n};\n\nexport const toSqlitePoolOptions = <\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n>(\n options: SQLitePoolFactoryOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions> => {\n const { singleton, ...rest } = options;\n const useSingleton = singleton ?? isInMemoryDatabase(options);\n\n if (useSingleton) {\n return { ...rest, singleton: true } as SQLitePoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n }\n return { ...rest, singleton: false } as SQLitePoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n};\n\nexport function sqlitePool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n>(\n options: SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePool<SQLiteConnectionType> {\n const { driverType } = options;\n\n // TODO: Handle dates and bigints\n // setSQLiteTypeParser(serializer ?? JSONSerializer);\n\n if (options.connection)\n return createAmbientConnectionPool<SQLiteConnectionType>({\n driverType,\n connection: options.connection,\n });\n\n if (options.singleton === true && options.sqliteConnectionFactory) {\n return createSingletonConnectionPool({\n driverType,\n getConnection: () =>\n options.sqliteConnectionFactory(options.connectionOptions),\n });\n }\n\n return createAlwaysNewConnectionPool({\n driverType,\n getConnection: () =>\n options.sqliteConnectionFactory!(options.connectionOptions!),\n });\n}\n","import {\n registerDefaultMigratorOptions,\n type MigratorOptions,\n} from '../../../../core';\n\nexport const DefaultSQLiteMigratorOptions: MigratorOptions = {};\n\nregisterDefaultMigratorOptions('SQLite', DefaultSQLiteMigratorOptions);\n","import { exists, SQL, type ConnectionPool } from '../../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT 1\n FROM sqlite_master\n WHERE type = 'table' AND name = ${tableName}\n ) AS \"exists\"\n `;\n\nexport const tableExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(tableExistsSQL(tableName)));\n","import { type DatabaseDriverType } from '../../..';\n\nexport * from './connections';\nexport * from './execute';\nexport * from './pool';\nexport * from './schema';\nexport * from './sql';\nexport * from './transactions';\n\nexport type SQLiteDatabaseName = 'SQLite';\nexport const SQLiteDatabaseName = 'SQLite';\n\nexport type SQLiteDriverType<DriverName extends string = string> =\n DatabaseDriverType<SQLiteDatabaseName, DriverName>;\n\nexport type SQLiteDatabaseType = 'SQLite';\n","import type { DatabaseConnectionString } from '../../../all';\n\nexport type SQLiteConnectionString = DatabaseConnectionString<\n 'SQLite',\n `file:${string}` | `:memory:` | `/${string}` | `./${string}`\n>;\n\nexport const SQLiteConnectionString = (\n connectionString: string,\n): SQLiteConnectionString => {\n if (\n !connectionString.startsWith('file:') &&\n connectionString !== ':memory:' &&\n !connectionString.startsWith('/') &&\n !connectionString.startsWith('./')\n ) {\n throw new Error(\n `Invalid SQLite connection string: ${connectionString}. It should start with \"file:\", \":memory:\", \"/\", or \"./\".`,\n );\n }\n return connectionString as SQLiteConnectionString;\n};\n","import {\n SQLiteConnectionString,\n sqliteSQLExecutor,\n type SQLiteDriverType,\n} from '..';\nimport {\n createAmbientConnection,\n createConnection,\n type AnyConnection,\n type Connection,\n type ConnectionOptions,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n type InferDbClientFromConnection,\n type InferDriverTypeFromConnection,\n type InitTransaction,\n type SQLCommandOptions,\n type SQLExecutor,\n} from '../../../../core';\nimport { sqliteTransaction } from '../transactions';\n\nexport type SQLiteCommandOptions = SQLCommandOptions & {\n ignoreChangesCount?: boolean;\n};\n\nexport type SQLiteParameters =\n | object\n | string\n | bigint\n | number\n | boolean\n | null;\n\nexport type SQLiteClient = {\n connect: () => Promise<void>;\n close: () => Promise<void>;\n} & SQLExecutor;\n\nexport type SQLitePoolClient = {\n release: () => void;\n} & SQLExecutor;\n\nexport type SQLiteClientFactory<\n SQLiteClientType extends SQLiteClient = SQLiteClient,\n ClientOptions = SQLiteClientOptions,\n> = (options: ClientOptions) => SQLiteClientType;\n\nexport type SQLiteClientOrPoolClient = SQLitePoolClient | SQLiteClient;\n\nexport interface SQLiteError extends Error {\n errno: number;\n}\n\nexport const isSQLiteError = (error: unknown): error is SQLiteError => {\n if (error instanceof Error && 'code' in error) {\n return true;\n }\n\n return false;\n};\n\nexport type SQLiteClientConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLiteClientType extends SQLiteClient = SQLiteClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> = Connection<\n Self,\n DriverType,\n SQLiteClientType,\n TransactionType,\n TransactionOptionsType\n>;\n\nexport type SQLitePoolClientConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLitePoolClientType extends SQLitePoolClient = SQLitePoolClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> = Connection<\n Self,\n DriverType,\n SQLitePoolClientType,\n TransactionType,\n TransactionOptionsType\n>;\n\nexport type SQLiteConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLiteClientType extends SQLiteClientOrPoolClient =\n | SQLiteClient\n | SQLitePoolClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> =\n | (SQLiteClientType extends SQLiteClient\n ? SQLiteClientConnection<\n Self,\n DriverType,\n SQLiteClientType,\n TransactionType,\n TransactionOptionsType\n >\n : never)\n | (SQLiteClientType extends SQLitePoolClient\n ? SQLitePoolClientConnection<\n Self,\n DriverType,\n SQLiteClientType,\n TransactionType,\n TransactionOptionsType\n >\n : never);\n\nexport type AnySQLiteClientConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLiteClientConnection<any, any>;\n\nexport type AnySQLitePoolClientConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLitePoolClientConnection<any, any, any, any, any>;\n\nexport type AnySQLiteConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLiteConnection<any, any, any, any, any>;\n\nexport type SQLiteConnectionOptions<\n ConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionOptions<ConnectionType> & SQLiteClientOptions;\n\nexport type SQLiteClientConnectionDefinitionOptions<\n SQLiteConnectionType extends\n AnySQLiteClientConnection = AnySQLiteClientConnection,\n ConnectionOptions = SQLiteConnectionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<SQLiteConnectionType>;\n type: 'Client';\n sqliteClientFactory: SQLiteClientFactory<\n InferDbClientFromConnection<SQLiteConnectionType>,\n ConnectionOptions\n >;\n connectionOptions: SQLiteConnectionOptions<SQLiteConnectionType>;\n};\n\nexport type SQLitePoolConnectionDefinitionOptions<\n SQLiteConnectionType extends\n AnySQLitePoolClientConnection = AnySQLitePoolClientConnection,\n ConnectionOptions = SQLiteConnectionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<SQLiteConnectionType>;\n type: 'PoolClient';\n sqliteClientFactory: SQLiteClientFactory<\n InferDbClientFromConnection<SQLiteConnectionType>,\n ConnectionOptions\n >;\n connectionOptions: SQLiteConnectionOptions<SQLiteConnectionType>;\n};\n\nexport type SQLiteConnectionDefinitionOptions<\n SQLiteConnectionType extends\n AnySQLitePoolClientConnection = AnySQLitePoolClientConnection,\n ClientOptions = SQLiteClientOptions,\n> =\n | SQLiteClientConnectionDefinitionOptions<SQLiteConnectionType, ClientOptions>\n | SQLitePoolConnectionDefinitionOptions<SQLiteConnectionType, ClientOptions>;\n\nexport type SQLiteConnectionFactory<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = (options: ConnectionOptions) => SQLiteConnectionType;\n\nexport type TransactionNestingCounter = {\n increment: () => void;\n decrement: () => void;\n reset: () => void;\n level: number;\n};\n\nexport const transactionNestingCounter = (): TransactionNestingCounter => {\n let transactionLevel = 0;\n\n return {\n reset: () => {\n transactionLevel = 0;\n },\n increment: () => {\n transactionLevel++;\n },\n decrement: () => {\n transactionLevel--;\n\n if (transactionLevel < 0) {\n throw new Error('Transaction level is out of bounds');\n }\n },\n get level() {\n return transactionLevel;\n },\n };\n};\n\nexport type SqliteAmbientClientConnectionOptions<\n SQLiteConnectionType extends\n AnySQLiteClientConnection = AnySQLiteClientConnection,\n TransactionType extends\n DatabaseTransaction<SQLiteConnectionType> = DatabaseTransaction<SQLiteConnectionType>,\n TransactionOptionsType extends\n DatabaseTransactionOptions = DatabaseTransactionOptions,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n client: InferDbClientFromConnection<SQLiteConnectionType>;\n initTransaction?: InitTransaction<\n SQLiteConnectionType,\n TransactionType,\n TransactionOptionsType\n >;\n allowNestedTransactions?: boolean;\n};\n\nexport const sqliteAmbientClientConnection = <\n SQLiteConnectionType extends\n AnySQLiteClientConnection = AnySQLiteClientConnection,\n>(\n options: SqliteAmbientClientConnectionOptions<SQLiteConnectionType>,\n) => {\n const { client, driverType, initTransaction, allowNestedTransactions } =\n options;\n\n return createAmbientConnection<SQLiteConnectionType>({\n driverType,\n client,\n initTransaction:\n initTransaction ??\n ((connection) =>\n sqliteTransaction(\n driverType,\n connection,\n allowNestedTransactions ?? false,\n )),\n executor: () => sqliteSQLExecutor(driverType),\n });\n};\n\nexport const sqliteClientConnection = <\n SQLiteConnectionType extends\n AnySQLiteClientConnection = AnySQLiteClientConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLiteClientConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType => {\n const { connectionOptions, sqliteClientFactory } = options;\n\n let client: InferDbClientFromConnection<SQLiteConnectionType> | null = null;\n\n const connect = async (): Promise<\n InferDbClientFromConnection<SQLiteConnectionType>\n > => {\n if (client) return Promise.resolve(client);\n\n client = sqliteClientFactory(connectionOptions as ClientOptions);\n\n if (client && 'connect' in client && typeof client.connect === 'function')\n await client.connect();\n\n return client;\n };\n\n return createConnection({\n driverType: options.driverType,\n connect,\n close: async () => {\n if (client && 'close' in client && typeof client.close === 'function')\n await client.close();\n else if (\n client &&\n 'release' in client &&\n typeof client.release === 'function'\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.release();\n },\n initTransaction: (connection) =>\n sqliteTransaction(\n options.driverType,\n connection,\n connectionOptions.transactionOptions?.allowNestedTransactions ?? false,\n ),\n executor: () => sqliteSQLExecutor(options.driverType),\n });\n};\n\nexport const sqlitePoolClientConnection = <\n SQLiteConnectionType extends\n AnySQLiteClientConnection = AnySQLiteClientConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLitePoolConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType => {\n const { connectionOptions, sqliteClientFactory } = options;\n\n let client: InferDbClientFromConnection<SQLiteConnectionType> | null = null;\n\n const connect = async (): Promise<\n InferDbClientFromConnection<SQLiteConnectionType>\n > => {\n if (client) return Promise.resolve(client);\n\n client = sqliteClientFactory(connectionOptions as ClientOptions);\n\n await client.connect();\n\n return client;\n };\n\n return createConnection({\n driverType: options.driverType,\n connect,\n close: () =>\n client !== null\n ? Promise.resolve((client as unknown as SQLitePoolClient).release())\n : Promise.resolve(),\n initTransaction: (connection) =>\n sqliteTransaction(\n options.driverType,\n connection,\n connectionOptions.transactionOptions?.allowNestedTransactions ?? false,\n ),\n executor: () => sqliteSQLExecutor(options.driverType),\n });\n};\n\nexport function sqliteConnection<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLiteConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType {\n return options.type === 'Client'\n ? sqliteClientConnection(options)\n : sqlitePoolClientConnection(options);\n}\n\nexport type InMemorySQLiteDatabase = ':memory:';\nexport const InMemorySQLiteDatabase = SQLiteConnectionString(':memory:');\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type SQLiteClientOptions = {};\n\nexport * from './connectionString';\n","import {\n SQL,\n sqlExecutor,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n type InferDbClientFromConnection,\n} from '../../../../core';\nimport { sqliteSQLExecutor } from '../../core/execute';\nimport {\n transactionNestingCounter,\n type AnySQLiteConnection,\n type SQLiteClientOrPoolClient,\n} from '../connections';\n\nexport type SQLiteTransaction<\n ConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = DatabaseTransaction<ConnectionType>;\n\nexport const sqliteTransaction =\n <ConnectionType extends AnySQLiteConnection = AnySQLiteConnection>(\n driverType: ConnectionType['driverType'],\n connection: () => ConnectionType,\n allowNestedTransactions: boolean,\n ) =>\n (\n getClient: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n } & DatabaseTransactionOptions,\n ): DatabaseTransaction<ConnectionType> => {\n const transactionCounter = transactionNestingCounter();\n allowNestedTransactions =\n options?.allowNestedTransactions ?? allowNestedTransactions;\n\n return {\n connection: connection(),\n driverType,\n begin: async function () {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n\n if (allowNestedTransactions) {\n if (transactionCounter.level >= 1) {\n transactionCounter.increment();\n await client.query(\n SQL`SAVEPOINT transaction${SQL.plain(transactionCounter.level.toString())}`,\n );\n return;\n }\n\n transactionCounter.increment();\n }\n\n await client.query(SQL`BEGIN TRANSACTION`);\n },\n commit: async function () {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n\n try {\n if (allowNestedTransactions) {\n if (transactionCounter.level > 1) {\n await client.query(\n SQL`RELEASE transaction${SQL.plain(transactionCounter.level.toString())}`,\n );\n transactionCounter.decrement();\n\n return;\n }\n\n transactionCounter.reset();\n }\n await client.query(SQL`COMMIT`);\n } finally {\n if (options?.close)\n await options?.close(\n client as InferDbClientFromConnection<ConnectionType>,\n );\n }\n },\n rollback: async function (error?: unknown) {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n try {\n if (allowNestedTransactions) {\n if (transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n }\n\n await client.query(SQL`ROLLBACK`);\n } finally {\n if (options?.close)\n await options?.close(\n client as InferDbClientFromConnection<ConnectionType>,\n error,\n );\n }\n },\n execute: sqlExecutor(sqliteSQLExecutor(driverType), {\n connect: () => getClient,\n }),\n };\n };\n"],"mappings":"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","names":["SQLiteConnectionString","SQLiteConnectionString"]}
|