{"version":3,"file":"postgres-js.mjs","names":[],"sources":["../src/adapters/driver-adapter-shared.ts","../src/adapters/postgres-js-array-parser-patch.ts","../src/adapters/postgres-js.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 postgres from 'postgres';\n\ninterface PostgresJsParser {\n  (input: string): unknown;\n  array?: boolean;\n}\n\ninterface PostgresJsOptionsWithArrays extends postgres.ParsedOptions {\n  shared: {\n    typeArrayMap: Record<number, number>;\n  };\n  parsers: Record<number, PostgresJsParser>;\n}\n\nexport const patchPostgresJsArrayParsers = (sql: postgres.Sql): void => {\n  const options = sql.options as PostgresJsOptionsWithArrays;\n  const { parsers } = options;\n  const serializers = options.serializers;\n\n  options.serializers = new Proxy(serializers, {\n    set(target, property, value, receiver) {\n      const result = Reflect.set(target, property, value, receiver);\n      if (typeof property === 'symbol') return result;\n\n      const typarray = Number(property);\n      if (!Number.isInteger(typarray) || !parsers[typarray]?.array) {\n        return result;\n      }\n\n      const oid = findTypeOidByArrayOid(options.shared.typeArrayMap, typarray);\n      if (!oid) return result;\n\n      const itemParser = parsers[oid];\n      const arrayParser: PostgresJsParser = (input) =>\n        parsePostgresArray(input, itemParser, typarray);\n      arrayParser.array = true;\n      parsers[typarray] = arrayParser;\n\n      return result;\n    },\n  });\n};\n\nconst findTypeOidByArrayOid = (\n  typeArrayMap: Record<number, number>,\n  typarray: number,\n): number | undefined => {\n  for (const oid in typeArrayMap) {\n    if (typeArrayMap[oid] === typarray) return Number(oid);\n  }\n\n  return undefined;\n};\n\ninterface ArrayParserState {\n  i: number;\n  char: string | null;\n  str: string;\n  quoted: boolean;\n  last: number;\n  p?: string | null;\n}\n\nconst parsePostgresArray = (\n  input: string,\n  parser: PostgresJsParser | undefined,\n  typarray: number,\n): unknown[] => {\n  return parsePostgresArrayLoop(\n    {\n      i: 0,\n      char: null,\n      str: '',\n      quoted: false,\n      last: 0,\n    },\n    input,\n    parser,\n    typarray,\n  );\n};\n\nconst parsePostgresArrayLoop = (\n  state: ArrayParserState,\n  input: string,\n  parser: PostgresJsParser | undefined,\n  typarray: number,\n): unknown[] => {\n  const result: unknown[] = [];\n  // Only _box (1020) has the ';' delimiter for arrays, all other types use ','.\n  const delimiter = typarray === 1020 ? ';' : ',';\n\n  for (; state.i < input.length; state.i++) {\n    state.char = input[state.i];\n    if (state.quoted) {\n      if (state.char === '\\\\') {\n        state.str += input[++state.i];\n      } else if (state.char === '\"') {\n        result.push(parser ? parser(state.str) : state.str);\n        state.str = '';\n        state.quoted = input[state.i + 1] === '\"';\n        state.last = state.i + 2;\n      } else {\n        state.str += state.char;\n      }\n    } else if (state.char === '\"') {\n      state.quoted = true;\n    } else if (state.char === '{') {\n      state.last = ++state.i;\n      result.push(parsePostgresArrayLoop(state, input, parser, typarray));\n    } else if (state.char === '}') {\n      state.quoted = false;\n      if (state.last < state.i) {\n        result.push(parseArrayValue(input.slice(state.last, state.i), parser));\n      }\n      state.last = state.i + 1;\n      break;\n    } else if (state.char === delimiter && state.p !== '}' && state.p !== '\"') {\n      result.push(parseArrayValue(input.slice(state.last, state.i), parser));\n      state.last = state.i + 1;\n    }\n\n    state.p = state.char;\n  }\n\n  if (state.last < state.i) {\n    result.push(parseArrayValue(input.slice(state.last, state.i + 1), parser));\n  }\n\n  return result;\n};\n\nconst parseArrayValue = (\n  input: string,\n  parser: PostgresJsParser | undefined,\n): unknown => {\n  return input === 'NULL' ? null : parser ? parser(input) : input;\n};\n","import postgres, { Row, RowList, TransactionSql } from 'postgres';\nimport {\n  AdapterConfigBase,\n  QueryResult,\n  QueryResultRow,\n  returnArg,\n  DbOptions,\n  DefaultColumnTypes,\n  DefaultSchemaConfig,\n  DbResult,\n  ColumnSchemaConfig,\n  AdapterClass,\n  DriverAdapter,\n  QuerySchema,\n  noop,\n} from 'pqb/internal';\nimport { createDbWithAdapter } from 'pqb';\nimport { HackySavepointState, SavepointCallback } from './adapter';\nimport { parseInterval } from './driver-adapter-shared';\nimport { patchPostgresJsArrayParsers } from './postgres-js-array-parser-patch';\n\nexport interface CreatePostgresJsDbOptions<\n  SchemaConfig extends ColumnSchemaConfig,\n  ColumnTypes,\n>\n  extends PostgresJsAdapterOptions, DbOptions<SchemaConfig, ColumnTypes> {}\n\nexport const createDb = <\n  SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n  ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>(\n  options: CreatePostgresJsDbOptions<SchemaConfig, ColumnTypes>,\n): DbResult<ColumnTypes> => {\n  return createDbWithAdapter({\n    ...options,\n    adapter: new AdapterClass({\n      driverAdapter: PostgresJsAdapter,\n      config: options,\n    }),\n  });\n};\n\nexport interface PostgresJsAdapterOptions\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  extends postgres.Options<any>, Omit<AdapterConfigBase, 'searchPath' | 'ssl'> {\n  databaseURL?: string;\n  schema?: QuerySchema;\n}\n\ntype RawResult = RowList<(Row & Iterable<Row>)[]>;\n\nclass PostgresJsResult<T extends QueryResultRow> implements QueryResult<T> {\n  rowCount: number;\n  rows: T[];\n  fields: QueryResult<T>['fields'];\n\n  constructor(result: RawResult) {\n    this.rowCount = result.count;\n    this.rows = result as never;\n    this.fields = result.statement?.columns;\n  }\n}\n\nclass PostgresJsArraysResult<\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  R extends any[],\n> implements QueryResult<R> {\n  rowCount: number;\n  rows: R[];\n  fields: QueryResult['fields'];\n\n  constructor(result: RawResult) {\n    this.rowCount = result.count;\n    this.rows = result as never;\n    this.fields = result.statement.columns;\n  }\n}\n\nconst types: Record<string, Partial<postgres.PostgresType>> = {\n  bytea: {\n    to: 17,\n    from: 17 as never,\n    serialize: (x) => '\\\\x' + Buffer.from(x).toString('hex'),\n    parse: (x: string) => Buffer.from(x.slice(2), 'hex'),\n  },\n  dateAndTimestampAsStrings: {\n    to: 25,\n    from: [1082, 1114, 1184],\n    parse: returnArg,\n  },\n  interval: {\n    from: [1186],\n    serialize: returnArg,\n    parse: parseInterval,\n  },\n  json: {\n    to: 114,\n    from: [114, 3802],\n    parse: (x) => {\n      return JSON.parse(x);\n    },\n  },\n};\n\nexport const PostgresJsAdapter: DriverAdapter = {\n  manualPool: false,\n\n  errorClass: postgres.PostgresError,\n  errorFields: {\n    message: 'message',\n    severity: 'severity',\n    code: 'code',\n    detail: 'detail',\n    schema: 'schema_name',\n    table: 'table_name',\n    constraint: 'constraint_name',\n    hint: 'hint',\n    position: 'position',\n    where: 'where',\n    file: 'file',\n    line: 'line',\n    routine: 'routine',\n  },\n\n  configure(params: PostgresJsAdapterOptions): postgres.Sql {\n    const config: PostgresJsAdapterOptions = {\n      ...params,\n      types,\n    };\n\n    if (config.setConfig?.search_path) {\n      config.connection = {\n        ...config.connection,\n        search_path: config.setConfig.search_path,\n      };\n    }\n\n    let sql;\n    if (config.databaseURL) {\n      sql = postgres(config.databaseURL, config);\n    } else {\n      sql = postgres(config);\n    }\n\n    patchPostgresJsArrayParsers(sql);\n\n    return sql;\n  },\n\n  async queryClient<T = QueryResultRow>(\n    client: TransactionSql,\n    text: string,\n    values?: unknown[],\n    arraysMode?: boolean,\n    prepare?: true,\n  ): Promise<QueryResult<T>> {\n    let query = (\n      prepare\n        ? client.unsafe(text, values as never, { prepare: true })\n        : client.unsafe(text, values as never)\n    ) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n    if (arraysMode) query = query.values();\n\n    const result = await query;\n    if (result.constructor === Array) {\n      return (result as RawResult[]).map((res) =>\n        makePostgresJsResult(res, arraysMode),\n      ) as never;\n    } else {\n      return makePostgresJsResult(\n        result as RawResult,\n        arraysMode,\n      ) as QueryResult<T>;\n    }\n  },\n\n  borrow(client: postgres.Sql): Promise<postgres.ReservedSql> {\n    return client.reserve();\n  },\n\n  release(client: postgres.ReservedSql): void {\n    client.release();\n  },\n\n  begin<DriverClient, Result>(\n    client: postgres.Sql,\n    cb: (adapter: DriverClient) => Promise<Result>,\n    options?: string,\n  ): Promise<Result> {\n    let ok: boolean | undefined;\n    let result: unknown;\n\n    const fn = (sql: TransactionSql): Promise<Result> =>\n      cb(sql as DriverClient).then((res) => {\n        ok = true;\n        return (result = res);\n      });\n\n    return (options ? client.begin(options, fn) : client.begin(fn)).catch(\n      (err) => {\n        if (ok) return result;\n\n        throw err;\n      },\n    ) as never;\n  },\n\n  async savepoint<T>(\n    client: postgres.TransactionSql,\n    setClient: (client: postgres.TransactionSql) => 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    let result: T | undefined;\n    let failed = false;\n    try {\n      await client.savepoint(name, async (savepointClient) => {\n        setClient(savepointClient);\n        onSavepoint?.();\n        try {\n          result = await cb();\n          beforeRelease?.();\n        } catch (err) {\n          beforeRollback?.();\n          failed = true;\n          throw err;\n        }\n      });\n      onRelease?.();\n    } finally {\n      setClient(client);\n      if (failed) onRollback?.();\n    }\n\n    return result as T;\n  },\n\n  async hackySavepoint<T extends QueryResultRow>(\n    client: postgres.TransactionSql,\n    setClient: (client: postgres.TransactionSql) => 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    let resolve: () => void;\n    let reject: (err: unknown) => void;\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;\n    let resultReject: (err: unknown) => void;\n    const resultPromise = new Promise<QueryResult<T>>((res, rej) => {\n      resultResolve = res;\n      resultReject = rej;\n    });\n\n    let failed = false;\n    const savepointPromise = client\n      .savepoint<void>(state.name, async (savepointClient) => {\n        setClient(savepointClient);\n        onSavepoint?.();\n        try {\n          const res = await this.queryClient<T>(\n            savepointClient,\n            text,\n            values,\n            arraysMode,\n            prepare,\n          );\n          resultResolve(res as QueryResult<T>);\n\n          await promise;\n          beforeRelease?.();\n        } catch (err) {\n          resultReject(err);\n          beforeRollback?.();\n          failed = true;\n          throw err;\n        }\n      })\n      .then(() => onRelease?.())\n      .finally(() => {\n        setClient(client);\n        if (failed) onRollback?.();\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(client: postgres.Sql): Promise<void> {\n    return client.end();\n  },\n};\n\nconst makePostgresJsResult = (\n  result: RawResult,\n  arraysMode?: boolean,\n): QueryResult => {\n  return arraysMode\n    ? new PostgresJsArraysResult(result)\n    : new PostgresJsResult(result);\n};\n"],"mappings":"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"}