{"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    // `ROLLBACK TO` below must not run for a savepoint that wasn't created\n    await queryClient(client, `SAVEPOINT ${safeName}`);\n    try {\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    // handled: `rollback` rejects it even after the savepoint has failed\n    promise.catch(noop);\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      // `ROLLBACK TO` below must not run for a savepoint that wasn't created\n      await queryClient(client, `SAVEPOINT ${safeName}`);\n      try {\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    // the query never runs when `SAVEPOINT` fails\n    savepointPromise.catch(resultReject!);\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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"}