pqb 0.57.4 → 0.57.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"node-postgres.mjs","sources":["../src/core/utils.ts","../src/core/adapter.ts","../src/adapters/node-postgres.ts"],"sourcesContent":["import url from 'url';\nimport path from 'node:path';\n\nexport type UnionToIntersection<U> = (\n U extends any ? (x: U) => void : never\n) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(derivedCtor: any, constructors: any[]) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a) => `_${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) return b === null;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key]))\n return false;\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) return false;\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch (_) {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n","import { QueryBaseCommon } from './query/query';\nimport { emptyObject } from './utils';\nimport { setTimeout } from 'timers/promises';\nimport { QueryLogObject } from './log';\nimport { QueryError } from './query/errors';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T extends QueryResultRow = any> {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryArraysResult<R extends any[] = any[]> {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\n// Interface of a database adapter to use for different databases.\nexport interface AdapterBase {\n connectRetryConfig?: AdapterConfigConnectRetry;\n schema?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n assignError(to: QueryError, from: Error): void;\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase;\n\n getDatabase(): string;\n getUser(): string;\n getSchema(): string | undefined;\n getHost(): string;\n\n connect?(): Promise<unknown>;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>>;\n // make a query to get rows as array of column values\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>>;\n /**\n * Run a transaction\n *\n * @param options - optional transaction parameters\n * @param cb - callback will be called with a db client with a dedicated connection.\n */\n transaction<T>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<T>,\n ): Promise<T>;\n // close connection\n close(): Promise<void>;\n}\n\n// Wrapper type for transactions.\nexport interface TransactionState {\n // Database adapter that is connected to a currently running transaction.\n adapter: AdapterBase;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries inside a transaction.\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n}\n\n/**\n * Element of `afterCommit` transaction array. See {@link TransactionState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | QueryBaseCommon\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: QueryBaseCommon): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const setConnectRetryConfig = (\n adapter: AdapterBase,\n config: AdapterConfigConnectRetryParam,\n) => {\n adapter.connectRetryConfig = {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Fn extends (this: unknown, ...args: any[]) => Promise<unknown>,\n>(\n adapter: AdapterBase,\n fn: Fn,\n) => {\n return async function (...args) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this, ...args);\n } catch (err) {\n const config = adapter.connectRetryConfig;\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n !config ||\n attempt >= config.attempts\n ) {\n throw err;\n }\n\n await config.strategy(attempt, config.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n","import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n} from '../core';\nimport {\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n createDbWithAdapter,\n} from 'pqb';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new NodePostgresAdapter(options),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends AdapterConfigBase,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n schema?: string;\n databaseURL?: string;\n}\n\nexport type NodePostgresAdapterOptions = Omit<AdapterConfig, 'log'>;\n\nexport class NodePostgresAdapter implements AdapterBase {\n pool: Pool;\n schema?: string;\n errorClass = DatabaseError;\n\n constructor(public config: NodePostgresAdapterOptions) {\n let schema = config.schema;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!schema) {\n schema = url.searchParams.get('schema') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (schema) this.schema = schema === 'public' ? undefined : schema;\n\n this.config = config;\n this.pool = new pg.Pool(config);\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.connect = wrapAdapterFnWithConnectRetry(this, () =>\n this.pool.connect(),\n );\n }\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): NodePostgresAdapter {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.schema !== undefined) {\n url.searchParams.set('schema', params.schema);\n }\n\n return new NodePostgresAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new NodePostgresAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSchema(): string | undefined {\n return this.schema;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>> {\n return performQuery(this, text, values) as never;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>> {\n return performQuery(this, text, values, 'array') as never;\n }\n\n async transaction<Result>(\n options: string | undefined,\n cb: (adapter: NodePostgresTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n const client = await this.connect();\n try {\n await setSearchPath(client, this.schema);\n await performQueryOnClient(\n client,\n options ? 'BEGIN ' + options : 'BEGIN',\n );\n let result;\n try {\n result = await cb(new NodePostgresTransactionAdapter(this, client));\n } catch (err) {\n await performQueryOnClient(client, 'ROLLBACK');\n throw err;\n }\n await performQueryOnClient(client, 'COMMIT');\n return result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as DatabaseError;\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ninterface ConnectionSchema {\n connection: { schema?: string };\n}\n\nconst setSearchPath = (client: PoolClient, schema?: string) => {\n if ((client as unknown as ConnectionSchema).connection.schema !== schema) {\n (client as unknown as ConnectionSchema).connection.schema = schema;\n return client.query(`SET search_path = ${schema || 'public'}`);\n }\n return;\n};\n\nconst performQuery = async (\n adapter: NodePostgresAdapter,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n) => {\n const client = await adapter.connect();\n try {\n await setSearchPath(client, adapter.schema);\n return await performQueryOnClient(client, text, values, rowMode);\n } finally {\n client.release();\n }\n};\n\nconst performQueryOnClient = (\n client: PoolClient,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n) => {\n const params = {\n text,\n values,\n rowMode,\n types: defaultTypesConfig,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return client.query(params as any);\n};\n\nexport class NodePostgresTransactionAdapter implements AdapterBase {\n pool: Pool;\n config: PoolConfig;\n schema?: string;\n errorClass = DatabaseError;\n\n constructor(public adapter: NodePostgresAdapter, public client: PoolClient) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n this.schema = adapter.schema;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSchema(): string | undefined {\n return this.adapter.getSchema();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\n }\n\n async query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>> {\n return await performQueryOnClient(this.client, text, values);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>> {\n return await performQueryOnClient(this.client, text, values, 'array');\n }\n\n async transaction<Result>(\n _options: string | undefined,\n cb: (adapter: NodePostgresTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close() {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-postgres.mjs","sources":["../src/core/utils.ts","../src/core/adapter.ts","../src/adapters/node-postgres.ts"],"sourcesContent":["import url from 'url';\nimport path from 'node:path';\n\nexport type UnionToIntersection<U> = (\n U extends any ? (x: U) => void : never\n) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(derivedCtor: any, constructors: any[]) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a) => `_${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) return b === null;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key]))\n return false;\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) return false;\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch (_) {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n","import { QueryBaseCommon } from './query/query';\nimport { emptyObject } from './utils';\nimport { setTimeout } from 'timers/promises';\nimport { QueryLogObject } from './log';\nimport { QueryError } from './query/errors';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T extends QueryResultRow = any> {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryArraysResult<R extends any[] = any[]> {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\n// Interface of a database adapter to use for different databases.\nexport interface AdapterBase {\n connectRetryConfig?: AdapterConfigConnectRetry;\n schema?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n assignError(to: QueryError, from: Error): void;\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase;\n\n getDatabase(): string;\n getUser(): string;\n getSchema(): string | undefined;\n getHost(): string;\n\n connect?(): Promise<unknown>;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>>;\n // make a query to get rows as array of column values\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>>;\n /**\n * Run a transaction\n *\n * @param options - optional transaction parameters\n * @param cb - callback will be called with a db client with a dedicated connection.\n */\n transaction<T>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<T>,\n ): Promise<T>;\n // close connection\n close(): Promise<void>;\n}\n\n// Wrapper type for transactions.\nexport interface TransactionState {\n // Database adapter that is connected to a currently running transaction.\n adapter: AdapterBase;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries inside a transaction.\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n // sequential number for catching save-points\n catchI?: number;\n}\n\n/**\n * Element of `afterCommit` transaction array. See {@link TransactionState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | QueryBaseCommon\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: QueryBaseCommon): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const setConnectRetryConfig = (\n adapter: AdapterBase,\n config: AdapterConfigConnectRetryParam,\n) => {\n adapter.connectRetryConfig = {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Fn extends (this: unknown, ...args: any[]) => Promise<unknown>,\n>(\n adapter: AdapterBase,\n fn: Fn,\n) => {\n return async function (...args) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this, ...args);\n } catch (err) {\n const config = adapter.connectRetryConfig;\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n !config ||\n attempt >= config.attempts\n ) {\n throw err;\n }\n\n await config.strategy(attempt, config.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n","import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n noop,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n} from '../core';\nimport {\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n createDbWithAdapter,\n} from 'pqb';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new NodePostgresAdapter(options),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends AdapterConfigBase,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n schema?: string;\n databaseURL?: string;\n}\n\nexport type NodePostgresAdapterOptions = Omit<AdapterConfig, 'log'>;\n\nexport class NodePostgresAdapter implements AdapterBase {\n pool: Pool;\n schema?: string;\n errorClass = DatabaseError;\n\n constructor(public config: NodePostgresAdapterOptions) {\n let schema = config.schema;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!schema) {\n schema = url.searchParams.get('schema') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (schema) this.schema = schema === 'public' ? undefined : schema;\n\n this.config = config;\n this.pool = new pg.Pool(config);\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.connect = wrapAdapterFnWithConnectRetry(this, () =>\n this.pool.connect(),\n );\n }\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): NodePostgresAdapter {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.schema !== undefined) {\n url.searchParams.set('schema', params.schema);\n }\n\n return new NodePostgresAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new NodePostgresAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSchema(): string | undefined {\n return this.schema;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>> {\n return performQuery(\n this,\n text,\n values,\n undefined,\n catchingSavepoint,\n ) as never;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>> {\n return performQuery(\n this,\n text,\n values,\n 'array',\n catchingSavepoint,\n ) as never;\n }\n\n async transaction<Result>(\n options: string | undefined,\n cb: (adapter: NodePostgresTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n const client = await this.connect();\n try {\n await setSearchPath(client, this.schema);\n await performQueryOnClient(\n client,\n options ? 'BEGIN ' + options : 'BEGIN',\n );\n let result;\n try {\n result = await cb(new NodePostgresTransactionAdapter(this, client));\n } catch (err) {\n await performQueryOnClient(client, 'ROLLBACK');\n throw err;\n }\n await performQueryOnClient(client, 'COMMIT');\n return result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as DatabaseError;\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ninterface ConnectionSchema {\n connection: { schema?: string };\n}\n\nconst setSearchPath = (client: PoolClient, schema?: string) => {\n if ((client as unknown as ConnectionSchema).connection.schema !== schema) {\n (client as unknown as ConnectionSchema).connection.schema = schema;\n return client.query(`SET search_path = ${schema || 'public'}`);\n }\n return;\n};\n\nconst performQuery = async (\n adapter: NodePostgresAdapter,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n catchingSavepoint?: string,\n) => {\n const client = await adapter.connect();\n try {\n await setSearchPath(client, adapter.schema);\n return await performQueryOnClient(\n client,\n text,\n values,\n rowMode,\n catchingSavepoint,\n );\n } finally {\n client.release();\n }\n};\n\nconst performQueryOnClient = async (\n client: PoolClient,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n catchingSavepoint?: string,\n) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\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 = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise = catchingSavepoint\n ? performQueryOnClientWithSavepoint(client, catchingSavepoint, params)\n : client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise = catchingSavepoint\n ? performQueryOnClientWithSavepoint(client, catchingSavepoint, params)\n : client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst performQueryOnClientWithSavepoint = (\n client: PoolClient,\n catchingSavepoint: string,\n params: unknown,\n) => {\n return client.query(`SAVEPOINT \"${catchingSavepoint}\"`).then(async () => {\n let result;\n try {\n result = await client.query(params as never);\n } catch (err) {\n await client.query(`ROLLBACK TO SAVEPOINT \"${catchingSavepoint}\"`);\n throw err;\n }\n await client.query(`RELEASE SAVEPOINT \"${catchingSavepoint}\"`);\n return result;\n });\n};\n\nexport class NodePostgresTransactionAdapter implements AdapterBase {\n pool: Pool;\n config: PoolConfig;\n schema?: string;\n errorClass = DatabaseError;\n\n constructor(public adapter: NodePostgresAdapter, public client: PoolClient) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n this.schema = adapter.schema;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSchema(): string | undefined {\n return this.adapter.getSchema();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\n }\n\n async query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>> {\n return await performQueryOnClient(\n this.client,\n text,\n values,\n undefined,\n catchingSavepoint,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>> {\n return await performQueryOnClient(\n this.client,\n text,\n values,\n 'array',\n catchingSavepoint,\n );\n }\n\n async transaction<Result>(\n _options: string | undefined,\n cb: (adapter: NodePostgresTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close() {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":["promise"],"mappings":"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"}
@@ -1044,8 +1044,8 @@ interface AdapterBase {
1044
1044
  getSchema(): string | undefined;
1045
1045
  getHost(): string;
1046
1046
  connect?(): Promise<unknown>;
1047
- query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[]): Promise<QueryResult<T>>;
1048
- arrays<R extends any[] = any[]>(text: string, values?: unknown[]): Promise<QueryArraysResult<R>>;
1047
+ query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryResult<T>>;
1048
+ arrays<R extends any[] = any[]>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryArraysResult<R>>;
1049
1049
  /**
1050
1050
  * Run a transaction
1051
1051
  *
@@ -1061,6 +1061,7 @@ interface TransactionState {
1061
1061
  afterCommit?: TransactionAfterCommitHook[];
1062
1062
  log?: QueryLogObject;
1063
1063
  testTransactionCount?: number;
1064
+ catchI?: number;
1064
1065
  }
1065
1066
  /**
1066
1067
  * Element of `afterCommit` transaction array. See {@link TransactionState.afterCommit}.
@@ -1097,8 +1098,8 @@ declare class PostgresJsAdapter implements AdapterBase {
1097
1098
  getUser(): string;
1098
1099
  getSchema(): string | undefined;
1099
1100
  getHost(): string;
1100
- query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[]): Promise<QueryResult<T>>;
1101
- arrays<R extends any[] = any[]>(text: string, values?: unknown[]): Promise<QueryArraysResult<R>>;
1101
+ query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryResult<T>>;
1102
+ arrays<R extends any[] = any[]>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryArraysResult<R>>;
1102
1103
  transaction<Result>(options: string | undefined, cb: (adapter: AdapterBase) => Promise<Result>): Promise<Result>;
1103
1104
  close(): Promise<void>;
1104
1105
  assignError(to: QueryError, dbError: Error$1): void;
@@ -1118,8 +1119,8 @@ declare class PostgresJsTransactionAdapter implements AdapterBase {
1118
1119
  getUser(): string;
1119
1120
  getSchema(): string | undefined;
1120
1121
  getHost(): string;
1121
- query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[]): Promise<QueryResult<T>>;
1122
- arrays<R extends any[] = any[]>(text: string, values?: unknown[]): Promise<QueryArraysResult<R>>;
1122
+ query<T extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryResult<T>>;
1123
+ arrays<R extends any[] = any[]>(text: string, values?: unknown[], catchingSavepoint?: string): Promise<QueryArraysResult<R>>;
1123
1124
  transaction<Result>(_options: string | undefined, cb: (adapter: PostgresJsTransactionAdapter) => Promise<Result>): Promise<Result>;
1124
1125
  close(): Promise<void>;
1125
1126
  assignError(to: QueryError, from: Error$1): void;
@@ -177,19 +177,30 @@ class PostgresJsAdapter {
177
177
  const url = this.getURL();
178
178
  return url ? url.hostname : this.config.host;
179
179
  }
180
- query(text, values) {
181
- return query(this.sql, text, values);
180
+ query(text, values, catchingSavepoint) {
181
+ return query(this.sql, text, values, catchingSavepoint);
182
182
  }
183
- arrays(text, values) {
184
- return arrays(this.sql, text, values);
183
+ arrays(text, values, catchingSavepoint) {
184
+ return arrays(this.sql, text, values, catchingSavepoint);
185
185
  }
186
186
  async transaction(options, cb) {
187
- return options ? this.sql.begin(
187
+ let ok;
188
+ let result;
189
+ return (options ? this.sql.begin(
188
190
  options,
189
- (sql) => cb(new PostgresJsTransactionAdapter(this, sql))
191
+ (sql) => cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {
192
+ ok = true;
193
+ return result = res;
194
+ })
190
195
  ) : this.sql.begin(
191
- (sql) => cb(new PostgresJsTransactionAdapter(this, sql))
192
- );
196
+ (sql) => cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {
197
+ ok = true;
198
+ return result = res;
199
+ })
200
+ )).catch((err) => {
201
+ if (ok) return result;
202
+ throw err;
203
+ });
193
204
  }
194
205
  close() {
195
206
  return this.sql.end();
@@ -211,11 +222,28 @@ class PostgresJsAdapter {
211
222
  to.routine = from.routine;
212
223
  }
213
224
  }
214
- const query = (sql, text, values) => {
215
- return sql.unsafe(text, values).then(wrapResult);
225
+ const query = (sql, text, values, catchingSavepoint, arrays2) => {
226
+ let query2 = sql.unsafe(text, values);
227
+ if (arrays2) query2 = query2.values();
228
+ if (catchingSavepoint) {
229
+ return Promise.all([
230
+ sql.unsafe(`SAVEPOINT "${catchingSavepoint}"`),
231
+ query2,
232
+ sql.unsafe(`RELEASE SAVEPOINT "${catchingSavepoint}"`)
233
+ ]).then(
234
+ (results) => {
235
+ return wrapResult(results[1]);
236
+ },
237
+ (err) => sql.unsafe(`ROLLBACK TO SAVEPOINT "${catchingSavepoint}"`).then(() => {
238
+ throw err;
239
+ })
240
+ );
241
+ } else {
242
+ return query2.then(wrapResult);
243
+ }
216
244
  };
217
- const arrays = (sql, text, values) => {
218
- return sql.unsafe(text, values).values().then(wrapResult);
245
+ const arrays = (sql, text, values, catchingSavepoint) => {
246
+ return query(sql, text, values, catchingSavepoint, true);
219
247
  };
220
248
  class PostgresJsTransactionAdapter {
221
249
  constructor(adapter, sql) {
@@ -238,12 +266,12 @@ class PostgresJsTransactionAdapter {
238
266
  getHost() {
239
267
  return this.adapter.getHost();
240
268
  }
241
- query(text, values) {
242
- return query(this.sql, text, values);
269
+ query(text, values, catchingSavepoint) {
270
+ return query(this.sql, text, values, catchingSavepoint);
243
271
  }
244
272
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
245
- arrays(text, values) {
246
- return arrays(this.sql, text, values);
273
+ arrays(text, values, catchingSavepoint) {
274
+ return arrays(this.sql, text, values, catchingSavepoint);
247
275
  }
248
276
  async transaction(_options, cb) {
249
277
  return await cb(this);
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-js.js","sources":["../src/core/utils.ts","../src/core/adapter.ts","../src/adapters/postgres-js.ts"],"sourcesContent":["import url from 'url';\nimport path from 'node:path';\n\nexport type UnionToIntersection<U> = (\n U extends any ? (x: U) => void : never\n) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(derivedCtor: any, constructors: any[]) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a) => `_${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) return b === null;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key]))\n return false;\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) return false;\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch (_) {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n","import { QueryBaseCommon } from './query/query';\nimport { emptyObject } from './utils';\nimport { setTimeout } from 'timers/promises';\nimport { QueryLogObject } from './log';\nimport { QueryError } from './query/errors';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T extends QueryResultRow = any> {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryArraysResult<R extends any[] = any[]> {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\n// Interface of a database adapter to use for different databases.\nexport interface AdapterBase {\n connectRetryConfig?: AdapterConfigConnectRetry;\n schema?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n assignError(to: QueryError, from: Error): void;\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase;\n\n getDatabase(): string;\n getUser(): string;\n getSchema(): string | undefined;\n getHost(): string;\n\n connect?(): Promise<unknown>;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>>;\n // make a query to get rows as array of column values\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>>;\n /**\n * Run a transaction\n *\n * @param options - optional transaction parameters\n * @param cb - callback will be called with a db client with a dedicated connection.\n */\n transaction<T>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<T>,\n ): Promise<T>;\n // close connection\n close(): Promise<void>;\n}\n\n// Wrapper type for transactions.\nexport interface TransactionState {\n // Database adapter that is connected to a currently running transaction.\n adapter: AdapterBase;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries inside a transaction.\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n}\n\n/**\n * Element of `afterCommit` transaction array. See {@link TransactionState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | QueryBaseCommon\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: QueryBaseCommon): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const setConnectRetryConfig = (\n adapter: AdapterBase,\n config: AdapterConfigConnectRetryParam,\n) => {\n adapter.connectRetryConfig = {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Fn extends (this: unknown, ...args: any[]) => Promise<unknown>,\n>(\n adapter: AdapterBase,\n fn: Fn,\n) => {\n return async function (...args) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this, ...args);\n } catch (err) {\n const config = adapter.connectRetryConfig;\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n !config ||\n attempt >= config.attempts\n ) {\n throw err;\n }\n\n await config.strategy(attempt, config.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n","import {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n} from '../core';\nimport postgres, { Error, Row, RowList } from 'postgres';\nimport {\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n createDbWithAdapter,\n DbResult,\n} from 'pqb';\n\nexport interface CreatePostgresJsDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n> extends PostgresJsAdapterOptions,\n 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 PostgresJsAdapter(options as never),\n });\n};\n\nexport interface PostgresJsAdapterOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extends postgres.Options<any>,\n AdapterConfigBase {\n databaseURL?: string;\n schema?: string;\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\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst wrapResult = (result: MaybeArray<RawResult>): QueryArraysResult<any> => {\n if (result.constructor === Array) {\n return (result as RawResult[]).map(\n (res) => new PostgresJsResult(res),\n ) as never;\n } else {\n return new PostgresJsResult(result as RawResult);\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 // omit parse, let bytea return a string, so it remains consistent with when it's selected via JSON\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(str: string) {\n const [years, , months, , days, , time] = str.split(' ');\n const [hours, minutes, seconds] = time.split(':');\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? Number(hours) : 0,\n minutes: minutes ? Number(minutes) : 0,\n seconds: seconds ? Number(seconds) : 0,\n };\n },\n },\n // overrides the built-in json type to not serialize it, because it incorrectly serializes\n json: {\n to: 114,\n from: [114, 3802],\n serialize: returnArg,\n parse: (x) => {\n return JSON.parse(x);\n },\n },\n};\n\nexport class PostgresJsAdapter implements AdapterBase {\n sql: postgres.Sql;\n schema?: string;\n config: PostgresJsAdapterOptions;\n errorClass = postgres.PostgresError;\n\n constructor(config: PostgresJsAdapterOptions) {\n this.config = { ...config, types };\n\n this.schema = config.schema;\n if (this.schema) {\n this.config.connection = {\n ...config.connection,\n search_path: this.schema,\n };\n }\n\n if (this.config.databaseURL) {\n const urlString = this.config.databaseURL;\n const url = new URL(urlString);\n\n const ssl = url.searchParams.get('ssl');\n if (ssl === 'false' || ssl === 'true') {\n this.config.ssl = ssl === 'true';\n }\n\n const schema = url.searchParams.get('schema');\n if (schema) {\n this.schema = schema;\n url.searchParams.delete('schema');\n this.config.connection = {\n ...config.connection,\n search_path: schema,\n };\n }\n\n this.sql = postgres(url.toString(), this.config);\n } else {\n this.sql = postgres(this.config);\n }\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.query = wrapAdapterFnWithConnectRetry(this, this.query);\n this.arrays = wrapAdapterFnWithConnectRetry(this, this.arrays);\n }\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.schema !== undefined) {\n url.searchParams.set('schema', params.schema);\n }\n\n return new PostgresJsAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new PostgresJsAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSchema(): string | undefined {\n return this.schema;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>> {\n return query(this.sql, text, values);\n }\n\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>> {\n return arrays(this.sql, text, values);\n }\n\n async transaction<Result>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<Result>,\n ): Promise<Result> {\n return (\n options\n ? this.sql.begin(options, (sql) =>\n cb(new PostgresJsTransactionAdapter(this, sql)),\n )\n : this.sql.begin((sql) =>\n cb(new PostgresJsTransactionAdapter(this, sql)),\n )\n ) as never;\n }\n\n close(): Promise<void> {\n return this.sql.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as postgres.PostgresError;\n to.message = from.message;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.schema = from.schema_name;\n to.table = from.table_name;\n to.constraint = from.constraint_name;\n to.hint = from.hint;\n to.position = from.position;\n to.where = from.where;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst query = <T extends QueryResultRow = QueryResultRow>(\n sql: postgres.Sql,\n text: string,\n values?: unknown[],\n): Promise<QueryResult<T>> => {\n return sql.unsafe(text, values as never).then(wrapResult);\n};\n\nconst arrays = <R extends any[] = any[]>(\n sql: postgres.Sql,\n text: string,\n values?: unknown[],\n): Promise<QueryArraysResult<R>> => {\n return sql\n .unsafe(text, values as never)\n .values()\n .then(wrapResult);\n};\n\nexport class PostgresJsTransactionAdapter implements AdapterBase {\n errorClass = postgres.PostgresError;\n\n constructor(public adapter: PostgresJsAdapter, public sql: postgres.Sql) {}\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSchema(): string | undefined {\n return this.adapter.schema;\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>> {\n return query(this.sql, text, values);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>> {\n return arrays(this.sql, text, values);\n }\n\n async transaction<Result>(\n _options: string | undefined,\n cb: (adapter: PostgresJsTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close(): Promise<void> {\n return this.sql.end();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":["setTimeout","createDbWithAdapter"],"mappings":"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"}
1
+ {"version":3,"file":"postgres-js.js","sources":["../src/core/utils.ts","../src/core/adapter.ts","../src/adapters/postgres-js.ts"],"sourcesContent":["import url from 'url';\nimport path from 'node:path';\n\nexport type UnionToIntersection<U> = (\n U extends any ? (x: U) => void : never\n) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(derivedCtor: any, constructors: any[]) {\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||\n Object.create(null),\n );\n });\n });\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a) => `_${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) return b === null;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key]))\n return false;\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) return false;\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch (_) {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n","import { QueryBaseCommon } from './query/query';\nimport { emptyObject } from './utils';\nimport { setTimeout } from 'timers/promises';\nimport { QueryLogObject } from './log';\nimport { QueryError } from './query/errors';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T extends QueryResultRow = any> {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryArraysResult<R extends any[] = any[]> {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\n// Interface of a database adapter to use for different databases.\nexport interface AdapterBase {\n connectRetryConfig?: AdapterConfigConnectRetry;\n schema?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n assignError(to: QueryError, from: Error): void;\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase;\n\n getDatabase(): string;\n getUser(): string;\n getSchema(): string | undefined;\n getHost(): string;\n\n connect?(): Promise<unknown>;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>>;\n // make a query to get rows as array of column values\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>>;\n /**\n * Run a transaction\n *\n * @param options - optional transaction parameters\n * @param cb - callback will be called with a db client with a dedicated connection.\n */\n transaction<T>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<T>,\n ): Promise<T>;\n // close connection\n close(): Promise<void>;\n}\n\n// Wrapper type for transactions.\nexport interface TransactionState {\n // Database adapter that is connected to a currently running transaction.\n adapter: AdapterBase;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries inside a transaction.\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n // sequential number for catching save-points\n catchI?: number;\n}\n\n/**\n * Element of `afterCommit` transaction array. See {@link TransactionState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | QueryBaseCommon\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: QueryBaseCommon): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const setConnectRetryConfig = (\n adapter: AdapterBase,\n config: AdapterConfigConnectRetryParam,\n) => {\n adapter.connectRetryConfig = {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Fn extends (this: unknown, ...args: any[]) => Promise<unknown>,\n>(\n adapter: AdapterBase,\n fn: Fn,\n) => {\n return async function (...args) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this, ...args);\n } catch (err) {\n const config = adapter.connectRetryConfig;\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n !config ||\n attempt >= config.attempts\n ) {\n throw err;\n }\n\n await config.strategy(attempt, config.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n","import {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n} from '../core';\nimport postgres, { Error, Row, RowList } from 'postgres';\nimport {\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n createDbWithAdapter,\n DbResult,\n} from 'pqb';\n\nexport interface CreatePostgresJsDbOptions<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n> extends PostgresJsAdapterOptions,\n 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 PostgresJsAdapter(options as never),\n });\n};\n\nexport interface PostgresJsAdapterOptions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extends postgres.Options<any>,\n AdapterConfigBase {\n databaseURL?: string;\n schema?: string;\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\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst wrapResult = (result: MaybeArray<RawResult>): QueryArraysResult<any> => {\n if (result.constructor === Array) {\n return (result as RawResult[]).map(\n (res) => new PostgresJsResult(res),\n ) as never;\n } else {\n return new PostgresJsResult(result as RawResult);\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 // omit parse, let bytea return a string, so it remains consistent with when it's selected via JSON\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(str: string) {\n const [years, , months, , days, , time] = str.split(' ');\n const [hours, minutes, seconds] = time.split(':');\n\n return {\n years: years ? Number(years) : 0,\n months: months ? Number(months) : 0,\n days: days ? Number(days) : 0,\n hours: hours ? Number(hours) : 0,\n minutes: minutes ? Number(minutes) : 0,\n seconds: seconds ? Number(seconds) : 0,\n };\n },\n },\n // overrides the built-in json type to not serialize it, because it incorrectly serializes\n json: {\n to: 114,\n from: [114, 3802],\n serialize: returnArg,\n parse: (x) => {\n return JSON.parse(x);\n },\n },\n};\n\nexport class PostgresJsAdapter implements AdapterBase {\n sql: postgres.Sql;\n schema?: string;\n config: PostgresJsAdapterOptions;\n errorClass = postgres.PostgresError;\n\n constructor(config: PostgresJsAdapterOptions) {\n this.config = { ...config, types };\n\n this.schema = config.schema;\n if (this.schema) {\n this.config.connection = {\n ...config.connection,\n search_path: this.schema,\n };\n }\n\n if (this.config.databaseURL) {\n const urlString = this.config.databaseURL;\n const url = new URL(urlString);\n\n const ssl = url.searchParams.get('ssl');\n if (ssl === 'false' || ssl === 'true') {\n this.config.ssl = ssl === 'true';\n }\n\n const schema = url.searchParams.get('schema');\n if (schema) {\n this.schema = schema;\n url.searchParams.delete('schema');\n this.config.connection = {\n ...config.connection,\n search_path: schema,\n };\n }\n\n this.sql = postgres(url.toString(), this.config);\n } else {\n this.sql = postgres(this.config);\n }\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.query = wrapAdapterFnWithConnectRetry(this, this.query);\n this.arrays = wrapAdapterFnWithConnectRetry(this, this.arrays);\n }\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.schema !== undefined) {\n url.searchParams.set('schema', params.schema);\n }\n\n return new PostgresJsAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new PostgresJsAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSchema(): string | undefined {\n return this.schema;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>> {\n return query(this.sql, text, values, catchingSavepoint);\n }\n\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>> {\n return arrays(this.sql, text, values, catchingSavepoint);\n }\n\n async transaction<Result>(\n options: string | undefined,\n cb: (adapter: AdapterBase) => Promise<Result>,\n ): Promise<Result> {\n let ok: boolean | undefined;\n let result: unknown;\n\n return (\n options\n ? this.sql.begin(options, (sql) =>\n cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {\n ok = true;\n return (result = res);\n }),\n )\n : this.sql.begin((sql) =>\n cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {\n ok = true;\n return (result = res);\n }),\n )\n ).catch((err) => {\n if (ok) return result;\n\n throw err;\n }) as never;\n }\n\n close(): Promise<void> {\n return this.sql.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as postgres.PostgresError;\n to.message = from.message;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.schema = from.schema_name;\n to.table = from.table_name;\n to.constraint = from.constraint_name;\n to.hint = from.hint;\n to.position = from.position;\n to.where = from.where;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst query = <T extends QueryResultRow = QueryResultRow>(\n sql: postgres.Sql,\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n arrays?: boolean,\n): Promise<QueryResult<T>> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let query = sql.unsafe(text, values as never) as any;\n\n if (arrays) query = query.values();\n\n if (catchingSavepoint) {\n return Promise.all([\n sql.unsafe(`SAVEPOINT \"${catchingSavepoint}\"`),\n query,\n sql.unsafe(`RELEASE SAVEPOINT \"${catchingSavepoint}\"`),\n ]).then(\n (results: RawResult[]) => {\n return wrapResult(results[1]);\n },\n (err) =>\n sql.unsafe(`ROLLBACK TO SAVEPOINT \"${catchingSavepoint}\"`).then(() => {\n throw err;\n }),\n );\n } else {\n return query.then(wrapResult);\n }\n};\n\nconst arrays = <R extends any[] = any[]>(\n sql: postgres.Sql,\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n): Promise<QueryArraysResult<R>> => {\n return query(sql, text, values, catchingSavepoint, true);\n};\n\nexport class PostgresJsTransactionAdapter implements AdapterBase {\n errorClass = postgres.PostgresError;\n\n constructor(public adapter: PostgresJsAdapter, public sql: postgres.Sql) {}\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n schema?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSchema(): string | undefined {\n return this.adapter.schema;\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryResult<T>> {\n return query(this.sql, text, values, catchingSavepoint);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n catchingSavepoint?: string,\n ): Promise<QueryArraysResult<R>> {\n return arrays(this.sql, text, values, catchingSavepoint);\n }\n\n async transaction<Result>(\n _options: string | undefined,\n cb: (adapter: PostgresJsTransactionAdapter) => Promise<Result>,\n ): Promise<Result> {\n return await cb(this);\n }\n\n close(): Promise<void> {\n return this.sql.end();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":["setTimeout","createDbWithAdapter","arrays","query"],"mappings":"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"}
@@ -175,19 +175,30 @@ class PostgresJsAdapter {
175
175
  const url = this.getURL();
176
176
  return url ? url.hostname : this.config.host;
177
177
  }
178
- query(text, values) {
179
- return query(this.sql, text, values);
178
+ query(text, values, catchingSavepoint) {
179
+ return query(this.sql, text, values, catchingSavepoint);
180
180
  }
181
- arrays(text, values) {
182
- return arrays(this.sql, text, values);
181
+ arrays(text, values, catchingSavepoint) {
182
+ return arrays(this.sql, text, values, catchingSavepoint);
183
183
  }
184
184
  async transaction(options, cb) {
185
- return options ? this.sql.begin(
185
+ let ok;
186
+ let result;
187
+ return (options ? this.sql.begin(
186
188
  options,
187
- (sql) => cb(new PostgresJsTransactionAdapter(this, sql))
189
+ (sql) => cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {
190
+ ok = true;
191
+ return result = res;
192
+ })
188
193
  ) : this.sql.begin(
189
- (sql) => cb(new PostgresJsTransactionAdapter(this, sql))
190
- );
194
+ (sql) => cb(new PostgresJsTransactionAdapter(this, sql)).then((res) => {
195
+ ok = true;
196
+ return result = res;
197
+ })
198
+ )).catch((err) => {
199
+ if (ok) return result;
200
+ throw err;
201
+ });
191
202
  }
192
203
  close() {
193
204
  return this.sql.end();
@@ -209,11 +220,28 @@ class PostgresJsAdapter {
209
220
  to.routine = from.routine;
210
221
  }
211
222
  }
212
- const query = (sql, text, values) => {
213
- return sql.unsafe(text, values).then(wrapResult);
223
+ const query = (sql, text, values, catchingSavepoint, arrays2) => {
224
+ let query2 = sql.unsafe(text, values);
225
+ if (arrays2) query2 = query2.values();
226
+ if (catchingSavepoint) {
227
+ return Promise.all([
228
+ sql.unsafe(`SAVEPOINT "${catchingSavepoint}"`),
229
+ query2,
230
+ sql.unsafe(`RELEASE SAVEPOINT "${catchingSavepoint}"`)
231
+ ]).then(
232
+ (results) => {
233
+ return wrapResult(results[1]);
234
+ },
235
+ (err) => sql.unsafe(`ROLLBACK TO SAVEPOINT "${catchingSavepoint}"`).then(() => {
236
+ throw err;
237
+ })
238
+ );
239
+ } else {
240
+ return query2.then(wrapResult);
241
+ }
214
242
  };
215
- const arrays = (sql, text, values) => {
216
- return sql.unsafe(text, values).values().then(wrapResult);
243
+ const arrays = (sql, text, values, catchingSavepoint) => {
244
+ return query(sql, text, values, catchingSavepoint, true);
217
245
  };
218
246
  class PostgresJsTransactionAdapter {
219
247
  constructor(adapter, sql) {
@@ -236,12 +264,12 @@ class PostgresJsTransactionAdapter {
236
264
  getHost() {
237
265
  return this.adapter.getHost();
238
266
  }
239
- query(text, values) {
240
- return query(this.sql, text, values);
267
+ query(text, values, catchingSavepoint) {
268
+ return query(this.sql, text, values, catchingSavepoint);
241
269
  }
242
270
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
- arrays(text, values) {
244
- return arrays(this.sql, text, values);
271
+ arrays(text, values, catchingSavepoint) {
272
+ return arrays(this.sql, text, values, catchingSavepoint);
245
273
  }
246
274
  async transaction(_options, cb) {
247
275
  return await cb(this);