pqb 0.73.2 → 0.73.4
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/bun.js +3 -3
- package/dist/bun.js.map +1 -1
- package/dist/bun.mjs +3 -3
- package/dist/bun.mjs.map +1 -1
- package/dist/index.d.ts +7715 -7716
- package/dist/index.js +123 -112
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +123 -113
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +35 -33
- package/dist/internal.js +33 -9
- package/dist/internal.js.map +1 -1
- package/dist/internal.mjs +29 -11
- package/dist/internal.mjs.map +1 -1
- package/dist/node-postgres.js +20 -3
- package/dist/node-postgres.js.map +1 -1
- package/dist/node-postgres.mjs +20 -3
- package/dist/node-postgres.mjs.map +1 -1
- package/dist/postgres-js.js +4 -4
- package/dist/postgres-js.js.map +1 -1
- package/dist/postgres-js.mjs +4 -4
- package/dist/postgres-js.mjs.map +1 -1
- package/package.json +1 -1
package/dist/bun.js
CHANGED
|
@@ -45,7 +45,7 @@ const getBun = () => {
|
|
|
45
45
|
const getBunPostgresError = () => {
|
|
46
46
|
return globalThis.Bun?.SQL.PostgresError ?? Error;
|
|
47
47
|
};
|
|
48
|
-
const queryClient = (client, text, values, arraysMode) => {
|
|
48
|
+
const queryClient = (client, text, values, arraysMode, _prepare) => {
|
|
49
49
|
const runQuery = () => {
|
|
50
50
|
const query = client.unsafe(text, values);
|
|
51
51
|
const resultPromise = arraysMode ? query.values() : query;
|
|
@@ -143,7 +143,7 @@ const BunAdapter = {
|
|
|
143
143
|
throw err;
|
|
144
144
|
}
|
|
145
145
|
},
|
|
146
|
-
async hackySavepoint(client, _setClient, state, text, values, arraysMode, onSavepoint, beforeRelease, onRelease, beforeRollback, onRollback) {
|
|
146
|
+
async hackySavepoint(client, _setClient, state, text, values, arraysMode, prepare, onSavepoint, beforeRelease, onRelease, beforeRollback, onRollback) {
|
|
147
147
|
const safeName = (0, pqb_internal.quoteIdentifier)(state.name);
|
|
148
148
|
let resolve;
|
|
149
149
|
let reject;
|
|
@@ -162,7 +162,7 @@ const BunAdapter = {
|
|
|
162
162
|
await queryClient(client, `SAVEPOINT ${safeName}`);
|
|
163
163
|
onSavepoint?.();
|
|
164
164
|
try {
|
|
165
|
-
const res = await queryClient(client, text, values, arraysMode);
|
|
165
|
+
const res = await queryClient(client, text, values, arraysMode, prepare);
|
|
166
166
|
resultResolve?.(res);
|
|
167
167
|
} catch (err) {
|
|
168
168
|
resultReject?.(err);
|
package/dist/bun.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun.js","names":["defaultSchemaConfig","createDbWithAdapter","AdapterClass","noop","quoteIdentifier"],"sources":["../src/adapters/driver-adapter-shared.ts","../src/adapters/bun.ts"],"sourcesContent":["export interface PostgresInterval {\n years: number;\n months: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nconst intervalRegExp =\n /^\\s*(?:([+-]?\\d+)\\s+years?)?\\s*(?:([+-]?\\d+)\\s+mons?)?\\s*(?:([+-]?\\d+)\\s+days?)?\\s*(?:([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?))?\\s*$/;\n\nexport const parseInterval = (str: string): PostgresInterval => {\n const [, years, months, days, timeSign, hours, minutes, seconds] =\n intervalRegExp.exec(str) || [];\n const timeMultiplier = timeSign === '-' ? -1 : 1;\n const secondsFloat = Number(seconds) || 0;\n const wholeSeconds = Math.floor(secondsFloat);\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? timeMultiplier * Number(hours) : 0,\n minutes: minutes ? timeMultiplier * Number(minutes) : 0,\n seconds: timeMultiplier * wholeSeconds,\n milliseconds:\n Math.round(timeMultiplier * (secondsFloat - wholeSeconds) * 1000000) /\n 1000,\n };\n};\n","import {\n AdapterClass,\n AdapterConfigBase,\n ColumnSchemaConfig,\n DbOptions,\n DbResult,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DriverAdapter,\n noop,\n QueryResult,\n QueryResultRow,\n QuerySchema,\n quoteIdentifier,\n RecordUnknown,\n AdapterSchemaConfigOptions,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState, SavepointCallback } from './adapter';\nimport { parseInterval } from './driver-adapter-shared';\n\nconst schemaConfig: AdapterSchemaConfigOptions = {\n arrayEncode: (input) => {\n return getBun().sql.array(input);\n },\n intervalParse: parseInterval,\n jsonEncodedByDriver: true,\n dateParsedByDriver: true,\n};\n\nexport const bunSchemaConfig = Object.assign(\n () => defaultSchemaConfig(schemaConfig),\n schemaConfig,\n);\n\nexport interface CreateBunDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends BunAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: CreateBunDbOptions<SchemaConfig, ColumnTypes>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n schemaConfig: bunSchemaConfig as unknown as () => SchemaConfig,\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: BunAdapter,\n config: options,\n }),\n });\n};\n\nexport interface BunOptions {\n hostname?: string;\n port?: number;\n database?: string;\n username?: string;\n password?: string | (() => string | Promise<string>);\n max?: number;\n idleTimeout?: number;\n maxLifetime?: number;\n connectionTimeout?: number;\n prepare?: boolean;\n tls?: unknown;\n}\n\nexport interface BunAdapterOptions extends AdapterConfigBase, BunOptions {\n schema?: QuerySchema;\n searchPath?: string;\n ssl?: unknown;\n}\n\ninterface Bun {\n SQL: BunSqlConstructor;\n sql: {\n array(input: unknown): unknown;\n };\n}\n\ninterface BunSqlConstructor {\n new (options?: BunSqlOptions | string): BunSql;\n PostgresError: ErrorClass;\n}\n\ninterface BunSqlOptions extends BunOptions {\n url?: string;\n ssl?: unknown;\n}\n\ninterface BunSql {\n unsafe<Row extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): BunSqlQuery<Row>;\n reserve(): Promise<BunReservedSql>;\n close(options?: { timeout?: number }): Promise<void>;\n}\n\ninterface BunReservedSql extends BunSql {\n release(): void;\n}\n\ninterface BunSqlQuery<\n Row extends QueryResultRow = QueryResultRow,\n> extends PromiseLike<BunSqlResult<Row>> {\n values(): Promise<BunSqlResult<unknown[]>>;\n}\n\ninterface BunSqlResult<Row = unknown> extends Array<Row> {\n count?: number;\n affectedRows?: number;\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ErrorClass = new (...args: any[]) => Error;\n\nconst getBun = (): Bun => {\n const Bun = (globalThis as unknown as { Bun?: Bun }).Bun;\n if (!Bun?.SQL) {\n throw new Error('Bun.SQL is only available when running in Bun');\n }\n\n return Bun;\n};\n\nconst getBunPostgresError = (): ErrorClass => {\n return (\n (globalThis as unknown as { Bun?: { SQL: BunSqlConstructor } }).Bun?.SQL\n .PostgresError ?? (Error as ErrorClass)\n );\n};\n\nconst queryClient = <T = QueryResultRow>(\n client: BunSql,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n const runQuery = () => {\n const query = client.unsafe(text, values);\n const resultPromise: PromiseLike<BunSqlResult> = arraysMode\n ? query.values()\n : query;\n\n return Promise.resolve(resultPromise).then((result) => {\n return normalizeResult(result, arraysMode) as QueryResult<T>;\n });\n };\n\n // Keep a single transactional connection ordered when savepoints are active.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: (() => void) | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = res;\n });\n\n return __lock.then(() => {\n const promise = runQuery();\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = runQuery();\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst borrowBunClient = (pool: BunSql): Promise<BunReservedSql> => {\n return pool.reserve();\n};\n\nconst releaseBunClient = (client: BunReservedSql): void => {\n client.release();\n};\n\nexport const BunAdapter: DriverAdapter = {\n noFieldsForArrays: true,\n manualPool: true,\n schemaConfig,\n errorClass: getBunPostgresError(),\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'errno',\n detail: 'detail',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: BunAdapterOptions): BunSql {\n return new (getBun().SQL)(makeOptions(config));\n },\n\n queryClient,\n\n borrow(pool: BunSql): Promise<BunReservedSql> {\n return borrowBunClient(pool);\n },\n\n release(client: BunReservedSql): void {\n releaseBunClient(client);\n },\n\n async begin<DriverClient, Result>(\n pool: BunSql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await borrowBunClient(pool);\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n releaseBunClient(client);\n }\n },\n\n async savepoint<T>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n name: string,\n cb: () => Promise<T>,\n onSavepoint: SavepointCallback | undefined,\n beforeRelease: SavepointCallback | undefined,\n onRelease: SavepointCallback | undefined,\n beforeRollback: SavepointCallback | undefined,\n onRollback: SavepointCallback | undefined,\n ): Promise<T> {\n const safeName = quoteIdentifier(name);\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n const res = await cb();\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return res;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n onSavepoint?: SavepointCallback,\n beforeRelease?: SavepointCallback,\n onRelease?: SavepointCallback,\n beforeRollback?: SavepointCallback,\n onRollback?: SavepointCallback,\n ): Promise<QueryResult<T>> {\n const safeName = quoteIdentifier(state.name);\n\n let resolve: (() => void) | undefined;\n let reject: ((err: unknown) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: ((res: QueryResult<T>) => void) | undefined;\n let resultReject: ((err: unknown) => void) | undefined;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n\n try {\n const res = await queryClient<T>(client, text, values, arraysMode);\n resultResolve?.(res as QueryResult<T>);\n } catch (err) {\n resultReject?.(err);\n throw err;\n }\n\n const result = await promise;\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return result;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve?.();\n await savepointPromise;\n },\n async rollback(err) {\n reject?.(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: BunSql): Promise<void> {\n return pool.close();\n },\n};\n\nconst makeOptions = (config: BunAdapterOptions): BunSqlOptions => {\n const {\n databaseURL,\n host,\n user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n setConfig,\n searchPath,\n } = config;\n\n return {\n url:\n databaseURL && makeUrl(databaseURL, setConfig?.search_path ?? searchPath),\n hostname: host,\n username: user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n };\n};\n\nconst makeUrl = (databaseURL: string, searchPath?: string): string => {\n if (!searchPath) return databaseURL;\n\n const url = new URL(databaseURL);\n url.searchParams.set('options', `-c search_path=${searchPath}`);\n return url.toString();\n};\n\nconst normalizeResult = <T>(\n result: BunSqlResult<T>,\n arraysMode?: boolean,\n): QueryResult<T> | QueryResult<T>[] => {\n if (!arraysMode && isMultiResult(result)) {\n return result.map((item) => new BunQueryResult(item, arraysMode));\n }\n\n return new BunQueryResult(result, arraysMode);\n};\n\nclass BunQueryResult<T> implements QueryResult<T> {\n public rowCount: number;\n public rows: T[];\n private _fields?: QueryResult<T>['fields'];\n\n constructor(\n private result: BunSqlResult<T>,\n private isArray?: boolean,\n ) {\n this.rowCount = result.count ?? result.affectedRows ?? result.length;\n\n // creating new Array because BunSqlResult is not a real array - can't do spread on it\n this.rows = Array.from(result) as T[];\n }\n\n get fields(): QueryResult<T>['fields'] {\n if (this.isArray) {\n throw new Error('Bun does not support fields on array result');\n }\n\n return (this._fields ??= getFields(this.result));\n }\n}\n\nconst isMultiResult = <T>(\n result: BunSqlResult<T>,\n): result is BunSqlResult<T>[] & BunSqlResult<T> => {\n return Array.isArray(result[0]);\n};\n\nconst getFields = <T>(rows: T[]): { name: string }[] => {\n const first = rows[0];\n if (!first || Array.isArray(first) || typeof first !== 'object') return [];\n\n return Object.keys(first).map((name) => ({ name }));\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bun.js","names":["defaultSchemaConfig","createDbWithAdapter","AdapterClass","noop","quoteIdentifier"],"sources":["../src/adapters/driver-adapter-shared.ts","../src/adapters/bun.ts"],"sourcesContent":["export interface PostgresInterval {\n years: number;\n months: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nconst intervalRegExp =\n /^\\s*(?:([+-]?\\d+)\\s+years?)?\\s*(?:([+-]?\\d+)\\s+mons?)?\\s*(?:([+-]?\\d+)\\s+days?)?\\s*(?:([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?))?\\s*$/;\n\nexport const parseInterval = (str: string): PostgresInterval => {\n const [, years, months, days, timeSign, hours, minutes, seconds] =\n intervalRegExp.exec(str) || [];\n const timeMultiplier = timeSign === '-' ? -1 : 1;\n const secondsFloat = Number(seconds) || 0;\n const wholeSeconds = Math.floor(secondsFloat);\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? timeMultiplier * Number(hours) : 0,\n minutes: minutes ? timeMultiplier * Number(minutes) : 0,\n seconds: timeMultiplier * wholeSeconds,\n milliseconds:\n Math.round(timeMultiplier * (secondsFloat - wholeSeconds) * 1000000) /\n 1000,\n };\n};\n","import {\n AdapterClass,\n AdapterConfigBase,\n ColumnSchemaConfig,\n DbOptions,\n DbResult,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DriverAdapter,\n noop,\n QueryResult,\n QueryResultRow,\n QuerySchema,\n quoteIdentifier,\n RecordUnknown,\n AdapterSchemaConfigOptions,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState, SavepointCallback } from './adapter';\nimport { parseInterval } from './driver-adapter-shared';\n\nconst schemaConfig: AdapterSchemaConfigOptions = {\n arrayEncode: (input) => {\n return getBun().sql.array(input);\n },\n intervalParse: parseInterval,\n jsonEncodedByDriver: true,\n dateParsedByDriver: true,\n};\n\nexport const bunSchemaConfig = Object.assign(\n () => defaultSchemaConfig(schemaConfig),\n schemaConfig,\n);\n\nexport interface CreateBunDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends BunAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: CreateBunDbOptions<SchemaConfig, ColumnTypes>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n schemaConfig: bunSchemaConfig as unknown as () => SchemaConfig,\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: BunAdapter,\n config: options,\n }),\n });\n};\n\nexport interface BunOptions {\n hostname?: string;\n port?: number;\n database?: string;\n username?: string;\n password?: string | (() => string | Promise<string>);\n max?: number;\n idleTimeout?: number;\n maxLifetime?: number;\n connectionTimeout?: number;\n prepare?: boolean;\n tls?: unknown;\n}\n\nexport interface BunAdapterOptions extends AdapterConfigBase, BunOptions {\n schema?: QuerySchema;\n searchPath?: string;\n ssl?: unknown;\n}\n\ninterface Bun {\n SQL: BunSqlConstructor;\n sql: {\n array(input: unknown): unknown;\n };\n}\n\ninterface BunSqlConstructor {\n new (options?: BunSqlOptions | string): BunSql;\n PostgresError: ErrorClass;\n}\n\ninterface BunSqlOptions extends BunOptions {\n url?: string;\n ssl?: unknown;\n}\n\ninterface BunSql {\n unsafe<Row extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): BunSqlQuery<Row>;\n reserve(): Promise<BunReservedSql>;\n close(options?: { timeout?: number }): Promise<void>;\n}\n\ninterface BunReservedSql extends BunSql {\n release(): void;\n}\n\ninterface BunSqlQuery<\n Row extends QueryResultRow = QueryResultRow,\n> extends PromiseLike<BunSqlResult<Row>> {\n values(): Promise<BunSqlResult<unknown[]>>;\n}\n\ninterface BunSqlResult<Row = unknown> extends Array<Row> {\n count?: number;\n affectedRows?: number;\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ErrorClass = new (...args: any[]) => Error;\n\nconst getBun = (): Bun => {\n const Bun = (globalThis as unknown as { Bun?: Bun }).Bun;\n if (!Bun?.SQL) {\n throw new Error('Bun.SQL is only available when running in Bun');\n }\n\n return Bun;\n};\n\nconst getBunPostgresError = (): ErrorClass => {\n return (\n (globalThis as unknown as { Bun?: { SQL: BunSqlConstructor } }).Bun?.SQL\n .PostgresError ?? (Error as ErrorClass)\n );\n};\n\nconst queryClient = <T = QueryResultRow>(\n client: BunSql,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n // Bun only enables prepared statements globally, not per query.\n // Preparing manually would require managing Bun's physical connections.\n _prepare?: true,\n): Promise<QueryResult<T>> => {\n const runQuery = () => {\n const query = client.unsafe(text, values);\n const resultPromise: PromiseLike<BunSqlResult> = arraysMode\n ? query.values()\n : query;\n\n return Promise.resolve(resultPromise).then((result) => {\n return normalizeResult(result, arraysMode) as QueryResult<T>;\n });\n };\n\n // Keep a single transactional connection ordered when savepoints are active.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: (() => void) | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = res;\n });\n\n return __lock.then(() => {\n const promise = runQuery();\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = runQuery();\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst borrowBunClient = (pool: BunSql): Promise<BunReservedSql> => {\n return pool.reserve();\n};\n\nconst releaseBunClient = (client: BunReservedSql): void => {\n client.release();\n};\n\nexport const BunAdapter: DriverAdapter = {\n noFieldsForArrays: true,\n manualPool: true,\n schemaConfig,\n errorClass: getBunPostgresError(),\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'errno',\n detail: 'detail',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: BunAdapterOptions): BunSql {\n return new (getBun().SQL)(makeOptions(config));\n },\n\n queryClient,\n\n borrow(pool: BunSql): Promise<BunReservedSql> {\n return borrowBunClient(pool);\n },\n\n release(client: BunReservedSql): void {\n releaseBunClient(client);\n },\n\n async begin<DriverClient, Result>(\n pool: BunSql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await borrowBunClient(pool);\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n releaseBunClient(client);\n }\n },\n\n async savepoint<T>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n name: string,\n cb: () => Promise<T>,\n onSavepoint: SavepointCallback | undefined,\n beforeRelease: SavepointCallback | undefined,\n onRelease: SavepointCallback | undefined,\n beforeRollback: SavepointCallback | undefined,\n onRollback: SavepointCallback | undefined,\n ): Promise<T> {\n const safeName = quoteIdentifier(name);\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n const res = await cb();\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return res;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n prepare?: true,\n onSavepoint?: SavepointCallback,\n beforeRelease?: SavepointCallback,\n onRelease?: SavepointCallback,\n beforeRollback?: SavepointCallback,\n onRollback?: SavepointCallback,\n ): Promise<QueryResult<T>> {\n const safeName = quoteIdentifier(state.name);\n\n let resolve: (() => void) | undefined;\n let reject: ((err: unknown) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: ((res: QueryResult<T>) => void) | undefined;\n let resultReject: ((err: unknown) => void) | undefined;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n\n try {\n const res = await queryClient<T>(\n client,\n text,\n values,\n arraysMode,\n prepare,\n );\n resultResolve?.(res as QueryResult<T>);\n } catch (err) {\n resultReject?.(err);\n throw err;\n }\n\n const result = await promise;\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return result;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve?.();\n await savepointPromise;\n },\n async rollback(err) {\n reject?.(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: BunSql): Promise<void> {\n return pool.close();\n },\n};\n\nconst makeOptions = (config: BunAdapterOptions): BunSqlOptions => {\n const {\n databaseURL,\n host,\n user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n setConfig,\n searchPath,\n } = config;\n\n return {\n url:\n databaseURL && makeUrl(databaseURL, setConfig?.search_path ?? searchPath),\n hostname: host,\n username: user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n };\n};\n\nconst makeUrl = (databaseURL: string, searchPath?: string): string => {\n if (!searchPath) return databaseURL;\n\n const url = new URL(databaseURL);\n url.searchParams.set('options', `-c search_path=${searchPath}`);\n return url.toString();\n};\n\nconst normalizeResult = <T>(\n result: BunSqlResult<T>,\n arraysMode?: boolean,\n): QueryResult<T> | QueryResult<T>[] => {\n if (!arraysMode && isMultiResult(result)) {\n return result.map((item) => new BunQueryResult(item, arraysMode));\n }\n\n return new BunQueryResult(result, arraysMode);\n};\n\nclass BunQueryResult<T> implements QueryResult<T> {\n public rowCount: number;\n public rows: T[];\n private _fields?: QueryResult<T>['fields'];\n\n constructor(\n private result: BunSqlResult<T>,\n private isArray?: boolean,\n ) {\n this.rowCount = result.count ?? result.affectedRows ?? result.length;\n\n // creating new Array because BunSqlResult is not a real array - can't do spread on it\n this.rows = Array.from(result) as T[];\n }\n\n get fields(): QueryResult<T>['fields'] {\n if (this.isArray) {\n throw new Error('Bun does not support fields on array result');\n }\n\n return (this._fields ??= getFields(this.result));\n }\n}\n\nconst isMultiResult = <T>(\n result: BunSqlResult<T>,\n): result is BunSqlResult<T>[] & BunSqlResult<T> => {\n return Array.isArray(result[0]);\n};\n\nconst getFields = <T>(rows: T[]): { name: string }[] => {\n const first = rows[0];\n if (!first || Array.isArray(first) || typeof first !== 'object') return [];\n\n return Object.keys(first).map((name) => ({ name }));\n};\n"],"mappings":"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"}
|
package/dist/bun.mjs
CHANGED
|
@@ -44,7 +44,7 @@ const getBun = () => {
|
|
|
44
44
|
const getBunPostgresError = () => {
|
|
45
45
|
return globalThis.Bun?.SQL.PostgresError ?? Error;
|
|
46
46
|
};
|
|
47
|
-
const queryClient = (client, text, values, arraysMode) => {
|
|
47
|
+
const queryClient = (client, text, values, arraysMode, _prepare) => {
|
|
48
48
|
const runQuery = () => {
|
|
49
49
|
const query = client.unsafe(text, values);
|
|
50
50
|
const resultPromise = arraysMode ? query.values() : query;
|
|
@@ -142,7 +142,7 @@ const BunAdapter = {
|
|
|
142
142
|
throw err;
|
|
143
143
|
}
|
|
144
144
|
},
|
|
145
|
-
async hackySavepoint(client, _setClient, state, text, values, arraysMode, onSavepoint, beforeRelease, onRelease, beforeRollback, onRollback) {
|
|
145
|
+
async hackySavepoint(client, _setClient, state, text, values, arraysMode, prepare, onSavepoint, beforeRelease, onRelease, beforeRollback, onRollback) {
|
|
146
146
|
const safeName = quoteIdentifier(state.name);
|
|
147
147
|
let resolve;
|
|
148
148
|
let reject;
|
|
@@ -161,7 +161,7 @@ const BunAdapter = {
|
|
|
161
161
|
await queryClient(client, `SAVEPOINT ${safeName}`);
|
|
162
162
|
onSavepoint?.();
|
|
163
163
|
try {
|
|
164
|
-
const res = await queryClient(client, text, values, arraysMode);
|
|
164
|
+
const res = await queryClient(client, text, values, arraysMode, prepare);
|
|
165
165
|
resultResolve?.(res);
|
|
166
166
|
} catch (err) {
|
|
167
167
|
resultReject?.(err);
|
package/dist/bun.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun.mjs","names":[],"sources":["../src/adapters/driver-adapter-shared.ts","../src/adapters/bun.ts"],"sourcesContent":["export interface PostgresInterval {\n years: number;\n months: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nconst intervalRegExp =\n /^\\s*(?:([+-]?\\d+)\\s+years?)?\\s*(?:([+-]?\\d+)\\s+mons?)?\\s*(?:([+-]?\\d+)\\s+days?)?\\s*(?:([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?))?\\s*$/;\n\nexport const parseInterval = (str: string): PostgresInterval => {\n const [, years, months, days, timeSign, hours, minutes, seconds] =\n intervalRegExp.exec(str) || [];\n const timeMultiplier = timeSign === '-' ? -1 : 1;\n const secondsFloat = Number(seconds) || 0;\n const wholeSeconds = Math.floor(secondsFloat);\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? timeMultiplier * Number(hours) : 0,\n minutes: minutes ? timeMultiplier * Number(minutes) : 0,\n seconds: timeMultiplier * wholeSeconds,\n milliseconds:\n Math.round(timeMultiplier * (secondsFloat - wholeSeconds) * 1000000) /\n 1000,\n };\n};\n","import {\n AdapterClass,\n AdapterConfigBase,\n ColumnSchemaConfig,\n DbOptions,\n DbResult,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DriverAdapter,\n noop,\n QueryResult,\n QueryResultRow,\n QuerySchema,\n quoteIdentifier,\n RecordUnknown,\n AdapterSchemaConfigOptions,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState, SavepointCallback } from './adapter';\nimport { parseInterval } from './driver-adapter-shared';\n\nconst schemaConfig: AdapterSchemaConfigOptions = {\n arrayEncode: (input) => {\n return getBun().sql.array(input);\n },\n intervalParse: parseInterval,\n jsonEncodedByDriver: true,\n dateParsedByDriver: true,\n};\n\nexport const bunSchemaConfig = Object.assign(\n () => defaultSchemaConfig(schemaConfig),\n schemaConfig,\n);\n\nexport interface CreateBunDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends BunAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: CreateBunDbOptions<SchemaConfig, ColumnTypes>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n schemaConfig: bunSchemaConfig as unknown as () => SchemaConfig,\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: BunAdapter,\n config: options,\n }),\n });\n};\n\nexport interface BunOptions {\n hostname?: string;\n port?: number;\n database?: string;\n username?: string;\n password?: string | (() => string | Promise<string>);\n max?: number;\n idleTimeout?: number;\n maxLifetime?: number;\n connectionTimeout?: number;\n prepare?: boolean;\n tls?: unknown;\n}\n\nexport interface BunAdapterOptions extends AdapterConfigBase, BunOptions {\n schema?: QuerySchema;\n searchPath?: string;\n ssl?: unknown;\n}\n\ninterface Bun {\n SQL: BunSqlConstructor;\n sql: {\n array(input: unknown): unknown;\n };\n}\n\ninterface BunSqlConstructor {\n new (options?: BunSqlOptions | string): BunSql;\n PostgresError: ErrorClass;\n}\n\ninterface BunSqlOptions extends BunOptions {\n url?: string;\n ssl?: unknown;\n}\n\ninterface BunSql {\n unsafe<Row extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): BunSqlQuery<Row>;\n reserve(): Promise<BunReservedSql>;\n close(options?: { timeout?: number }): Promise<void>;\n}\n\ninterface BunReservedSql extends BunSql {\n release(): void;\n}\n\ninterface BunSqlQuery<\n Row extends QueryResultRow = QueryResultRow,\n> extends PromiseLike<BunSqlResult<Row>> {\n values(): Promise<BunSqlResult<unknown[]>>;\n}\n\ninterface BunSqlResult<Row = unknown> extends Array<Row> {\n count?: number;\n affectedRows?: number;\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ErrorClass = new (...args: any[]) => Error;\n\nconst getBun = (): Bun => {\n const Bun = (globalThis as unknown as { Bun?: Bun }).Bun;\n if (!Bun?.SQL) {\n throw new Error('Bun.SQL is only available when running in Bun');\n }\n\n return Bun;\n};\n\nconst getBunPostgresError = (): ErrorClass => {\n return (\n (globalThis as unknown as { Bun?: { SQL: BunSqlConstructor } }).Bun?.SQL\n .PostgresError ?? (Error as ErrorClass)\n );\n};\n\nconst queryClient = <T = QueryResultRow>(\n client: BunSql,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n): Promise<QueryResult<T>> => {\n const runQuery = () => {\n const query = client.unsafe(text, values);\n const resultPromise: PromiseLike<BunSqlResult> = arraysMode\n ? query.values()\n : query;\n\n return Promise.resolve(resultPromise).then((result) => {\n return normalizeResult(result, arraysMode) as QueryResult<T>;\n });\n };\n\n // Keep a single transactional connection ordered when savepoints are active.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: (() => void) | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = res;\n });\n\n return __lock.then(() => {\n const promise = runQuery();\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = runQuery();\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst borrowBunClient = (pool: BunSql): Promise<BunReservedSql> => {\n return pool.reserve();\n};\n\nconst releaseBunClient = (client: BunReservedSql): void => {\n client.release();\n};\n\nexport const BunAdapter: DriverAdapter = {\n noFieldsForArrays: true,\n manualPool: true,\n schemaConfig,\n errorClass: getBunPostgresError(),\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'errno',\n detail: 'detail',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: BunAdapterOptions): BunSql {\n return new (getBun().SQL)(makeOptions(config));\n },\n\n queryClient,\n\n borrow(pool: BunSql): Promise<BunReservedSql> {\n return borrowBunClient(pool);\n },\n\n release(client: BunReservedSql): void {\n releaseBunClient(client);\n },\n\n async begin<DriverClient, Result>(\n pool: BunSql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await borrowBunClient(pool);\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n releaseBunClient(client);\n }\n },\n\n async savepoint<T>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n name: string,\n cb: () => Promise<T>,\n onSavepoint: SavepointCallback | undefined,\n beforeRelease: SavepointCallback | undefined,\n onRelease: SavepointCallback | undefined,\n beforeRollback: SavepointCallback | undefined,\n onRollback: SavepointCallback | undefined,\n ): Promise<T> {\n const safeName = quoteIdentifier(name);\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n const res = await cb();\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return res;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n onSavepoint?: SavepointCallback,\n beforeRelease?: SavepointCallback,\n onRelease?: SavepointCallback,\n beforeRollback?: SavepointCallback,\n onRollback?: SavepointCallback,\n ): Promise<QueryResult<T>> {\n const safeName = quoteIdentifier(state.name);\n\n let resolve: (() => void) | undefined;\n let reject: ((err: unknown) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: ((res: QueryResult<T>) => void) | undefined;\n let resultReject: ((err: unknown) => void) | undefined;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n\n try {\n const res = await queryClient<T>(client, text, values, arraysMode);\n resultResolve?.(res as QueryResult<T>);\n } catch (err) {\n resultReject?.(err);\n throw err;\n }\n\n const result = await promise;\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return result;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve?.();\n await savepointPromise;\n },\n async rollback(err) {\n reject?.(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: BunSql): Promise<void> {\n return pool.close();\n },\n};\n\nconst makeOptions = (config: BunAdapterOptions): BunSqlOptions => {\n const {\n databaseURL,\n host,\n user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n setConfig,\n searchPath,\n } = config;\n\n return {\n url:\n databaseURL && makeUrl(databaseURL, setConfig?.search_path ?? searchPath),\n hostname: host,\n username: user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n };\n};\n\nconst makeUrl = (databaseURL: string, searchPath?: string): string => {\n if (!searchPath) return databaseURL;\n\n const url = new URL(databaseURL);\n url.searchParams.set('options', `-c search_path=${searchPath}`);\n return url.toString();\n};\n\nconst normalizeResult = <T>(\n result: BunSqlResult<T>,\n arraysMode?: boolean,\n): QueryResult<T> | QueryResult<T>[] => {\n if (!arraysMode && isMultiResult(result)) {\n return result.map((item) => new BunQueryResult(item, arraysMode));\n }\n\n return new BunQueryResult(result, arraysMode);\n};\n\nclass BunQueryResult<T> implements QueryResult<T> {\n public rowCount: number;\n public rows: T[];\n private _fields?: QueryResult<T>['fields'];\n\n constructor(\n private result: BunSqlResult<T>,\n private isArray?: boolean,\n ) {\n this.rowCount = result.count ?? result.affectedRows ?? result.length;\n\n // creating new Array because BunSqlResult is not a real array - can't do spread on it\n this.rows = Array.from(result) as T[];\n }\n\n get fields(): QueryResult<T>['fields'] {\n if (this.isArray) {\n throw new Error('Bun does not support fields on array result');\n }\n\n return (this._fields ??= getFields(this.result));\n }\n}\n\nconst isMultiResult = <T>(\n result: BunSqlResult<T>,\n): result is BunSqlResult<T>[] & BunSqlResult<T> => {\n return Array.isArray(result[0]);\n};\n\nconst getFields = <T>(rows: T[]): { name: string }[] => {\n const first = rows[0];\n if (!first || Array.isArray(first) || typeof first !== 'object') return [];\n\n return Object.keys(first).map((name) => ({ name }));\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bun.mjs","names":[],"sources":["../src/adapters/driver-adapter-shared.ts","../src/adapters/bun.ts"],"sourcesContent":["export interface PostgresInterval {\n years: number;\n months: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n milliseconds: number;\n}\n\nconst intervalRegExp =\n /^\\s*(?:([+-]?\\d+)\\s+years?)?\\s*(?:([+-]?\\d+)\\s+mons?)?\\s*(?:([+-]?\\d+)\\s+days?)?\\s*(?:([+-])?(\\d+):(\\d\\d):(\\d\\d(?:\\.\\d{1,6})?))?\\s*$/;\n\nexport const parseInterval = (str: string): PostgresInterval => {\n const [, years, months, days, timeSign, hours, minutes, seconds] =\n intervalRegExp.exec(str) || [];\n const timeMultiplier = timeSign === '-' ? -1 : 1;\n const secondsFloat = Number(seconds) || 0;\n const wholeSeconds = Math.floor(secondsFloat);\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? timeMultiplier * Number(hours) : 0,\n minutes: minutes ? timeMultiplier * Number(minutes) : 0,\n seconds: timeMultiplier * wholeSeconds,\n milliseconds:\n Math.round(timeMultiplier * (secondsFloat - wholeSeconds) * 1000000) /\n 1000,\n };\n};\n","import {\n AdapterClass,\n AdapterConfigBase,\n ColumnSchemaConfig,\n DbOptions,\n DbResult,\n DefaultColumnTypes,\n defaultSchemaConfig,\n DefaultSchemaConfig,\n DriverAdapter,\n noop,\n QueryResult,\n QueryResultRow,\n QuerySchema,\n quoteIdentifier,\n RecordUnknown,\n AdapterSchemaConfigOptions,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState, SavepointCallback } from './adapter';\nimport { parseInterval } from './driver-adapter-shared';\n\nconst schemaConfig: AdapterSchemaConfigOptions = {\n arrayEncode: (input) => {\n return getBun().sql.array(input);\n },\n intervalParse: parseInterval,\n jsonEncodedByDriver: true,\n dateParsedByDriver: true,\n};\n\nexport const bunSchemaConfig = Object.assign(\n () => defaultSchemaConfig(schemaConfig),\n schemaConfig,\n);\n\nexport interface CreateBunDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n>\n extends BunAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: CreateBunDbOptions<SchemaConfig, ColumnTypes>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n schemaConfig: bunSchemaConfig as unknown as () => SchemaConfig,\n ...options,\n log,\n adapter: new AdapterClass({\n driverAdapter: BunAdapter,\n config: options,\n }),\n });\n};\n\nexport interface BunOptions {\n hostname?: string;\n port?: number;\n database?: string;\n username?: string;\n password?: string | (() => string | Promise<string>);\n max?: number;\n idleTimeout?: number;\n maxLifetime?: number;\n connectionTimeout?: number;\n prepare?: boolean;\n tls?: unknown;\n}\n\nexport interface BunAdapterOptions extends AdapterConfigBase, BunOptions {\n schema?: QuerySchema;\n searchPath?: string;\n ssl?: unknown;\n}\n\ninterface Bun {\n SQL: BunSqlConstructor;\n sql: {\n array(input: unknown): unknown;\n };\n}\n\ninterface BunSqlConstructor {\n new (options?: BunSqlOptions | string): BunSql;\n PostgresError: ErrorClass;\n}\n\ninterface BunSqlOptions extends BunOptions {\n url?: string;\n ssl?: unknown;\n}\n\ninterface BunSql {\n unsafe<Row extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): BunSqlQuery<Row>;\n reserve(): Promise<BunReservedSql>;\n close(options?: { timeout?: number }): Promise<void>;\n}\n\ninterface BunReservedSql extends BunSql {\n release(): void;\n}\n\ninterface BunSqlQuery<\n Row extends QueryResultRow = QueryResultRow,\n> extends PromiseLike<BunSqlResult<Row>> {\n values(): Promise<BunSqlResult<unknown[]>>;\n}\n\ninterface BunSqlResult<Row = unknown> extends Array<Row> {\n count?: number;\n affectedRows?: number;\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ErrorClass = new (...args: any[]) => Error;\n\nconst getBun = (): Bun => {\n const Bun = (globalThis as unknown as { Bun?: Bun }).Bun;\n if (!Bun?.SQL) {\n throw new Error('Bun.SQL is only available when running in Bun');\n }\n\n return Bun;\n};\n\nconst getBunPostgresError = (): ErrorClass => {\n return (\n (globalThis as unknown as { Bun?: { SQL: BunSqlConstructor } }).Bun?.SQL\n .PostgresError ?? (Error as ErrorClass)\n );\n};\n\nconst queryClient = <T = QueryResultRow>(\n client: BunSql,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n // Bun only enables prepared statements globally, not per query.\n // Preparing manually would require managing Bun's physical connections.\n _prepare?: true,\n): Promise<QueryResult<T>> => {\n const runQuery = () => {\n const query = client.unsafe(text, values);\n const resultPromise: PromiseLike<BunSqlResult> = arraysMode\n ? query.values()\n : query;\n\n return Promise.resolve(resultPromise).then((result) => {\n return normalizeResult(result, arraysMode) as QueryResult<T>;\n });\n };\n\n // Keep a single transactional connection ordered when savepoints are active.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: (() => void) | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = res;\n });\n\n return __lock.then(() => {\n const promise = runQuery();\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = runQuery();\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst borrowBunClient = (pool: BunSql): Promise<BunReservedSql> => {\n return pool.reserve();\n};\n\nconst releaseBunClient = (client: BunReservedSql): void => {\n client.release();\n};\n\nexport const BunAdapter: DriverAdapter = {\n noFieldsForArrays: true,\n manualPool: true,\n schemaConfig,\n errorClass: getBunPostgresError(),\n errorFields: {\n message: 'message',\n severity: 'severity',\n code: 'errno',\n detail: 'detail',\n schema: 'schema',\n table: 'table',\n column: 'column',\n dataType: 'dataType',\n constraint: 'constraint',\n hint: 'hint',\n position: 'position',\n internalPosition: 'internalPosition',\n internalQuery: 'internalQuery',\n where: 'where',\n file: 'file',\n line: 'line',\n routine: 'routine',\n },\n\n configure(config: BunAdapterOptions): BunSql {\n return new (getBun().SQL)(makeOptions(config));\n },\n\n queryClient,\n\n borrow(pool: BunSql): Promise<BunReservedSql> {\n return borrowBunClient(pool);\n },\n\n release(client: BunReservedSql): void {\n releaseBunClient(client);\n },\n\n async begin<DriverClient, Result>(\n pool: BunSql,\n cb: (adapter: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result> {\n const client = await borrowBunClient(pool);\n\n try {\n await queryClient(client, options ? 'BEGIN ' + options : 'BEGIN');\n\n let result;\n try {\n result = await cb(client as DriverClient);\n } catch (err) {\n await queryClient(client, 'ROLLBACK');\n throw err;\n }\n\n await queryClient(client, 'COMMIT');\n return result as Result;\n } finally {\n releaseBunClient(client);\n }\n },\n\n async savepoint<T>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n name: string,\n cb: () => Promise<T>,\n onSavepoint: SavepointCallback | undefined,\n beforeRelease: SavepointCallback | undefined,\n onRelease: SavepointCallback | undefined,\n beforeRollback: SavepointCallback | undefined,\n onRollback: SavepointCallback | undefined,\n ): Promise<T> {\n const safeName = quoteIdentifier(name);\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n const res = await cb();\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return res;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n },\n\n async hackySavepoint<T extends QueryResultRow>(\n client: BunSql,\n // Bun doesn't need to switch the client in a savepoint.\n _setClient: (client: BunSql) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n prepare?: true,\n onSavepoint?: SavepointCallback,\n beforeRelease?: SavepointCallback,\n onRelease?: SavepointCallback,\n beforeRollback?: SavepointCallback,\n onRollback?: SavepointCallback,\n ): Promise<QueryResult<T>> {\n const safeName = quoteIdentifier(state.name);\n\n let resolve: (() => void) | undefined;\n let reject: ((err: unknown) => void) | undefined;\n const promise = new Promise<void>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n let resultResolve: ((res: QueryResult<T>) => void) | undefined;\n let resultReject: ((err: unknown) => void) | undefined;\n const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n resultResolve = res;\n resultReject = rej;\n });\n\n const savepointPromise = (async () => {\n try {\n await queryClient(client, `SAVEPOINT ${safeName}`);\n onSavepoint?.();\n\n try {\n const res = await queryClient<T>(\n client,\n text,\n values,\n arraysMode,\n prepare,\n );\n resultResolve?.(res as QueryResult<T>);\n } catch (err) {\n resultReject?.(err);\n throw err;\n }\n\n const result = await promise;\n beforeRelease?.();\n await queryClient(client, `RELEASE SAVEPOINT ${safeName}`);\n onRelease?.();\n return result;\n } catch (err) {\n beforeRollback?.();\n await queryClient(client, `ROLLBACK TO SAVEPOINT ${safeName}`);\n onRollback?.();\n throw err;\n }\n })();\n\n state.activeSavepoint = {\n async release() {\n resolve?.();\n await savepointPromise;\n },\n async rollback(err) {\n reject?.(err);\n await savepointPromise.catch(noop);\n },\n };\n\n return resultPromise;\n },\n\n close(pool: BunSql): Promise<void> {\n return pool.close();\n },\n};\n\nconst makeOptions = (config: BunAdapterOptions): BunSqlOptions => {\n const {\n databaseURL,\n host,\n user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n setConfig,\n searchPath,\n } = config;\n\n return {\n url:\n databaseURL && makeUrl(databaseURL, setConfig?.search_path ?? searchPath),\n hostname: host,\n username: user,\n password,\n port,\n database,\n max,\n idleTimeout,\n maxLifetime,\n connectionTimeout,\n prepare,\n tls,\n ssl,\n };\n};\n\nconst makeUrl = (databaseURL: string, searchPath?: string): string => {\n if (!searchPath) return databaseURL;\n\n const url = new URL(databaseURL);\n url.searchParams.set('options', `-c search_path=${searchPath}`);\n return url.toString();\n};\n\nconst normalizeResult = <T>(\n result: BunSqlResult<T>,\n arraysMode?: boolean,\n): QueryResult<T> | QueryResult<T>[] => {\n if (!arraysMode && isMultiResult(result)) {\n return result.map((item) => new BunQueryResult(item, arraysMode));\n }\n\n return new BunQueryResult(result, arraysMode);\n};\n\nclass BunQueryResult<T> implements QueryResult<T> {\n public rowCount: number;\n public rows: T[];\n private _fields?: QueryResult<T>['fields'];\n\n constructor(\n private result: BunSqlResult<T>,\n private isArray?: boolean,\n ) {\n this.rowCount = result.count ?? result.affectedRows ?? result.length;\n\n // creating new Array because BunSqlResult is not a real array - can't do spread on it\n this.rows = Array.from(result) as T[];\n }\n\n get fields(): QueryResult<T>['fields'] {\n if (this.isArray) {\n throw new Error('Bun does not support fields on array result');\n }\n\n return (this._fields ??= getFields(this.result));\n }\n}\n\nconst isMultiResult = <T>(\n result: BunSqlResult<T>,\n): result is BunSqlResult<T>[] & BunSqlResult<T> => {\n return Array.isArray(result[0]);\n};\n\nconst getFields = <T>(rows: T[]): { name: string }[] => {\n const first = rows[0];\n if (!first || Array.isArray(first) || typeof first !== 'object') return [];\n\n return Object.keys(first).map((name) => ({ name }));\n};\n"],"mappings":";;AAUA,MAAM,iBACJ;AAEF,MAAa,iBAAiB,QAAkC;CAC9D,MAAM,GAAG,OAAO,QAAQ,MAAM,UAAU,OAAO,SAAS,WACtD,eAAe,KAAK,GAAG,KAAK,CAAC;CAC/B,MAAM,iBAAiB,aAAa,MAAM,KAAK;CAC/C,MAAM,eAAe,OAAO,OAAO,KAAK;CACxC,MAAM,eAAe,KAAK,MAAM,YAAY;CAE5C,OAAO;EACL,OAAO,QAAQ,OAAO,KAAK,IAAI;EAC/B,QAAQ,SAAS,OAAO,MAAM,IAAI;EAClC,MAAM,OAAO,OAAO,IAAI,IAAI;EAC5B,OAAO,QAAQ,iBAAiB,OAAO,KAAK,IAAI;EAChD,SAAS,UAAU,iBAAiB,OAAO,OAAO,IAAI;EACtD,SAAS,iBAAiB;EAC1B,cACE,KAAK,MAAM,kBAAkB,eAAe,gBAAgB,GAAO,IACnE;CACJ;AACF;ACTA,MAAM,eAA2C;CAC/C,cAAc,UAAU;EACtB,OAAO,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK;CACjC;CACA,eAAe;CACf,qBAAqB;CACrB,oBAAoB;AACtB;AAEA,MAAa,kBAAkB,OAAO,aAC9B,oBAAoB,YAAY,GACtC,YACF;AAQA,MAAa,YAGX,EACA,KACA,GAAG,cACuE;CAC1E,OAAO,oBAAoB;EACzB,cAAc;EACd,GAAG;EACH;EACA,SAAS,IAAI,aAAa;GACxB,eAAe;GACf,QAAQ;EACV,CAAC;CACH,CAAC;AACH;AAkEA,MAAM,eAAoB;CACxB,MAAM,MAAO,WAAwC;CACrD,IAAI,CAAC,KAAK,KACR,MAAM,IAAI,MAAM,+CAA+C;CAGjE,OAAO;AACT;AAEA,MAAM,4BAAwC;CAC5C,OACG,WAA+D,KAAK,IAClE,iBAAkB;AAEzB;AAEA,MAAM,eACJ,QACA,MACA,QACA,YAGA,aAC4B;CAC5B,MAAM,iBAAiB;EACrB,MAAM,QAAQ,OAAO,OAAO,MAAM,MAAM;EACxC,MAAM,gBAA2C,aAC7C,MAAM,OAAO,IACb;EAEJ,OAAO,QAAQ,QAAQ,aAAa,CAAC,CAAC,MAAM,WAAW;GACrD,OAAO,gBAAgB,QAAQ,UAAU;EAC3C,CAAC;CACH;CAGA,MAAM,EAAE,WAAW;CACnB,IAAI,QAAQ;EACV,IAAI;EACJ,OAAqC,SAAS,IAAI,SAAe,QAAQ;GACvE,UAAU;EACZ,CAAC;EAED,OAAO,OAAO,WAAW;GACvB,MAAM,UAAU,SAAS;GACzB,QAAQ,KAAK,SAAS,OAAO;GAC7B,OAAO;EACT,CAAC;CACH;CAEA,MAAM,UAAU,SAAS;CAEzB,OAAqD,SACnD,QAAQ,MAAM,IAAI;CAEpB,OAAO;AACT;AAEA,MAAM,mBAAmB,SAA0C;CACjE,OAAO,KAAK,QAAQ;AACtB;AAEA,MAAM,oBAAoB,WAAiC;CACzD,OAAO,QAAQ;AACjB;AAEA,MAAa,aAA4B;CACvC,mBAAmB;CACnB,YAAY;CACZ;CACA,YAAY,oBAAoB;CAChC,aAAa;EACX,SAAS;EACT,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,UAAU;EACV,YAAY;EACZ,MAAM;EACN,UAAU;EACV,kBAAkB;EAClB,eAAe;EACf,OAAO;EACP,MAAM;EACN,MAAM;EACN,SAAS;CACX;CAEA,UAAU,QAAmC;EAC3C,OAAO,KAAK,OAAO,EAAA,CAAE,IAAK,YAAY,MAAM,CAAC;CAC/C;CAEA;CAEA,OAAO,MAAuC;EAC5C,OAAO,gBAAgB,IAAI;CAC7B;CAEA,QAAQ,QAA8B;EACpC,iBAAiB,MAAM;CACzB;CAEA,MAAM,MACJ,MACA,IACA,SACiB;EACjB,MAAM,SAAS,MAAM,gBAAgB,IAAI;EAEzC,IAAI;GACF,MAAM,YAAY,QAAQ,UAAU,WAAW,UAAU,OAAO;GAEhE,IAAI;GACJ,IAAI;IACF,SAAS,MAAM,GAAG,MAAsB;GAC1C,SAAS,KAAK;IACZ,MAAM,YAAY,QAAQ,UAAU;IACpC,MAAM;GACR;GAEA,MAAM,YAAY,QAAQ,QAAQ;GAClC,OAAO;EACT,UAAU;GACR,iBAAiB,MAAM;EACzB;CACF;CAEA,MAAM,UACJ,QAEA,YACA,MACA,IACA,aACA,eACA,WACA,gBACA,YACY;EACZ,MAAM,WAAW,gBAAgB,IAAI;EACrC,IAAI;GACF,MAAM,YAAY,QAAQ,aAAa,UAAU;GACjD,cAAc;GACd,MAAM,MAAM,MAAM,GAAG;GACrB,gBAAgB;GAChB,MAAM,YAAY,QAAQ,qBAAqB,UAAU;GACzD,YAAY;GACZ,OAAO;EACT,SAAS,KAAK;GACZ,iBAAiB;GACjB,MAAM,YAAY,QAAQ,yBAAyB,UAAU;GAC7D,aAAa;GACb,MAAM;EACR;CACF;CAEA,MAAM,eACJ,QAEA,YACA,OACA,MACA,QACA,YACA,SACA,aACA,eACA,WACA,gBACA,YACyB;EACzB,MAAM,WAAW,gBAAgB,MAAM,IAAI;EAE3C,IAAI;EACJ,IAAI;EACJ,MAAM,UAAU,IAAI,SAAe,KAAK,QAAQ;GAC9C,UAAU;GACV,SAAS;EACX,CAAC;EAED,IAAI;EACJ,IAAI;EACJ,MAAM,gBAAgB,IAAI,SAAyB,KAAK,QAAQ;GAC9D,gBAAgB;GAChB,eAAe;EACjB,CAAC;EAED,MAAM,oBAAoB,YAAY;GACpC,IAAI;IACF,MAAM,YAAY,QAAQ,aAAa,UAAU;IACjD,cAAc;IAEd,IAAI;KACF,MAAM,MAAM,MAAM,YAChB,QACA,MACA,QACA,YACA,OACF;KACA,gBAAgB,GAAqB;IACvC,SAAS,KAAK;KACZ,eAAe,GAAG;KAClB,MAAM;IACR;IAEA,MAAM,SAAS,MAAM;IACrB,gBAAgB;IAChB,MAAM,YAAY,QAAQ,qBAAqB,UAAU;IACzD,YAAY;IACZ,OAAO;GACT,SAAS,KAAK;IACZ,iBAAiB;IACjB,MAAM,YAAY,QAAQ,yBAAyB,UAAU;IAC7D,aAAa;IACb,MAAM;GACR;EACF,EAAA,CAAG;EAEH,MAAM,kBAAkB;GACtB,MAAM,UAAU;IACd,UAAU;IACV,MAAM;GACR;GACA,MAAM,SAAS,KAAK;IAClB,SAAS,GAAG;IACZ,MAAM,iBAAiB,MAAM,IAAI;GACnC;EACF;EAEA,OAAO;CACT;CAEA,MAAM,MAA6B;EACjC,OAAO,KAAK,MAAM;CACpB;AACF;AAEA,MAAM,eAAe,WAA6C;CAChE,MAAM,EACJ,aACA,MACA,MACA,UACA,MACA,UACA,KACA,aACA,aACA,mBACA,SACA,KACA,KACA,WACA,eACE;CAEJ,OAAO;EACL,KACE,eAAe,QAAQ,aAAa,WAAW,eAAe,UAAU;EAC1E,UAAU;EACV,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,MAAM,WAAW,aAAqB,eAAgC;CACpE,IAAI,CAAC,YAAY,OAAO;CAExB,MAAM,MAAM,IAAI,IAAI,WAAW;CAC/B,IAAI,aAAa,IAAI,WAAW,kBAAkB,YAAY;CAC9D,OAAO,IAAI,SAAS;AACtB;AAEA,MAAM,mBACJ,QACA,eACsC;CACtC,IAAI,CAAC,cAAc,cAAc,MAAM,GACrC,OAAO,OAAO,KAAK,SAAS,IAAI,eAAe,MAAM,UAAU,CAAC;CAGlE,OAAO,IAAI,eAAe,QAAQ,UAAU;AAC9C;AAEA,IAAM,iBAAN,MAAkD;CAKhD,YACE,QACA,SACA;EAFQ,KAAA,SAAA;EACA,KAAA,UAAA;EAER,KAAK,WAAW,OAAO,SAAS,OAAO,gBAAgB,OAAO;EAG9D,KAAK,OAAO,MAAM,KAAK,MAAM;CAC/B;CAEA,IAAI,SAAmC;EACrC,IAAI,KAAK,SACP,MAAM,IAAI,MAAM,6CAA6C;EAG/D,OAAQ,KAAK,YAAY,UAAU,KAAK,MAAM;CAChD;AACF;AAEA,MAAM,iBACJ,WACkD;CAClD,OAAO,MAAM,QAAQ,OAAO,EAAE;AAChC;AAEA,MAAM,aAAgB,SAAkC;CACtD,MAAM,QAAQ,KAAK;CACnB,IAAI,CAAC,SAAS,MAAM,QAAQ,KAAK,KAAK,OAAO,UAAU,UAAU,OAAO,CAAC;CAEzE,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE,KAAK,EAAE;AACpD"}
|