pqb 0.57.7 → 0.58.1

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,43 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var pg = require('pg');
4
- require('url');
5
- require('node:path');
6
- var promises = require('timers/promises');
7
4
  var pqb = require('pqb');
8
5
 
9
- const noop = () => {
10
- };
11
- const returnArg = (a) => a;
12
- const emptyObject = {};
13
-
14
- const setConnectRetryConfig = (adapter, config) => {
15
- adapter.connectRetryConfig = {
16
- attempts: config.attempts ?? 10,
17
- strategy: typeof config.strategy === "function" ? config.strategy : defaultConnectRetryStrategy(config.strategy ?? emptyObject)
18
- };
19
- };
20
- const wrapAdapterFnWithConnectRetry = (adapter, fn) => {
21
- return async function(...args) {
22
- let attempt = 1;
23
- for (; ; ) {
24
- try {
25
- return await fn.call(this, ...args);
26
- } catch (err) {
27
- const config = adapter.connectRetryConfig;
28
- if (!err || typeof err !== "object" || err.code !== "ECONNREFUSED" || !config || attempt >= config.attempts) {
29
- throw err;
30
- }
31
- await config.strategy(attempt, config.attempts);
32
- attempt++;
33
- }
34
- }
35
- };
36
- };
37
- const defaultConnectRetryStrategy = (param) => {
38
- return (attempt) => promises.setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));
39
- };
40
-
41
6
  const createDb = ({
42
7
  log,
43
8
  ...options
@@ -67,6 +32,9 @@ class NodePostgresAdapter {
67
32
  constructor(config) {
68
33
  this.config = config;
69
34
  this.errorClass = pg.DatabaseError;
35
+ this.pool = this.configure(config);
36
+ }
37
+ configure(config) {
70
38
  let schema = config.schema;
71
39
  if (config.databaseURL) {
72
40
  const url = new URL(config.databaseURL);
@@ -83,22 +51,26 @@ class NodePostgresAdapter {
83
51
  config.connectionString = config.databaseURL;
84
52
  }
85
53
  if (schema) this.schema = schema === "public" ? void 0 : schema;
86
- this.config = config;
87
- this.pool = new pg.Pool(config);
54
+ const pool = new pg.Pool(config);
88
55
  if (config.connectRetry) {
89
- setConnectRetryConfig(
56
+ pqb.setConnectRetryConfig(
90
57
  this,
91
- config.connectRetry === true ? emptyObject : config.connectRetry
58
+ config.connectRetry === true ? pqb.emptyObject : config.connectRetry
92
59
  );
93
- this.connect = wrapAdapterFnWithConnectRetry(
60
+ this.connect = pqb.wrapAdapterFnWithConnectRetry(
94
61
  this,
95
62
  () => this.pool.connect()
96
63
  );
97
64
  }
65
+ return pool;
98
66
  }
99
67
  getURL() {
100
68
  return this.config.databaseURL ? new URL(this.config.databaseURL) : void 0;
101
69
  }
70
+ async updateConfig(config) {
71
+ await this.close();
72
+ this.configure({ ...this.config, ...config });
73
+ }
102
74
  reconfigure(params) {
103
75
  const url = this.getURL();
104
76
  if (url) {
@@ -198,7 +170,7 @@ class NodePostgresAdapter {
198
170
  }
199
171
  const defaultTypesConfig = {
200
172
  getTypeParser(id) {
201
- return defaultTypeParsers[id] || returnArg;
173
+ return defaultTypeParsers[id] || pqb.returnArg;
202
174
  }
203
175
  };
204
176
  const setSearchPath = (client, schema) => {
@@ -245,7 +217,7 @@ const performQueryOnClient = async (client, text, values, rowMode, catchingSavep
245
217
  });
246
218
  }
247
219
  const promise = catchingSavepoint ? performQueryOnClientWithSavepoint(client, catchingSavepoint, params) : client.query(params);
248
- client.__lock = promise.catch(noop);
220
+ client.__lock = promise.catch(pqb.noop);
249
221
  return promise;
250
222
  };
251
223
  const performQueryOnClientWithSavepoint = (client, catchingSavepoint, params) => {
@@ -270,6 +242,9 @@ class NodePostgresTransactionAdapter {
270
242
  this.config = adapter.config;
271
243
  this.schema = adapter.schema;
272
244
  }
245
+ updateConfig(config) {
246
+ return this.adapter.updateConfig(config);
247
+ }
273
248
  reconfigure(params) {
274
249
  return this.adapter.reconfigure(params);
275
250
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node-postgres.js","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 // only has effect in a transaction\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 // only has effect in a transaction\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 ): Promise<QueryResult<T>> {\n return performQuery(this, text, values, undefined) 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 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":["setTimeout","createDbWithAdapter","DatabaseError","promise"],"mappings":"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"}
1
+ {"version":3,"file":"node-postgres.js","sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["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 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 this.pool = this.configure(config);\n }\n\n private configure(config: NodePostgresAdapterOptions): Pool {\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 const 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 return pool;\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n async updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n await this.close();\n this.configure({ ...this.config, ...config });\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, undefined) 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 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 updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n return this.adapter.updateConfig(config);\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":["createDbWithAdapter","DatabaseError","setConnectRetryConfig","emptyObject","wrapAdapterFnWithConnectRetry","returnArg","promise","noop"],"mappings":"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"}
@@ -1,40 +1,5 @@
1
1
  import pg, { DatabaseError } from 'pg';
2
- import 'url';
3
- import 'node:path';
4
- import { setTimeout } from 'timers/promises';
5
- import { createDbWithAdapter } from 'pqb';
6
-
7
- const noop = () => {
8
- };
9
- const returnArg = (a) => a;
10
- const emptyObject = {};
11
-
12
- const setConnectRetryConfig = (adapter, config) => {
13
- adapter.connectRetryConfig = {
14
- attempts: config.attempts ?? 10,
15
- strategy: typeof config.strategy === "function" ? config.strategy : defaultConnectRetryStrategy(config.strategy ?? emptyObject)
16
- };
17
- };
18
- const wrapAdapterFnWithConnectRetry = (adapter, fn) => {
19
- return async function(...args) {
20
- let attempt = 1;
21
- for (; ; ) {
22
- try {
23
- return await fn.call(this, ...args);
24
- } catch (err) {
25
- const config = adapter.connectRetryConfig;
26
- if (!err || typeof err !== "object" || err.code !== "ECONNREFUSED" || !config || attempt >= config.attempts) {
27
- throw err;
28
- }
29
- await config.strategy(attempt, config.attempts);
30
- attempt++;
31
- }
32
- }
33
- };
34
- };
35
- const defaultConnectRetryStrategy = (param) => {
36
- return (attempt) => setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));
37
- };
2
+ import { createDbWithAdapter, setConnectRetryConfig, emptyObject, wrapAdapterFnWithConnectRetry, noop, returnArg } from 'pqb';
38
3
 
39
4
  const createDb = ({
40
5
  log,
@@ -65,6 +30,9 @@ class NodePostgresAdapter {
65
30
  constructor(config) {
66
31
  this.config = config;
67
32
  this.errorClass = DatabaseError;
33
+ this.pool = this.configure(config);
34
+ }
35
+ configure(config) {
68
36
  let schema = config.schema;
69
37
  if (config.databaseURL) {
70
38
  const url = new URL(config.databaseURL);
@@ -81,8 +49,7 @@ class NodePostgresAdapter {
81
49
  config.connectionString = config.databaseURL;
82
50
  }
83
51
  if (schema) this.schema = schema === "public" ? void 0 : schema;
84
- this.config = config;
85
- this.pool = new pg.Pool(config);
52
+ const pool = new pg.Pool(config);
86
53
  if (config.connectRetry) {
87
54
  setConnectRetryConfig(
88
55
  this,
@@ -93,10 +60,15 @@ class NodePostgresAdapter {
93
60
  () => this.pool.connect()
94
61
  );
95
62
  }
63
+ return pool;
96
64
  }
97
65
  getURL() {
98
66
  return this.config.databaseURL ? new URL(this.config.databaseURL) : void 0;
99
67
  }
68
+ async updateConfig(config) {
69
+ await this.close();
70
+ this.configure({ ...this.config, ...config });
71
+ }
100
72
  reconfigure(params) {
101
73
  const url = this.getURL();
102
74
  if (url) {
@@ -268,6 +240,9 @@ class NodePostgresTransactionAdapter {
268
240
  this.config = adapter.config;
269
241
  this.schema = adapter.schema;
270
242
  }
243
+ updateConfig(config) {
244
+ return this.adapter.updateConfig(config);
245
+ }
271
246
  reconfigure(params) {
272
247
  return this.adapter.reconfigure(params);
273
248
  }
@@ -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 // only has effect in a transaction\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 // only has effect in a transaction\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 ): Promise<QueryResult<T>> {\n return performQuery(this, text, values, undefined) 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 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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"}
1
+ {"version":3,"file":"node-postgres.mjs","sources":["../src/adapters/node-postgres.ts"],"sourcesContent":["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 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 this.pool = this.configure(config);\n }\n\n private configure(config: NodePostgresAdapterOptions): Pool {\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 const 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 return pool;\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n async updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n await this.close();\n this.configure({ ...this.config, ...config });\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, undefined) 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 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 updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n return this.adapter.updateConfig(config);\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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"}