@prisma-next/adapter-postgres 0.16.0-dev.2 → 0.16.0-dev.20
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/{adapter-BaZsfXGA.mjs → adapter-B1ZjTaaz.mjs} +2 -2
- package/dist/{adapter-BaZsfXGA.mjs.map → adapter-B1ZjTaaz.mjs.map} +1 -1
- package/dist/adapter.mjs +1 -1
- package/dist/{control-adapter-B6IM_oTR.mjs → control-adapter-D2bXxM7h.mjs} +47 -17
- package/dist/control-adapter-D2bXxM7h.mjs.map +1 -0
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +266 -31
- package/dist/control.mjs.map +1 -1
- package/dist/runtime.mjs +1 -1
- package/package.json +23 -23
- package/src/core/control-adapter.ts +8 -2
- package/src/core/control-mutation-defaults.ts +140 -34
- package/src/core/sql-renderer.ts +94 -22
- package/src/exports/control.ts +2 -2
- package/dist/control-adapter-B6IM_oTR.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-
|
|
1
|
+
import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-D2bXxM7h.mjs";
|
|
2
2
|
import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
|
|
3
3
|
import { isDdlNode } from "@prisma-next/sql-relational-core/ast";
|
|
4
4
|
//#region src/core/adapter.ts
|
|
@@ -63,4 +63,4 @@ function createPostgresAdapter(options) {
|
|
|
63
63
|
//#endregion
|
|
64
64
|
export { postgresRawCodecInferer as n, createPostgresAdapter as t };
|
|
65
65
|
|
|
66
|
-
//# sourceMappingURL=adapter-
|
|
66
|
+
//# sourceMappingURL=adapter-B1ZjTaaz.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-
|
|
1
|
+
{"version":3,"file":"adapter-B1ZjTaaz.mjs","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AnyQueryAst,\n LowererContext,\n RawSqlLiteral,\n SqlQueryable,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { PostgresDdlNode } from '@prisma-next/target-postgres/ddl';\nimport { createPostgresBuiltinCodecLookup } from './codec-lookup';\nimport { PostgresControlAdapter } from './control-adapter';\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 distinctOn: true,\n },\n sql: {\n enums: true,\n returning: true,\n defaultInInsert: true,\n lateral: true,\n scalarList: true,\n },\n});\n\nclass PostgresAdapterImpl\n implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement>\n{\n // These fields make the adapter instance structurally compatible with 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 codecLookup: CodecRegistry;\n\n constructor(options?: PostgresAdapterOptions) {\n this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();\n const controlAdapter = new PostgresControlAdapter(this.codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'postgres/default@1',\n target: 'postgres',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'postgres',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | PostgresDdlNode,\n context: LowererContext<PostgresContract>,\n ): PostgresLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract, this.codecLookup);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a postgres client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const postgresRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0 ? 'pg/int4' : 'pg/float8';\n case 'bigint':\n return 'pg/int8';\n case 'string':\n return 'pg/text';\n case 'boolean':\n return 'pg/bool';\n case 'object':\n if (value instanceof Uint8Array) return 'pg/bytea';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;AAkBA,MAAM,sBAAsB,OAAO,OAAO;CACxC,UAAU;EACR,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACX,YAAY;CACd;CACA,KAAK;EACH,OAAO;EACP,WAAW;EACX,iBAAiB;EACjB,SAAS;EACT,YAAY;CACd;AACF,CAAC;AAED,IAAM,sBAAN,MAEA;CAEE,WAAoB;CACpB,WAAoB;CAEpB;CACA;CAEA,YAAY,SAAkC;EAC5C,KAAK,cAAc,SAAS,eAAe,iCAAiC;EAC5E,MAAM,iBAAiB,IAAI,uBAAuB,KAAK,WAAW;EAClE,KAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,aAAa,cACX,eAAe,wBACb;IACE,UAAU;IACV,UAAU;IACV,OAAO,OACL,KACA,WACG;KAEH,OAAO,EAAE,MAAM,CAAC,IAAG,MADE,UAAU,MAAW,KAAK,MAAM,EAAA,CAC3B,IAAI,EAAE;IAClC;IACA,OAAO,YAAY,CAAC;GACtB,GACA,YACF;EACJ,CAAC;CACH;CAEA,MACE,KACA,SAC0B;EAC1B,IAAI,UAAU,GAAG,GACf,MAAM,IAAI,MACR,6HACF;EAEF,OAAO,iBAAiB,KAAK,QAAQ,UAAU,KAAK,WAAW;CACjE;AACF;;AAGA,MAAa,0BAA2C,EACtD,WAAW,OAA8B;CACvC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,MAAM,IAAI,YAAY;EACtE,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,YAAY,OAAO;CAC5C;CACA,MAAM,IAAI,MACR,6GACF;AACF,EACF;AAEA,SAAgB,sBAAsB,SAAkC;CACtE,OAAO,OAAO,OAAO,IAAI,oBAAoB,OAAO,CAAC;AACvD"}
|
package/dist/adapter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-
|
|
1
|
+
import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-B1ZjTaaz.mjs";
|
|
2
2
|
export { createPostgresAdapter, postgresRawCodecInferer };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { APP_SPACE_ID, extractCodecLookup } from "@prisma-next/framework-components/control";
|
|
2
2
|
import { LiteralExpr, RawExpr, collectOrderedParamRefs, isDdlNode } from "@prisma-next/sql-relational-core/ast";
|
|
3
|
-
import { postgresCodecRegistry } from "@prisma-next/target-postgres/codecs";
|
|
3
|
+
import { isPgEnumParams, postgresCodecRegistry } from "@prisma-next/target-postgres/codecs";
|
|
4
4
|
import { parseMarkerRowSafely, rethrowMarkerReadError, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
|
|
5
5
|
import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
|
|
6
6
|
import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
|
|
@@ -10,7 +10,7 @@ import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries, int
|
|
|
10
10
|
import { parsePostgresDefault } from "@prisma-next/target-postgres/default-normalizer";
|
|
11
11
|
import { normalizeSchemaNativeType } from "@prisma-next/target-postgres/native-type-normalizer";
|
|
12
12
|
import { parseRlsPolicyWireName } from "@prisma-next/target-postgres/rls-canonicalize";
|
|
13
|
-
import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
|
|
13
|
+
import { escapeLiteral, quoteIdentifier, quoteQualifiedName } from "@prisma-next/target-postgres/sql-utils";
|
|
14
14
|
import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresSchemaNodeKind, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
|
|
15
15
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
16
16
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
@@ -34,7 +34,7 @@ function createPostgresBuiltinCodecLookup() {
|
|
|
34
34
|
//#endregion
|
|
35
35
|
//#region ../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs
|
|
36
36
|
function ledgerOriginFromStored(originCoreHash) {
|
|
37
|
-
if (originCoreHash === null || originCoreHash === "" || originCoreHash === "
|
|
37
|
+
if (originCoreHash === null || originCoreHash === "" || originCoreHash === "empty") return null;
|
|
38
38
|
return originCoreHash;
|
|
39
39
|
}
|
|
40
40
|
//#endregion
|
|
@@ -170,6 +170,7 @@ function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
|
|
|
170
170
|
const nativeType = isRecord(dialectBlock) ? dialectBlock["nativeType"] : void 0;
|
|
171
171
|
if (typeof nativeType === "string") {
|
|
172
172
|
const arraySuffix = many ? "[]" : "";
|
|
173
|
+
if (isPgEnumParams(typeParams)) return `$${index}::${quoteQualifiedName(nativeType)}${arraySuffix}`;
|
|
173
174
|
if (!POSTGRES_INFERRABLE_NATIVE_TYPES.has(nativeType)) return `$${index}::${nativeType}${arraySuffix}`;
|
|
174
175
|
if (many) return `$${index}::${nativeType}${arraySuffix}`;
|
|
175
176
|
}
|
|
@@ -178,6 +179,11 @@ function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
|
|
|
178
179
|
function isRecord(value) {
|
|
179
180
|
return typeof value === "object" && value !== null;
|
|
180
181
|
}
|
|
182
|
+
function unreachableKind(value) {
|
|
183
|
+
const candidate = value;
|
|
184
|
+
if (typeof candidate === "object" && candidate !== null && "kind" in candidate && typeof candidate.kind === "string") return candidate.kind;
|
|
185
|
+
return "unknown";
|
|
186
|
+
}
|
|
181
187
|
/**
|
|
182
188
|
* Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
|
|
183
189
|
*
|
|
@@ -219,7 +225,7 @@ function renderLoweredSql(ast, contract, codecLookup) {
|
|
|
219
225
|
sql = renderRawSql(node, contract, pim);
|
|
220
226
|
break;
|
|
221
227
|
// v8 ignore next 4
|
|
222
|
-
default: throw new Error(`Unsupported AST node kind: ${node
|
|
228
|
+
default: throw new Error(`Unsupported AST node kind: ${unreachableKind(node)}`);
|
|
223
229
|
}
|
|
224
230
|
return Object.freeze({
|
|
225
231
|
sql,
|
|
@@ -359,11 +365,10 @@ function renderSource(source, contract, pim) {
|
|
|
359
365
|
case "derived-table-source": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;
|
|
360
366
|
case "function-source": {
|
|
361
367
|
const args = node.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
|
|
362
|
-
|
|
363
|
-
return node.alias !== void 0 ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
|
|
368
|
+
return `${`${node.fn}(${args})`}${node.ordinality ? " WITH ORDINALITY" : ""}${node.alias === void 0 ? "" : ` AS ${quoteIdentifier(node.alias)}`}${node.columnAliases === void 0 ? "" : `(${node.columnAliases.map((column) => quoteIdentifier(column)).join(", ")})`}`;
|
|
364
369
|
}
|
|
365
370
|
// v8 ignore next 4
|
|
366
|
-
default: throw new Error(`Unsupported source node kind: ${node
|
|
371
|
+
default: throw new Error(`Unsupported source node kind: ${unreachableKind(node)}`);
|
|
367
372
|
}
|
|
368
373
|
}
|
|
369
374
|
function assertScalarSubquery(query) {
|
|
@@ -395,6 +400,9 @@ function isAtomicExpressionKind(kind) {
|
|
|
395
400
|
case "literal":
|
|
396
401
|
case "aggregate":
|
|
397
402
|
case "window-func":
|
|
403
|
+
case "function-call":
|
|
404
|
+
case "cast":
|
|
405
|
+
case "case":
|
|
398
406
|
case "json-object":
|
|
399
407
|
case "json-array-agg":
|
|
400
408
|
case "list": return true;
|
|
@@ -469,11 +477,26 @@ function renderAggregateExpr(expr, contract, pim) {
|
|
|
469
477
|
function renderWindowFuncExpr(expr, contract, pim) {
|
|
470
478
|
return `${expr.fn.toUpperCase()}(${expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ")}) OVER (${[expr.partitionBy && expr.partitionBy.length > 0 ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract, pim)).join(", ")}` : "", expr.orderBy && expr.orderBy.length > 0 ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : ""].filter((part) => part.length > 0).join(" ")})`;
|
|
471
479
|
}
|
|
480
|
+
function renderFunctionCallExpr(expr, contract, pim) {
|
|
481
|
+
const args = expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
|
|
482
|
+
return `${expr.fn}(${args})`;
|
|
483
|
+
}
|
|
484
|
+
function renderCastExpr(expr, contract, pim) {
|
|
485
|
+
return `CAST(${renderExpr(expr.expr, contract, pim)} AS ${expr.targetType})`;
|
|
486
|
+
}
|
|
487
|
+
function renderCaseExpr(expr, contract, pim) {
|
|
488
|
+
return `CASE ${expr.branches.map((branch) => `WHEN ${renderExpr(branch.condition, contract, pim)} THEN ${renderExpr(branch.value, contract, pim)}`).join(" ")}${expr.elseExpr === void 0 ? "" : ` ELSE ${renderExpr(expr.elseExpr, contract, pim)}`} END`;
|
|
489
|
+
}
|
|
490
|
+
function renderJsonValueProjection(projection, contract, pim) {
|
|
491
|
+
return projection.accept({
|
|
492
|
+
codec: ({ value }) => renderExpr(value, contract, pim),
|
|
493
|
+
native: ({ value }) => renderExpr(value, contract, pim),
|
|
494
|
+
document: ({ value }) => renderExpr(value, contract, pim)
|
|
495
|
+
});
|
|
496
|
+
}
|
|
472
497
|
function renderJsonObjectExpr(expr, contract, pim) {
|
|
473
498
|
return `json_build_object(${expr.entries.flatMap((entry) => {
|
|
474
|
-
|
|
475
|
-
if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
|
|
476
|
-
return [key, renderExpr(entry.value, contract, pim)];
|
|
499
|
+
return [`'${escapeLiteral(entry.key)}'`, renderJsonValueProjection(entry.value, contract, pim)];
|
|
477
500
|
}).join(", ")})`;
|
|
478
501
|
}
|
|
479
502
|
function renderOrderByItems(items, contract, pim) {
|
|
@@ -481,7 +504,7 @@ function renderOrderByItems(items, contract, pim) {
|
|
|
481
504
|
}
|
|
482
505
|
function renderJsonArrayAggExpr(expr, contract, pim) {
|
|
483
506
|
const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : "";
|
|
484
|
-
const aggregated = `json_agg(${
|
|
507
|
+
const aggregated = `json_agg(${renderJsonValueProjection(expr.expr, contract, pim)}${aggregateOrderBy})`;
|
|
485
508
|
if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, json_build_array())`;
|
|
486
509
|
return aggregated;
|
|
487
510
|
}
|
|
@@ -494,6 +517,9 @@ function renderExpr(expr, contract, pim) {
|
|
|
494
517
|
case "subquery": return renderSubqueryExpr(node, contract, pim);
|
|
495
518
|
case "aggregate": return renderAggregateExpr(node, contract, pim);
|
|
496
519
|
case "window-func": return renderWindowFuncExpr(node, contract, pim);
|
|
520
|
+
case "function-call": return renderFunctionCallExpr(node, contract, pim);
|
|
521
|
+
case "cast": return renderCastExpr(node, contract, pim);
|
|
522
|
+
case "case": return renderCaseExpr(node, contract, pim);
|
|
497
523
|
case "json-object": return renderJsonObjectExpr(node, contract, pim);
|
|
498
524
|
case "json-array-agg": return renderJsonArrayAggExpr(node, contract, pim);
|
|
499
525
|
case "binary": return renderBinary(node, contract, pim);
|
|
@@ -512,7 +538,7 @@ function renderExpr(expr, contract, pim) {
|
|
|
512
538
|
case "list": return renderListLiteral(node, contract, pim);
|
|
513
539
|
case "raw-expr": return renderRawExpr(node, contract, pim);
|
|
514
540
|
// v8 ignore next 4
|
|
515
|
-
default: throw new Error(`Unsupported expression node kind: ${node
|
|
541
|
+
default: throw new Error(`Unsupported expression node kind: ${unreachableKind(node)}`);
|
|
516
542
|
}
|
|
517
543
|
}
|
|
518
544
|
function renderParamRef(ref, pim) {
|
|
@@ -589,7 +615,7 @@ function renderInsertValue(value, contract, pim) {
|
|
|
589
615
|
case "column-ref": return renderColumn(value);
|
|
590
616
|
case "raw-expr": return renderExpr(value, contract, pim);
|
|
591
617
|
// v8 ignore next 4
|
|
592
|
-
default: throw new Error(`Unsupported value node in INSERT: ${value
|
|
618
|
+
default: throw new Error(`Unsupported value node in INSERT: ${unreachableKind(value)}`);
|
|
593
619
|
}
|
|
594
620
|
}
|
|
595
621
|
function renderInsert(ast, contract, pim) {
|
|
@@ -627,7 +653,7 @@ function renderInsert(ast, contract, pim) {
|
|
|
627
653
|
return ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
|
|
628
654
|
}
|
|
629
655
|
// v8 ignore next 4
|
|
630
|
-
default: throw new Error(`Unsupported onConflict action: ${action
|
|
656
|
+
default: throw new Error(`Unsupported onConflict action: ${unreachableKind(action)}`);
|
|
631
657
|
}
|
|
632
658
|
})() : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
|
|
633
659
|
}
|
|
@@ -1087,6 +1113,7 @@ var PostgresControlAdapter = class {
|
|
|
1087
1113
|
i.tablename,
|
|
1088
1114
|
i.indexname,
|
|
1089
1115
|
ix.indisunique,
|
|
1116
|
+
ix.indpred IS NOT NULL AS indpartial,
|
|
1090
1117
|
a.attname,
|
|
1091
1118
|
k.ord AS index_position,
|
|
1092
1119
|
am.amname,
|
|
@@ -1230,6 +1257,7 @@ var PostgresControlAdapter = class {
|
|
|
1230
1257
|
columns: [idxRow.attname],
|
|
1231
1258
|
name: idxRow.indexname,
|
|
1232
1259
|
unique: idxRow.indisunique,
|
|
1260
|
+
partial: idxRow.indpartial,
|
|
1233
1261
|
type: indexType,
|
|
1234
1262
|
options: indexOptions
|
|
1235
1263
|
});
|
|
@@ -1246,8 +1274,10 @@ var PostgresControlAdapter = class {
|
|
|
1246
1274
|
columns: Object.freeze([...idx.columns]),
|
|
1247
1275
|
name: idx.name,
|
|
1248
1276
|
unique: idx.unique,
|
|
1249
|
-
|
|
1250
|
-
|
|
1277
|
+
partial: idx.partial,
|
|
1278
|
+
type: idx.type,
|
|
1279
|
+
options: idx.options,
|
|
1280
|
+
annotations: void 0,
|
|
1251
1281
|
dependsOn: postgresColumnDependsOn(schema, tableName, idx.columns)
|
|
1252
1282
|
}));
|
|
1253
1283
|
const checksForTable = [];
|
|
@@ -1790,4 +1820,4 @@ async function pgRenderDdlExecuteRequest(ast, codecLookup) {
|
|
|
1790
1820
|
//#endregion
|
|
1791
1821
|
export { renderLoweredSql as n, createPostgresBuiltinCodecLookup as r, PostgresControlAdapter as t };
|
|
1792
1822
|
|
|
1793
|
-
//# sourceMappingURL=control-adapter-
|
|
1823
|
+
//# sourceMappingURL=control-adapter-D2bXxM7h.mjs.map
|