pqb 0.57.7 → 0.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7686 -7532
- package/dist/index.js +9197 -8893
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8360 -8067
- package/dist/index.mjs.map +1 -1
- package/dist/node-postgres.d.ts +5 -1074
- package/dist/node-postgres.js +17 -42
- package/dist/node-postgres.js.map +1 -1
- package/dist/node-postgres.mjs +13 -38
- package/dist/node-postgres.mjs.map +1 -1
- package/dist/postgres-js.d.ts +8 -1077
- package/dist/postgres-js.js +21 -42
- package/dist/postgres-js.js.map +1 -1
- package/dist/postgres-js.mjs +15 -36
- package/dist/postgres-js.mjs.map +1 -1
- package/package.json +3 -3
package/dist/postgres-js.js
CHANGED
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
require('url');
|
|
4
|
-
require('node:path');
|
|
5
|
-
var promises = require('timers/promises');
|
|
6
3
|
var postgres = require('postgres');
|
|
7
4
|
var pqb = require('pqb');
|
|
8
5
|
|
|
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) => promises.setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));
|
|
37
|
-
};
|
|
38
|
-
|
|
39
6
|
const createDb = (options) => {
|
|
40
7
|
return pqb.createDbWithAdapter({
|
|
41
8
|
...options,
|
|
@@ -68,11 +35,11 @@ const types = {
|
|
|
68
35
|
dateAndTimestampAsStrings: {
|
|
69
36
|
to: 25,
|
|
70
37
|
from: [1082, 1114, 1184],
|
|
71
|
-
parse: returnArg
|
|
38
|
+
parse: pqb.returnArg
|
|
72
39
|
},
|
|
73
40
|
interval: {
|
|
74
41
|
from: [1186],
|
|
75
|
-
serialize: returnArg,
|
|
42
|
+
serialize: pqb.returnArg,
|
|
76
43
|
parse(str) {
|
|
77
44
|
const [years, , months, , days, , time] = str.split(" ");
|
|
78
45
|
const [hours, minutes, seconds] = time.split(":");
|
|
@@ -90,7 +57,7 @@ const types = {
|
|
|
90
57
|
json: {
|
|
91
58
|
to: 114,
|
|
92
59
|
from: [114, 3802],
|
|
93
|
-
serialize: returnArg,
|
|
60
|
+
serialize: pqb.returnArg,
|
|
94
61
|
parse: (x) => {
|
|
95
62
|
return JSON.parse(x);
|
|
96
63
|
}
|
|
@@ -100,6 +67,9 @@ class PostgresJsAdapter {
|
|
|
100
67
|
constructor(config) {
|
|
101
68
|
this.errorClass = postgres.PostgresError;
|
|
102
69
|
this.config = { ...config, types };
|
|
70
|
+
this.sql = this.configure(config);
|
|
71
|
+
}
|
|
72
|
+
configure(config) {
|
|
103
73
|
this.schema = config.schema;
|
|
104
74
|
if (this.schema) {
|
|
105
75
|
this.config.connection = {
|
|
@@ -107,6 +77,7 @@ class PostgresJsAdapter {
|
|
|
107
77
|
search_path: this.schema
|
|
108
78
|
};
|
|
109
79
|
}
|
|
80
|
+
let sql;
|
|
110
81
|
if (this.config.databaseURL) {
|
|
111
82
|
const urlString = this.config.databaseURL;
|
|
112
83
|
const url = new URL(urlString);
|
|
@@ -123,22 +94,27 @@ class PostgresJsAdapter {
|
|
|
123
94
|
search_path: schema
|
|
124
95
|
};
|
|
125
96
|
}
|
|
126
|
-
|
|
97
|
+
sql = postgres(url.toString(), this.config);
|
|
127
98
|
} else {
|
|
128
|
-
|
|
99
|
+
sql = postgres(this.config);
|
|
129
100
|
}
|
|
130
101
|
if (config.connectRetry) {
|
|
131
|
-
setConnectRetryConfig(
|
|
102
|
+
pqb.setConnectRetryConfig(
|
|
132
103
|
this,
|
|
133
|
-
config.connectRetry === true ? emptyObject : config.connectRetry
|
|
104
|
+
config.connectRetry === true ? pqb.emptyObject : config.connectRetry
|
|
134
105
|
);
|
|
135
|
-
this.query = wrapAdapterFnWithConnectRetry(this, this.query);
|
|
136
|
-
this.arrays = wrapAdapterFnWithConnectRetry(this, this.arrays);
|
|
106
|
+
this.query = pqb.wrapAdapterFnWithConnectRetry(this, this.query);
|
|
107
|
+
this.arrays = pqb.wrapAdapterFnWithConnectRetry(this, this.arrays);
|
|
137
108
|
}
|
|
109
|
+
return sql;
|
|
138
110
|
}
|
|
139
111
|
getURL() {
|
|
140
112
|
return this.config.databaseURL ? new URL(this.config.databaseURL) : void 0;
|
|
141
113
|
}
|
|
114
|
+
async updateConfig(config) {
|
|
115
|
+
await this.close();
|
|
116
|
+
this.sql = this.configure({ ...this.config, ...config });
|
|
117
|
+
}
|
|
142
118
|
reconfigure(params) {
|
|
143
119
|
const url = this.getURL();
|
|
144
120
|
if (url) {
|
|
@@ -251,6 +227,9 @@ class PostgresJsTransactionAdapter {
|
|
|
251
227
|
this.sql = sql;
|
|
252
228
|
this.errorClass = postgres.PostgresError;
|
|
253
229
|
}
|
|
230
|
+
updateConfig(config) {
|
|
231
|
+
return this.adapter.updateConfig(config);
|
|
232
|
+
}
|
|
254
233
|
reconfigure(params) {
|
|
255
234
|
return this.adapter.reconfigure(params);
|
|
256
235
|
}
|
package/dist/postgres-js.js.map
CHANGED
|
@@ -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 // 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 {\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 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":";;;;;;;;AAmFa,MAAA,SAAA,GAAY,CAAI,CAAS,KAAA,CAAA,CAAA;AAK/B,MAAM,cAAc,EAAC;;ACoGf,MAAA,qBAAA,GAAwB,CACnC,OAAA,EACA,MACG,KAAA;AACH,EAAA,OAAA,CAAQ,kBAAqB,GAAA;AAAA,IAC3B,QAAA,EAAU,OAAO,QAAY,IAAA,EAAA;AAAA,IAC7B,QAAA,EACE,OAAO,MAAA,CAAO,QAAa,KAAA,UAAA,GACvB,OAAO,QACP,GAAA,2BAAA,CAA4B,MAAO,CAAA,QAAA,IAAY,WAAW,CAAA;AAAA,GAClE,CAAA;AACF,CAAA,CAAA;AAEa,MAAA,6BAAA,GAAgC,CAI3C,OAAA,EACA,EACG,KAAA;AACH,EAAA,OAAO,kBAAmB,IAAM,EAAA;AAC9B,IAAA,IAAI,OAAU,GAAA,CAAA,CAAA;AACd,IAAS,WAAA;AACP,MAAI,IAAA;AACF,QAAA,OAAO,MAAM,EAAA,CAAG,IAAK,CAAA,IAAA,EAAM,GAAG,IAAI,CAAA,CAAA;AAAA,eAC3B,GAAK,EAAA;AACZ,QAAA,MAAM,SAAS,OAAQ,CAAA,kBAAA,CAAA;AACvB,QAAA,IACE,CAAC,GAAA,IACD,OAAO,GAAA,KAAQ,QACd,IAAA,GAAA,CAAyB,IAAS,KAAA,cAAA,IACnC,CAAC,MAAA,IACD,OAAW,IAAA,MAAA,CAAO,QAClB,EAAA;AACA,UAAM,MAAA,GAAA,CAAA;AAAA,SACR;AAEA,QAAA,MAAM,MAAO,CAAA,QAAA,CAAS,OAAS,EAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAC9C,QAAA,OAAA,EAAA,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAClC,KACsC,KAAA;AACtC,EAAO,OAAA,CAAC,OACN,KAAAA,mBAAA,CAAA,CAAY,KAAM,CAAA,MAAA,IAAU,SAAS,OAAU,GAAA,CAAA,CAAA,IAAM,KAAM,CAAA,KAAA,IAAS,EAAG,CAAA,CAAA,CAAA;AAC3E,CAAA;;AChNa,MAAA,QAAA,GAAW,CAItB,OAC0B,KAAA;AAC1B,EAAA,OAAOC,uBAAoB,CAAA;AAAA,IACzB,GAAG,OAAA;AAAA,IACH,OAAA,EAAS,IAAI,iBAAA,CAAkB,OAAgB,CAAA;AAAA,GAChD,CAAA,CAAA;AACH,EAAA;AAYA,MAAM,gBAAqE,CAAA;AAAA,EAKzE,YAAY,MAAmB,EAAA;AAC7B,IAAA,IAAA,CAAK,WAAW,MAAO,CAAA,KAAA,CAAA;AACvB,IAAA,IAAA,CAAK,IAAO,GAAA,MAAA,CAAA;AACZ,IAAK,IAAA,CAAA,MAAA,GAAS,OAAO,SAAU,CAAA,OAAA,CAAA;AAAA,GACjC;AACF,CAAA;AAGA,MAAM,UAAA,GAAa,CAAC,MAA0D,KAAA;AAC5E,EAAI,IAAA,MAAA,CAAO,gBAAgB,KAAO,EAAA;AAChC,IAAA,OAAQ,MAAuB,CAAA,GAAA;AAAA,MAC7B,CAAC,GAAA,KAAQ,IAAI,gBAAA,CAAiB,GAAG,CAAA;AAAA,KACnC,CAAA;AAAA,GACK,MAAA;AACL,IAAO,OAAA,IAAI,iBAAiB,MAAmB,CAAA,CAAA;AAAA,GACjD;AACF,CAAA,CAAA;AAEA,MAAM,KAAwD,GAAA;AAAA,EAC5D,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,EAAA;AAAA,IACJ,IAAM,EAAA,EAAA;AAAA,IACN,SAAA,EAAW,CAAC,CAAM,KAAA,KAAA,GAAQ,OAAO,IAAK,CAAA,CAAC,CAAE,CAAA,QAAA,CAAS,KAAK,CAAA;AAAA;AAAA,GAEzD;AAAA,EACA,yBAA2B,EAAA;AAAA,IACzB,EAAI,EAAA,EAAA;AAAA,IACJ,IAAM,EAAA,CAAC,IAAM,EAAA,IAAA,EAAM,IAAI,CAAA;AAAA,IACvB,KAAO,EAAA,SAAA;AAAA,GACT;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,IACX,SAAW,EAAA,SAAA;AAAA,IACX,MAAM,GAAa,EAAA;AACjB,MAAM,MAAA,CAAC,KAAO,IAAE,MAAQ,IAAE,IAAM,IAAE,IAAI,CAAA,GAAI,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACvD,MAAA,MAAM,CAAC,KAAO,EAAA,OAAA,EAAS,OAAO,CAAI,GAAA,IAAA,CAAK,MAAM,GAAG,CAAA,CAAA;AAEhD,MAAO,OAAA;AAAA,QACL,KAAO,EAAA,KAAA,GAAQ,MAAO,CAAA,KAAK,CAAI,GAAA,CAAA;AAAA,QAC/B,MAAQ,EAAA,MAAA,GAAS,MAAO,CAAA,MAAM,CAAI,GAAA,CAAA;AAAA,QAClC,IAAM,EAAA,IAAA,GAAO,MAAO,CAAA,IAAI,CAAI,GAAA,CAAA;AAAA,QAC5B,KAAO,EAAA,KAAA,GAAQ,MAAO,CAAA,KAAK,CAAI,GAAA,CAAA;AAAA,QAC/B,OAAS,EAAA,OAAA,GAAU,MAAO,CAAA,OAAO,CAAI,GAAA,CAAA;AAAA,QACrC,OAAS,EAAA,OAAA,GAAU,MAAO,CAAA,OAAO,CAAI,GAAA,CAAA;AAAA,OACvC,CAAA;AAAA,KACF;AAAA,GACF;AAAA;AAAA,EAEA,IAAM,EAAA;AAAA,IACJ,EAAI,EAAA,GAAA;AAAA,IACJ,IAAA,EAAM,CAAC,GAAA,EAAK,IAAI,CAAA;AAAA,IAChB,SAAW,EAAA,SAAA;AAAA,IACX,KAAA,EAAO,CAAC,CAAM,KAAA;AACZ,MAAO,OAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,KACrB;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,iBAAyC,CAAA;AAAA,EAMpD,YAAY,MAAkC,EAAA;AAF9C,IAAA,IAAA,CAAA,UAAA,GAAa,QAAS,CAAA,aAAA,CAAA;AAGpB,IAAA,IAAA,CAAK,MAAS,GAAA,EAAE,GAAG,MAAA,EAAQ,KAAM,EAAA,CAAA;AAEjC,IAAA,IAAA,CAAK,SAAS,MAAO,CAAA,MAAA,CAAA;AACrB,IAAA,IAAI,KAAK,MAAQ,EAAA;AACf,MAAA,IAAA,CAAK,OAAO,UAAa,GAAA;AAAA,QACvB,GAAG,MAAO,CAAA,UAAA;AAAA,QACV,aAAa,IAAK,CAAA,MAAA;AAAA,OACpB,CAAA;AAAA,KACF;AAEA,IAAI,IAAA,IAAA,CAAK,OAAO,WAAa,EAAA;AAC3B,MAAM,MAAA,SAAA,GAAY,KAAK,MAAO,CAAA,WAAA,CAAA;AAC9B,MAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA,CAAA;AAE7B,MAAA,MAAM,GAAM,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACtC,MAAI,IAAA,GAAA,KAAQ,OAAW,IAAA,GAAA,KAAQ,MAAQ,EAAA;AACrC,QAAK,IAAA,CAAA,MAAA,CAAO,MAAM,GAAQ,KAAA,MAAA,CAAA;AAAA,OAC5B;AAEA,MAAA,MAAM,MAAS,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAC5C,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,QAAI,GAAA,CAAA,YAAA,CAAa,OAAO,QAAQ,CAAA,CAAA;AAChC,QAAA,IAAA,CAAK,OAAO,UAAa,GAAA;AAAA,UACvB,GAAG,MAAO,CAAA,UAAA;AAAA,UACV,WAAa,EAAA,MAAA;AAAA,SACf,CAAA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAM,QAAS,CAAA,GAAA,CAAI,QAAS,EAAA,EAAG,KAAK,MAAM,CAAA,CAAA;AAAA,KAC1C,MAAA;AACL,MAAK,IAAA,CAAA,GAAA,GAAM,QAAS,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,KACjC;AAEA,IAAA,IAAI,OAAO,YAAc,EAAA;AACvB,MAAA,qBAAA;AAAA,QACE,IAAA;AAAA,QACA,MAAO,CAAA,YAAA,KAAiB,IAAO,GAAA,WAAA,GAAc,MAAO,CAAA,YAAA;AAAA,OACtD,CAAA;AAEA,MAAA,IAAA,CAAK,KAAQ,GAAA,6BAAA,CAA8B,IAAM,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAC3D,MAAA,IAAA,CAAK,MAAS,GAAA,6BAAA,CAA8B,IAAM,EAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,KAC/D;AAAA,GACF;AAAA,EAEQ,MAA0B,GAAA;AAChC,IAAO,OAAA,IAAA,CAAK,OAAO,WACf,GAAA,IAAI,IAAI,IAAK,CAAA,MAAA,CAAO,WAAW,CAC/B,GAAA,KAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,YAAY,MAKI,EAAA;AACd,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,IAAI,cAAc,MAAQ,EAAA;AACxB,QAAI,GAAA,CAAA,QAAA,GAAW,CAAI,CAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,OACpC;AAEA,MAAI,IAAA,MAAA,CAAO,SAAS,KAAW,CAAA,EAAA;AAC7B,QAAA,GAAA,CAAI,WAAW,MAAO,CAAA,IAAA,CAAA;AAAA,OACxB;AAEA,MAAI,IAAA,MAAA,CAAO,aAAa,KAAW,CAAA,EAAA;AACjC,QAAA,GAAA,CAAI,WAAW,MAAO,CAAA,QAAA,CAAA;AAAA,OACxB;AAEA,MAAI,IAAA,MAAA,CAAO,WAAW,KAAW,CAAA,EAAA;AAC/B,QAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,QAAU,EAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,OAC9C;AAEA,MAAA,OAAO,IAAI,iBAAkB,CAAA;AAAA,QAC3B,GAAG,IAAK,CAAA,MAAA;AAAA,QACR,WAAA,EAAa,IAAI,QAAS,EAAA;AAAA,OAC3B,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAO,OAAA,IAAI,kBAAkB,EAAE,GAAG,KAAK,MAAQ,EAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,KAC5D;AAAA,GACF;AAAA,EAEA,WAAsB,GAAA;AACpB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,MAAM,GAAI,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA,GAAK,KAAK,MAAO,CAAA,QAAA,CAAA;AAAA,GACpD;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,GAAM,GAAA,GAAA,CAAI,QAAY,GAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,SAAgC,GAAA;AAC9B,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACd;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,GAAM,GAAA,GAAA,CAAI,QAAY,GAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,KAAA,CACE,MACA,MACyB,EAAA;AACzB,IAAA,OAAO,KAAM,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA,CAAA;AAAA,GACrC;AAAA,EAEA,MAAA,CACE,MACA,MAC+B,EAAA;AAC/B,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA,CAAA;AAAA,GACtC;AAAA,EAEA,MAAM,WACJ,CAAA,OAAA,EACA,EACiB,EAAA;AACjB,IAAI,IAAA,EAAA,CAAA;AACJ,IAAI,IAAA,MAAA,CAAA;AAEJ,IACE,OAAA,CAAA,OAAA,GACI,KAAK,GAAI,CAAA,KAAA;AAAA,MAAM,OAAA;AAAA,MAAS,CAAC,GACvB,KAAA,EAAA,CAAG,IAAI,4BAAA,CAA6B,IAAM,EAAA,GAAG,CAAC,CAAA,CAAE,IAAK,CAAA,CAAC,GAAQ,KAAA;AAC5D,QAAK,EAAA,GAAA,IAAA,CAAA;AACL,QAAA,OAAQ,MAAS,GAAA,GAAA,CAAA;AAAA,OAClB,CAAA;AAAA,KACH,GACA,KAAK,GAAI,CAAA,KAAA;AAAA,MAAM,CAAC,GACd,KAAA,EAAA,CAAG,IAAI,4BAAA,CAA6B,IAAM,EAAA,GAAG,CAAC,CAAA,CAAE,IAAK,CAAA,CAAC,GAAQ,KAAA;AAC5D,QAAK,EAAA,GAAA,IAAA,CAAA;AACL,QAAA,OAAQ,MAAS,GAAA,GAAA,CAAA;AAAA,OAClB,CAAA;AAAA,KACH,EACJ,KAAM,CAAA,CAAC,GAAQ,KAAA;AACf,MAAA,IAAI,IAAW,OAAA,MAAA,CAAA;AAEf,MAAM,MAAA,GAAA,CAAA;AAAA,KACP,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,KAAuB,GAAA;AACrB,IAAO,OAAA,IAAA,CAAK,IAAI,GAAI,EAAA,CAAA;AAAA,GACtB;AAAA,EAEA,WAAA,CAAY,IAAgB,OAAgB,EAAA;AAC1C,IAAA,MAAM,IAAO,GAAA,OAAA,CAAA;AACb,IAAA,EAAA,CAAG,UAAU,IAAK,CAAA,OAAA,CAAA;AAClB,IAAA,EAAA,CAAG,WAAW,IAAK,CAAA,QAAA,CAAA;AACnB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,SAAS,IAAK,CAAA,MAAA,CAAA;AACjB,IAAA,EAAA,CAAG,SAAS,IAAK,CAAA,WAAA,CAAA;AACjB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,UAAA,CAAA;AAChB,IAAA,EAAA,CAAG,aAAa,IAAK,CAAA,eAAA,CAAA;AACrB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,WAAW,IAAK,CAAA,QAAA,CAAA;AACnB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,KAAA,CAAA;AAChB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,UAAU,IAAK,CAAA,OAAA,CAAA;AAAA,GACpB;AACF,CAAA;AAEA,MAAM,QAAQ,CACZ,GAAA,EACA,IACA,EAAA,MAAA,EACA,mBACAC,OAC4B,KAAA;AAE5B,EAAA,IAAIC,MAAQ,GAAA,GAAA,CAAI,MAAO,CAAA,IAAA,EAAM,MAAe,CAAA,CAAA;AAE5C,EAAA,IAAID,OAAQ,EAAAC,MAAQA,GAAAA,MAAAA,CAAM,MAAO,EAAA,CAAA;AAEjC,EAAA,IAAI,iBAAmB,EAAA;AACrB,IAAA,OAAO,QAAQ,GAAI,CAAA;AAAA,MACjB,GAAI,CAAA,MAAA,CAAO,CAAc,WAAA,EAAA,iBAAiB,CAAG,CAAA,CAAA,CAAA;AAAA,MAC7CA,MAAAA;AAAA,MACA,GAAI,CAAA,MAAA,CAAO,CAAsB,mBAAA,EAAA,iBAAiB,CAAG,CAAA,CAAA,CAAA;AAAA,KACtD,CAAE,CAAA,IAAA;AAAA,MACD,CAAC,OAAyB,KAAA;AACxB,QAAO,OAAA,UAAA,CAAW,OAAQ,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,OAC9B;AAAA,MACA,CAAC,QACC,GAAI,CAAA,MAAA,CAAO,0BAA0B,iBAAiB,CAAA,CAAA,CAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AACpE,QAAM,MAAA,GAAA,CAAA;AAAA,OACP,CAAA;AAAA,KACL,CAAA;AAAA,GACK,MAAA;AACL,IAAOA,OAAAA,MAAAA,CAAM,KAAK,UAAU,CAAA,CAAA;AAAA,GAC9B;AACF,CAAA,CAAA;AAEA,MAAM,MAAS,GAAA,CACb,GACA,EAAA,IAAA,EACA,QACA,iBACkC,KAAA;AAClC,EAAA,OAAO,KAAM,CAAA,GAAA,EAAK,IAAM,EAAA,MAAA,EAAQ,mBAAmB,IAAI,CAAA,CAAA;AACzD,CAAA,CAAA;AAEO,MAAM,4BAAoD,CAAA;AAAA,EAG/D,WAAA,CAAmB,SAAmC,GAAmB,EAAA;AAAtD,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAAmC,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA,CAAA;AAFtD,IAAA,IAAA,CAAA,UAAA,GAAa,QAAS,CAAA,aAAA,CAAA;AAAA,GAEoD;AAAA,EAE1E,YAAY,MAKI,EAAA;AACd,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,GACxC;AAAA,EAEA,WAAsB,GAAA;AACpB,IAAO,OAAA,IAAA,CAAK,QAAQ,WAAY,EAAA,CAAA;AAAA,GAClC;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAO,OAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,SAAgC,GAAA;AAC9B,IAAA,OAAO,KAAK,OAAQ,CAAA,MAAA,CAAA;AAAA,GACtB;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAO,OAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,KAAA,CACE,IACA,EAAA,MAAA,EACA,iBACyB,EAAA;AACzB,IAAA,OAAO,KAAM,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,EAAM,QAAQ,iBAAiB,CAAA,CAAA;AAAA,GACxD;AAAA;AAAA,EAGA,MAAA,CACE,IACA,EAAA,MAAA,EACA,iBAC+B,EAAA;AAC/B,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,EAAM,QAAQ,iBAAiB,CAAA,CAAA;AAAA,GACzD;AAAA,EAEA,MAAM,WACJ,CAAA,QAAA,EACA,EACiB,EAAA;AACjB,IAAO,OAAA,MAAM,GAAG,IAAI,CAAA,CAAA;AAAA,GACtB;AAAA,EAEA,KAAuB,GAAA;AACrB,IAAO,OAAA,IAAA,CAAK,IAAI,GAAI,EAAA,CAAA;AAAA,GACtB;AAAA,EAEA,WAAA,CAAY,IAAgB,IAAa,EAAA;AACvC,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,WAAY,CAAA,EAAA,EAAI,IAAI,CAAA,CAAA;AAAA,GAC1C;AACF;;;;;;"}
|
|
1
|
+
{"version":3,"file":"postgres-js.js","sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Error, Row, RowList } from 'postgres';\nimport {\n AdapterBase,\n AdapterConfigBase,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n createDbWithAdapter,\n DbResult,\n ColumnSchemaConfig,\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 this.sql = this.configure(config);\n }\n\n private configure(config: PostgresJsAdapterOptions): postgres.Sql {\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 let sql;\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 sql = postgres(url.toString(), this.config);\n } else {\n 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 return sql;\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: PostgresJsAdapterOptions): Promise<void> {\n await this.close();\n this.sql = this.configure({ ...this.config, ...config });\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 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 updateConfig(config: PostgresJsAdapterOptions): 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.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":["createDbWithAdapter","returnArg","setConnectRetryConfig","emptyObject","wrapAdapterFnWithConnectRetry","arrays","query"],"mappings":"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"}
|
package/dist/postgres-js.mjs
CHANGED
|
@@ -1,38 +1,5 @@
|
|
|
1
|
-
import 'url';
|
|
2
|
-
import 'node:path';
|
|
3
|
-
import { setTimeout } from 'timers/promises';
|
|
4
1
|
import postgres from 'postgres';
|
|
5
|
-
import { createDbWithAdapter } from 'pqb';
|
|
6
|
-
|
|
7
|
-
const returnArg = (a) => a;
|
|
8
|
-
const emptyObject = {};
|
|
9
|
-
|
|
10
|
-
const setConnectRetryConfig = (adapter, config) => {
|
|
11
|
-
adapter.connectRetryConfig = {
|
|
12
|
-
attempts: config.attempts ?? 10,
|
|
13
|
-
strategy: typeof config.strategy === "function" ? config.strategy : defaultConnectRetryStrategy(config.strategy ?? emptyObject)
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
const wrapAdapterFnWithConnectRetry = (adapter, fn) => {
|
|
17
|
-
return async function(...args) {
|
|
18
|
-
let attempt = 1;
|
|
19
|
-
for (; ; ) {
|
|
20
|
-
try {
|
|
21
|
-
return await fn.call(this, ...args);
|
|
22
|
-
} catch (err) {
|
|
23
|
-
const config = adapter.connectRetryConfig;
|
|
24
|
-
if (!err || typeof err !== "object" || err.code !== "ECONNREFUSED" || !config || attempt >= config.attempts) {
|
|
25
|
-
throw err;
|
|
26
|
-
}
|
|
27
|
-
await config.strategy(attempt, config.attempts);
|
|
28
|
-
attempt++;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
const defaultConnectRetryStrategy = (param) => {
|
|
34
|
-
return (attempt) => setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));
|
|
35
|
-
};
|
|
2
|
+
import { createDbWithAdapter, setConnectRetryConfig, emptyObject, wrapAdapterFnWithConnectRetry, returnArg } from 'pqb';
|
|
36
3
|
|
|
37
4
|
const createDb = (options) => {
|
|
38
5
|
return createDbWithAdapter({
|
|
@@ -98,6 +65,9 @@ class PostgresJsAdapter {
|
|
|
98
65
|
constructor(config) {
|
|
99
66
|
this.errorClass = postgres.PostgresError;
|
|
100
67
|
this.config = { ...config, types };
|
|
68
|
+
this.sql = this.configure(config);
|
|
69
|
+
}
|
|
70
|
+
configure(config) {
|
|
101
71
|
this.schema = config.schema;
|
|
102
72
|
if (this.schema) {
|
|
103
73
|
this.config.connection = {
|
|
@@ -105,6 +75,7 @@ class PostgresJsAdapter {
|
|
|
105
75
|
search_path: this.schema
|
|
106
76
|
};
|
|
107
77
|
}
|
|
78
|
+
let sql;
|
|
108
79
|
if (this.config.databaseURL) {
|
|
109
80
|
const urlString = this.config.databaseURL;
|
|
110
81
|
const url = new URL(urlString);
|
|
@@ -121,9 +92,9 @@ class PostgresJsAdapter {
|
|
|
121
92
|
search_path: schema
|
|
122
93
|
};
|
|
123
94
|
}
|
|
124
|
-
|
|
95
|
+
sql = postgres(url.toString(), this.config);
|
|
125
96
|
} else {
|
|
126
|
-
|
|
97
|
+
sql = postgres(this.config);
|
|
127
98
|
}
|
|
128
99
|
if (config.connectRetry) {
|
|
129
100
|
setConnectRetryConfig(
|
|
@@ -133,10 +104,15 @@ class PostgresJsAdapter {
|
|
|
133
104
|
this.query = wrapAdapterFnWithConnectRetry(this, this.query);
|
|
134
105
|
this.arrays = wrapAdapterFnWithConnectRetry(this, this.arrays);
|
|
135
106
|
}
|
|
107
|
+
return sql;
|
|
136
108
|
}
|
|
137
109
|
getURL() {
|
|
138
110
|
return this.config.databaseURL ? new URL(this.config.databaseURL) : void 0;
|
|
139
111
|
}
|
|
112
|
+
async updateConfig(config) {
|
|
113
|
+
await this.close();
|
|
114
|
+
this.sql = this.configure({ ...this.config, ...config });
|
|
115
|
+
}
|
|
140
116
|
reconfigure(params) {
|
|
141
117
|
const url = this.getURL();
|
|
142
118
|
if (url) {
|
|
@@ -249,6 +225,9 @@ class PostgresJsTransactionAdapter {
|
|
|
249
225
|
this.sql = sql;
|
|
250
226
|
this.errorClass = postgres.PostgresError;
|
|
251
227
|
}
|
|
228
|
+
updateConfig(config) {
|
|
229
|
+
return this.adapter.updateConfig(config);
|
|
230
|
+
}
|
|
252
231
|
reconfigure(params) {
|
|
253
232
|
return this.adapter.reconfigure(params);
|
|
254
233
|
}
|
package/dist/postgres-js.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-js.mjs","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 // 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 {\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 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":["arrays","query"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-js.mjs","sources":["../src/adapters/postgres-js.ts"],"sourcesContent":["import postgres, { Error, Row, RowList } from 'postgres';\nimport {\n AdapterBase,\n AdapterConfigBase,\n emptyObject,\n MaybeArray,\n QueryArraysResult,\n QueryError,\n QueryResult,\n QueryResultRow,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n DbOptions,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n createDbWithAdapter,\n DbResult,\n ColumnSchemaConfig,\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 this.sql = this.configure(config);\n }\n\n private configure(config: PostgresJsAdapterOptions): postgres.Sql {\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 let sql;\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 sql = postgres(url.toString(), this.config);\n } else {\n 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 return sql;\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: PostgresJsAdapterOptions): Promise<void> {\n await this.close();\n this.sql = this.configure({ ...this.config, ...config });\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 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 updateConfig(config: PostgresJsAdapterOptions): 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.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":["arrays","query"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pqb",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.58.0",
|
|
4
4
|
"description": "Postgres query builder",
|
|
5
5
|
"homepage": "https://orchid-orm.netlify.app/guide/orm-and-query-builder.html",
|
|
6
6
|
"repository": {
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"@types/pg": ">=8"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"zod": "^
|
|
45
|
-
"test-utils": "0.3.
|
|
44
|
+
"zod": "^4.0.0",
|
|
45
|
+
"test-utils": "0.3.4"
|
|
46
46
|
},
|
|
47
47
|
"peerDependencies": {
|
|
48
48
|
"pg": ">=8",
|