@prisma-next/adapter-postgres 0.5.0-dev.16 → 0.5.0-dev.18

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/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as OrderClause, c as PostgresContract, d as StorageColumn, f as StorageTable, i as Expr, l as PostgresLoweredStatement, n as ColumnRef, o as ParamRef, r as Direction, s as PostgresAdapterOptions, t as BinaryExpr, u as SelectAst } from "./types-CfRPdAk8.mjs";
1
+ import { a as OrderClause, c as PostgresContract, d as StorageColumn, f as StorageTable, i as Expr, l as PostgresLoweredStatement, n as ColumnRef, o as ParamRef, r as Direction, s as PostgresAdapterOptions, t as BinaryExpr, u as SelectAst } from "./types-tLtmYqCO.mjs";
2
2
  export { type BinaryExpr, type ColumnRef, type Direction, type Expr, type OrderClause, type ParamRef, type PostgresAdapterOptions, type PostgresContract, type PostgresLoweredStatement, type SelectAst, type StorageColumn, type StorageTable };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-postgres",
3
- "version": "0.5.0-dev.16",
3
+ "version": "0.5.0-dev.18",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -10,33 +10,33 @@
10
10
  "dependencies": {
11
11
  "ajv": "^8.18.0",
12
12
  "arktype": "^2.0.0",
13
- "@prisma-next/contract": "0.5.0-dev.16",
14
- "@prisma-next/family-sql": "0.5.0-dev.16",
15
- "@prisma-next/contract-authoring": "0.5.0-dev.16",
16
- "@prisma-next/framework-components": "0.5.0-dev.16",
17
- "@prisma-next/ids": "0.5.0-dev.16",
18
- "@prisma-next/sql-contract-psl": "0.5.0-dev.16",
19
- "@prisma-next/sql-contract-ts": "0.5.0-dev.16",
20
- "@prisma-next/sql-relational-core": "0.5.0-dev.16",
21
- "@prisma-next/sql-operations": "0.5.0-dev.16",
22
- "@prisma-next/sql-schema-ir": "0.5.0-dev.16",
23
- "@prisma-next/sql-runtime": "0.5.0-dev.16",
24
- "@prisma-next/sql-contract": "0.5.0-dev.16",
25
- "@prisma-next/utils": "0.5.0-dev.16",
26
- "@prisma-next/target-postgres": "0.5.0-dev.16"
13
+ "@prisma-next/contract": "0.5.0-dev.18",
14
+ "@prisma-next/family-sql": "0.5.0-dev.18",
15
+ "@prisma-next/contract-authoring": "0.5.0-dev.18",
16
+ "@prisma-next/framework-components": "0.5.0-dev.18",
17
+ "@prisma-next/sql-contract": "0.5.0-dev.18",
18
+ "@prisma-next/ids": "0.5.0-dev.18",
19
+ "@prisma-next/sql-contract-psl": "0.5.0-dev.18",
20
+ "@prisma-next/sql-relational-core": "0.5.0-dev.18",
21
+ "@prisma-next/sql-contract-ts": "0.5.0-dev.18",
22
+ "@prisma-next/sql-schema-ir": "0.5.0-dev.18",
23
+ "@prisma-next/sql-runtime": "0.5.0-dev.18",
24
+ "@prisma-next/sql-operations": "0.5.0-dev.18",
25
+ "@prisma-next/utils": "0.5.0-dev.18",
26
+ "@prisma-next/target-postgres": "0.5.0-dev.18"
27
27
  },
28
28
  "devDependencies": {
29
29
  "pathe": "^2.0.3",
30
30
  "tsdown": "0.18.4",
31
31
  "typescript": "5.9.3",
32
32
  "vitest": "4.0.17",
33
- "@prisma-next/cli": "0.5.0-dev.16",
34
- "@prisma-next/errors": "0.5.0-dev.16",
33
+ "@prisma-next/driver-postgres": "0.5.0-dev.18",
34
+ "@prisma-next/extension-pgvector": "0.5.0-dev.18",
35
+ "@prisma-next/cli": "0.5.0-dev.18",
36
+ "@prisma-next/errors": "0.5.0-dev.18",
35
37
  "@prisma-next/test-utils": "0.0.1",
36
- "@prisma-next/driver-postgres": "0.5.0-dev.16",
37
- "@prisma-next/tsdown": "0.0.0",
38
38
  "@prisma-next/tsconfig": "0.0.0",
39
- "@prisma-next/extension-pgvector": "0.5.0-dev.16"
39
+ "@prisma-next/tsdown": "0.0.0"
40
40
  },
41
41
  "exports": {
42
42
  "./adapter": "./dist/adapter.mjs",
@@ -1,3 +1,4 @@
1
+ import type { CodecLookup } from '@prisma-next/framework-components/codec';
1
2
  import {
2
3
  type Adapter,
3
4
  type AdapterProfile,
@@ -9,6 +10,7 @@ import {
9
10
  import { parseContractMarkerRow } from '@prisma-next/sql-runtime';
10
11
  import { codecDefinitions } from '@prisma-next/target-postgres/codecs';
11
12
  import { ifDefined } from '@prisma-next/utils/defined';
13
+ import { createPostgresBuiltinCodecLookup } from './codec-lookup';
12
14
  import { renderLoweredSql } from './sql-renderer';
13
15
  import type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';
14
16
 
@@ -59,8 +61,10 @@ class PostgresAdapterImpl
59
61
  }
60
62
  return registry;
61
63
  })();
