@event-driven-io/dumbo 0.12.4 → 0.12.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -14,8 +14,12 @@ var isFirstLetterNumericOrMinus = (str) => {
14
14
  return c >= 48 && c <= 57 || c === 45;
15
15
  };
16
16
  var bigIntReviver = (_key, value, context) => {
17
- if (typeof value === "number" && !Number.isSafeInteger(value)) {
18
- return BigInt(_nullishCoalesce(_optionalChain([context, 'optionalAccess', _2 => _2.source]), () => ( value.toString())));
17
+ if (typeof value === "number" && Number.isInteger(value) && !Number.isSafeInteger(value)) {
18
+ try {
19
+ return BigInt(_nullishCoalesce(_optionalChain([context, 'optionalAccess', _2 => _2.source]), () => ( value.toString())));
20
+ } catch (e2) {
21
+ return value;
22
+ }
19
23
  }
20
24
  if (typeof value === "string" && value.length > 15) {
21
25
  if (isFirstLetterNumericOrMinus(value)) {
@@ -23,7 +27,7 @@ var bigIntReviver = (_key, value, context) => {
23
27
  if (Number.isFinite(num) && !Number.isSafeInteger(num)) {
24
28
  try {
25
29
  return BigInt(value);
26
- } catch (e2) {
30
+ } catch (e3) {
27
31
  }
28
32
  }
29
33
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/index.cjs","../src/core/serializer/json/index.ts","../src/core/sql/pg-format/reserved.ts","../src/core/sql/pg-format/index.ts","../src/core/sql/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/schema/migrations.ts","../src/core/schema/schemaComponent.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/locks/databaseLock.ts","../src/postgres/core/connections/connectionString.ts","../src/postgres/core/schema/migrations.ts","../src/postgres/core/schema/schema.ts","../src/postgres/core/locks/advisoryLocks.ts","../src/postgres/pg/connections/connection.ts","../src/postgres/pg/execute/execute.ts","../src/postgres/pg/connections/transaction.ts","../src/postgres/pg/connections/pool.ts","../src/postgres/pg/serialization/index.ts","../src/postgres/index.ts","../src/index.ts"],"names":["key","sql","literal","sqlExecutor","format","advisoryLock","pg"],"mappings":"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;AAGJ;AAEa;AACX,EAAA;AACA,EAAA;AACA,EAAA;AAKmB;AACnB,EAAA;AACM,EAAA;AAEA,EAAA;AACF,EAAA;AACI,IAAA;AACR,EAAA;AACF;AAEa;AACP,EAAA;AACI,IAAA;AACC,EAAA;AACA,IAAA;AACT,EAAA;AACM,EAAA;AACR;AAEa;AAEC,EAAA;AACZ;AAEW;AAGP;AACE,EAAA;AACA,EAAA;AAEN,EAAA;AAEO,EAAA;AACT;AxBqiCY;AACA;A0Bl1CC;A1Bo1CD;AACA;A2Bh1CC;AACX;AAGA,EAAA;AAAsD;AAEnC;A3Bg1CT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/index.cjs","sourcesContent":[null,"import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n return BigInt(context?.source ?? value.toString());\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.parseBigInts === true ? JSONReplacers.bigInt : undefined,\n opts?.parseDates === true ? JSONReplacers.date : undefined,\n opts?.replacer,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n opts?.reviver,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (options?: JSONSerializerOptions): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer = jsonSerializer({ parseBigInts: true });\n\nconst RawJSONSerializer = jsonSerializer();\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n RawJSONSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n};\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/reserved.js\n//\n// PostgreSQL reserved words\n//\nconst reservedMap: { [key: string]: boolean } = {\n AES128: true,\n AES256: true,\n ALL: true,\n ALLOWOVERWRITE: true,\n ANALYSE: true,\n ANALYZE: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BACKUP: true,\n BETWEEN: true,\n BINARY: true,\n BLANKSASNULL: true,\n BOTH: true,\n BYTEDICT: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CREDENTIALS: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n CURRENT_USER_ID: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DEFLATE: true,\n DEFRAG: true,\n DELTA: true,\n DELTA32K: true,\n DESC: true,\n DISABLE: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n EMPTYASNULL: true,\n ENABLE: true,\n ENCODE: true,\n ENCRYPT: true,\n ENCRYPTION: true,\n END: true,\n EXCEPT: true,\n EXPLICIT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FREEZE: true,\n FROM: true,\n FULL: true,\n GLOBALDICT256: true,\n GLOBALDICT64K: true,\n GRANT: true,\n GROUP: true,\n GZIP: true,\n HAVING: true,\n IDENTITY: true,\n IGNORE: true,\n ILIKE: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n ISNULL: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LIMIT: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n LUN: true,\n LUNS: true,\n LZO: true,\n LZOP: true,\n MINUS: true,\n MOSTLY13: true,\n MOSTLY32: true,\n MOSTLY8: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NOTNULL: true,\n NULL: true,\n NULLS: true,\n OFF: true,\n OFFLINE: true,\n OFFSET: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARALLEL: true,\n PARTITION: true,\n PERCENT: true,\n PLACING: true,\n PRIMARY: true,\n RAW: true,\n READRATIO: true,\n RECOVER: true,\n REFERENCES: true,\n REJECTLOG: true,\n RESORT: true,\n RESTORE: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n SYSDATE: true,\n SYSTEM: true,\n TABLE: true,\n TAG: true,\n TDES: true,\n TEXT255: true,\n TEXT32K: true,\n THEN: true,\n TO: true,\n TOP: true,\n TRAILING: true,\n TRUE: true,\n TRUNCATECOLUMNS: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n VERBOSE: true,\n WALLET: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n};\n\nexport default reservedMap;\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/index.js\nimport { JSONSerializer } from '../../serializer/index.js';\nimport reservedMap from './reserved.js';\n\ntype FormatterConfig = {\n pattern?: {\n ident?: string;\n literal?: string;\n string?: string;\n };\n};\n\ntype FormatterFunction = (value: unknown) => string;\n\nconst fmtPattern = {\n ident: 'I',\n literal: 'L',\n string: 's',\n};\n\n// convert to Postgres default ISO 8601 format\nconst formatDate = (date: string): string => {\n date = date.replace('T', ' ');\n date = date.replace('Z', '+00');\n return date;\n};\n\nconst isReserved = (value: string): boolean => {\n return !!reservedMap[value.toUpperCase()];\n};\n\nconst arrayToList = (\n useSpace: boolean,\n array: unknown[],\n formatter: FormatterFunction,\n): string => {\n let sql = '';\n sql += useSpace ? ' (' : '(';\n for (let i = 0; i < array.length; i++) {\n sql += (i === 0 ? '' : ', ') + formatter(array[i]);\n }\n sql += ')';\n return sql;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteIdent = (value: unknown): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n } else if (value === false) {\n return '\"f\"';\n } else if (value === true) {\n return '\"t\"';\n } else if (value instanceof Date) {\n return '\"' + formatDate(value.toISOString()) + '\"';\n } else if (value instanceof Buffer) {\n throw new Error('SQL identifier cannot be a buffer');\n } else if (Array.isArray(value)) {\n return value\n .map((v) => {\n if (Array.isArray(v)) {\n throw new Error(\n 'Nested array to grouped list conversion is not supported for SQL identifier',\n );\n }\n return quoteIdent(v);\n })\n .toString();\n } else if (value === Object(value)) {\n throw new Error('SQL identifier cannot be an object');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const ident = value.toString().slice(0); // create copy\n\n // do not quote a valid, unquoted identifier\n if (/^[a-z_][a-z0-9_$]*$/.test(ident) && !isReserved(ident)) {\n return ident;\n }\n\n let quoted = '\"';\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === '\"' ? c + c : c;\n }\n quoted += '\"';\n return quoted;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteLiteral = (value: unknown): string => {\n let literal: string | null = null;\n let explicitCast: string | null = null;\n\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (value === false) {\n return \"'f'\";\n } else if (value === true) {\n return \"'t'\";\n } else if (value instanceof Date) {\n return \"'\" + formatDate(value.toISOString()) + \"'\";\n } else if (value instanceof Buffer) {\n return \"E'\\\\\\\\x\" + value.toString('hex') + \"'\";\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteLiteral);\n }\n return quoteLiteral(v);\n })\n .toString();\n } else if (value === Object(value)) {\n explicitCast = 'jsonb';\n literal = JSONSerializer.serialize(value);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n literal = value.toString().slice(0); // create copy\n }\n\n let hasBackslash = false;\n let quoted = \"'\";\n\n for (let i = 0; i < literal.length; i++) {\n const c = literal[i];\n if (c === \"'\") {\n quoted += c + c;\n } else if (c === '\\\\') {\n quoted += c + c;\n hasBackslash = true;\n } else {\n quoted += c;\n }\n }\n\n quoted += \"'\";\n\n if (hasBackslash) {\n quoted = 'E' + quoted;\n }\n\n if (explicitCast) {\n quoted += '::' + explicitCast;\n }\n\n return quoted;\n};\n\nconst quoteString = (value: unknown): string => {\n if (value === undefined || value === null) {\n return '';\n } else if (value === false) {\n return 'f';\n } else if (value === true) {\n return 't';\n } else if (value instanceof Date) {\n return formatDate(value.toISOString());\n } else if (value instanceof Buffer) {\n return '\\\\x' + value.toString('hex');\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (v !== null && v !== undefined) {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteString);\n }\n return quoteString(v);\n }\n return ''; // Handle undefined or null values properly within arrays\n })\n .filter((v) => v !== '') // Filter out empty strings to avoid extra commas\n .toString();\n } else if (value === Object(value)) {\n return JSONSerializer.serialize(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return value.toString().slice(0); // return copy\n};\n\nconst config = (cfg: FormatterConfig): void => {\n // default\n fmtPattern.ident = 'I';\n fmtPattern.literal = 'L';\n fmtPattern.string = 's';\n\n if (cfg && cfg.pattern) {\n if (cfg.pattern.ident) {\n fmtPattern.ident = cfg.pattern.ident;\n }\n if (cfg.pattern.literal) {\n fmtPattern.literal = cfg.pattern.literal;\n }\n if (cfg.pattern.string) {\n fmtPattern.string = cfg.pattern.string;\n }\n }\n};\n\nconst formatWithArray = (fmt: string, parameters: unknown[]): string => {\n let index = 0;\n const params = parameters;\n\n let re: string | RegExp = '%(%|(\\\\d+\\\\$)?[';\n re += fmtPattern.ident;\n re += fmtPattern.literal;\n re += fmtPattern.string;\n re += '])';\n re = new RegExp(re, 'g');\n\n return fmt.replace(re, (_, type) => {\n if (type === '%') {\n return '%';\n }\n\n let position = index;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const tokens = type.split('$');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (tokens.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n position = parseInt(tokens[0], 10) - 1;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n type = tokens[1];\n }\n\n if (position < 0) {\n throw new Error('specified argument 0 but arguments start at 1');\n } else if (position > params.length - 1) {\n throw new Error('too few arguments');\n }\n\n index = position + 1;\n\n if (type === fmtPattern.ident) {\n return quoteIdent(params[position]);\n } else if (type === fmtPattern.literal) {\n return quoteLiteral(params[position]);\n } else if (type === fmtPattern.string) {\n return quoteString(params[position]);\n }\n\n return undefined!;\n });\n};\n\nconst format = (fmt: string, ...args: unknown[]): string => {\n return formatWithArray(fmt, args);\n};\n\nformat.config = config;\nformat.format = format;\nformat.ident = quoteIdent;\nformat.literal = quoteLiteral;\nformat.string = quoteString;\nformat.withArray = formatWithArray;\n\nexport default format;\n","import format from './pg-format';\n// TODO: add core formatter, when adding other database type\n\ntype SQL = string & { __brand: 'sql' };\n\nconst sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nconst rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n\nconst isSQL = (literal: unknown): literal is SQL =>\n literal !== undefined && literal !== null && typeof literal === 'string';\n\ntype SQLValue =\n | { type: 'literal'; value: unknown } // Literal types (e.g., strings, numbers)\n | { type: 'identifier'; value: string } // Identifier types (e.g., table/column names)\n | { type: 'plainString'; value: string }; // Plain string types (unsafe, unescaped)\n\n// Wrapping functions for explicit formatting\nconst literal = (value: unknown) => ({ type: 'literal', value });\nconst identifier = (value: string) => ({ type: 'identifier', value });\nconst plainString = (value: string) => ({ type: 'plainString', value });\n\nconst defaultFormat = (value: unknown) => {\n if (typeof value === 'string') {\n return format('%L', value);\n } else if (typeof value === 'number') {\n return value.toString();\n } else if (typeof value === 'bigint') {\n return format('%L', value);\n } else if (value instanceof Date) {\n return format('%L', value);\n } else if (Array.isArray(value)) {\n return format('(%L)', value);\n } else if (typeof value === 'object') {\n return format('%s', JSON.stringify(value));\n } else {\n return format('%L', value);\n }\n};\n\nfunction SQL(strings: TemplateStringsArray, ...values: unknown[]): SQL {\n return strings\n .map((string, index) => {\n let formattedValue = '';\n\n if (index < values.length) {\n const value = values[index];\n\n if (\n value &&\n typeof value === 'object' &&\n 'type' in value &&\n 'value' in value\n ) {\n const sqlValue = value as SQLValue;\n switch (sqlValue.type) {\n case 'literal':\n formattedValue = format('%L', sqlValue.value);\n break;\n case 'identifier':\n formattedValue = format('%I', sqlValue.value);\n break;\n case 'plainString':\n formattedValue = sqlValue.value;\n break;\n }\n } else {\n formattedValue = defaultFormat(value);\n }\n }\n\n return string + formattedValue;\n })\n .join('') as SQL;\n}\n\nexport { SQL, identifier, isSQL, literal, plainString, rawSql, sql };\n","import type { Connection } from '../connections';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport { type SQL } from '../sql';\n\nexport type SQLQueryOptions = { timeoutMs?: number };\nexport type SQLCommandOptions = { timeoutMs?: number };\n\nexport interface DbSQLExecutor<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n type: ConnectorType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql),\n options,\n ),\n batchQuery: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls),\n options,\n ),\n command: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql),\n options,\n ),\n batchCommand: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport { type Connection } from './connection';\n\nexport interface DatabaseTransaction<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor {\n type: ConnectorType;\n connection: Connection<ConnectorType, DbClient>;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n}\n\nexport interface DatabaseTransactionFactory<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n transaction: () => DatabaseTransaction<ConnectorType, DbClient>;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n ConnectorType extends string = string,\n DbClient = unknown,\n Result = void,\n>(\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectorType extends string = string,\n DbClient = unknown,\n>(\n connect: () => Promise<DbClient>,\n initTransaction: (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>,\n): DatabaseTransactionFactory<ConnectorType, DbClient> => ({\n transaction: () => initTransaction(connect()),\n withTransaction: (handle) =>\n executeInTransaction(initTransaction(connect()), handle),\n});\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends Connection = Connection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends Connection = Connection,\n>(\n connect: () => ConnectionType,\n): DatabaseTransactionFactory<ConnectionType['type']> => ({\n transaction: () => {\n const connection = connect();\n const transaction = connection.transaction();\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle) => {\n const connection = connect();\n return wrapInConnectionClosure(connection, () =>\n connection.withTransaction(handle),\n );\n },\n});\n","import {\n sqlExecutor,\n type DbSQLExecutor,\n type WithSQLExecutor,\n} from '../execute';\nimport {\n transactionFactoryWithDbClient,\n type DatabaseTransaction,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor,\n DatabaseTransactionFactory<ConnectorType> {\n type: ConnectorType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n}\n\nexport interface ConnectionFactory<\n ConnectionType extends Connection = Connection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n ) => Promise<Result>;\n}\n\nexport type CreateConnectionOptions<\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n type: ConnectorType;\n connect: Promise<DbClient>;\n close: (client: DbClient) => Promise<void>;\n initTransaction: (\n connection: () => ConnectionType,\n ) => (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>;\n executor: () => Executor;\n};\n\nexport const createConnection = <\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateConnectionOptions<\n ConnectorType,\n DbClient,\n ConnectionType,\n Executor\n >,\n): ConnectionType => {\n const { type, connect, close, initTransaction, executor } = options;\n\n let client: DbClient | null = null;\n\n const getClient = async () => client ?? (client = await connect);\n\n const connection: Connection<ConnectorType, DbClient> = {\n type: type,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor(), { connect: getClient }),\n };\n\n const typedConnection = connection as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInNewConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport { type Connection, type ConnectionFactory } from './connection';\nimport {\n transactionFactoryWithNewConnection,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<ConnectionType extends Connection = Connection>\n extends WithSQLExecutor,\n ConnectionFactory<ConnectionType>,\n DatabaseTransactionFactory<ConnectionType['type']> {\n type: ConnectionType['type'];\n close: () => Promise<void>;\n}\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport const createConnectionPool = <\n ConnectionType extends Connection,\n ConnectionPoolType extends ConnectionPool<ConnectionType>,\n>(\n pool: Pick<ConnectionPool<ConnectionType>, 'type'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n },\n): ConnectionPoolType => {\n const { type, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(handle: (connection: ConnectionType) => Promise<Result>) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({ connection });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n type,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result as ConnectionPoolType;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const mapRows = async <\n Result extends QueryResultRow = QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: Record<string, unknown>,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return result.count;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true;\n};\n","import {\n mapToCamelCase,\n rawSql,\n singleOrNull,\n sql,\n tracer,\n type SchemaComponent,\n type SQLExecutor,\n} from '..';\nimport { type DatabaseLock, type DatabaseLockOptions, type Dumbo } from '../..';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: string[];\n};\n\nexport const sqlMigration = (name: string, sqls: string[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\nexport type MigratorOptions = {\n schema: {\n migrationTable: SchemaComponent;\n };\n lock: {\n databaseLock: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n options: MigratorOptions,\n): Promise<void> =>\n pool.withTransaction(async ({ execute }) => {\n const { databaseLock, ...rest } = options.lock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const coreMigrations = options.schema.migrationTable.migrations({\n connector: 'PostgreSQL:pg', // TODO: This will need to change to support more connectors\n });\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n const sql = combineMigrations(migration);\n await execute.command(rawSql(sql));\n }\n\n for (const migration of migrations) {\n await runSQLMigration(execute, migration);\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result: undefined };\n });\n\nconst runSQLMigration = async (\n execute: SQLExecutor,\n migration: SQLMigration,\n): Promise<void> => {\n const sql = combineMigrations(migration);\n const sqlHash = await getMigrationHash(sql);\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const wasMigrationApplied = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (wasMigrationApplied) return;\n\n await execute.command(rawSql(sql));\n\n await recordMigration(execute, newMigration);\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (content: string): Promise<string> => {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (...migration: Pick<SQLMigration, 'sqls'>[]) =>\n migration.flatMap((m) => m.sqls).join('\\n');\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<boolean> => {\n const result = await singleOrNull(\n execute.query<{ sql_hash: string }>(\n sql(`SELECT sql_hash FROM migrations WHERE name = %L`, migration.name),\n ),\n );\n\n if (result === null) return false;\n\n const { sqlHash } = mapToCamelCase<Pick<MigrationRecord, 'sqlHash'>>(result);\n\n if (sqlHash !== migration.sqlHash) {\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n }\n\n //console.log(`Migration \"${migration.name}\" already applied. Skipping.`);\n return true;\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n sql(\n `\n INSERT INTO migrations (name, sql_hash)\n VALUES (%L, %L)\n `,\n migration.name,\n migration.sqlHash,\n ),\n );\n};\n","import type { ConnectorType } from '../..';\nimport { type SQLMigration } from './migrations';\n\nexport type SchemaComponentMigrationsOptions = {\n connector: ConnectorType;\n};\n\nexport type SchemaComponent = {\n schemaComponentType: string;\n components?: ReadonlyArray<SchemaComponent> | undefined;\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n};\n\nexport const schemaComponent = (\n type: string,\n migrationsOrComponents:\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n }\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n components: ReadonlyArray<SchemaComponent>;\n }\n | {\n components: ReadonlyArray<SchemaComponent>;\n },\n): SchemaComponent => {\n const components =\n 'components' in migrationsOrComponents\n ? migrationsOrComponents.components\n : undefined;\n\n const migrations =\n 'migrations' in migrationsOrComponents\n ? migrationsOrComponents.migrations\n : undefined;\n\n return {\n schemaComponentType: type,\n components,\n migrations: (options) => [\n ...(migrations ? migrations(options) : []),\n ...(components\n ? components.flatMap((component) => component.migrations(options))\n : []),\n ],\n };\n};\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = process.env.DUMBO_LOG_LEVEL ?? LogLevel.DISABLED;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (logStyle: LogStyle): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return JSONSerializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (process.env.DUMBO_LOG_STYLE as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import { type SQLExecutor } from '..';\n\nexport type DatabaseLockOptions = { lockId: number; timeoutMs?: number };\n\nexport type AcquireDatabaseLockMode = 'Permanent' | 'Session';\n\nexport type AcquireDatabaseLockOptions = DatabaseLockOptions & {\n mode?: AcquireDatabaseLockMode;\n};\nexport type ReleaseDatabaseLockOptions = DatabaseLockOptions;\n\nexport const defaultDatabaseLockOptions: Required<\n Omit<DatabaseLockOptions, 'lockId'>\n> = {\n timeoutMs: 10000,\n};\n\nexport type DatabaseLock = {\n acquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<void>;\n tryAcquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<boolean>;\n release(\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n ): Promise<boolean>;\n withAcquire: <Result = unknown>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => Promise<Result>;\n};\n","import pgcs from 'pg-connection-string';\nimport { defaultPostgreSqlDatabase } from '../schema';\n\nexport const defaultPostgreSQLConenctionString =\n 'postgresql://postgres@localhost:5432/postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import { AdvisoryLock, type DatabaseLockOptions } from '../..';\nimport { rawSql, type Dumbo } from '../../..';\nimport {\n MIGRATIONS_LOCK_ID,\n runSQLMigrations,\n schemaComponent,\n sqlMigration,\n type SQLMigration,\n} from '../../../core/schema';\n\nexport type PostgreSQLMigratorOptions = {\n lock?: {\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nconst migrationTableSQL = rawSql(`\n CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL UNIQUE,\n application VARCHAR(255) NOT NULL DEFAULT 'default',\n sql_hash VARCHAR(64) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`);\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: () => [\n sqlMigration('dumbo:migrationTable:001', [migrationTableSQL]),\n ],\n },\n);\n\nexport const runPostgreSQLMigrations = (\n pool: Dumbo,\n migrations: SQLMigration[],\n options?: PostgreSQLMigratorOptions,\n): Promise<void> =>\n runSQLMigrations(pool, migrations, {\n schema: {\n migrationTable: migrationTableSchemaComponent,\n },\n lock: {\n databaseLock: AdvisoryLock,\n options: {\n ...(options ?? {}),\n lockId: MIGRATIONS_LOCK_ID,\n },\n },\n dryRun: options?.dryRun,\n });\n","import { exists, sql, type ConnectionPool, type SQL } from '../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(functionExistsSQL(tableName)));\n","import {\n defaultDatabaseLockOptions,\n type AcquireDatabaseLockMode,\n type AcquireDatabaseLockOptions,\n type DatabaseLock,\n type DatabaseLockOptions,\n type ReleaseDatabaseLockOptions,\n} from '..';\nimport { single, sql, type SQLExecutor } from '../../../core';\n\nexport const tryAcquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n const advisoryLock =\n options.mode === 'Permanent' ? 'pg_advisory_lock' : 'pg_advisory_xact_lock';\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT %s(%s) AS locked', advisoryLock, options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const releaseAdvisoryLock = async (\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT pg_advisory_unlock(%s) AS locked', options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const acquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n) => {\n const lockAcquired = await tryAcquireAdvisoryLock(execute, options);\n if (!lockAcquired) {\n throw new Error(\n 'Failed to acquire advisory lock within the specified timeout. Migration aborted.',\n );\n }\n};\n\nexport const AdvisoryLock: DatabaseLock = {\n acquire: acquireAdvisoryLock,\n tryAcquire: tryAcquireAdvisoryLock,\n release: releaseAdvisoryLock,\n withAcquire: async <Result>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => {\n await acquireAdvisoryLock(execute, options);\n try {\n return await handle();\n } finally {\n if (options.mode === 'Permanent')\n await releaseAdvisoryLock(execute, options);\n }\n },\n};\n\nexport const advisoryLock = (\n execute: SQLExecutor,\n options: DatabaseLockOptions,\n) => ({\n acquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n tryAcquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n tryAcquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n release: () => releaseAdvisoryLock(execute, options),\n withAcquire: async <Result>(\n handle: () => Promise<Result>,\n acquireOptions?: { mode: AcquireDatabaseLockMode },\n ) => {\n await acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n });\n try {\n return await handle();\n } finally {\n await releaseAdvisoryLock(execute, options);\n }\n },\n});\n","import pg from 'pg';\nimport { createConnection, type Connection } from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport { nodePostgresTransaction } from './transaction';\n\nexport const NodePostgresConnectorType = 'PostgreSQL:pg';\nexport type NodePostgresConnector = 'PostgreSQL:pg';\n\nexport type NodePostgresClient = pg.PoolClient | pg.Client;\n\nexport type NodePostgresPoolOrClient = pg.Pool | pg.PoolClient | pg.Client;\n\nexport type NodePostgresClientConnection = Connection<\n NodePostgresConnector,\n pg.Client\n>;\n\nexport type NodePostgresPoolClientConnection = Connection<\n NodePostgresConnector,\n pg.PoolClient\n>;\n\nexport type NodePostgresConnection =\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n\nexport type NodePostgresPoolClientOptions = {\n type: 'PoolClient';\n connect: Promise<pg.PoolClient>;\n close: (client: pg.PoolClient) => Promise<void>;\n};\n\nexport type NodePostgresClientOptions = {\n type: 'Client';\n connect: Promise<pg.Client>;\n close: (client: pg.Client) => Promise<void>;\n};\n\nexport const nodePostgresClientConnection = (\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport const nodePostgresPoolClientConnection = (\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions | NodePostgresClientOptions,\n): NodePostgresPoolClientConnection | NodePostgresClientConnection {\n return options.type === 'Client'\n ? nodePostgresClientConnection(options)\n : nodePostgresPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString: connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import pg from 'pg';\nimport {\n tracer,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n} from '../../../core';\nimport {\n NodePostgresConnectorType,\n type NodePostgresClient,\n type NodePostgresConnector,\n} from '../connections';\n\nexport const isNodePostgresNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isNodePostgresClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isNodePostgresPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const nodePostgresExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isNodePostgresNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (\n isNodePostgresNativePool(poolOrClient) &&\n isNodePostgresPoolClient(client)\n )\n client.release();\n }\n};\n\nexport type NodePostgresSQLExecutor = DbSQLExecutor<\n NodePostgresConnector,\n NodePostgresClient\n>;\n\nexport const nodePostgresSQLExecutor = (): NodePostgresSQLExecutor => ({\n type: NodePostgresConnectorType,\n query: batch,\n batchQuery: batch,\n command: batch,\n batchCommand: batch,\n});\n\nexport type BatchQueryOptions = { timeoutMs?: number };\n\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL,\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>>;\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>[]>;\nasync function batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL | SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result> | QueryResult<Result>[]> {\n const sqls = Array.isArray(sqlOrSqls) ? sqlOrSqls : [sqlOrSqls];\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options?.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n tracer.info('db:sql:query', { sql: sqls[i]! });\n const result = await client.query<Result>(sqls[i]!);\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n }\n return Array.isArray(sqlOrSqls) ? results : results[0]!;\n}\n","import {\n sqlExecutor,\n type Connection,\n type DatabaseTransaction,\n} from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport {\n NodePostgresConnectorType,\n type NodePostgresConnector,\n type NodePostgresPoolOrClient,\n} from './connection';\n\nexport type NodePostgresTransaction =\n DatabaseTransaction<NodePostgresConnector>;\n\nexport const nodePostgresTransaction =\n <DbClient extends NodePostgresPoolOrClient = NodePostgresPoolOrClient>(\n connection: () => Connection<NodePostgresConnector, DbClient>,\n ) =>\n (\n getClient: Promise<DbClient>,\n options?: { close: (client: DbClient, error?: unknown) => Promise<void> },\n ): DatabaseTransaction<NodePostgresConnector> => ({\n connection: connection(),\n type: NodePostgresConnectorType,\n begin: async () => {\n const client = await getClient;\n await client.query('BEGIN');\n },\n commit: async () => {\n const client = await getClient;\n\n await client.query('COMMIT');\n\n if (options?.close) await options?.close(client);\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n await client.query('ROLLBACK');\n\n if (options?.close) await options?.close(client, error);\n },\n execute: sqlExecutor(nodePostgresSQLExecutor(), {\n connect: () => getClient,\n }),\n });\n","import pg from 'pg';\nimport {\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n} from '../../../core';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from '../../core';\nimport { setNodePostgresTypeParser } from '../serialization';\nimport {\n nodePostgresConnection,\n NodePostgresConnectorType,\n type NodePostgresClientConnection,\n type NodePostgresConnector,\n type NodePostgresPoolClientConnection,\n} from './connection';\n\nexport type NodePostgresNativePool =\n ConnectionPool<NodePostgresPoolClientConnection>;\n\nexport type NodePostgresAmbientClientPool =\n ConnectionPool<NodePostgresClientConnection>;\n\nexport type NodePostgresAmbientConnectionPool = ConnectionPool<\n NodePostgresPoolClientConnection | NodePostgresClientConnection\n>;\n\nexport type NodePostgresPool =\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool;\n\nexport const nodePostgresNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresNativePool => {\n const { connectionString, database } = options;\n const pool = getPool({ connectionString, database });\n\n const getConnection = () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPool({ connectionString, database });\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const nodePostgresAmbientNativePool = (options: {\n pool: pg.Pool;\n}): NodePostgresNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n }),\n });\n};\n\nexport const nodePostgresAmbientConnectionPool = (options: {\n connection: NodePostgresPoolClientConnection | NodePostgresClientConnection;\n}): NodePostgresAmbientConnectionPool => {\n const { connection } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: () => connection.transaction(),\n withTransaction: (handle) => connection.withTransaction(handle),\n });\n};\n\nexport const nodePostgresClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => {\n const connect = Promise.resolve(\n new pg.Client({ connectionString, database }),\n ).then(async (client) => {\n await client.connect();\n return client;\n });\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n });\n },\n });\n};\n\nexport const nodePostgresAmbientClientPool = (options: {\n client: pg.Client;\n}): NodePostgresAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = Promise.resolve(client);\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type NodePostgresPoolPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n };\n\nexport type NodePostgresPoolNotPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n connection:\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n pooled?: false;\n };\n\nexport type NodePostgresPoolOptions = (\n | NodePostgresPoolPooledOptions\n | NodePostgresPoolNotPooledOptions\n) & {\n serializer?: JSONSerializer;\n};\n\nexport function nodePostgresPool(\n options: NodePostgresPoolPooledOptions,\n): NodePostgresNativePool;\nexport function nodePostgresPool(\n options: NodePostgresPoolNotPooledOptions,\n): NodePostgresAmbientClientPool;\nexport function nodePostgresPool(\n options: NodePostgresPoolOptions,\n):\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool {\n const { connectionString, database } = options;\n\n setNodePostgresTypeParser();\n\n if ('client' in options && options.client)\n return nodePostgresAmbientClientPool({ client: options.client });\n\n if ('connection' in options && options.connection)\n return nodePostgresAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return nodePostgresClientPool({ connectionString, database });\n\n if ('pool' in options && options.pool)\n return nodePostgresAmbientNativePool({ pool: options.pool });\n\n return nodePostgresNativePool({\n connectionString,\n database,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pg from 'pg';\nimport { JSONSerializer, RawJSONSerializer } from '../../../core/serializer';\n\nlet arePgTypesSet = false;\n\nexport const setNodePostgresTypeParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => JSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => JSONSerializer.deserialize(val));\n};\n\nexport const setNodePostgresTypeRawParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => RawJSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => RawJSONSerializer.deserialize(val));\n};\n","export * from './core';\nexport * from './pg';\nimport {\n type NodePostgresConnection,\n type NodePostgresConnector,\n type NodePostgresPool,\n type NodePostgresPoolOptions,\n nodePostgresPool,\n} from './pg';\n\nexport type PostgresConnector = NodePostgresConnector;\nexport type PostgresPoolOptions = NodePostgresPoolOptions;\nexport type PostgresPool = NodePostgresPool;\nexport type PostgresConnection = NodePostgresConnection;\nexport const postgresPool = nodePostgresPool;\n","import {\n postgresPool,\n type PostgresConnector,\n type PostgresPool,\n type PostgresPoolOptions,\n} from './postgres';\n\nexport * from './core';\nexport * from './postgres';\n\nexport type ConnectorType = PostgresConnector;\n\nexport type PoolOptions = {\n connector?: ConnectorType;\n};\n\nexport type DumboOptions = PoolOptions & PostgresPoolOptions;\nexport type Dumbo = PostgresPool;\n\nexport const connectionPool = <PoolOptionsType extends DumboOptions>(\n options: PoolOptionsType,\n) =>\n // TODO: this should have the pattern matching and verification\n postgresPool(options as unknown as PostgresPoolOptions);\n\nexport const dumbo = <DumboOptionsType extends DumboOptions = DumboOptions>(\n options: DumboOptionsType,\n): Dumbo => connectionPool(options);\n"]}
1
+ {"version":3,"sources":["/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/index.cjs","../src/core/serializer/json/index.ts","../src/core/sql/pg-format/reserved.ts","../src/core/sql/pg-format/index.ts","../src/core/sql/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/schema/migrations.ts","../src/core/schema/schemaComponent.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/locks/databaseLock.ts","../src/postgres/core/connections/connectionString.ts","../src/postgres/core/schema/migrations.ts","../src/postgres/core/schema/schema.ts","../src/postgres/core/locks/advisoryLocks.ts","../src/postgres/pg/connections/connection.ts","../src/postgres/pg/execute/execute.ts","../src/postgres/pg/connections/transaction.ts","../src/postgres/pg/connections/pool.ts","../src/postgres/pg/serialization/index.ts","../src/postgres/index.ts","../src/index.ts"],"names":["key","sql","literal","sqlExecutor","format","advisoryLock","pg"],"mappings":"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;AACA,IAAA;AACD,EAAA;AACH;AAEoC;AAC9B;AAEO;AAGL,EAAA;AAKA,EAAA;AAKA,EAAA;AAMA,EAAA;AAEN,EAAA;AAGE,EAAA;AAGJ;AAEa;AACX,EAAA;AACA,EAAA;AACA,EAAA;AAKmB;AACnB,EAAA;AACM,EAAA;AAEA,EAAA;AACF,EAAA;AACI,IAAA;AACR,EAAA;AACF;AAEa;AACP,EAAA;AACI,IAAA;AACC,EAAA;AACA,IAAA;AACT,EAAA;AACM,EAAA;AACR;AAEa;AAEC,EAAA;AACZ;AAEW;AAGP;AACE,EAAA;AACA,EAAA;AAEN,EAAA;AAEO,EAAA;AACT;AxByiCY;AACA;A0Bt1CC;A1Bw1CD;AACA;A2Bp1CC;AACX;AAGA,EAAA;AAAsD;AAEnC;A3Bo1CT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/Pongo/Pongo/src/packages/dumbo/dist/index.cjs","sourcesContent":[null,"import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !Number.isSafeInteger(value)\n ) {\n try {\n return BigInt(context?.source ?? value.toString());\n } catch {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n }\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.parseBigInts === true ? JSONReplacers.bigInt : undefined,\n opts?.parseDates === true ? JSONReplacers.date : undefined,\n opts?.replacer,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n opts?.reviver,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (options?: JSONSerializerOptions): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer = jsonSerializer({ parseBigInts: true });\n\nconst RawJSONSerializer = jsonSerializer();\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n RawJSONSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n};\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/reserved.js\n//\n// PostgreSQL reserved words\n//\nconst reservedMap: { [key: string]: boolean } = {\n AES128: true,\n AES256: true,\n ALL: true,\n ALLOWOVERWRITE: true,\n ANALYSE: true,\n ANALYZE: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BACKUP: true,\n BETWEEN: true,\n BINARY: true,\n BLANKSASNULL: true,\n BOTH: true,\n BYTEDICT: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CREDENTIALS: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n CURRENT_USER_ID: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DEFLATE: true,\n DEFRAG: true,\n DELTA: true,\n DELTA32K: true,\n DESC: true,\n DISABLE: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n EMPTYASNULL: true,\n ENABLE: true,\n ENCODE: true,\n ENCRYPT: true,\n ENCRYPTION: true,\n END: true,\n EXCEPT: true,\n EXPLICIT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FREEZE: true,\n FROM: true,\n FULL: true,\n GLOBALDICT256: true,\n GLOBALDICT64K: true,\n GRANT: true,\n GROUP: true,\n GZIP: true,\n HAVING: true,\n IDENTITY: true,\n IGNORE: true,\n ILIKE: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n ISNULL: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LIMIT: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n LUN: true,\n LUNS: true,\n LZO: true,\n LZOP: true,\n MINUS: true,\n MOSTLY13: true,\n MOSTLY32: true,\n MOSTLY8: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NOTNULL: true,\n NULL: true,\n NULLS: true,\n OFF: true,\n OFFLINE: true,\n OFFSET: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARALLEL: true,\n PARTITION: true,\n PERCENT: true,\n PLACING: true,\n PRIMARY: true,\n RAW: true,\n READRATIO: true,\n RECOVER: true,\n REFERENCES: true,\n REJECTLOG: true,\n RESORT: true,\n RESTORE: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n SYSDATE: true,\n SYSTEM: true,\n TABLE: true,\n TAG: true,\n TDES: true,\n TEXT255: true,\n TEXT32K: true,\n THEN: true,\n TO: true,\n TOP: true,\n TRAILING: true,\n TRUE: true,\n TRUNCATECOLUMNS: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n VERBOSE: true,\n WALLET: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n};\n\nexport default reservedMap;\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/index.js\nimport { JSONSerializer } from '../../serializer/index.js';\nimport reservedMap from './reserved.js';\n\ntype FormatterConfig = {\n pattern?: {\n ident?: string;\n literal?: string;\n string?: string;\n };\n};\n\ntype FormatterFunction = (value: unknown) => string;\n\nconst fmtPattern = {\n ident: 'I',\n literal: 'L',\n string: 's',\n};\n\n// convert to Postgres default ISO 8601 format\nconst formatDate = (date: string): string => {\n date = date.replace('T', ' ');\n date = date.replace('Z', '+00');\n return date;\n};\n\nconst isReserved = (value: string): boolean => {\n return !!reservedMap[value.toUpperCase()];\n};\n\nconst arrayToList = (\n useSpace: boolean,\n array: unknown[],\n formatter: FormatterFunction,\n): string => {\n let sql = '';\n sql += useSpace ? ' (' : '(';\n for (let i = 0; i < array.length; i++) {\n sql += (i === 0 ? '' : ', ') + formatter(array[i]);\n }\n sql += ')';\n return sql;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteIdent = (value: unknown): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n } else if (value === false) {\n return '\"f\"';\n } else if (value === true) {\n return '\"t\"';\n } else if (value instanceof Date) {\n return '\"' + formatDate(value.toISOString()) + '\"';\n } else if (value instanceof Buffer) {\n throw new Error('SQL identifier cannot be a buffer');\n } else if (Array.isArray(value)) {\n return value\n .map((v) => {\n if (Array.isArray(v)) {\n throw new Error(\n 'Nested array to grouped list conversion is not supported for SQL identifier',\n );\n }\n return quoteIdent(v);\n })\n .toString();\n } else if (value === Object(value)) {\n throw new Error('SQL identifier cannot be an object');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const ident = value.toString().slice(0); // create copy\n\n // do not quote a valid, unquoted identifier\n if (/^[a-z_][a-z0-9_$]*$/.test(ident) && !isReserved(ident)) {\n return ident;\n }\n\n let quoted = '\"';\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === '\"' ? c + c : c;\n }\n quoted += '\"';\n return quoted;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteLiteral = (value: unknown): string => {\n let literal: string | null = null;\n let explicitCast: string | null = null;\n\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (value === false) {\n return \"'f'\";\n } else if (value === true) {\n return \"'t'\";\n } else if (value instanceof Date) {\n return \"'\" + formatDate(value.toISOString()) + \"'\";\n } else if (value instanceof Buffer) {\n return \"E'\\\\\\\\x\" + value.toString('hex') + \"'\";\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteLiteral);\n }\n return quoteLiteral(v);\n })\n .toString();\n } else if (value === Object(value)) {\n explicitCast = 'jsonb';\n literal = JSONSerializer.serialize(value);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n literal = value.toString().slice(0); // create copy\n }\n\n let hasBackslash = false;\n let quoted = \"'\";\n\n for (let i = 0; i < literal.length; i++) {\n const c = literal[i];\n if (c === \"'\") {\n quoted += c + c;\n } else if (c === '\\\\') {\n quoted += c + c;\n hasBackslash = true;\n } else {\n quoted += c;\n }\n }\n\n quoted += \"'\";\n\n if (hasBackslash) {\n quoted = 'E' + quoted;\n }\n\n if (explicitCast) {\n quoted += '::' + explicitCast;\n }\n\n return quoted;\n};\n\nconst quoteString = (value: unknown): string => {\n if (value === undefined || value === null) {\n return '';\n } else if (value === false) {\n return 'f';\n } else if (value === true) {\n return 't';\n } else if (value instanceof Date) {\n return formatDate(value.toISOString());\n } else if (value instanceof Buffer) {\n return '\\\\x' + value.toString('hex');\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (v !== null && v !== undefined) {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteString);\n }\n return quoteString(v);\n }\n return ''; // Handle undefined or null values properly within arrays\n })\n .filter((v) => v !== '') // Filter out empty strings to avoid extra commas\n .toString();\n } else if (value === Object(value)) {\n return JSONSerializer.serialize(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return value.toString().slice(0); // return copy\n};\n\nconst config = (cfg: FormatterConfig): void => {\n // default\n fmtPattern.ident = 'I';\n fmtPattern.literal = 'L';\n fmtPattern.string = 's';\n\n if (cfg && cfg.pattern) {\n if (cfg.pattern.ident) {\n fmtPattern.ident = cfg.pattern.ident;\n }\n if (cfg.pattern.literal) {\n fmtPattern.literal = cfg.pattern.literal;\n }\n if (cfg.pattern.string) {\n fmtPattern.string = cfg.pattern.string;\n }\n }\n};\n\nconst formatWithArray = (fmt: string, parameters: unknown[]): string => {\n let index = 0;\n const params = parameters;\n\n let re: string | RegExp = '%(%|(\\\\d+\\\\$)?[';\n re += fmtPattern.ident;\n re += fmtPattern.literal;\n re += fmtPattern.string;\n re += '])';\n re = new RegExp(re, 'g');\n\n return fmt.replace(re, (_, type) => {\n if (type === '%') {\n return '%';\n }\n\n let position = index;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const tokens = type.split('$');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (tokens.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n position = parseInt(tokens[0], 10) - 1;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n type = tokens[1];\n }\n\n if (position < 0) {\n throw new Error('specified argument 0 but arguments start at 1');\n } else if (position > params.length - 1) {\n throw new Error('too few arguments');\n }\n\n index = position + 1;\n\n if (type === fmtPattern.ident) {\n return quoteIdent(params[position]);\n } else if (type === fmtPattern.literal) {\n return quoteLiteral(params[position]);\n } else if (type === fmtPattern.string) {\n return quoteString(params[position]);\n }\n\n return undefined!;\n });\n};\n\nconst format = (fmt: string, ...args: unknown[]): string => {\n return formatWithArray(fmt, args);\n};\n\nformat.config = config;\nformat.format = format;\nformat.ident = quoteIdent;\nformat.literal = quoteLiteral;\nformat.string = quoteString;\nformat.withArray = formatWithArray;\n\nexport default format;\n","import format from './pg-format';\n// TODO: add core formatter, when adding other database type\n\ntype SQL = string & { __brand: 'sql' };\n\nconst sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nconst rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n\nconst isSQL = (literal: unknown): literal is SQL =>\n literal !== undefined && literal !== null && typeof literal === 'string';\n\ntype SQLValue =\n | { type: 'literal'; value: unknown } // Literal types (e.g., strings, numbers)\n | { type: 'identifier'; value: string } // Identifier types (e.g., table/column names)\n | { type: 'plainString'; value: string }; // Plain string types (unsafe, unescaped)\n\n// Wrapping functions for explicit formatting\nconst literal = (value: unknown) => ({ type: 'literal', value });\nconst identifier = (value: string) => ({ type: 'identifier', value });\nconst plainString = (value: string) => ({ type: 'plainString', value });\n\nconst defaultFormat = (value: unknown) => {\n if (typeof value === 'string') {\n return format('%L', value);\n } else if (typeof value === 'number') {\n return value.toString();\n } else if (typeof value === 'bigint') {\n return format('%L', value);\n } else if (value instanceof Date) {\n return format('%L', value);\n } else if (Array.isArray(value)) {\n return format('(%L)', value);\n } else if (typeof value === 'object') {\n return format('%s', JSON.stringify(value));\n } else {\n return format('%L', value);\n }\n};\n\nfunction SQL(strings: TemplateStringsArray, ...values: unknown[]): SQL {\n return strings\n .map((string, index) => {\n let formattedValue = '';\n\n if (index < values.length) {\n const value = values[index];\n\n if (\n value &&\n typeof value === 'object' &&\n 'type' in value &&\n 'value' in value\n ) {\n const sqlValue = value as SQLValue;\n switch (sqlValue.type) {\n case 'literal':\n formattedValue = format('%L', sqlValue.value);\n break;\n case 'identifier':\n formattedValue = format('%I', sqlValue.value);\n break;\n case 'plainString':\n formattedValue = sqlValue.value;\n break;\n }\n } else {\n formattedValue = defaultFormat(value);\n }\n }\n\n return string + formattedValue;\n })\n .join('') as SQL;\n}\n\nexport { SQL, identifier, isSQL, literal, plainString, rawSql, sql };\n","import type { Connection } from '../connections';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport { type SQL } from '../sql';\n\nexport type SQLQueryOptions = { timeoutMs?: number };\nexport type SQLCommandOptions = { timeoutMs?: number };\n\nexport interface DbSQLExecutor<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n type: ConnectorType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql),\n options,\n ),\n batchQuery: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls),\n options,\n ),\n command: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql),\n options,\n ),\n batchCommand: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport { type Connection } from './connection';\n\nexport interface DatabaseTransaction<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor {\n type: ConnectorType;\n connection: Connection<ConnectorType, DbClient>;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n}\n\nexport interface DatabaseTransactionFactory<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n transaction: () => DatabaseTransaction<ConnectorType, DbClient>;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n ConnectorType extends string = string,\n DbClient = unknown,\n Result = void,\n>(\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectorType extends string = string,\n DbClient = unknown,\n>(\n connect: () => Promise<DbClient>,\n initTransaction: (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>,\n): DatabaseTransactionFactory<ConnectorType, DbClient> => ({\n transaction: () => initTransaction(connect()),\n withTransaction: (handle) =>\n executeInTransaction(initTransaction(connect()), handle),\n});\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends Connection = Connection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends Connection = Connection,\n>(\n connect: () => ConnectionType,\n): DatabaseTransactionFactory<ConnectionType['type']> => ({\n transaction: () => {\n const connection = connect();\n const transaction = connection.transaction();\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle) => {\n const connection = connect();\n return wrapInConnectionClosure(connection, () =>\n connection.withTransaction(handle),\n );\n },\n});\n","import {\n sqlExecutor,\n type DbSQLExecutor,\n type WithSQLExecutor,\n} from '../execute';\nimport {\n transactionFactoryWithDbClient,\n type DatabaseTransaction,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor,\n DatabaseTransactionFactory<ConnectorType> {\n type: ConnectorType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n}\n\nexport interface ConnectionFactory<\n ConnectionType extends Connection = Connection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n ) => Promise<Result>;\n}\n\nexport type CreateConnectionOptions<\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n type: ConnectorType;\n connect: Promise<DbClient>;\n close: (client: DbClient) => Promise<void>;\n initTransaction: (\n connection: () => ConnectionType,\n ) => (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>;\n executor: () => Executor;\n};\n\nexport const createConnection = <\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateConnectionOptions<\n ConnectorType,\n DbClient,\n ConnectionType,\n Executor\n >,\n): ConnectionType => {\n const { type, connect, close, initTransaction, executor } = options;\n\n let client: DbClient | null = null;\n\n const getClient = async () => client ?? (client = await connect);\n\n const connection: Connection<ConnectorType, DbClient> = {\n type: type,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor(), { connect: getClient }),\n };\n\n const typedConnection = connection as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInNewConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport { type Connection, type ConnectionFactory } from './connection';\nimport {\n transactionFactoryWithNewConnection,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<ConnectionType extends Connection = Connection>\n extends WithSQLExecutor,\n ConnectionFactory<ConnectionType>,\n DatabaseTransactionFactory<ConnectionType['type']> {\n type: ConnectionType['type'];\n close: () => Promise<void>;\n}\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport const createConnectionPool = <\n ConnectionType extends Connection,\n ConnectionPoolType extends ConnectionPool<ConnectionType>,\n>(\n pool: Pick<ConnectionPool<ConnectionType>, 'type'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n },\n): ConnectionPoolType => {\n const { type, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(handle: (connection: ConnectionType) => Promise<Result>) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({ connection });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n type,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result as ConnectionPoolType;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const mapRows = async <\n Result extends QueryResultRow = QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: Record<string, unknown>,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return result.count;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true;\n};\n","import {\n mapToCamelCase,\n rawSql,\n singleOrNull,\n sql,\n tracer,\n type SchemaComponent,\n type SQLExecutor,\n} from '..';\nimport { type DatabaseLock, type DatabaseLockOptions, type Dumbo } from '../..';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: string[];\n};\n\nexport const sqlMigration = (name: string, sqls: string[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\nexport type MigratorOptions = {\n schema: {\n migrationTable: SchemaComponent;\n };\n lock: {\n databaseLock: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n options: MigratorOptions,\n): Promise<void> =>\n pool.withTransaction(async ({ execute }) => {\n const { databaseLock, ...rest } = options.lock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const coreMigrations = options.schema.migrationTable.migrations({\n connector: 'PostgreSQL:pg', // TODO: This will need to change to support more connectors\n });\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n const sql = combineMigrations(migration);\n await execute.command(rawSql(sql));\n }\n\n for (const migration of migrations) {\n await runSQLMigration(execute, migration);\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result: undefined };\n });\n\nconst runSQLMigration = async (\n execute: SQLExecutor,\n migration: SQLMigration,\n): Promise<void> => {\n const sql = combineMigrations(migration);\n const sqlHash = await getMigrationHash(sql);\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const wasMigrationApplied = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (wasMigrationApplied) return;\n\n await execute.command(rawSql(sql));\n\n await recordMigration(execute, newMigration);\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (content: string): Promise<string> => {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (...migration: Pick<SQLMigration, 'sqls'>[]) =>\n migration.flatMap((m) => m.sqls).join('\\n');\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<boolean> => {\n const result = await singleOrNull(\n execute.query<{ sql_hash: string }>(\n sql(`SELECT sql_hash FROM migrations WHERE name = %L`, migration.name),\n ),\n );\n\n if (result === null) return false;\n\n const { sqlHash } = mapToCamelCase<Pick<MigrationRecord, 'sqlHash'>>(result);\n\n if (sqlHash !== migration.sqlHash) {\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n }\n\n //console.log(`Migration \"${migration.name}\" already applied. Skipping.`);\n return true;\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n sql(\n `\n INSERT INTO migrations (name, sql_hash)\n VALUES (%L, %L)\n `,\n migration.name,\n migration.sqlHash,\n ),\n );\n};\n","import type { ConnectorType } from '../..';\nimport { type SQLMigration } from './migrations';\n\nexport type SchemaComponentMigrationsOptions = {\n connector: ConnectorType;\n};\n\nexport type SchemaComponent = {\n schemaComponentType: string;\n components?: ReadonlyArray<SchemaComponent> | undefined;\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n};\n\nexport const schemaComponent = (\n type: string,\n migrationsOrComponents:\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n }\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n components: ReadonlyArray<SchemaComponent>;\n }\n | {\n components: ReadonlyArray<SchemaComponent>;\n },\n): SchemaComponent => {\n const components =\n 'components' in migrationsOrComponents\n ? migrationsOrComponents.components\n : undefined;\n\n const migrations =\n 'migrations' in migrationsOrComponents\n ? migrationsOrComponents.migrations\n : undefined;\n\n return {\n schemaComponentType: type,\n components,\n migrations: (options) => [\n ...(migrations ? migrations(options) : []),\n ...(components\n ? components.flatMap((component) => component.migrations(options))\n : []),\n ],\n };\n};\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = process.env.DUMBO_LOG_LEVEL ?? LogLevel.DISABLED;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (logStyle: LogStyle): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return JSONSerializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (process.env.DUMBO_LOG_STYLE as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import { type SQLExecutor } from '..';\n\nexport type DatabaseLockOptions = { lockId: number; timeoutMs?: number };\n\nexport type AcquireDatabaseLockMode = 'Permanent' | 'Session';\n\nexport type AcquireDatabaseLockOptions = DatabaseLockOptions & {\n mode?: AcquireDatabaseLockMode;\n};\nexport type ReleaseDatabaseLockOptions = DatabaseLockOptions;\n\nexport const defaultDatabaseLockOptions: Required<\n Omit<DatabaseLockOptions, 'lockId'>\n> = {\n timeoutMs: 10000,\n};\n\nexport type DatabaseLock = {\n acquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<void>;\n tryAcquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<boolean>;\n release(\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n ): Promise<boolean>;\n withAcquire: <Result = unknown>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => Promise<Result>;\n};\n","import pgcs from 'pg-connection-string';\nimport { defaultPostgreSqlDatabase } from '../schema';\n\nexport const defaultPostgreSQLConenctionString =\n 'postgresql://postgres@localhost:5432/postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import { AdvisoryLock, type DatabaseLockOptions } from '../..';\nimport { rawSql, type Dumbo } from '../../..';\nimport {\n MIGRATIONS_LOCK_ID,\n runSQLMigrations,\n schemaComponent,\n sqlMigration,\n type SQLMigration,\n} from '../../../core/schema';\n\nexport type PostgreSQLMigratorOptions = {\n lock?: {\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nconst migrationTableSQL = rawSql(`\n CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL UNIQUE,\n application VARCHAR(255) NOT NULL DEFAULT 'default',\n sql_hash VARCHAR(64) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`);\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: () => [\n sqlMigration('dumbo:migrationTable:001', [migrationTableSQL]),\n ],\n },\n);\n\nexport const runPostgreSQLMigrations = (\n pool: Dumbo,\n migrations: SQLMigration[],\n options?: PostgreSQLMigratorOptions,\n): Promise<void> =>\n runSQLMigrations(pool, migrations, {\n schema: {\n migrationTable: migrationTableSchemaComponent,\n },\n lock: {\n databaseLock: AdvisoryLock,\n options: {\n ...(options ?? {}),\n lockId: MIGRATIONS_LOCK_ID,\n },\n },\n dryRun: options?.dryRun,\n });\n","import { exists, sql, type ConnectionPool, type SQL } from '../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(functionExistsSQL(tableName)));\n","import {\n defaultDatabaseLockOptions,\n type AcquireDatabaseLockMode,\n type AcquireDatabaseLockOptions,\n type DatabaseLock,\n type DatabaseLockOptions,\n type ReleaseDatabaseLockOptions,\n} from '..';\nimport { single, sql, type SQLExecutor } from '../../../core';\n\nexport const tryAcquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n const advisoryLock =\n options.mode === 'Permanent' ? 'pg_advisory_lock' : 'pg_advisory_xact_lock';\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT %s(%s) AS locked', advisoryLock, options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const releaseAdvisoryLock = async (\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT pg_advisory_unlock(%s) AS locked', options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const acquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n) => {\n const lockAcquired = await tryAcquireAdvisoryLock(execute, options);\n if (!lockAcquired) {\n throw new Error(\n 'Failed to acquire advisory lock within the specified timeout. Migration aborted.',\n );\n }\n};\n\nexport const AdvisoryLock: DatabaseLock = {\n acquire: acquireAdvisoryLock,\n tryAcquire: tryAcquireAdvisoryLock,\n release: releaseAdvisoryLock,\n withAcquire: async <Result>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => {\n await acquireAdvisoryLock(execute, options);\n try {\n return await handle();\n } finally {\n if (options.mode === 'Permanent')\n await releaseAdvisoryLock(execute, options);\n }\n },\n};\n\nexport const advisoryLock = (\n execute: SQLExecutor,\n options: DatabaseLockOptions,\n) => ({\n acquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n tryAcquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n tryAcquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n release: () => releaseAdvisoryLock(execute, options),\n withAcquire: async <Result>(\n handle: () => Promise<Result>,\n acquireOptions?: { mode: AcquireDatabaseLockMode },\n ) => {\n await acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n });\n try {\n return await handle();\n } finally {\n await releaseAdvisoryLock(execute, options);\n }\n },\n});\n","import pg from 'pg';\nimport { createConnection, type Connection } from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport { nodePostgresTransaction } from './transaction';\n\nexport const NodePostgresConnectorType = 'PostgreSQL:pg';\nexport type NodePostgresConnector = 'PostgreSQL:pg';\n\nexport type NodePostgresClient = pg.PoolClient | pg.Client;\n\nexport type NodePostgresPoolOrClient = pg.Pool | pg.PoolClient | pg.Client;\n\nexport type NodePostgresClientConnection = Connection<\n NodePostgresConnector,\n pg.Client\n>;\n\nexport type NodePostgresPoolClientConnection = Connection<\n NodePostgresConnector,\n pg.PoolClient\n>;\n\nexport type NodePostgresConnection =\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n\nexport type NodePostgresPoolClientOptions = {\n type: 'PoolClient';\n connect: Promise<pg.PoolClient>;\n close: (client: pg.PoolClient) => Promise<void>;\n};\n\nexport type NodePostgresClientOptions = {\n type: 'Client';\n connect: Promise<pg.Client>;\n close: (client: pg.Client) => Promise<void>;\n};\n\nexport const nodePostgresClientConnection = (\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport const nodePostgresPoolClientConnection = (\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions | NodePostgresClientOptions,\n): NodePostgresPoolClientConnection | NodePostgresClientConnection {\n return options.type === 'Client'\n ? nodePostgresClientConnection(options)\n : nodePostgresPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString: connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import pg from 'pg';\nimport {\n tracer,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n} from '../../../core';\nimport {\n NodePostgresConnectorType,\n type NodePostgresClient,\n type NodePostgresConnector,\n} from '../connections';\n\nexport const isNodePostgresNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isNodePostgresClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isNodePostgresPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const nodePostgresExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isNodePostgresNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (\n isNodePostgresNativePool(poolOrClient) &&\n isNodePostgresPoolClient(client)\n )\n client.release();\n }\n};\n\nexport type NodePostgresSQLExecutor = DbSQLExecutor<\n NodePostgresConnector,\n NodePostgresClient\n>;\n\nexport const nodePostgresSQLExecutor = (): NodePostgresSQLExecutor => ({\n type: NodePostgresConnectorType,\n query: batch,\n batchQuery: batch,\n command: batch,\n batchCommand: batch,\n});\n\nexport type BatchQueryOptions = { timeoutMs?: number };\n\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL,\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>>;\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>[]>;\nasync function batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL | SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result> | QueryResult<Result>[]> {\n const sqls = Array.isArray(sqlOrSqls) ? sqlOrSqls : [sqlOrSqls];\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options?.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n tracer.info('db:sql:query', { sql: sqls[i]! });\n const result = await client.query<Result>(sqls[i]!);\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n }\n return Array.isArray(sqlOrSqls) ? results : results[0]!;\n}\n","import {\n sqlExecutor,\n type Connection,\n type DatabaseTransaction,\n} from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport {\n NodePostgresConnectorType,\n type NodePostgresConnector,\n type NodePostgresPoolOrClient,\n} from './connection';\n\nexport type NodePostgresTransaction =\n DatabaseTransaction<NodePostgresConnector>;\n\nexport const nodePostgresTransaction =\n <DbClient extends NodePostgresPoolOrClient = NodePostgresPoolOrClient>(\n connection: () => Connection<NodePostgresConnector, DbClient>,\n ) =>\n (\n getClient: Promise<DbClient>,\n options?: { close: (client: DbClient, error?: unknown) => Promise<void> },\n ): DatabaseTransaction<NodePostgresConnector> => ({\n connection: connection(),\n type: NodePostgresConnectorType,\n begin: async () => {\n const client = await getClient;\n await client.query('BEGIN');\n },\n commit: async () => {\n const client = await getClient;\n\n await client.query('COMMIT');\n\n if (options?.close) await options?.close(client);\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n await client.query('ROLLBACK');\n\n if (options?.close) await options?.close(client, error);\n },\n execute: sqlExecutor(nodePostgresSQLExecutor(), {\n connect: () => getClient,\n }),\n });\n","import pg from 'pg';\nimport {\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n} from '../../../core';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from '../../core';\nimport { setNodePostgresTypeParser } from '../serialization';\nimport {\n nodePostgresConnection,\n NodePostgresConnectorType,\n type NodePostgresClientConnection,\n type NodePostgresConnector,\n type NodePostgresPoolClientConnection,\n} from './connection';\n\nexport type NodePostgresNativePool =\n ConnectionPool<NodePostgresPoolClientConnection>;\n\nexport type NodePostgresAmbientClientPool =\n ConnectionPool<NodePostgresClientConnection>;\n\nexport type NodePostgresAmbientConnectionPool = ConnectionPool<\n NodePostgresPoolClientConnection | NodePostgresClientConnection\n>;\n\nexport type NodePostgresPool =\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool;\n\nexport const nodePostgresNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresNativePool => {\n const { connectionString, database } = options;\n const pool = getPool({ connectionString, database });\n\n const getConnection = () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPool({ connectionString, database });\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const nodePostgresAmbientNativePool = (options: {\n pool: pg.Pool;\n}): NodePostgresNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n }),\n });\n};\n\nexport const nodePostgresAmbientConnectionPool = (options: {\n connection: NodePostgresPoolClientConnection | NodePostgresClientConnection;\n}): NodePostgresAmbientConnectionPool => {\n const { connection } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: () => connection.transaction(),\n withTransaction: (handle) => connection.withTransaction(handle),\n });\n};\n\nexport const nodePostgresClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => {\n const connect = Promise.resolve(\n new pg.Client({ connectionString, database }),\n ).then(async (client) => {\n await client.connect();\n return client;\n });\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n });\n },\n });\n};\n\nexport const nodePostgresAmbientClientPool = (options: {\n client: pg.Client;\n}): NodePostgresAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = Promise.resolve(client);\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type NodePostgresPoolPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n };\n\nexport type NodePostgresPoolNotPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n connection:\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n pooled?: false;\n };\n\nexport type NodePostgresPoolOptions = (\n | NodePostgresPoolPooledOptions\n | NodePostgresPoolNotPooledOptions\n) & {\n serializer?: JSONSerializer;\n};\n\nexport function nodePostgresPool(\n options: NodePostgresPoolPooledOptions,\n): NodePostgresNativePool;\nexport function nodePostgresPool(\n options: NodePostgresPoolNotPooledOptions,\n): NodePostgresAmbientClientPool;\nexport function nodePostgresPool(\n options: NodePostgresPoolOptions,\n):\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool {\n const { connectionString, database } = options;\n\n setNodePostgresTypeParser();\n\n if ('client' in options && options.client)\n return nodePostgresAmbientClientPool({ client: options.client });\n\n if ('connection' in options && options.connection)\n return nodePostgresAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return nodePostgresClientPool({ connectionString, database });\n\n if ('pool' in options && options.pool)\n return nodePostgresAmbientNativePool({ pool: options.pool });\n\n return nodePostgresNativePool({\n connectionString,\n database,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pg from 'pg';\nimport { JSONSerializer, RawJSONSerializer } from '../../../core/serializer';\n\nlet arePgTypesSet = false;\n\nexport const setNodePostgresTypeParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => JSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => JSONSerializer.deserialize(val));\n};\n\nexport const setNodePostgresTypeRawParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => RawJSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => RawJSONSerializer.deserialize(val));\n};\n","export * from './core';\nexport * from './pg';\nimport {\n type NodePostgresConnection,\n type NodePostgresConnector,\n type NodePostgresPool,\n type NodePostgresPoolOptions,\n nodePostgresPool,\n} from './pg';\n\nexport type PostgresConnector = NodePostgresConnector;\nexport type PostgresPoolOptions = NodePostgresPoolOptions;\nexport type PostgresPool = NodePostgresPool;\nexport type PostgresConnection = NodePostgresConnection;\nexport const postgresPool = nodePostgresPool;\n","import {\n postgresPool,\n type PostgresConnector,\n type PostgresPool,\n type PostgresPoolOptions,\n} from './postgres';\n\nexport * from './core';\nexport * from './postgres';\n\nexport type ConnectorType = PostgresConnector;\n\nexport type PoolOptions = {\n connector?: ConnectorType;\n};\n\nexport type DumboOptions = PoolOptions & PostgresPoolOptions;\nexport type Dumbo = PostgresPool;\n\nexport const connectionPool = <PoolOptionsType extends DumboOptions>(\n options: PoolOptionsType,\n) =>\n // TODO: this should have the pattern matching and verification\n postgresPool(options as unknown as PostgresPoolOptions);\n\nexport const dumbo = <DumboOptionsType extends DumboOptions = DumboOptions>(\n options: DumboOptionsType,\n): Dumbo => connectionPool(options);\n"]}
package/dist/index.js CHANGED
@@ -14,8 +14,12 @@ var isFirstLetterNumericOrMinus = (str) => {
14
14
  return c >= 48 && c <= 57 || c === 45;
15
15
  };
16
16
  var bigIntReviver = (_key, value, context) => {
17
- if (typeof value === "number" && !Number.isSafeInteger(value)) {
18
- return BigInt(context?.source ?? value.toString());
17
+ if (typeof value === "number" && Number.isInteger(value) && !Number.isSafeInteger(value)) {
18
+ try {
19
+ return BigInt(context?.source ?? value.toString());
20
+ } catch {
21
+ return value;
22
+ }
19
23
  }
20
24
  if (typeof value === "string" && value.length > 15) {
21
25
  if (isFirstLetterNumericOrMinus(value)) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/serializer/json/index.ts","../src/core/sql/pg-format/reserved.ts","../src/core/sql/pg-format/index.ts","../src/core/sql/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/schema/migrations.ts","../src/core/schema/schemaComponent.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/locks/databaseLock.ts","../src/postgres/core/connections/connectionString.ts","../src/postgres/core/schema/migrations.ts","../src/postgres/core/schema/schema.ts","../src/postgres/core/locks/advisoryLocks.ts","../src/postgres/pg/connections/connection.ts","../src/postgres/pg/execute/execute.ts","../src/postgres/pg/connections/transaction.ts","../src/postgres/pg/connections/pool.ts","../src/postgres/pg/serialization/index.ts","../src/postgres/index.ts","../src/index.ts"],"sourcesContent":["import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n return BigInt(context?.source ?? value.toString());\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.parseBigInts === true ? JSONReplacers.bigInt : undefined,\n opts?.parseDates === true ? JSONReplacers.date : undefined,\n opts?.replacer,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n opts?.reviver,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (options?: JSONSerializerOptions): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer = jsonSerializer({ parseBigInts: true });\n\nconst RawJSONSerializer = jsonSerializer();\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n RawJSONSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n};\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/reserved.js\n//\n// PostgreSQL reserved words\n//\nconst reservedMap: { [key: string]: boolean } = {\n AES128: true,\n AES256: true,\n ALL: true,\n ALLOWOVERWRITE: true,\n ANALYSE: true,\n ANALYZE: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BACKUP: true,\n BETWEEN: true,\n BINARY: true,\n BLANKSASNULL: true,\n BOTH: true,\n BYTEDICT: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CREDENTIALS: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n CURRENT_USER_ID: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DEFLATE: true,\n DEFRAG: true,\n DELTA: true,\n DELTA32K: true,\n DESC: true,\n DISABLE: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n EMPTYASNULL: true,\n ENABLE: true,\n ENCODE: true,\n ENCRYPT: true,\n ENCRYPTION: true,\n END: true,\n EXCEPT: true,\n EXPLICIT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FREEZE: true,\n FROM: true,\n FULL: true,\n GLOBALDICT256: true,\n GLOBALDICT64K: true,\n GRANT: true,\n GROUP: true,\n GZIP: true,\n HAVING: true,\n IDENTITY: true,\n IGNORE: true,\n ILIKE: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n ISNULL: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LIMIT: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n LUN: true,\n LUNS: true,\n LZO: true,\n LZOP: true,\n MINUS: true,\n MOSTLY13: true,\n MOSTLY32: true,\n MOSTLY8: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NOTNULL: true,\n NULL: true,\n NULLS: true,\n OFF: true,\n OFFLINE: true,\n OFFSET: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARALLEL: true,\n PARTITION: true,\n PERCENT: true,\n PLACING: true,\n PRIMARY: true,\n RAW: true,\n READRATIO: true,\n RECOVER: true,\n REFERENCES: true,\n REJECTLOG: true,\n RESORT: true,\n RESTORE: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n SYSDATE: true,\n SYSTEM: true,\n TABLE: true,\n TAG: true,\n TDES: true,\n TEXT255: true,\n TEXT32K: true,\n THEN: true,\n TO: true,\n TOP: true,\n TRAILING: true,\n TRUE: true,\n TRUNCATECOLUMNS: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n VERBOSE: true,\n WALLET: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n};\n\nexport default reservedMap;\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/index.js\nimport { JSONSerializer } from '../../serializer/index.js';\nimport reservedMap from './reserved.js';\n\ntype FormatterConfig = {\n pattern?: {\n ident?: string;\n literal?: string;\n string?: string;\n };\n};\n\ntype FormatterFunction = (value: unknown) => string;\n\nconst fmtPattern = {\n ident: 'I',\n literal: 'L',\n string: 's',\n};\n\n// convert to Postgres default ISO 8601 format\nconst formatDate = (date: string): string => {\n date = date.replace('T', ' ');\n date = date.replace('Z', '+00');\n return date;\n};\n\nconst isReserved = (value: string): boolean => {\n return !!reservedMap[value.toUpperCase()];\n};\n\nconst arrayToList = (\n useSpace: boolean,\n array: unknown[],\n formatter: FormatterFunction,\n): string => {\n let sql = '';\n sql += useSpace ? ' (' : '(';\n for (let i = 0; i < array.length; i++) {\n sql += (i === 0 ? '' : ', ') + formatter(array[i]);\n }\n sql += ')';\n return sql;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteIdent = (value: unknown): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n } else if (value === false) {\n return '\"f\"';\n } else if (value === true) {\n return '\"t\"';\n } else if (value instanceof Date) {\n return '\"' + formatDate(value.toISOString()) + '\"';\n } else if (value instanceof Buffer) {\n throw new Error('SQL identifier cannot be a buffer');\n } else if (Array.isArray(value)) {\n return value\n .map((v) => {\n if (Array.isArray(v)) {\n throw new Error(\n 'Nested array to grouped list conversion is not supported for SQL identifier',\n );\n }\n return quoteIdent(v);\n })\n .toString();\n } else if (value === Object(value)) {\n throw new Error('SQL identifier cannot be an object');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const ident = value.toString().slice(0); // create copy\n\n // do not quote a valid, unquoted identifier\n if (/^[a-z_][a-z0-9_$]*$/.test(ident) && !isReserved(ident)) {\n return ident;\n }\n\n let quoted = '\"';\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === '\"' ? c + c : c;\n }\n quoted += '\"';\n return quoted;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteLiteral = (value: unknown): string => {\n let literal: string | null = null;\n let explicitCast: string | null = null;\n\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (value === false) {\n return \"'f'\";\n } else if (value === true) {\n return \"'t'\";\n } else if (value instanceof Date) {\n return \"'\" + formatDate(value.toISOString()) + \"'\";\n } else if (value instanceof Buffer) {\n return \"E'\\\\\\\\x\" + value.toString('hex') + \"'\";\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteLiteral);\n }\n return quoteLiteral(v);\n })\n .toString();\n } else if (value === Object(value)) {\n explicitCast = 'jsonb';\n literal = JSONSerializer.serialize(value);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n literal = value.toString().slice(0); // create copy\n }\n\n let hasBackslash = false;\n let quoted = \"'\";\n\n for (let i = 0; i < literal.length; i++) {\n const c = literal[i];\n if (c === \"'\") {\n quoted += c + c;\n } else if (c === '\\\\') {\n quoted += c + c;\n hasBackslash = true;\n } else {\n quoted += c;\n }\n }\n\n quoted += \"'\";\n\n if (hasBackslash) {\n quoted = 'E' + quoted;\n }\n\n if (explicitCast) {\n quoted += '::' + explicitCast;\n }\n\n return quoted;\n};\n\nconst quoteString = (value: unknown): string => {\n if (value === undefined || value === null) {\n return '';\n } else if (value === false) {\n return 'f';\n } else if (value === true) {\n return 't';\n } else if (value instanceof Date) {\n return formatDate(value.toISOString());\n } else if (value instanceof Buffer) {\n return '\\\\x' + value.toString('hex');\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (v !== null && v !== undefined) {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteString);\n }\n return quoteString(v);\n }\n return ''; // Handle undefined or null values properly within arrays\n })\n .filter((v) => v !== '') // Filter out empty strings to avoid extra commas\n .toString();\n } else if (value === Object(value)) {\n return JSONSerializer.serialize(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return value.toString().slice(0); // return copy\n};\n\nconst config = (cfg: FormatterConfig): void => {\n // default\n fmtPattern.ident = 'I';\n fmtPattern.literal = 'L';\n fmtPattern.string = 's';\n\n if (cfg && cfg.pattern) {\n if (cfg.pattern.ident) {\n fmtPattern.ident = cfg.pattern.ident;\n }\n if (cfg.pattern.literal) {\n fmtPattern.literal = cfg.pattern.literal;\n }\n if (cfg.pattern.string) {\n fmtPattern.string = cfg.pattern.string;\n }\n }\n};\n\nconst formatWithArray = (fmt: string, parameters: unknown[]): string => {\n let index = 0;\n const params = parameters;\n\n let re: string | RegExp = '%(%|(\\\\d+\\\\$)?[';\n re += fmtPattern.ident;\n re += fmtPattern.literal;\n re += fmtPattern.string;\n re += '])';\n re = new RegExp(re, 'g');\n\n return fmt.replace(re, (_, type) => {\n if (type === '%') {\n return '%';\n }\n\n let position = index;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const tokens = type.split('$');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (tokens.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n position = parseInt(tokens[0], 10) - 1;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n type = tokens[1];\n }\n\n if (position < 0) {\n throw new Error('specified argument 0 but arguments start at 1');\n } else if (position > params.length - 1) {\n throw new Error('too few arguments');\n }\n\n index = position + 1;\n\n if (type === fmtPattern.ident) {\n return quoteIdent(params[position]);\n } else if (type === fmtPattern.literal) {\n return quoteLiteral(params[position]);\n } else if (type === fmtPattern.string) {\n return quoteString(params[position]);\n }\n\n return undefined!;\n });\n};\n\nconst format = (fmt: string, ...args: unknown[]): string => {\n return formatWithArray(fmt, args);\n};\n\nformat.config = config;\nformat.format = format;\nformat.ident = quoteIdent;\nformat.literal = quoteLiteral;\nformat.string = quoteString;\nformat.withArray = formatWithArray;\n\nexport default format;\n","import format from './pg-format';\n// TODO: add core formatter, when adding other database type\n\ntype SQL = string & { __brand: 'sql' };\n\nconst sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nconst rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n\nconst isSQL = (literal: unknown): literal is SQL =>\n literal !== undefined && literal !== null && typeof literal === 'string';\n\ntype SQLValue =\n | { type: 'literal'; value: unknown } // Literal types (e.g., strings, numbers)\n | { type: 'identifier'; value: string } // Identifier types (e.g., table/column names)\n | { type: 'plainString'; value: string }; // Plain string types (unsafe, unescaped)\n\n// Wrapping functions for explicit formatting\nconst literal = (value: unknown) => ({ type: 'literal', value });\nconst identifier = (value: string) => ({ type: 'identifier', value });\nconst plainString = (value: string) => ({ type: 'plainString', value });\n\nconst defaultFormat = (value: unknown) => {\n if (typeof value === 'string') {\n return format('%L', value);\n } else if (typeof value === 'number') {\n return value.toString();\n } else if (typeof value === 'bigint') {\n return format('%L', value);\n } else if (value instanceof Date) {\n return format('%L', value);\n } else if (Array.isArray(value)) {\n return format('(%L)', value);\n } else if (typeof value === 'object') {\n return format('%s', JSON.stringify(value));\n } else {\n return format('%L', value);\n }\n};\n\nfunction SQL(strings: TemplateStringsArray, ...values: unknown[]): SQL {\n return strings\n .map((string, index) => {\n let formattedValue = '';\n\n if (index < values.length) {\n const value = values[index];\n\n if (\n value &&\n typeof value === 'object' &&\n 'type' in value &&\n 'value' in value\n ) {\n const sqlValue = value as SQLValue;\n switch (sqlValue.type) {\n case 'literal':\n formattedValue = format('%L', sqlValue.value);\n break;\n case 'identifier':\n formattedValue = format('%I', sqlValue.value);\n break;\n case 'plainString':\n formattedValue = sqlValue.value;\n break;\n }\n } else {\n formattedValue = defaultFormat(value);\n }\n }\n\n return string + formattedValue;\n })\n .join('') as SQL;\n}\n\nexport { SQL, identifier, isSQL, literal, plainString, rawSql, sql };\n","import type { Connection } from '../connections';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport { type SQL } from '../sql';\n\nexport type SQLQueryOptions = { timeoutMs?: number };\nexport type SQLCommandOptions = { timeoutMs?: number };\n\nexport interface DbSQLExecutor<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n type: ConnectorType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql),\n options,\n ),\n batchQuery: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls),\n options,\n ),\n command: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql),\n options,\n ),\n batchCommand: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport { type Connection } from './connection';\n\nexport interface DatabaseTransaction<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor {\n type: ConnectorType;\n connection: Connection<ConnectorType, DbClient>;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n}\n\nexport interface DatabaseTransactionFactory<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n transaction: () => DatabaseTransaction<ConnectorType, DbClient>;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n ConnectorType extends string = string,\n DbClient = unknown,\n Result = void,\n>(\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectorType extends string = string,\n DbClient = unknown,\n>(\n connect: () => Promise<DbClient>,\n initTransaction: (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>,\n): DatabaseTransactionFactory<ConnectorType, DbClient> => ({\n transaction: () => initTransaction(connect()),\n withTransaction: (handle) =>\n executeInTransaction(initTransaction(connect()), handle),\n});\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends Connection = Connection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends Connection = Connection,\n>(\n connect: () => ConnectionType,\n): DatabaseTransactionFactory<ConnectionType['type']> => ({\n transaction: () => {\n const connection = connect();\n const transaction = connection.transaction();\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle) => {\n const connection = connect();\n return wrapInConnectionClosure(connection, () =>\n connection.withTransaction(handle),\n );\n },\n});\n","import {\n sqlExecutor,\n type DbSQLExecutor,\n type WithSQLExecutor,\n} from '../execute';\nimport {\n transactionFactoryWithDbClient,\n type DatabaseTransaction,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor,\n DatabaseTransactionFactory<ConnectorType> {\n type: ConnectorType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n}\n\nexport interface ConnectionFactory<\n ConnectionType extends Connection = Connection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n ) => Promise<Result>;\n}\n\nexport type CreateConnectionOptions<\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n type: ConnectorType;\n connect: Promise<DbClient>;\n close: (client: DbClient) => Promise<void>;\n initTransaction: (\n connection: () => ConnectionType,\n ) => (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>;\n executor: () => Executor;\n};\n\nexport const createConnection = <\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateConnectionOptions<\n ConnectorType,\n DbClient,\n ConnectionType,\n Executor\n >,\n): ConnectionType => {\n const { type, connect, close, initTransaction, executor } = options;\n\n let client: DbClient | null = null;\n\n const getClient = async () => client ?? (client = await connect);\n\n const connection: Connection<ConnectorType, DbClient> = {\n type: type,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor(), { connect: getClient }),\n };\n\n const typedConnection = connection as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInNewConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport { type Connection, type ConnectionFactory } from './connection';\nimport {\n transactionFactoryWithNewConnection,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<ConnectionType extends Connection = Connection>\n extends WithSQLExecutor,\n ConnectionFactory<ConnectionType>,\n DatabaseTransactionFactory<ConnectionType['type']> {\n type: ConnectionType['type'];\n close: () => Promise<void>;\n}\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport const createConnectionPool = <\n ConnectionType extends Connection,\n ConnectionPoolType extends ConnectionPool<ConnectionType>,\n>(\n pool: Pick<ConnectionPool<ConnectionType>, 'type'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n },\n): ConnectionPoolType => {\n const { type, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(handle: (connection: ConnectionType) => Promise<Result>) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({ connection });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n type,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result as ConnectionPoolType;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const mapRows = async <\n Result extends QueryResultRow = QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: Record<string, unknown>,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return result.count;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true;\n};\n","import {\n mapToCamelCase,\n rawSql,\n singleOrNull,\n sql,\n tracer,\n type SchemaComponent,\n type SQLExecutor,\n} from '..';\nimport { type DatabaseLock, type DatabaseLockOptions, type Dumbo } from '../..';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: string[];\n};\n\nexport const sqlMigration = (name: string, sqls: string[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\nexport type MigratorOptions = {\n schema: {\n migrationTable: SchemaComponent;\n };\n lock: {\n databaseLock: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n options: MigratorOptions,\n): Promise<void> =>\n pool.withTransaction(async ({ execute }) => {\n const { databaseLock, ...rest } = options.lock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const coreMigrations = options.schema.migrationTable.migrations({\n connector: 'PostgreSQL:pg', // TODO: This will need to change to support more connectors\n });\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n const sql = combineMigrations(migration);\n await execute.command(rawSql(sql));\n }\n\n for (const migration of migrations) {\n await runSQLMigration(execute, migration);\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result: undefined };\n });\n\nconst runSQLMigration = async (\n execute: SQLExecutor,\n migration: SQLMigration,\n): Promise<void> => {\n const sql = combineMigrations(migration);\n const sqlHash = await getMigrationHash(sql);\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const wasMigrationApplied = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (wasMigrationApplied) return;\n\n await execute.command(rawSql(sql));\n\n await recordMigration(execute, newMigration);\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (content: string): Promise<string> => {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (...migration: Pick<SQLMigration, 'sqls'>[]) =>\n migration.flatMap((m) => m.sqls).join('\\n');\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<boolean> => {\n const result = await singleOrNull(\n execute.query<{ sql_hash: string }>(\n sql(`SELECT sql_hash FROM migrations WHERE name = %L`, migration.name),\n ),\n );\n\n if (result === null) return false;\n\n const { sqlHash } = mapToCamelCase<Pick<MigrationRecord, 'sqlHash'>>(result);\n\n if (sqlHash !== migration.sqlHash) {\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n }\n\n //console.log(`Migration \"${migration.name}\" already applied. Skipping.`);\n return true;\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n sql(\n `\n INSERT INTO migrations (name, sql_hash)\n VALUES (%L, %L)\n `,\n migration.name,\n migration.sqlHash,\n ),\n );\n};\n","import type { ConnectorType } from '../..';\nimport { type SQLMigration } from './migrations';\n\nexport type SchemaComponentMigrationsOptions = {\n connector: ConnectorType;\n};\n\nexport type SchemaComponent = {\n schemaComponentType: string;\n components?: ReadonlyArray<SchemaComponent> | undefined;\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n};\n\nexport const schemaComponent = (\n type: string,\n migrationsOrComponents:\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n }\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n components: ReadonlyArray<SchemaComponent>;\n }\n | {\n components: ReadonlyArray<SchemaComponent>;\n },\n): SchemaComponent => {\n const components =\n 'components' in migrationsOrComponents\n ? migrationsOrComponents.components\n : undefined;\n\n const migrations =\n 'migrations' in migrationsOrComponents\n ? migrationsOrComponents.migrations\n : undefined;\n\n return {\n schemaComponentType: type,\n components,\n migrations: (options) => [\n ...(migrations ? migrations(options) : []),\n ...(components\n ? components.flatMap((component) => component.migrations(options))\n : []),\n ],\n };\n};\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = process.env.DUMBO_LOG_LEVEL ?? LogLevel.DISABLED;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (logStyle: LogStyle): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return JSONSerializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (process.env.DUMBO_LOG_STYLE as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import { type SQLExecutor } from '..';\n\nexport type DatabaseLockOptions = { lockId: number; timeoutMs?: number };\n\nexport type AcquireDatabaseLockMode = 'Permanent' | 'Session';\n\nexport type AcquireDatabaseLockOptions = DatabaseLockOptions & {\n mode?: AcquireDatabaseLockMode;\n};\nexport type ReleaseDatabaseLockOptions = DatabaseLockOptions;\n\nexport const defaultDatabaseLockOptions: Required<\n Omit<DatabaseLockOptions, 'lockId'>\n> = {\n timeoutMs: 10000,\n};\n\nexport type DatabaseLock = {\n acquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<void>;\n tryAcquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<boolean>;\n release(\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n ): Promise<boolean>;\n withAcquire: <Result = unknown>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => Promise<Result>;\n};\n","import pgcs from 'pg-connection-string';\nimport { defaultPostgreSqlDatabase } from '../schema';\n\nexport const defaultPostgreSQLConenctionString =\n 'postgresql://postgres@localhost:5432/postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import { AdvisoryLock, type DatabaseLockOptions } from '../..';\nimport { rawSql, type Dumbo } from '../../..';\nimport {\n MIGRATIONS_LOCK_ID,\n runSQLMigrations,\n schemaComponent,\n sqlMigration,\n type SQLMigration,\n} from '../../../core/schema';\n\nexport type PostgreSQLMigratorOptions = {\n lock?: {\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nconst migrationTableSQL = rawSql(`\n CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL UNIQUE,\n application VARCHAR(255) NOT NULL DEFAULT 'default',\n sql_hash VARCHAR(64) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`);\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: () => [\n sqlMigration('dumbo:migrationTable:001', [migrationTableSQL]),\n ],\n },\n);\n\nexport const runPostgreSQLMigrations = (\n pool: Dumbo,\n migrations: SQLMigration[],\n options?: PostgreSQLMigratorOptions,\n): Promise<void> =>\n runSQLMigrations(pool, migrations, {\n schema: {\n migrationTable: migrationTableSchemaComponent,\n },\n lock: {\n databaseLock: AdvisoryLock,\n options: {\n ...(options ?? {}),\n lockId: MIGRATIONS_LOCK_ID,\n },\n },\n dryRun: options?.dryRun,\n });\n","import { exists, sql, type ConnectionPool, type SQL } from '../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(functionExistsSQL(tableName)));\n","import {\n defaultDatabaseLockOptions,\n type AcquireDatabaseLockMode,\n type AcquireDatabaseLockOptions,\n type DatabaseLock,\n type DatabaseLockOptions,\n type ReleaseDatabaseLockOptions,\n} from '..';\nimport { single, sql, type SQLExecutor } from '../../../core';\n\nexport const tryAcquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n const advisoryLock =\n options.mode === 'Permanent' ? 'pg_advisory_lock' : 'pg_advisory_xact_lock';\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT %s(%s) AS locked', advisoryLock, options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const releaseAdvisoryLock = async (\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT pg_advisory_unlock(%s) AS locked', options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const acquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n) => {\n const lockAcquired = await tryAcquireAdvisoryLock(execute, options);\n if (!lockAcquired) {\n throw new Error(\n 'Failed to acquire advisory lock within the specified timeout. Migration aborted.',\n );\n }\n};\n\nexport const AdvisoryLock: DatabaseLock = {\n acquire: acquireAdvisoryLock,\n tryAcquire: tryAcquireAdvisoryLock,\n release: releaseAdvisoryLock,\n withAcquire: async <Result>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => {\n await acquireAdvisoryLock(execute, options);\n try {\n return await handle();\n } finally {\n if (options.mode === 'Permanent')\n await releaseAdvisoryLock(execute, options);\n }\n },\n};\n\nexport const advisoryLock = (\n execute: SQLExecutor,\n options: DatabaseLockOptions,\n) => ({\n acquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n tryAcquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n tryAcquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n release: () => releaseAdvisoryLock(execute, options),\n withAcquire: async <Result>(\n handle: () => Promise<Result>,\n acquireOptions?: { mode: AcquireDatabaseLockMode },\n ) => {\n await acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n });\n try {\n return await handle();\n } finally {\n await releaseAdvisoryLock(execute, options);\n }\n },\n});\n","import pg from 'pg';\nimport { createConnection, type Connection } from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport { nodePostgresTransaction } from './transaction';\n\nexport const NodePostgresConnectorType = 'PostgreSQL:pg';\nexport type NodePostgresConnector = 'PostgreSQL:pg';\n\nexport type NodePostgresClient = pg.PoolClient | pg.Client;\n\nexport type NodePostgresPoolOrClient = pg.Pool | pg.PoolClient | pg.Client;\n\nexport type NodePostgresClientConnection = Connection<\n NodePostgresConnector,\n pg.Client\n>;\n\nexport type NodePostgresPoolClientConnection = Connection<\n NodePostgresConnector,\n pg.PoolClient\n>;\n\nexport type NodePostgresConnection =\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n\nexport type NodePostgresPoolClientOptions = {\n type: 'PoolClient';\n connect: Promise<pg.PoolClient>;\n close: (client: pg.PoolClient) => Promise<void>;\n};\n\nexport type NodePostgresClientOptions = {\n type: 'Client';\n connect: Promise<pg.Client>;\n close: (client: pg.Client) => Promise<void>;\n};\n\nexport const nodePostgresClientConnection = (\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport const nodePostgresPoolClientConnection = (\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions | NodePostgresClientOptions,\n): NodePostgresPoolClientConnection | NodePostgresClientConnection {\n return options.type === 'Client'\n ? nodePostgresClientConnection(options)\n : nodePostgresPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString: connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import pg from 'pg';\nimport {\n tracer,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n} from '../../../core';\nimport {\n NodePostgresConnectorType,\n type NodePostgresClient,\n type NodePostgresConnector,\n} from '../connections';\n\nexport const isNodePostgresNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isNodePostgresClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isNodePostgresPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const nodePostgresExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isNodePostgresNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (\n isNodePostgresNativePool(poolOrClient) &&\n isNodePostgresPoolClient(client)\n )\n client.release();\n }\n};\n\nexport type NodePostgresSQLExecutor = DbSQLExecutor<\n NodePostgresConnector,\n NodePostgresClient\n>;\n\nexport const nodePostgresSQLExecutor = (): NodePostgresSQLExecutor => ({\n type: NodePostgresConnectorType,\n query: batch,\n batchQuery: batch,\n command: batch,\n batchCommand: batch,\n});\n\nexport type BatchQueryOptions = { timeoutMs?: number };\n\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL,\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>>;\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>[]>;\nasync function batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL | SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result> | QueryResult<Result>[]> {\n const sqls = Array.isArray(sqlOrSqls) ? sqlOrSqls : [sqlOrSqls];\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options?.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n tracer.info('db:sql:query', { sql: sqls[i]! });\n const result = await client.query<Result>(sqls[i]!);\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n }\n return Array.isArray(sqlOrSqls) ? results : results[0]!;\n}\n","import {\n sqlExecutor,\n type Connection,\n type DatabaseTransaction,\n} from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport {\n NodePostgresConnectorType,\n type NodePostgresConnector,\n type NodePostgresPoolOrClient,\n} from './connection';\n\nexport type NodePostgresTransaction =\n DatabaseTransaction<NodePostgresConnector>;\n\nexport const nodePostgresTransaction =\n <DbClient extends NodePostgresPoolOrClient = NodePostgresPoolOrClient>(\n connection: () => Connection<NodePostgresConnector, DbClient>,\n ) =>\n (\n getClient: Promise<DbClient>,\n options?: { close: (client: DbClient, error?: unknown) => Promise<void> },\n ): DatabaseTransaction<NodePostgresConnector> => ({\n connection: connection(),\n type: NodePostgresConnectorType,\n begin: async () => {\n const client = await getClient;\n await client.query('BEGIN');\n },\n commit: async () => {\n const client = await getClient;\n\n await client.query('COMMIT');\n\n if (options?.close) await options?.close(client);\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n await client.query('ROLLBACK');\n\n if (options?.close) await options?.close(client, error);\n },\n execute: sqlExecutor(nodePostgresSQLExecutor(), {\n connect: () => getClient,\n }),\n });\n","import pg from 'pg';\nimport {\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n} from '../../../core';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from '../../core';\nimport { setNodePostgresTypeParser } from '../serialization';\nimport {\n nodePostgresConnection,\n NodePostgresConnectorType,\n type NodePostgresClientConnection,\n type NodePostgresConnector,\n type NodePostgresPoolClientConnection,\n} from './connection';\n\nexport type NodePostgresNativePool =\n ConnectionPool<NodePostgresPoolClientConnection>;\n\nexport type NodePostgresAmbientClientPool =\n ConnectionPool<NodePostgresClientConnection>;\n\nexport type NodePostgresAmbientConnectionPool = ConnectionPool<\n NodePostgresPoolClientConnection | NodePostgresClientConnection\n>;\n\nexport type NodePostgresPool =\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool;\n\nexport const nodePostgresNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresNativePool => {\n const { connectionString, database } = options;\n const pool = getPool({ connectionString, database });\n\n const getConnection = () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPool({ connectionString, database });\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const nodePostgresAmbientNativePool = (options: {\n pool: pg.Pool;\n}): NodePostgresNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n }),\n });\n};\n\nexport const nodePostgresAmbientConnectionPool = (options: {\n connection: NodePostgresPoolClientConnection | NodePostgresClientConnection;\n}): NodePostgresAmbientConnectionPool => {\n const { connection } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: () => connection.transaction(),\n withTransaction: (handle) => connection.withTransaction(handle),\n });\n};\n\nexport const nodePostgresClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => {\n const connect = Promise.resolve(\n new pg.Client({ connectionString, database }),\n ).then(async (client) => {\n await client.connect();\n return client;\n });\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n });\n },\n });\n};\n\nexport const nodePostgresAmbientClientPool = (options: {\n client: pg.Client;\n}): NodePostgresAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = Promise.resolve(client);\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type NodePostgresPoolPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n };\n\nexport type NodePostgresPoolNotPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n connection:\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n pooled?: false;\n };\n\nexport type NodePostgresPoolOptions = (\n | NodePostgresPoolPooledOptions\n | NodePostgresPoolNotPooledOptions\n) & {\n serializer?: JSONSerializer;\n};\n\nexport function nodePostgresPool(\n options: NodePostgresPoolPooledOptions,\n): NodePostgresNativePool;\nexport function nodePostgresPool(\n options: NodePostgresPoolNotPooledOptions,\n): NodePostgresAmbientClientPool;\nexport function nodePostgresPool(\n options: NodePostgresPoolOptions,\n):\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool {\n const { connectionString, database } = options;\n\n setNodePostgresTypeParser();\n\n if ('client' in options && options.client)\n return nodePostgresAmbientClientPool({ client: options.client });\n\n if ('connection' in options && options.connection)\n return nodePostgresAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return nodePostgresClientPool({ connectionString, database });\n\n if ('pool' in options && options.pool)\n return nodePostgresAmbientNativePool({ pool: options.pool });\n\n return nodePostgresNativePool({\n connectionString,\n database,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pg from 'pg';\nimport { JSONSerializer, RawJSONSerializer } from '../../../core/serializer';\n\nlet arePgTypesSet = false;\n\nexport const setNodePostgresTypeParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => JSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => JSONSerializer.deserialize(val));\n};\n\nexport const setNodePostgresTypeRawParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => RawJSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => RawJSONSerializer.deserialize(val));\n};\n","export * from './core';\nexport * from './pg';\nimport {\n type NodePostgresConnection,\n type NodePostgresConnector,\n type NodePostgresPool,\n type NodePostgresPoolOptions,\n nodePostgresPool,\n} from './pg';\n\nexport type PostgresConnector = NodePostgresConnector;\nexport type PostgresPoolOptions = NodePostgresPoolOptions;\nexport type PostgresPool = NodePostgresPool;\nexport type PostgresConnection = NodePostgresConnection;\nexport const postgresPool = nodePostgresPool;\n","import {\n postgresPool,\n type PostgresConnector,\n type PostgresPool,\n type PostgresPoolOptions,\n} from './postgres';\n\nexport * from './core';\nexport * from './postgres';\n\nexport type ConnectorType = PostgresConnector;\n\nexport type PoolOptions = {\n connector?: ConnectorType;\n};\n\nexport type DumboOptions = PoolOptions & PostgresPoolOptions;\nexport type Dumbo = PostgresPool;\n\nexport const connectionPool = <PoolOptionsType extends DumboOptions>(\n options: PoolOptionsType,\n) =>\n // TODO: this should have the pattern matching and verification\n postgresPool(options as unknown as PostgresPoolOptions);\n\nexport const dumbo = <DumboOptionsType extends DumboOptions = DumboOptions>(\n options: DumboOptionsType,\n): Dumbo => connectionPool(options);\n"],"mappings":"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","names":["key","sql","literal","literal","sqlExecutor","sql","key","sql","key","format","advisoryLock","pg","pg","pg","pg","pg","pg"]}
1
+ {"version":3,"sources":["../src/core/serializer/json/index.ts","../src/core/sql/pg-format/reserved.ts","../src/core/sql/pg-format/index.ts","../src/core/sql/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/query/mappers.ts","../src/core/query/selectors.ts","../src/core/schema/migrations.ts","../src/core/schema/schemaComponent.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/locks/databaseLock.ts","../src/postgres/core/connections/connectionString.ts","../src/postgres/core/schema/migrations.ts","../src/postgres/core/schema/schema.ts","../src/postgres/core/locks/advisoryLocks.ts","../src/postgres/pg/connections/connection.ts","../src/postgres/pg/execute/execute.ts","../src/postgres/pg/connections/transaction.ts","../src/postgres/pg/connections/pool.ts","../src/postgres/pg/serialization/index.ts","../src/postgres/index.ts","../src/index.ts"],"sourcesContent":["import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !Number.isSafeInteger(value)\n ) {\n try {\n return BigInt(context?.source ?? value.toString());\n } catch {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n }\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.parseBigInts === true ? JSONReplacers.bigInt : undefined,\n opts?.parseDates === true ? JSONReplacers.date : undefined,\n opts?.replacer,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n opts?.reviver,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (options?: JSONSerializerOptions): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer = jsonSerializer({ parseBigInts: true });\n\nconst RawJSONSerializer = jsonSerializer();\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n RawJSONSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n};\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/reserved.js\n//\n// PostgreSQL reserved words\n//\nconst reservedMap: { [key: string]: boolean } = {\n AES128: true,\n AES256: true,\n ALL: true,\n ALLOWOVERWRITE: true,\n ANALYSE: true,\n ANALYZE: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BACKUP: true,\n BETWEEN: true,\n BINARY: true,\n BLANKSASNULL: true,\n BOTH: true,\n BYTEDICT: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CREDENTIALS: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n CURRENT_USER_ID: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DEFLATE: true,\n DEFRAG: true,\n DELTA: true,\n DELTA32K: true,\n DESC: true,\n DISABLE: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n EMPTYASNULL: true,\n ENABLE: true,\n ENCODE: true,\n ENCRYPT: true,\n ENCRYPTION: true,\n END: true,\n EXCEPT: true,\n EXPLICIT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FREEZE: true,\n FROM: true,\n FULL: true,\n GLOBALDICT256: true,\n GLOBALDICT64K: true,\n GRANT: true,\n GROUP: true,\n GZIP: true,\n HAVING: true,\n IDENTITY: true,\n IGNORE: true,\n ILIKE: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n ISNULL: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LIMIT: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n LUN: true,\n LUNS: true,\n LZO: true,\n LZOP: true,\n MINUS: true,\n MOSTLY13: true,\n MOSTLY32: true,\n MOSTLY8: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NOTNULL: true,\n NULL: true,\n NULLS: true,\n OFF: true,\n OFFLINE: true,\n OFFSET: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARALLEL: true,\n PARTITION: true,\n PERCENT: true,\n PLACING: true,\n PRIMARY: true,\n RAW: true,\n READRATIO: true,\n RECOVER: true,\n REFERENCES: true,\n REJECTLOG: true,\n RESORT: true,\n RESTORE: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n SYSDATE: true,\n SYSTEM: true,\n TABLE: true,\n TAG: true,\n TDES: true,\n TEXT255: true,\n TEXT32K: true,\n THEN: true,\n TO: true,\n TOP: true,\n TRAILING: true,\n TRUE: true,\n TRUNCATECOLUMNS: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n VERBOSE: true,\n WALLET: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n};\n\nexport default reservedMap;\n","// Ported from: https://github.com/datalanche/node-pg-format/blob/master/lib/index.js\nimport { JSONSerializer } from '../../serializer/index.js';\nimport reservedMap from './reserved.js';\n\ntype FormatterConfig = {\n pattern?: {\n ident?: string;\n literal?: string;\n string?: string;\n };\n};\n\ntype FormatterFunction = (value: unknown) => string;\n\nconst fmtPattern = {\n ident: 'I',\n literal: 'L',\n string: 's',\n};\n\n// convert to Postgres default ISO 8601 format\nconst formatDate = (date: string): string => {\n date = date.replace('T', ' ');\n date = date.replace('Z', '+00');\n return date;\n};\n\nconst isReserved = (value: string): boolean => {\n return !!reservedMap[value.toUpperCase()];\n};\n\nconst arrayToList = (\n useSpace: boolean,\n array: unknown[],\n formatter: FormatterFunction,\n): string => {\n let sql = '';\n sql += useSpace ? ' (' : '(';\n for (let i = 0; i < array.length; i++) {\n sql += (i === 0 ? '' : ', ') + formatter(array[i]);\n }\n sql += ')';\n return sql;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteIdent = (value: unknown): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n } else if (value === false) {\n return '\"f\"';\n } else if (value === true) {\n return '\"t\"';\n } else if (value instanceof Date) {\n return '\"' + formatDate(value.toISOString()) + '\"';\n } else if (value instanceof Buffer) {\n throw new Error('SQL identifier cannot be a buffer');\n } else if (Array.isArray(value)) {\n return value\n .map((v) => {\n if (Array.isArray(v)) {\n throw new Error(\n 'Nested array to grouped list conversion is not supported for SQL identifier',\n );\n }\n return quoteIdent(v);\n })\n .toString();\n } else if (value === Object(value)) {\n throw new Error('SQL identifier cannot be an object');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const ident = value.toString().slice(0); // create copy\n\n // do not quote a valid, unquoted identifier\n if (/^[a-z_][a-z0-9_$]*$/.test(ident) && !isReserved(ident)) {\n return ident;\n }\n\n let quoted = '\"';\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === '\"' ? c + c : c;\n }\n quoted += '\"';\n return quoted;\n};\n\n// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c\nconst quoteLiteral = (value: unknown): string => {\n let literal: string | null = null;\n let explicitCast: string | null = null;\n\n if (value === undefined || value === null) {\n return 'NULL';\n } else if (value === false) {\n return \"'f'\";\n } else if (value === true) {\n return \"'t'\";\n } else if (value instanceof Date) {\n return \"'\" + formatDate(value.toISOString()) + \"'\";\n } else if (value instanceof Buffer) {\n return \"E'\\\\\\\\x\" + value.toString('hex') + \"'\";\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteLiteral);\n }\n return quoteLiteral(v);\n })\n .toString();\n } else if (value === Object(value)) {\n explicitCast = 'jsonb';\n literal = JSONSerializer.serialize(value);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n literal = value.toString().slice(0); // create copy\n }\n\n let hasBackslash = false;\n let quoted = \"'\";\n\n for (let i = 0; i < literal.length; i++) {\n const c = literal[i];\n if (c === \"'\") {\n quoted += c + c;\n } else if (c === '\\\\') {\n quoted += c + c;\n hasBackslash = true;\n } else {\n quoted += c;\n }\n }\n\n quoted += \"'\";\n\n if (hasBackslash) {\n quoted = 'E' + quoted;\n }\n\n if (explicitCast) {\n quoted += '::' + explicitCast;\n }\n\n return quoted;\n};\n\nconst quoteString = (value: unknown): string => {\n if (value === undefined || value === null) {\n return '';\n } else if (value === false) {\n return 'f';\n } else if (value === true) {\n return 't';\n } else if (value instanceof Date) {\n return formatDate(value.toISOString());\n } else if (value instanceof Buffer) {\n return '\\\\x' + value.toString('hex');\n } else if (Array.isArray(value)) {\n return value\n .map((v, i) => {\n if (v !== null && v !== undefined) {\n if (Array.isArray(v)) {\n return arrayToList(i !== 0, v, quoteString);\n }\n return quoteString(v);\n }\n return ''; // Handle undefined or null values properly within arrays\n })\n .filter((v) => v !== '') // Filter out empty strings to avoid extra commas\n .toString();\n } else if (value === Object(value)) {\n return JSONSerializer.serialize(value);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return value.toString().slice(0); // return copy\n};\n\nconst config = (cfg: FormatterConfig): void => {\n // default\n fmtPattern.ident = 'I';\n fmtPattern.literal = 'L';\n fmtPattern.string = 's';\n\n if (cfg && cfg.pattern) {\n if (cfg.pattern.ident) {\n fmtPattern.ident = cfg.pattern.ident;\n }\n if (cfg.pattern.literal) {\n fmtPattern.literal = cfg.pattern.literal;\n }\n if (cfg.pattern.string) {\n fmtPattern.string = cfg.pattern.string;\n }\n }\n};\n\nconst formatWithArray = (fmt: string, parameters: unknown[]): string => {\n let index = 0;\n const params = parameters;\n\n let re: string | RegExp = '%(%|(\\\\d+\\\\$)?[';\n re += fmtPattern.ident;\n re += fmtPattern.literal;\n re += fmtPattern.string;\n re += '])';\n re = new RegExp(re, 'g');\n\n return fmt.replace(re, (_, type) => {\n if (type === '%') {\n return '%';\n }\n\n let position = index;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const tokens = type.split('$');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (tokens.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n position = parseInt(tokens[0], 10) - 1;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n type = tokens[1];\n }\n\n if (position < 0) {\n throw new Error('specified argument 0 but arguments start at 1');\n } else if (position > params.length - 1) {\n throw new Error('too few arguments');\n }\n\n index = position + 1;\n\n if (type === fmtPattern.ident) {\n return quoteIdent(params[position]);\n } else if (type === fmtPattern.literal) {\n return quoteLiteral(params[position]);\n } else if (type === fmtPattern.string) {\n return quoteString(params[position]);\n }\n\n return undefined!;\n });\n};\n\nconst format = (fmt: string, ...args: unknown[]): string => {\n return formatWithArray(fmt, args);\n};\n\nformat.config = config;\nformat.format = format;\nformat.ident = quoteIdent;\nformat.literal = quoteLiteral;\nformat.string = quoteString;\nformat.withArray = formatWithArray;\n\nexport default format;\n","import format from './pg-format';\n// TODO: add core formatter, when adding other database type\n\ntype SQL = string & { __brand: 'sql' };\n\nconst sql = (sqlQuery: string, ...params: unknown[]): SQL => {\n return format(sqlQuery, ...params) as SQL;\n};\n\nconst rawSql = (sqlQuery: string): SQL => {\n return sqlQuery as SQL;\n};\n\nconst isSQL = (literal: unknown): literal is SQL =>\n literal !== undefined && literal !== null && typeof literal === 'string';\n\ntype SQLValue =\n | { type: 'literal'; value: unknown } // Literal types (e.g., strings, numbers)\n | { type: 'identifier'; value: string } // Identifier types (e.g., table/column names)\n | { type: 'plainString'; value: string }; // Plain string types (unsafe, unescaped)\n\n// Wrapping functions for explicit formatting\nconst literal = (value: unknown) => ({ type: 'literal', value });\nconst identifier = (value: string) => ({ type: 'identifier', value });\nconst plainString = (value: string) => ({ type: 'plainString', value });\n\nconst defaultFormat = (value: unknown) => {\n if (typeof value === 'string') {\n return format('%L', value);\n } else if (typeof value === 'number') {\n return value.toString();\n } else if (typeof value === 'bigint') {\n return format('%L', value);\n } else if (value instanceof Date) {\n return format('%L', value);\n } else if (Array.isArray(value)) {\n return format('(%L)', value);\n } else if (typeof value === 'object') {\n return format('%s', JSON.stringify(value));\n } else {\n return format('%L', value);\n }\n};\n\nfunction SQL(strings: TemplateStringsArray, ...values: unknown[]): SQL {\n return strings\n .map((string, index) => {\n let formattedValue = '';\n\n if (index < values.length) {\n const value = values[index];\n\n if (\n value &&\n typeof value === 'object' &&\n 'type' in value &&\n 'value' in value\n ) {\n const sqlValue = value as SQLValue;\n switch (sqlValue.type) {\n case 'literal':\n formattedValue = format('%L', sqlValue.value);\n break;\n case 'identifier':\n formattedValue = format('%I', sqlValue.value);\n break;\n case 'plainString':\n formattedValue = sqlValue.value;\n break;\n }\n } else {\n formattedValue = defaultFormat(value);\n }\n }\n\n return string + formattedValue;\n })\n .join('') as SQL;\n}\n\nexport { SQL, identifier, isSQL, literal, plainString, rawSql, sql };\n","import type { Connection } from '../connections';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport { type SQL } from '../sql';\n\nexport type SQLQueryOptions = { timeoutMs?: number };\nexport type SQLCommandOptions = { timeoutMs?: number };\n\nexport interface DbSQLExecutor<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n type: ConnectorType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql),\n options,\n ),\n batchQuery: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls),\n options,\n ),\n command: (sql) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql),\n options,\n ),\n batchCommand: (sqls) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport { type Connection } from './connection';\n\nexport interface DatabaseTransaction<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor {\n type: ConnectorType;\n connection: Connection<ConnectorType, DbClient>;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n}\n\nexport interface DatabaseTransactionFactory<\n ConnectorType extends string = string,\n DbClient = unknown,\n> {\n transaction: () => DatabaseTransaction<ConnectorType, DbClient>;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n ConnectorType extends string = string,\n DbClient = unknown,\n Result = void,\n>(\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n handle: (\n transaction: DatabaseTransaction<ConnectorType, DbClient>,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectorType extends string = string,\n DbClient = unknown,\n>(\n connect: () => Promise<DbClient>,\n initTransaction: (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>,\n): DatabaseTransactionFactory<ConnectorType, DbClient> => ({\n transaction: () => initTransaction(connect()),\n withTransaction: (handle) =>\n executeInTransaction(initTransaction(connect()), handle),\n});\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends Connection = Connection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends Connection = Connection,\n>(\n connect: () => ConnectionType,\n): DatabaseTransactionFactory<ConnectionType['type']> => ({\n transaction: () => {\n const connection = connect();\n const transaction = connection.transaction();\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle) => {\n const connection = connect();\n return wrapInConnectionClosure(connection, () =>\n connection.withTransaction(handle),\n );\n },\n});\n","import {\n sqlExecutor,\n type DbSQLExecutor,\n type WithSQLExecutor,\n} from '../execute';\nimport {\n transactionFactoryWithDbClient,\n type DatabaseTransaction,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n ConnectorType extends string = string,\n DbClient = unknown,\n> extends WithSQLExecutor,\n DatabaseTransactionFactory<ConnectorType> {\n type: ConnectorType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n}\n\nexport interface ConnectionFactory<\n ConnectionType extends Connection = Connection,\n> {\n connection: () => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n ) => Promise<Result>;\n}\n\nexport type CreateConnectionOptions<\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n type: ConnectorType;\n connect: Promise<DbClient>;\n close: (client: DbClient) => Promise<void>;\n initTransaction: (\n connection: () => ConnectionType,\n ) => (\n client: Promise<DbClient>,\n ) => DatabaseTransaction<ConnectorType, DbClient>;\n executor: () => Executor;\n};\n\nexport const createConnection = <\n ConnectorType extends string = string,\n DbClient = unknown,\n ConnectionType extends Connection<ConnectorType, DbClient> = Connection<\n ConnectorType,\n DbClient\n >,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateConnectionOptions<\n ConnectorType,\n DbClient,\n ConnectionType,\n Executor\n >,\n): ConnectionType => {\n const { type, connect, close, initTransaction, executor } = options;\n\n let client: DbClient | null = null;\n\n const getClient = async () => client ?? (client = await connect);\n\n const connection: Connection<ConnectorType, DbClient> = {\n type: type,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor(), { connect: getClient }),\n };\n\n const typedConnection = connection as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInNewConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport { type Connection, type ConnectionFactory } from './connection';\nimport {\n transactionFactoryWithNewConnection,\n type DatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<ConnectionType extends Connection = Connection>\n extends WithSQLExecutor,\n ConnectionFactory<ConnectionType>,\n DatabaseTransactionFactory<ConnectionType['type']> {\n type: ConnectionType['type'];\n close: () => Promise<void>;\n}\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport const createConnectionPool = <\n ConnectionType extends Connection,\n ConnectionPoolType extends ConnectionPool<ConnectionType>,\n>(\n pool: Pick<ConnectionPool<ConnectionType>, 'type'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n },\n): ConnectionPoolType => {\n const { type, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(handle: (connection: ConnectionType) => Promise<Result>) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({ connection });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n type,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result as ConnectionPoolType;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const mapRows = async <\n Result extends QueryResultRow = QueryResultRow,\n Mapped = unknown,\n>(\n getResult: Promise<QueryResult<Result>>,\n map: (row: Result) => Mapped,\n): Promise<Mapped[]> => {\n const result = await getResult;\n\n return result.rows.map(map);\n};\n\nexport const toCamelCase = (snakeStr: string): string =>\n snakeStr.replace(/_([a-z])/g, (g) => g[1]?.toUpperCase() ?? '');\n\nexport const mapToCamelCase = <T extends Record<string, unknown>>(\n obj: Record<string, unknown>,\n): T => {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[toCamelCase(key)] = obj[key];\n }\n }\n return newObj as T;\n};\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return result.count;\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true;\n};\n","import {\n mapToCamelCase,\n rawSql,\n singleOrNull,\n sql,\n tracer,\n type SchemaComponent,\n type SQLExecutor,\n} from '..';\nimport { type DatabaseLock, type DatabaseLockOptions, type Dumbo } from '../..';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: string[];\n};\n\nexport const sqlMigration = (name: string, sqls: string[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\nexport type MigratorOptions = {\n schema: {\n migrationTable: SchemaComponent;\n };\n lock: {\n databaseLock: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n options: MigratorOptions,\n): Promise<void> =>\n pool.withTransaction(async ({ execute }) => {\n const { databaseLock, ...rest } = options.lock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const coreMigrations = options.schema.migrationTable.migrations({\n connector: 'PostgreSQL:pg', // TODO: This will need to change to support more connectors\n });\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n const sql = combineMigrations(migration);\n await execute.command(rawSql(sql));\n }\n\n for (const migration of migrations) {\n await runSQLMigration(execute, migration);\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result: undefined };\n });\n\nconst runSQLMigration = async (\n execute: SQLExecutor,\n migration: SQLMigration,\n): Promise<void> => {\n const sql = combineMigrations(migration);\n const sqlHash = await getMigrationHash(sql);\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const wasMigrationApplied = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (wasMigrationApplied) return;\n\n await execute.command(rawSql(sql));\n\n await recordMigration(execute, newMigration);\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (content: string): Promise<string> => {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (...migration: Pick<SQLMigration, 'sqls'>[]) =>\n migration.flatMap((m) => m.sqls).join('\\n');\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<boolean> => {\n const result = await singleOrNull(\n execute.query<{ sql_hash: string }>(\n sql(`SELECT sql_hash FROM migrations WHERE name = %L`, migration.name),\n ),\n );\n\n if (result === null) return false;\n\n const { sqlHash } = mapToCamelCase<Pick<MigrationRecord, 'sqlHash'>>(result);\n\n if (sqlHash !== migration.sqlHash) {\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n }\n\n //console.log(`Migration \"${migration.name}\" already applied. Skipping.`);\n return true;\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n sql(\n `\n INSERT INTO migrations (name, sql_hash)\n VALUES (%L, %L)\n `,\n migration.name,\n migration.sqlHash,\n ),\n );\n};\n","import type { ConnectorType } from '../..';\nimport { type SQLMigration } from './migrations';\n\nexport type SchemaComponentMigrationsOptions = {\n connector: ConnectorType;\n};\n\nexport type SchemaComponent = {\n schemaComponentType: string;\n components?: ReadonlyArray<SchemaComponent> | undefined;\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n};\n\nexport const schemaComponent = (\n type: string,\n migrationsOrComponents:\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n }\n | {\n migrations(\n options: SchemaComponentMigrationsOptions,\n ): ReadonlyArray<SQLMigration>;\n components: ReadonlyArray<SchemaComponent>;\n }\n | {\n components: ReadonlyArray<SchemaComponent>;\n },\n): SchemaComponent => {\n const components =\n 'components' in migrationsOrComponents\n ? migrationsOrComponents.components\n : undefined;\n\n const migrations =\n 'migrations' in migrationsOrComponents\n ? migrationsOrComponents.migrations\n : undefined;\n\n return {\n schemaComponentType: type,\n components,\n migrations: (options) => [\n ...(migrations ? migrations(options) : []),\n ...(components\n ? components.flatMap((component) => component.migrations(options))\n : []),\n ],\n };\n};\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = process.env.DUMBO_LOG_LEVEL ?? LogLevel.DISABLED;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (logStyle: LogStyle): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return JSONSerializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (process.env.DUMBO_LOG_STYLE as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import { type SQLExecutor } from '..';\n\nexport type DatabaseLockOptions = { lockId: number; timeoutMs?: number };\n\nexport type AcquireDatabaseLockMode = 'Permanent' | 'Session';\n\nexport type AcquireDatabaseLockOptions = DatabaseLockOptions & {\n mode?: AcquireDatabaseLockMode;\n};\nexport type ReleaseDatabaseLockOptions = DatabaseLockOptions;\n\nexport const defaultDatabaseLockOptions: Required<\n Omit<DatabaseLockOptions, 'lockId'>\n> = {\n timeoutMs: 10000,\n};\n\nexport type DatabaseLock = {\n acquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<void>;\n tryAcquire(\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n ): Promise<boolean>;\n release(\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n ): Promise<boolean>;\n withAcquire: <Result = unknown>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => Promise<Result>;\n};\n","import pgcs from 'pg-connection-string';\nimport { defaultPostgreSqlDatabase } from '../schema';\n\nexport const defaultPostgreSQLConenctionString =\n 'postgresql://postgres@localhost:5432/postgres';\n\nexport const getDatabaseNameOrDefault = (connectionString: string) =>\n pgcs.parse(connectionString).database ?? defaultPostgreSqlDatabase;\n","import { AdvisoryLock, type DatabaseLockOptions } from '../..';\nimport { rawSql, type Dumbo } from '../../..';\nimport {\n MIGRATIONS_LOCK_ID,\n runSQLMigrations,\n schemaComponent,\n sqlMigration,\n type SQLMigration,\n} from '../../../core/schema';\n\nexport type PostgreSQLMigratorOptions = {\n lock?: {\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n};\n\nconst migrationTableSQL = rawSql(`\n CREATE TABLE IF NOT EXISTS migrations (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL UNIQUE,\n application VARCHAR(255) NOT NULL DEFAULT 'default',\n sql_hash VARCHAR(64) NOT NULL,\n timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`);\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: () => [\n sqlMigration('dumbo:migrationTable:001', [migrationTableSQL]),\n ],\n },\n);\n\nexport const runPostgreSQLMigrations = (\n pool: Dumbo,\n migrations: SQLMigration[],\n options?: PostgreSQLMigratorOptions,\n): Promise<void> =>\n runSQLMigrations(pool, migrations, {\n schema: {\n migrationTable: migrationTableSchemaComponent,\n },\n lock: {\n databaseLock: AdvisoryLock,\n options: {\n ...(options ?? {}),\n lockId: MIGRATIONS_LOCK_ID,\n },\n },\n dryRun: options?.dryRun,\n });\n","import { exists, sql, type ConnectionPool, type SQL } from '../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = %L\n ) AS exists;`,\n tableName,\n );\n\nexport const tableExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n sql(\n `\n SELECT EXISTS (\n SELECT FROM pg_proc \n WHERE \n proname = %L\n ) AS exists;\n `,\n functionName,\n );\n\nexport const functionExists = async (\n pool: ConnectionPool,\n tableName: string,\n): Promise<boolean> => exists(pool.execute.query(functionExistsSQL(tableName)));\n","import {\n defaultDatabaseLockOptions,\n type AcquireDatabaseLockMode,\n type AcquireDatabaseLockOptions,\n type DatabaseLock,\n type DatabaseLockOptions,\n type ReleaseDatabaseLockOptions,\n} from '..';\nimport { single, sql, type SQLExecutor } from '../../../core';\n\nexport const tryAcquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n const advisoryLock =\n options.mode === 'Permanent' ? 'pg_advisory_lock' : 'pg_advisory_xact_lock';\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT %s(%s) AS locked', advisoryLock, options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const releaseAdvisoryLock = async (\n execute: SQLExecutor,\n options: ReleaseDatabaseLockOptions,\n): Promise<boolean> => {\n const timeoutMs = options.timeoutMs ?? defaultDatabaseLockOptions.timeoutMs;\n\n try {\n await single(\n execute.query<{ locked: boolean }>(\n sql('SELECT pg_advisory_unlock(%s) AS locked', options.lockId),\n { timeoutMs },\n ),\n );\n return true;\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === '57014')\n return false;\n\n throw error;\n }\n};\n\nexport const acquireAdvisoryLock = async (\n execute: SQLExecutor,\n options: AcquireDatabaseLockOptions,\n) => {\n const lockAcquired = await tryAcquireAdvisoryLock(execute, options);\n if (!lockAcquired) {\n throw new Error(\n 'Failed to acquire advisory lock within the specified timeout. Migration aborted.',\n );\n }\n};\n\nexport const AdvisoryLock: DatabaseLock = {\n acquire: acquireAdvisoryLock,\n tryAcquire: tryAcquireAdvisoryLock,\n release: releaseAdvisoryLock,\n withAcquire: async <Result>(\n execute: SQLExecutor,\n handle: () => Promise<Result>,\n options: AcquireDatabaseLockOptions,\n ) => {\n await acquireAdvisoryLock(execute, options);\n try {\n return await handle();\n } finally {\n if (options.mode === 'Permanent')\n await releaseAdvisoryLock(execute, options);\n }\n },\n};\n\nexport const advisoryLock = (\n execute: SQLExecutor,\n options: DatabaseLockOptions,\n) => ({\n acquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n tryAcquire: (acquireOptions?: { mode: AcquireDatabaseLockMode }) =>\n tryAcquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n }),\n release: () => releaseAdvisoryLock(execute, options),\n withAcquire: async <Result>(\n handle: () => Promise<Result>,\n acquireOptions?: { mode: AcquireDatabaseLockMode },\n ) => {\n await acquireAdvisoryLock(execute, {\n ...options,\n ...(acquireOptions ?? {}),\n });\n try {\n return await handle();\n } finally {\n await releaseAdvisoryLock(execute, options);\n }\n },\n});\n","import pg from 'pg';\nimport { createConnection, type Connection } from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport { nodePostgresTransaction } from './transaction';\n\nexport const NodePostgresConnectorType = 'PostgreSQL:pg';\nexport type NodePostgresConnector = 'PostgreSQL:pg';\n\nexport type NodePostgresClient = pg.PoolClient | pg.Client;\n\nexport type NodePostgresPoolOrClient = pg.Pool | pg.PoolClient | pg.Client;\n\nexport type NodePostgresClientConnection = Connection<\n NodePostgresConnector,\n pg.Client\n>;\n\nexport type NodePostgresPoolClientConnection = Connection<\n NodePostgresConnector,\n pg.PoolClient\n>;\n\nexport type NodePostgresConnection =\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n\nexport type NodePostgresPoolClientOptions = {\n type: 'PoolClient';\n connect: Promise<pg.PoolClient>;\n close: (client: pg.PoolClient) => Promise<void>;\n};\n\nexport type NodePostgresClientOptions = {\n type: 'Client';\n connect: Promise<pg.Client>;\n close: (client: pg.Client) => Promise<void>;\n};\n\nexport const nodePostgresClientConnection = (\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport const nodePostgresPoolClientConnection = (\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n type: NodePostgresConnectorType,\n connect,\n close,\n initTransaction: (connection) => nodePostgresTransaction(connection),\n executor: nodePostgresSQLExecutor,\n });\n};\n\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions,\n): NodePostgresPoolClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresClientOptions,\n): NodePostgresClientConnection;\nexport function nodePostgresConnection(\n options: NodePostgresPoolClientOptions | NodePostgresClientOptions,\n): NodePostgresPoolClientConnection | NodePostgresClientConnection {\n return options.type === 'Client'\n ? nodePostgresClientConnection(options)\n : nodePostgresPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString: connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import pg from 'pg';\nimport {\n tracer,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n} from '../../../core';\nimport {\n NodePostgresConnectorType,\n type NodePostgresClient,\n type NodePostgresConnector,\n} from '../connections';\n\nexport const isNodePostgresNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isNodePostgresClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isNodePostgresPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const nodePostgresExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isNodePostgresNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (\n isNodePostgresNativePool(poolOrClient) &&\n isNodePostgresPoolClient(client)\n )\n client.release();\n }\n};\n\nexport type NodePostgresSQLExecutor = DbSQLExecutor<\n NodePostgresConnector,\n NodePostgresClient\n>;\n\nexport const nodePostgresSQLExecutor = (): NodePostgresSQLExecutor => ({\n type: NodePostgresConnectorType,\n query: batch,\n batchQuery: batch,\n command: batch,\n batchCommand: batch,\n});\n\nexport type BatchQueryOptions = { timeoutMs?: number };\n\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL,\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>>;\nfunction batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result>[]>;\nasync function batch<Result extends QueryResultRow = QueryResultRow>(\n client: NodePostgresClient,\n sqlOrSqls: SQL | SQL[],\n options?: BatchQueryOptions,\n): Promise<QueryResult<Result> | QueryResult<Result>[]> {\n const sqls = Array.isArray(sqlOrSqls) ? sqlOrSqls : [sqlOrSqls];\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options?.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n tracer.info('db:sql:query', { sql: sqls[i]! });\n const result = await client.query<Result>(sqls[i]!);\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n }\n return Array.isArray(sqlOrSqls) ? results : results[0]!;\n}\n","import {\n sqlExecutor,\n type Connection,\n type DatabaseTransaction,\n} from '../../../core';\nimport { nodePostgresSQLExecutor } from '../execute';\nimport {\n NodePostgresConnectorType,\n type NodePostgresConnector,\n type NodePostgresPoolOrClient,\n} from './connection';\n\nexport type NodePostgresTransaction =\n DatabaseTransaction<NodePostgresConnector>;\n\nexport const nodePostgresTransaction =\n <DbClient extends NodePostgresPoolOrClient = NodePostgresPoolOrClient>(\n connection: () => Connection<NodePostgresConnector, DbClient>,\n ) =>\n (\n getClient: Promise<DbClient>,\n options?: { close: (client: DbClient, error?: unknown) => Promise<void> },\n ): DatabaseTransaction<NodePostgresConnector> => ({\n connection: connection(),\n type: NodePostgresConnectorType,\n begin: async () => {\n const client = await getClient;\n await client.query('BEGIN');\n },\n commit: async () => {\n const client = await getClient;\n\n await client.query('COMMIT');\n\n if (options?.close) await options?.close(client);\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n await client.query('ROLLBACK');\n\n if (options?.close) await options?.close(client, error);\n },\n execute: sqlExecutor(nodePostgresSQLExecutor(), {\n connect: () => getClient,\n }),\n });\n","import pg from 'pg';\nimport {\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n} from '../../../core';\nimport {\n defaultPostgreSqlDatabase,\n getDatabaseNameOrDefault,\n} from '../../core';\nimport { setNodePostgresTypeParser } from '../serialization';\nimport {\n nodePostgresConnection,\n NodePostgresConnectorType,\n type NodePostgresClientConnection,\n type NodePostgresConnector,\n type NodePostgresPoolClientConnection,\n} from './connection';\n\nexport type NodePostgresNativePool =\n ConnectionPool<NodePostgresPoolClientConnection>;\n\nexport type NodePostgresAmbientClientPool =\n ConnectionPool<NodePostgresClientConnection>;\n\nexport type NodePostgresAmbientConnectionPool = ConnectionPool<\n NodePostgresPoolClientConnection | NodePostgresClientConnection\n>;\n\nexport type NodePostgresPool =\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool;\n\nexport const nodePostgresNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresNativePool => {\n const { connectionString, database } = options;\n const pool = getPool({ connectionString, database });\n\n const getConnection = () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPool({ connectionString, database });\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const nodePostgresAmbientNativePool = (options: {\n pool: pg.Pool;\n}): NodePostgresNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () =>\n nodePostgresConnection({\n type: 'PoolClient',\n connect: pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n }),\n });\n};\n\nexport const nodePostgresAmbientConnectionPool = (options: {\n connection: NodePostgresPoolClientConnection | NodePostgresClientConnection;\n}): NodePostgresAmbientConnectionPool => {\n const { connection } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: () => connection.transaction(),\n withTransaction: (handle) => connection.withTransaction(handle),\n });\n};\n\nexport const nodePostgresClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n}): NodePostgresAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n getConnection: () => {\n const connect = Promise.resolve(\n new pg.Client({ connectionString, database }),\n ).then(async (client) => {\n await client.connect();\n return client;\n });\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n });\n },\n });\n};\n\nexport const nodePostgresAmbientClientPool = (options: {\n client: pg.Client;\n}): NodePostgresAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = Promise.resolve(client);\n\n return nodePostgresConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n type: NodePostgresConnectorType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type NodePostgresPoolPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n };\n\nexport type NodePostgresPoolNotPooledOptions =\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connector?: NodePostgresConnector;\n connectionString: string;\n database?: string;\n connection:\n | NodePostgresPoolClientConnection\n | NodePostgresClientConnection;\n pooled?: false;\n };\n\nexport type NodePostgresPoolOptions = (\n | NodePostgresPoolPooledOptions\n | NodePostgresPoolNotPooledOptions\n) & {\n serializer?: JSONSerializer;\n};\n\nexport function nodePostgresPool(\n options: NodePostgresPoolPooledOptions,\n): NodePostgresNativePool;\nexport function nodePostgresPool(\n options: NodePostgresPoolNotPooledOptions,\n): NodePostgresAmbientClientPool;\nexport function nodePostgresPool(\n options: NodePostgresPoolOptions,\n):\n | NodePostgresNativePool\n | NodePostgresAmbientClientPool\n | NodePostgresAmbientConnectionPool {\n const { connectionString, database } = options;\n\n setNodePostgresTypeParser();\n\n if ('client' in options && options.client)\n return nodePostgresAmbientClientPool({ client: options.client });\n\n if ('connection' in options && options.connection)\n return nodePostgresAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return nodePostgresClientPool({ connectionString, database });\n\n if ('pool' in options && options.pool)\n return nodePostgresAmbientNativePool({ pool: options.pool });\n\n return nodePostgresNativePool({\n connectionString,\n database,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? getDatabaseNameOrDefault(poolOptions.connectionString)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? getDatabaseNameOrDefault(connectionString);\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import pg from 'pg';\nimport { JSONSerializer, RawJSONSerializer } from '../../../core/serializer';\n\nlet arePgTypesSet = false;\n\nexport const setNodePostgresTypeParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => JSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => JSONSerializer.deserialize(val));\n};\n\nexport const setNodePostgresTypeRawParser = (options?: { force?: boolean }) => {\n if (arePgTypesSet && !options?.force) return;\n\n arePgTypesSet = true;\n\n // BigInt\n pg.types.setTypeParser(20, (val) => BigInt(val));\n\n // JSONB\n pg.types.setTypeParser(3802, (val) => RawJSONSerializer.deserialize(val));\n\n // JSON\n pg.types.setTypeParser(114, (val) => RawJSONSerializer.deserialize(val));\n};\n","export * from './core';\nexport * from './pg';\nimport {\n type NodePostgresConnection,\n type NodePostgresConnector,\n type NodePostgresPool,\n type NodePostgresPoolOptions,\n nodePostgresPool,\n} from './pg';\n\nexport type PostgresConnector = NodePostgresConnector;\nexport type PostgresPoolOptions = NodePostgresPoolOptions;\nexport type PostgresPool = NodePostgresPool;\nexport type PostgresConnection = NodePostgresConnection;\nexport const postgresPool = nodePostgresPool;\n","import {\n postgresPool,\n type PostgresConnector,\n type PostgresPool,\n type PostgresPoolOptions,\n} from './postgres';\n\nexport * from './core';\nexport * from './postgres';\n\nexport type ConnectorType = PostgresConnector;\n\nexport type PoolOptions = {\n connector?: ConnectorType;\n};\n\nexport type DumboOptions = PoolOptions & PostgresPoolOptions;\nexport type Dumbo = PostgresPool;\n\nexport const connectionPool = <PoolOptionsType extends DumboOptions>(\n options: PoolOptionsType,\n) =>\n // TODO: this should have the pattern matching and verification\n postgresPool(options as unknown as PostgresPoolOptions);\n\nexport const dumbo = <DumboOptionsType extends DumboOptions = DumboOptions>(\n options: DumboOptionsType,\n): Dumbo => connectionPool(options);\n"],"mappings":"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","names":["key","sql","literal","literal","sqlExecutor","sql","key","sql","key","format","advisoryLock","pg","pg","pg","pg","pg","pg"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event-driven-io/dumbo",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "Dumbo - tools for dealing with PostgreSQL",
5
5
  "type": "module",
6
6
  "scripts": {