64
+ private readonly codecLookup: CodecLookup;
62
65
 
63
66
  constructor(options?: PostgresAdapterOptions) {
67
+ this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();
64
68
  this.profile = Object.freeze({
65
69
  id: options?.profileId ?? 'postgres/default@1',
66
70
  target: 'postgres',
@@ -81,7 +85,7 @@ class PostgresAdapterImpl
81
85
  }
82
86
 
83
87
  lower(ast: AnyQueryAst, context: LowererContext<PostgresContract>): PostgresLoweredStatement {
84
- return renderLoweredSql(ast, context.contract);
88
+ return renderLoweredSql(ast, context.contract, this.codecLookup);
85
89
  }
86
90
  }
87
91
 
@@ -0,0 +1,24 @@
1
+ import type { Codec, CodecLookup } from '@prisma-next/framework-components/codec';
2
+ import { codecDefinitions } from '@prisma-next/target-postgres/codecs';
3
+
4
+ /**
5
+ * Build a {@link CodecLookup} populated with the Postgres-builtin codec
6
+ * definitions only.
7
+ *
8
+ * This is the default lookup used by `createPostgresAdapter()` and
9
+ * `new PostgresControlAdapter()` when called without a stack-derived lookup
10
+ * (e.g. from tests, or one-off scripts that don't compose a full stack).
11
+ *
12
+ * Extension codecs (e.g. `pg/vector@1` from `@prisma-next/extension-pgvector`)
13
+ * are intentionally NOT included here: a bare adapter cannot see extensions.
14
+ * Stack-composed paths (`SqlControlAdapterDescriptor.create(stack)` /
15
+ * `SqlRuntimeAdapterDescriptor.create(stack)`) supply the broader,
16
+ * extension-inclusive lookup at construction time.
17
+ */
18
+ export function createPostgresBuiltinCodecLookup(): CodecLookup {
19
+ const byId = new Map<string, Codec>();
20
+ for (const definition of Object.values(codecDefinitions)) {
21
+ byId.set(definition.codec.id, definition.codec);
22
+ }
23
+ return { get: (id) => byId.get(id) };
24
+ }
@@ -1,4 +1,5 @@
1
1
  import type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';
2
+ import type { CodecLookup } from '@prisma-next/framework-components/codec';
2
3
  import type { ControlDriverInstance } from '@prisma-next/framework-components/control';
3
4
  import type {
4
5
  AnyQueryAst,
@@ -19,6 +20,7 @@ import type {
19
20
  import { parsePostgresDefault } from '@prisma-next/target-postgres/default-normalizer';
20
21
  import { normalizeSchemaNativeType } from '@prisma-next/target-postgres/native-type-normalizer';
21
22
  import { ifDefined } from '@prisma-next/utils/defined';
23
+ import { createPostgresBuiltinCodecLookup } from './codec-lookup';
22
24
  import { pgEnumControlHooks } from './enum-control-hooks';
23
25
  import { renderLoweredSql } from './sql-renderer';
24
26
  import type { PostgresContract } from './types';
@@ -31,6 +33,19 @@ export class PostgresControlAdapter implements SqlControlAdapter<'postgres'> {
31
33
  readonly familyId = 'sql' as const;
32
34
  readonly targetId = 'postgres' as const;
33
35
 
36
+ private readonly codecLookup: CodecLookup;
37
+
38
+ /**
39
+ * @param codecLookup - Codec lookup used by the SQL renderer to resolve
40
+ * per-codec metadata at lower-time. Defaults to a Postgres-builtins-only
41
+ * lookup when omitted. Stack-aware callers
42
+ * (`SqlControlAdapterDescriptor.create(stack)`) supply
43
+ * `stack.codecLookup` so extension codecs are visible to the renderer.
44
+ */
45
+ constructor(codecLookup?: CodecLookup) {
46
+ this.codecLookup = codecLookup ?? createPostgresBuiltinCodecLookup();
47
+ }
48
+
34
49
  /**
35
50
  * Target-specific normalizer for raw Postgres default expressions.
36
51
  * Used by schema verification to normalize raw defaults before comparison.
@@ -53,7 +68,7 @@ export class PostgresControlAdapter implements SqlControlAdapter<'postgres'> {
53
68
  * without instantiating the runtime adapter.
54
69
  */
55
70
  lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement {
56
- return renderLoweredSql(ast, context.contract as PostgresContract);
71
+ return renderLoweredSql(ast, context.contract as PostgresContract, this.codecLookup);
57
72
  }
58
73
 
59
74
  /**
@@ -1,3 +1,4 @@
1
+ import type { CodecLookup } from '@prisma-next/framework-components/codec';
1
2
  import {
2
3
  type AggregateExpr,
3
4
  type AnyExpression,
@@ -20,50 +21,97 @@ import {
20
21
  type ParamRef,
21
22
  type ProjectionItem,
22
23
  type SelectAst,
24
+ type Codec as SqlCodec,
23
25
  type SubqueryExpr,
24
26
  type UpdateAst,
25
27
  } from '@prisma-next/sql-relational-core/ast';
26
- import { PG_JSON_CODEC_ID, PG_JSONB_CODEC_ID } from '@prisma-next/target-postgres/codec-ids';
27
28
  import { escapeLiteral, quoteIdentifier } from '@prisma-next/target-postgres/sql-utils';
28
29
  import type { PostgresContract } from './types';
29
30
 
30
- // Mirrors `VECTOR_CODEC_ID` in `@prisma-next/extension-pgvector/core/constants`.
31
- // Duplicated here rather than imported because the canonical export is not
32
- // part of the extension's public subpath surface, and `@prisma-next/adapter-postgres`
33
- // does not (and should not) take a runtime dependency on the extension package
34
- // just for one constant. The whole `getCodecParamCast` switch is slated for
35
- // removal under TML-2310 ("Move SQL param-cast metadata onto codec descriptors"),
36
- // at which point this and the JSON/JSONB IDs below also disappear.
37
- const VECTOR_CODEC_ID = 'pg/vector@1' as const;
38
-
39
31
  /**
40
- * Map a codec ID to its `::cast` suffix, if Postgres requires one for
41
- * parameterized values (e.g. `$1::vector`, `$1::jsonb`).
32
+ * Postgres native types whose unknown-OID parameter inference is reliable in
33
+ * arbitrary expression positions. Parameters bound to a codec whose
34
+ * `meta.db.sql.postgres.nativeType` falls in this set are emitted as plain
35
+ * `$N`; everything else (including `json`, `jsonb`, extension types like
36
+ * `vector`, and unknown user types) is emitted as `$N::<nativeType>` so the
37
+ * planner picks an unambiguous overload.
38
+ *
39
+ * `json` / `jsonb` are intentionally excluded despite being Postgres builtins:
40
+ * their operator overloads make context inference unreliable in expression
41
+ * positions (e.g. `$1 -> 'key'` is ambiguous between the two).
42
42
  *
43
- * NOTE: hardcoded codec IDs here are a known wart, tracked separately by
44
- * TML-2310 ("Move SQL param-cast metadata onto codec descriptors").
45
- * Until that lands the cast lives on the renderer rather than the codec.
43
+ * Spellings match the on-disk `meta.db.sql.postgres.nativeType` values in
44
+ * `@prisma-next/target-postgres`'s codec definitions, not the `udt_name`
45
+ * abbreviations that ADR 205 used as illustrative shorthand. The lookup-based
46
+ * cast policy compares against these strings directly.
46
47
  */
47
- function getCodecParamCast(codecId: string | undefined): string | undefined {
48
- if (codecId === VECTOR_CODEC_ID) {
49
- return 'vector';
50
- }
51
- if (codecId === PG_JSON_CODEC_ID) {
52
- return 'json';
53
- }
54
- if (codecId === PG_JSONB_CODEC_ID) {
55
- return 'jsonb';
56
- }
57
- return undefined;
48
+ const POSTGRES_INFERRABLE_NATIVE_TYPES: ReadonlySet<string> = new Set([
49
+ // Numeric
50
+ 'integer',
51
+ 'smallint',
52
+ 'bigint',
53
+ 'real',
54
+ 'double precision',
55
+ 'numeric',
56
+ // Boolean
57
+ 'boolean',
58
+ // Strings
59
+ 'text',
60
+ 'character',
61
+ 'character varying',
62
+ // Temporal
63
+ 'timestamp',
64
+ 'timestamp without time zone',
65
+ 'timestamp with time zone',
66
+ 'time',
67
+ 'timetz',
68
+ 'interval',
69
+ // Bit strings
70
+ 'bit',
71
+ 'bit varying',
72
+ ]);
73
+
74
+ function renderTypedParam(
75
+ index: number,
76
+ codecId: string | undefined,
77
+ codecLookup: CodecLookup,
78
+ ): string {
79
+ if (codecId === undefined) {
80
+ return `$${index}`;
81
+ }
82
+ // SQL codecs extend the framework `Codec` base with an optional
83
+ // `meta: CodecMeta`; the framework `CodecLookup.get` returns the base type,
84
+ // so we narrow to `SqlCodec` to read `meta`. Every codec actually
85
+ // registered into a SQL codec lookup conforms to `SqlCodec`.
86
+ const codec = codecLookup.get(codecId) as SqlCodec | undefined;
87
+ if (codec === undefined) {
88
+ throw new Error(
89
+ `Postgres lowering: ParamRef carries codecId "${codecId}" but the ` +
90
+ 'assembled codec lookup has no entry for it. This usually indicates ' +
91
+ 'a missing extension pack in the runtime stack — register the pack ' +
92
+ 'that contributes this codec (e.g. `extensionPacks: [pgvectorRuntime]`), ' +
93
+ 'or use the codec directly from `@prisma-next/target-postgres/codecs` ' +
94
+ "if it's a builtin.",
95
+ );
96
+ }
97
+ const nativeType = codec.meta?.db?.sql?.postgres?.nativeType;
98
+ if (nativeType !== undefined && !POSTGRES_INFERRABLE_NATIVE_TYPES.has(nativeType)) {
99
+ return `$${index}::${nativeType}`;
100
+ }
101
+ return `$${index}`;
58
102
  }
59
103
 
60
- function renderTypedParam(index: number, codecId: string | undefined): string {
61
- const cast = getCodecParamCast(codecId);
62
- return cast ? `$${index}::${cast}` : `$${index}`;
104
+ /**
105
+ * Per-render carrier threaded through every helper. Bundles the param-index
106
+ * map (for `$N` numbering) and the assembled-stack `codecLookup` (for
107
+ * cast policy at the `renderTypedParam` chokepoint). Carrying both on a
108
+ * single value keeps helper signatures stable.
109
+ */
110
+ interface ParamIndexMap {
111
+ readonly indexMap: Map<ParamRef, number>;
112
+ readonly codecLookup: CodecLookup;
63
113
  }
64
114
 
65
- type ParamIndexMap = Map<ParamRef, number>;
66
-
67
115
  /**
68
116
  * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
69
117
  *
@@ -74,32 +122,34 @@ type ParamIndexMap = Map<ParamRef, number>;
74
122
  export function renderLoweredSql(
75
123
  ast: AnyQueryAst,
76
124
  contract: PostgresContract,
125
+ codecLookup: CodecLookup,
77
126
  ): { readonly sql: string; readonly params: readonly unknown[] } {
78
127
  const collectedParamRefs = ast.collectParamRefs();
79
- const paramIndexMap: ParamIndexMap = new Map();
128
+ const indexMap = new Map<ParamRef, number>();
80
129
  const params: unknown[] = [];
81
130
  for (const ref of collectedParamRefs) {
82
- if (paramIndexMap.has(ref)) {
131
+ if (indexMap.has(ref)) {
83
132
  continue;
84
133
  }
85
- paramIndexMap.set(ref, params.length + 1);
134
+ indexMap.set(ref, params.length + 1);
86
135
  params.push(ref.value);
87
136
  }
137
+ const pim: ParamIndexMap = { indexMap, codecLookup };
88
138
 
89
139
  const node = ast;
90
140
  let sql: string;
91
141
  switch (node.kind) {
92
142
  case 'select':
93
- sql = renderSelect(node, contract, paramIndexMap);
143
+ sql = renderSelect(node, contract, pim);
94
144
  break;
95
145
  case 'insert':
96
- sql = renderInsert(node, contract, paramIndexMap);
146
+ sql = renderInsert(node, contract, pim);
97
147
  break;
98
148
  case 'update':
99
- sql = renderUpdate(node, contract, paramIndexMap);
149
+ sql = renderUpdate(node, contract, pim);
100
150
  break;
101
151
  case 'delete':
102
- sql = renderDelete(node, contract, paramIndexMap);
152
+ sql = renderDelete(node, contract, pim);
103
153
  break;
104
154
  // v8 ignore next 4
105
155
  default:
@@ -457,11 +507,11 @@ function renderExpr(expr: AnyExpression, contract: PostgresContract, pim: ParamI
457
507
  }
458
508
 
459
509
  function renderParamRef(ref: ParamRef, pim: ParamIndexMap): string {
460
- const index = pim.get(ref);
510
+ const index = pim.indexMap.get(ref);
461
511
  if (index === undefined) {
462
512
  throw new Error('ParamRef not found in index map');
463
513
  }
464
- return renderTypedParam(index, ref.codecId);
514
+ return renderTypedParam(index, ref.codecId, pim.codecLookup);
465
515
  }
466
516
 
467
517
  function renderLiteral(expr: LiteralExpr): string {
package/src/core/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Contract } from '@prisma-next/contract/types';
2
+ import type { CodecLookup } from '@prisma-next/framework-components/codec';
2
3
  import type { SqlStorage, StorageColumn, StorageTable } from '@prisma-next/sql-contract/types';
3
4
  import type {
4
5
  AnyQueryAst,
@@ -19,6 +20,16 @@ import type {
19
20
 
20
21
  export interface PostgresAdapterOptions {
21
22
  readonly profileId?: string;
23
+ /**
24
+ * Codec lookup used by the SQL renderer to resolve per-codec metadata at
25
+ * lower-time. Defaults to a Postgres-builtins-only lookup when omitted —
26
+ * see {@link createPostgresBuiltinCodecLookup} in `./codec-lookup`.
27
+ *
28
+ * Stack-aware callers (`SqlRuntimeAdapterDescriptor.create(stack)` /
29
+ * `SqlControlAdapterDescriptor.create(stack)`) supply the assembled stack
30
+ * lookup so extension codecs are visible to the renderer.
31
+ */
32
+ readonly codecLookup?: CodecLookup;
22
33
  }
23
34
 
24
35
  export type PostgresContract = Contract<SqlStorage> & { readonly target: 'postgres' };
@@ -21,8 +21,8 @@ const postgresAdapterDescriptor: SqlControlAdapterDescriptor<'postgres'> = {
21
21
  defaultFunctionRegistry: createPostgresDefaultFunctionRegistry(),
22
22
  generatorDescriptors: createPostgresMutationDefaultGeneratorDescriptors(),
23
23
  },
24
- create(_stack): SqlControlAdapter<'postgres'> {
25
- return new PostgresControlAdapter();
24
+ create(stack): SqlControlAdapter<'postgres'> {
25
+ return new PostgresControlAdapter(stack.codecLookup);
26
26
  },
27
27
  };
28
28
 
@@ -1,4 +1,5 @@
1
1
  import type { GeneratedValueSpec } from '@prisma-next/contract/types';
2
+ import { extractCodecLookup } from '@prisma-next/framework-components/control';
2
3
  import type { RuntimeAdapterInstance } from '@prisma-next/framework-components/execution';
3
4
  import { builtinGeneratorIds } from '@prisma-next/ids';
4
5
  import { generateId } from '@prisma-next/ids/runtime';
@@ -81,8 +82,20 @@ const postgresRuntimeAdapterDescriptor: SqlRuntimeAdapterDescriptor<'postgres',
81
82
  parameterizedCodecs: () => parameterizedCodecDescriptors,
82
83
  queryOperations: () => postgresQueryOperations(),
83
84
  mutationDefaultGenerators: createPostgresMutationDefaultGenerators,
84
- create(_stack): SqlRuntimeAdapter {
85
- return createPostgresAdapter();
85
+ create(stack): SqlRuntimeAdapter {
86
+ // The runtime `ExecutionStack` does not (yet) carry a pre-assembled
87
+ // `codecLookup` field the way the control `ControlStack` does, so we
88
+ // derive an equivalent lookup here from the stack's component metadata
89
+ // (target + adapter + extension packs) using the same assembly helper
90
+ // that `createControlStack` uses. This keeps the renderer fed with the
91
+ // same codec set on both planes — including extension-contributed
92
+ // codecs like `pg/vector@1` from `@prisma-next/extension-pgvector`.
93
+ const codecLookup = extractCodecLookup([
94
+ stack.target,
95
+ stack.adapter,
96
+ ...stack.extensionPacks,
97
+ ]);
98
+ return createPostgresAdapter({ codecLookup });
86
99
  },
87
100
  };
88
101
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter-nTJBU77Q.mjs","names":["parameterizedCodecs: ReadonlyArray<CodecParamsDescriptor>"],"sources":["../src/core/adapter.ts"],"sourcesContent":["import {\n type Adapter,\n type AdapterProfile,\n type AnyQueryAst,\n type CodecParamsDescriptor,\n createCodecRegistry,\n type LowererContext,\n} from '@prisma-next/sql-relational-core/ast';\nimport { parseContractMarkerRow } from '@prisma-next/sql-runtime';\nimport { codecDefinitions } from '@prisma-next/target-postgres/codecs';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './sql-renderer';\nimport type { PostgresAdapterOptions, PostgresContract, PostgresLoweredStatement } from './types';\n\nconst defaultCapabilities = Object.freeze({\n postgres: {\n orderBy: true,\n limit: true,\n lateral: true,\n jsonAgg: true,\n returning: true,\n },\n sql: {\n enums: true,\n returning: true,\n defaultInInsert: true,\n },\n});\n\ntype AdapterCodec = (typeof codecDefinitions)[keyof typeof codecDefinitions]['codec'];\ntype ParameterizedCodec = AdapterCodec & {\n readonly paramsSchema: NonNullable<AdapterCodec['paramsSchema']>;\n};\n\nconst parameterizedCodecs: ReadonlyArray<CodecParamsDescriptor> = Object.values(codecDefinitions)\n .map((definition) => definition.codec)\n .filter((codec): codec is ParameterizedCodec => codec.paramsSchema !== undefined)\n .map((codec) =>\n Object.freeze({\n codecId: codec.id,\n paramsSchema: codec.paramsSchema,\n ...ifDefined('init', codec.init),\n }),\n );\n\nclass PostgresAdapterImpl\n implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement>\n{\n // These fields make the adapter instance structurally compatible with\n // RuntimeAdapterInstance<'sql', 'postgres'> without introducing a runtime-plane dependency.\n readonly familyId = 'sql' as const;\n readonly targetId = 'postgres' as const;\n\n readonly profile: AdapterProfile<'postgres'>;\n private readonly codecRegistry = (() => {\n const registry = createCodecRegistry();\n for (const definition of Object.values(codecDefinitions)) {\n registry.register(definition.codec);\n }\n return registry;\n })();\n\n constructor(options?: PostgresAdapterOptions) {\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n codecs: () => this.codecRegistry,\n readMarkerStatement: () => ({\n sql: 'select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from prisma_contract.marker where id = $1',\n params: [1],\n }),\n // Postgres' driver hydrates `text[]` columns as native JS arrays, so\n // the row is already in the shape the shared parser expects.\n parseMarkerRow: (row: unknown) => parseContractMarkerRow(row),\n });\n }\n\n parameterizedCodecs(): ReadonlyArray<CodecParamsDescriptor> {\n return parameterizedCodecs;\n }\n\n lower(ast: AnyQueryAst, context: LowererContext<PostgresContract>): PostgresLoweredStatement {\n return renderLoweredSql(ast, context.contract);\n }\n}\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;;;;AAcA,MAAM,sBAAsB,OAAO,OAAO;CACxC,UAAU;EACR,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACZ;CACD,KAAK;EACH,OAAO;EACP,WAAW;EACX,iBAAiB;EAClB;CACF,CAAC;AAOF,MAAMA,sBAA4D,OAAO,OAAO,iBAAiB,CAC9F,KAAK,eAAe,WAAW,MAAM,CACrC,QAAQ,UAAuC,MAAM,iBAAiB,OAAU,CAChF,KAAK,UACJ,OAAO,OAAO;CACZ,SAAS,MAAM;CACf,cAAc,MAAM;CACpB,GAAG,UAAU,QAAQ,MAAM,KAAK;CACjC,CAAC,CACH;AAEH,IAAM,sBAAN,MAEA;CAGE,AAAS,WAAW;CACpB,AAAS,WAAW;CAEpB,AAAS;CACT,AAAiB,uBAAuB;EACtC,MAAM,WAAW,qBAAqB;AACtC,OAAK,MAAM,cAAc,OAAO,OAAO,iBAAiB,CACtD,UAAS,SAAS,WAAW,MAAM;AAErC,SAAO;KACL;CAEJ,YAAY,SAAkC;AAC5C,OAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,cAAc,KAAK;GACnB,4BAA4B;IAC1B,KAAK;IACL,QAAQ,CAAC,EAAE;IACZ;GAGD,iBAAiB,QAAiB,uBAAuB,IAAI;GAC9D,CAAC;;CAGJ,sBAA4D;AAC1D,SAAO;;CAGT,MAAM,KAAkB,SAAqE;AAC3F,SAAO,iBAAiB,KAAK,QAAQ,SAAS;;;AAIlD,SAAgB,sBAAsB,SAAkC;AACtE,QAAO,OAAO,OAAO,IAAI,oBAAoB,QAAQ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sql-renderer-pEaSP82_.mjs","names":["paramIndexMap: ParamIndexMap","params: unknown[]","sql: string","right: string","orderedColumns: string[]","value: string"],"sources":["../src/core/sql-renderer.ts"],"sourcesContent":["import {\n type AggregateExpr,\n type AnyExpression,\n type AnyFromSource,\n type AnyQueryAst,\n type BinaryExpr,\n type ColumnRef,\n type DeleteAst,\n type InsertAst,\n type InsertValue,\n type JoinAst,\n type JoinOnExpr,\n type JsonArrayAggExpr,\n type JsonObjectExpr,\n type ListExpression,\n LiteralExpr,\n type NullCheckExpr,\n type OperationExpr,\n type OrderByItem,\n type ParamRef,\n type ProjectionItem,\n type SelectAst,\n type SubqueryExpr,\n type UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { PG_JSON_CODEC_ID, PG_JSONB_CODEC_ID } from '@prisma-next/target-postgres/codec-ids';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-postgres/sql-utils';\nimport type { PostgresContract } from './types';\n\n// Mirrors `VECTOR_CODEC_ID` in `@prisma-next/extension-pgvector/core/constants`.\n// Duplicated here rather than imported because the canonical export is not\n// part of the extension's public subpath surface, and `@prisma-next/adapter-postgres`\n// does not (and should not) take a runtime dependency on the extension package\n// just for one constant. The whole `getCodecParamCast` switch is slated for\n// removal under TML-2310 (\"Move SQL param-cast metadata onto codec descriptors\"),\n// at which point this and the JSON/JSONB IDs below also disappear.\nconst VECTOR_CODEC_ID = 'pg/vector@1' as const;\n\n/**\n * Map a codec ID to its `::cast` suffix, if Postgres requires one for\n * parameterized values (e.g. `$1::vector`, `$1::jsonb`).\n *\n * NOTE: hardcoded codec IDs here are a known wart, tracked separately by\n * TML-2310 (\"Move SQL param-cast metadata onto codec descriptors\").\n * Until that lands the cast lives on the renderer rather than the codec.\n */\nfunction getCodecParamCast(codecId: string | undefined): string | undefined {\n if (codecId === VECTOR_CODEC_ID) {\n return 'vector';\n }\n if (codecId === PG_JSON_CODEC_ID) {\n return 'json';\n }\n if (codecId === PG_JSONB_CODEC_ID) {\n return 'jsonb';\n }\n return undefined;\n}\n\nfunction renderTypedParam(index: number, codecId: string | undefined): string {\n const cast = getCodecParamCast(codecId);\n return cast ? `$${index}::${cast}` : `$${index}`;\n}\n\ntype ParamIndexMap = Map<ParamRef, number>;\n\n/**\n * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime (`PostgresAdapterImpl.lower`) and control\n * (`PostgresControlAdapter.lower`) entrypoints so emit-time and run-time\n * paths produce byte-identical output for the same AST.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: PostgresContract,\n): { readonly sql: string; readonly params: readonly unknown[] } {\n const collectedParamRefs = ast.collectParamRefs();\n const paramIndexMap: ParamIndexMap = new Map();\n const params: unknown[] = [];\n for (const ref of collectedParamRefs) {\n if (paramIndexMap.has(ref)) {\n continue;\n }\n paramIndexMap.set(ref, params.length + 1);\n params.push(ref.value);\n }\n\n const node = ast;\n let sql: string;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract, paramIndexMap);\n break;\n case 'insert':\n sql = renderInsert(node, contract, paramIndexMap);\n break;\n case 'update':\n sql = renderUpdate(node, contract, paramIndexMap);\n break;\n case 'delete':\n sql = renderDelete(node, contract, paramIndexMap);\n break;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported AST node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n\n return Object.freeze({ sql, params: Object.freeze(params) });\n}\n\nfunction renderSelect(ast: SelectAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const selectClause = `SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(\n ast.projection,\n contract,\n pim,\n )}`;\n const fromClause = `FROM ${renderSource(ast.from, contract, pim)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract, pim)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract, pim)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderWhere(ast.having, contract, pim)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => {\n const expr = renderExpr(order.expr, contract, pim);\n return `${expr} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n const limitClause = typeof ast.limit === 'number' ? `LIMIT ${ast.limit}` : '';\n const offsetClause = typeof ast.offset === 'number' ? `OFFSET ${ast.offset}` : '';\n\n const clauses = [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ');\n return clauses.trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract, pim)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction renderDistinctPrefix(\n distinct: true | undefined,\n distinctOn: ReadonlyArray<AnyExpression> | undefined,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n if (distinctOn && distinctOn.length > 0) {\n const rendered = distinctOn.map((expr) => renderExpr(expr, contract, pim)).join(', ');\n return `DISTINCT ON (${rendered}) `;\n }\n if (distinct) {\n return 'DISTINCT ';\n }\n return '';\n}\n\nfunction renderSource(\n source: AnyFromSource,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const node = source;\n switch (node.kind) {\n case 'table-source': {\n const table = quoteIdentifier(node.name);\n if (!node.alias) {\n return table;\n }\n return `${table} AS ${quoteIdentifier(node.alias)}`;\n }\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported source node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction assertScalarSubquery(query: SelectAst): void {\n if (query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n}\n\nfunction renderSubqueryExpr(\n expr: SubqueryExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n assertScalarSubquery(expr.query);\n return `(${renderSelect(expr.query, contract, pim)})`;\n}\n\nfunction renderWhere(expr: AnyExpression, contract: PostgresContract, pim: ParamIndexMap): string {\n return renderExpr(expr, contract, pim);\n}\n\nfunction renderNullCheck(\n expr: NullCheckExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const rendered = renderExpr(expr.expr, contract, pim);\n const renderedExpr = isAtomicExpressionKind(expr.expr.kind) ? rendered : `(${rendered})`;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\n/**\n * Atomic expression kinds whose rendered SQL is already self-delimited\n * (a column reference, parameter, literal, function call, aggregate, etc.)\n * and therefore does not need surrounding parentheses when used as the\n * left operand of a postfix predicate like `IS NULL` or `IS NOT NULL`,\n * or as either operand of a binary infix operator.\n *\n * Anything not in this set is treated as composite (binary, AND/OR/NOT,\n * EXISTS, nested IS NULL, subqueries, operation templates) and gets\n * wrapped to preserve grouping.\n */\nfunction isAtomicExpressionKind(kind: AnyExpression['kind']): boolean {\n switch (kind) {\n case 'column-ref':\n case 'identifier-ref':\n case 'param-ref':\n case 'literal':\n case 'aggregate':\n case 'json-object':\n case 'json-array-agg':\n case 'list':\n return true;\n case 'subquery':\n case 'operation':\n case 'binary':\n case 'and':\n case 'or':\n case 'exists':\n case 'null-check':\n case 'not':\n return false;\n }\n}\n\nfunction renderBinary(expr: BinaryExpr, contract: PostgresContract, pim: ParamIndexMap): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract, pim);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode, contract, pim);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n right = renderParamRef(rightNode, pim);\n break;\n default:\n right = renderExpr(rightNode, contract, pim);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(\n expr: ListExpression,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref') return renderParamRef(v, pim);\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v, contract, pim);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderAggregateExpr(\n expr: AggregateExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract, pim)})`;\n}\n\nfunction renderJsonObjectExpr(\n expr: JsonObjectExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract, pim)];\n })\n .join(', ');\n return `json_build_object(${args})`;\n}\n\nfunction renderOrderByItems(\n items: ReadonlyArray<OrderByItem>,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract, pim)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(\n expr: JsonArrayAggExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}`\n : '';\n const aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, json_build_array())`;\n }\n return aggregated;\n}\n\nfunction renderExpr(expr: AnyExpression, contract: PostgresContract, pim: ParamIndexMap): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract, pim);\n case 'subquery':\n return renderSubqueryExpr(node, contract, pim);\n case 'aggregate':\n return renderAggregateExpr(node, contract, pim);\n case 'json-object':\n return renderJsonObjectExpr(node, contract, pim);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract, pim);\n case 'binary':\n return renderBinary(node, contract, pim);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(' OR ')})`;\n case 'exists': {\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract, pim);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract, pim);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract, pim)})`;\n case 'param-ref':\n return renderParamRef(node, pim);\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node, contract, pim);\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported expression node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction renderParamRef(ref: ParamRef, pim: ParamIndexMap): string {\n const index = pim.get(ref);\n if (index === undefined) {\n throw new Error('ParamRef not found in index map');\n }\n return renderTypedParam(index, ref.codecId);\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null) {\n return 'NULL';\n }\n if (expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n if (Array.isArray(expr.value)) {\n return `ARRAY[${expr.value.map((v: unknown) => renderLiteral(new LiteralExpr(v))).join(', ')}]`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(\n expr: OperationExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const self = renderExpr(expr.self, contract, pim);\n const args = expr.args.map((arg) => {\n return renderExpr(arg, contract, pim);\n });\n\n // Resolve `{{self}}` and `{{argN}}` from the original template in a single\n // pass. Doing this with sequential `String.prototype.replace` calls is\n // unsafe: a substituted fragment can itself contain text that matches a\n // later token (e.g. an arg literal containing the substring `{{arg1}}`),\n // and the next iteration would corrupt it. A single regex callback never\n // re-scans already-substituted output.\n return expr.lowering.template.replace(\n /\\{\\{self\\}\\}|\\{\\{arg(\\d+)\\}\\}/g,\n (token, argIndex: string | undefined) => {\n if (token === '{{self}}') {\n return self;\n }\n const arg = args[Number(argIndex)];\n if (arg === undefined) {\n throw new Error(\n `Operation lowering template for \"${expr.method}\" referenced missing argument {{arg${argIndex}}}; template has ${args.length} arg(s)`,\n );\n }\n return arg;\n },\n );\n}\n\nfunction renderJoin(join: JoinAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const joinType = join.joinType.toUpperCase();\n const lateral = join.lateral ? 'LATERAL ' : '';\n const source = renderSource(join.source, contract, pim);\n const onClause = renderJoinOn(join.on, contract, pim);\n return `${joinType} JOIN ${lateral}${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract: PostgresContract, pim: ParamIndexMap): string {\n if (on.kind === 'eq-col-join-on') {\n const left = renderColumn(on.left);\n const right = renderColumn(on.right);\n return `${left} = ${right}`;\n }\n return renderWhere(on, contract, pim);\n}\n\nfunction getInsertColumnOrder(\n rows: ReadonlyArray<Record<string, InsertValue>>,\n contract: PostgresContract,\n tableName: string,\n): string[] {\n const orderedColumns: string[] = [];\n const seenColumns = new Set<string>();\n\n for (const row of rows) {\n for (const column of Object.keys(row)) {\n if (seenColumns.has(column)) {\n continue;\n }\n seenColumns.add(column);\n orderedColumns.push(column);\n }\n }\n\n if (orderedColumns.length > 0) {\n return orderedColumns;\n }\n\n const table = contract.storage.tables[tableName];\n if (!table) {\n throw new Error(`INSERT target table not found in contract storage: ${tableName}`);\n }\n return Object.keys(table.columns);\n}\n\nfunction renderInsertValue(value: InsertValue | undefined, pim: ParamIndexMap): string {\n if (!value || value.kind === 'default-value') {\n return 'DEFAULT';\n }\n\n switch (value.kind) {\n case 'param-ref':\n return renderParamRef(value, pim);\n case 'column-ref':\n return renderColumn(value);\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported value node in INSERT: ${(value satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction renderInsert(ast: InsertAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n const hasExplicitValues = rows.some((row) => Object.keys(row).length > 0);\n const insertClause = (() => {\n if (!hasExplicitValues) {\n if (rows.length === 1) {\n return `INSERT INTO ${table} DEFAULT VALUES`;\n }\n\n const defaultColumns = getInsertColumnOrder(rows, contract, ast.table.name);\n if (defaultColumns.length === 0) {\n return `INSERT INTO ${table} VALUES ${rows.map(() => '()').join(', ')}`;\n }\n\n const quotedColumns = defaultColumns.map((column) => quoteIdentifier(column));\n const defaultRow = `(${defaultColumns.map(() => 'DEFAULT').join(', ')})`;\n return `INSERT INTO ${table} (${quotedColumns.join(', ')}) VALUES ${rows\n .map(() => defaultRow)\n .join(', ')}`;\n }\n\n const columnOrder = getInsertColumnOrder(rows, contract, ast.table.name);\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => renderInsertValue(row[column], pim));\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n\n return `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n })();\n const onConflictClause = ast.onConflict\n ? (() => {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n return ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n case 'do-update-set': {\n const updateEntries = Object.entries(action.set);\n if (updateEntries.length === 0) {\n throw new Error('INSERT onConflict do-update-set requires at least one assignment');\n }\n const updates = updateEntries.map(([colName, value]) => {\n const target = quoteIdentifier(colName);\n if (value.kind === 'param-ref') {\n return `${target} = ${renderParamRef(value, pim)}`;\n }\n return `${target} = ${renderColumn(value)}`;\n });\n return ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n }\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported onConflict action: ${(action satisfies never as { kind: string }).kind}`,\n );\n }\n })()\n : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const setEntries = Object.entries(ast.set);\n if (setEntries.length === 0) {\n throw new Error('UPDATE requires at least one SET assignment');\n }\n const setClauses = setEntries.map(([col, val]) => {\n const column = quoteIdentifier(col);\n let value: string;\n switch (val.kind) {\n case 'param-ref':\n value = renderParamRef(val, pim);\n break;\n case 'column-ref':\n value = renderColumn(val);\n break;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported value node in UPDATE: ${(val satisfies never as { kind: string }).kind}`,\n );\n }\n return `${column} = ${value}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CfRPdAk8.d.mts","names":[],"sources":["../src/core/types.ts"],"sourcesContent":[],"mappings":";;;;;UAmBiB,sBAAA;;AAAjB;AAIY,KAAA,gBAAA,GAAmB,QAAS,CAAA,UAAT,CAAA,GAAA;EAEnB,SAAI,MAAA,EAAA,UAAA;CAAG;AAAY,KAAnB,IAAA,GAAO,SAAY,GAAA,QAAA,GAAW,gBAAX;AAAW,UAEzB,WAAA,CAFyB;EAAgB,SAAA,IAAA,EAGzC,SAHyC;EAEzC,SAAA,GAAA,EAED,SAFY;AAK5B;KAAY,wBAAA,GAA2B"}