@prisma-next/adapter-postgres 0.15.0 → 0.16.0-dev.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-w2BFxQ--.mjs";
1
+ import { n as renderLoweredSql, r as createPostgresBuiltinCodecLookup, t as PostgresControlAdapter } from "./control-adapter-XtIRYsO-.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-CssyjkaR.mjs.map
66
+ //# sourceMappingURL=adapter-BbIiMeqB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-CssyjkaR.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"}
1
+ {"version":3,"file":"adapter-BbIiMeqB.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"}
@@ -1,8 +1,7 @@
1
- import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-DkGeLfUp.mjs";
1
+ import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-DyNEvnRB.mjs";
2
2
  import { Adapter, AdapterProfile, AnyQueryAst, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
3
  import { RawCodecInferer } from "@prisma-next/sql-relational-core/expression";
4
4
  import { PostgresDdlNode } from "@prisma-next/target-postgres/ddl";
5
-
6
5
  //#region src/core/adapter.d.ts
7
6
  declare class PostgresAdapterImpl implements Adapter<AnyQueryAst, PostgresContract, PostgresLoweredStatement> {
8
7
  readonly familyId: "sql";
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAoCM,mBAAA,YACO,OAAA,CAAQ,WAAA,EAAa,gBAAA,EAAkB,wBAAA;EAAA,SAGzC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;EAAA,iBACD,WAAA;cAEL,OAAA,GAAU,sBAAA;EA0BtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,eAAA,EACnB,OAAA,EAAS,cAAA,CAAe,gBAAA,IACvB,wBAAA;AAAA;;cAWQ,uBAAA,EAAyB,eAkBrC;AAAA,iBAEe,qBAAA,CAAsB,OAAA,GAAU,sBAAA,GAAsB,QAAA,CAAA,mBAAA"}
1
+ {"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;cAoCM,+BACO,QAAQ,aAAa,kBAAkB;WAGzC;WACA;WAEA,SAAS;mBACD;cAEL,UAAU;EA0BtB,MACE,KAAK,cAAc,iBACnB,SAAS,eAAe,oBACvB;;;cAWQ,yBAAyB;iBAoBtB,sBAAsB,UAAU,yBAAsB,SAAA"}
package/dist/adapter.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-CssyjkaR.mjs";
1
+ import { n as postgresRawCodecInferer, t as createPostgresAdapter } from "./adapter-BbIiMeqB.mjs";
2
2
  export { createPostgresAdapter, postgresRawCodecInferer };
@@ -1,5 +1,4 @@
1
1
  import { ColumnTypeDescriptor } from "@prisma-next/framework-components/codec";
2
-
3
2
  //#region src/exports/column-types.d.ts
4
3
  declare const textColumn: {
5
4
  readonly codecId: "pg/text@1";
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"mappings":";;;cA8Ba,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,UAAA,CAAW,MAAA,WAAiB,oBAAoB;EAAA,SACrD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,iBASlB,aAAA,CAAc,MAAA,WAAiB,oBAAoB;EAAA,SACxD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,cASrB,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,YAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,YAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,aAAA,CACd,SAAA,UACA,KAAA,YACC,oBAAoB;EAAA,SACZ,UAAA;IAAA,SAAuB,SAAA;IAAA,SAA4B,KAAA;EAAA;AAAA;AAAA,cASjD,eAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,cAE5B,iBAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,UAAA,CAAW,SAAA,YAAqB,oBAAoB;EAAA,SACzD,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;AAAA,iBASnB,YAAA,CAAa,SAAA,YAAqB,oBAAoB;EAAA,SAC3D,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;AAAA,cAStB,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,SAAA,CAAU,MAAA,WAAiB,oBAAoB;EAAA,SACpD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;AAAA,iBASlB,YAAA,CAAa,MAAA,WAAiB,oBAAoB;EAAA,SACvD,UAAA;IAAA,SAAuB,MAAA;EAAA;AAAA;;;;;;cAcrB,WAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;AAAA,iBAEzB,cAAA,CAAe,SAAA,YAAqB,oBAAoB;EAAA,SAC7D,UAAA;IAAA,SAAwB,SAAA;EAAA;AAAA;;;AA7CS;AAS5C;;cAkDa,UAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA;;;;cAK5B,WAAA;EAAA,SAG4B,OAAA;EAAA,SAAA,UAAA;AAAA"}
1
+ {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"mappings":";;cA8Ba;WAAA;WAAA;;iBAKG,WAAW,iBAAiB;WACjC;aAAuB;;;iBASlB,cAAc,iBAAiB;WACpC;aAAuB;;;cASrB;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;cAKA;WAAA;WAAA;;iBAKG,cACd,mBACA,iBACC;WACQ;aAAuB;aAA4B;;;cASjD;WAAA;WAAA;;cAKA;WAAA;WAAA;;iBAKG,WAAW,qBAAqB;WACrC;aAAwB;;;iBASnB,aAAa,qBAAqB;WACvC;aAAwB;;;cAStB;WAAA;WAAA;;iBAKG,UAAU,iBAAiB;WAChC;aAAuB;;;iBASlB,aAAa,iBAAiB;WACnC;aAAuB;;;;;;;;cAcrB;WAAA;WAAA;;iBAKG,eAAe,qBAAqB;WACzC;aAAwB;;;;;;;;cActB;WAAA;WAAA;;;;;cAQA;WAAA;WAAA"}
@@ -5,12 +5,13 @@ import { parseMarkerRowSafely, rethrowMarkerReadError, withMarkerReadErrorHandli
5
5
  import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
6
6
  import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
7
7
  import { REFERENTIAL_ACTION_SQL } from "@prisma-next/sql-contract/referential-action-sql";
8
+ import { RelationalSchemaNodeKind } from "@prisma-next/sql-schema-ir/types";
8
9
  import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries, int4, int8, jsonb, pgTable, text, textArray, timestamptz } from "@prisma-next/target-postgres/contract-free";
9
10
  import { parsePostgresDefault } from "@prisma-next/target-postgres/default-normalizer";
10
11
  import { normalizeSchemaNativeType } from "@prisma-next/target-postgres/native-type-normalizer";
11
12
  import { parseRlsPolicyWireName } from "@prisma-next/target-postgres/rls-canonicalize";
12
13
  import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
13
- import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
14
+ import { PostgresDatabaseSchemaNode, PostgresNamespaceSchemaNode, PostgresNativeEnumSchemaNode, PostgresPolicySchemaNode, PostgresRoleSchemaNode, PostgresSchemaNodeKind, PostgresTableSchemaNode } from "@prisma-next/target-postgres/types";
14
15
  import { blindCast } from "@prisma-next/utils/casts";
15
16
  import { ifDefined } from "@prisma-next/utils/defined";
16
17
  import { createAstCodecRegistry, deriveParamMetadata, encodeParamsWithMetadata } from "@prisma-next/sql-runtime";
@@ -177,6 +178,11 @@ function renderTypedParam(index, codecId, codecLookup, many, typeParams) {
177
178
  function isRecord(value) {
178
179
  return typeof value === "object" && value !== null;
179
180
  }
181
+ function unreachableKind(value) {
182
+ const candidate = value;
183
+ if (typeof candidate === "object" && candidate !== null && "kind" in candidate && typeof candidate.kind === "string") return candidate.kind;
184
+ return "unknown";
185
+ }
180
186
  /**
181
187
  * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
182
188
  *
@@ -218,7 +224,7 @@ function renderLoweredSql(ast, contract, codecLookup) {
218
224
  sql = renderRawSql(node, contract, pim);
219
225
  break;
220
226
  // v8 ignore next 4
221
- default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
227
+ default: throw new Error(`Unsupported AST node kind: ${unreachableKind(node)}`);
222
228
  }
223
229
  return Object.freeze({
224
230
  sql,
@@ -358,11 +364,10 @@ function renderSource(source, contract, pim) {
358
364
  case "derived-table-source": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;
359
365
  case "function-source": {
360
366
  const args = node.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
361
- const call = `${node.fn}(${args})`;
362
- return node.alias !== void 0 ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
367
+ 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(", ")})`}`;
363
368
  }
364
369
  // v8 ignore next 4
365
- default: throw new Error(`Unsupported source node kind: ${node.kind}`);
370
+ default: throw new Error(`Unsupported source node kind: ${unreachableKind(node)}`);
366
371
  }
367
372
  }
368
373
  function assertScalarSubquery(query) {
@@ -394,6 +399,9 @@ function isAtomicExpressionKind(kind) {
394
399
  case "literal":
395
400
  case "aggregate":
396
401
  case "window-func":
402
+ case "function-call":
403
+ case "cast":
404
+ case "case":
397
405
  case "json-object":
398
406
  case "json-array-agg":
399
407
  case "list": return true;
@@ -468,11 +476,26 @@ function renderAggregateExpr(expr, contract, pim) {
468
476
  function renderWindowFuncExpr(expr, contract, pim) {
469
477
  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(" ")})`;
470
478
  }
479
+ function renderFunctionCallExpr(expr, contract, pim) {
480
+ const args = expr.args.map((arg) => renderExpr(arg, contract, pim)).join(", ");
481
+ return `${expr.fn}(${args})`;
482
+ }
483
+ function renderCastExpr(expr, contract, pim) {
484
+ return `CAST(${renderExpr(expr.expr, contract, pim)} AS ${expr.targetType})`;
485
+ }
486
+ function renderCaseExpr(expr, contract, pim) {
487
+ 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`;
488
+ }
489
+ function renderJsonValueProjection(projection, contract, pim) {
490
+ return projection.accept({
491
+ codec: ({ value }) => renderExpr(value, contract, pim),
492
+ native: ({ value }) => renderExpr(value, contract, pim),
493
+ document: ({ value }) => renderExpr(value, contract, pim)
494
+ });
495
+ }
471
496
  function renderJsonObjectExpr(expr, contract, pim) {
472
497
  return `json_build_object(${expr.entries.flatMap((entry) => {
473
- const key = `'${escapeLiteral(entry.key)}'`;
474
- if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
475
- return [key, renderExpr(entry.value, contract, pim)];
498
+ return [`'${escapeLiteral(entry.key)}'`, renderJsonValueProjection(entry.value, contract, pim)];
476
499
  }).join(", ")})`;
477
500
  }
478
501
  function renderOrderByItems(items, contract, pim) {
@@ -480,7 +503,7 @@ function renderOrderByItems(items, contract, pim) {
480
503
  }
481
504
  function renderJsonArrayAggExpr(expr, contract, pim) {
482
505
  const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : "";
483
- const aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;
506
+ const aggregated = `json_agg(${renderJsonValueProjection(expr.expr, contract, pim)}${aggregateOrderBy})`;
484
507
  if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, json_build_array())`;
485
508
  return aggregated;
486
509
  }
@@ -493,6 +516,9 @@ function renderExpr(expr, contract, pim) {
493
516
  case "subquery": return renderSubqueryExpr(node, contract, pim);
494
517
  case "aggregate": return renderAggregateExpr(node, contract, pim);
495
518
  case "window-func": return renderWindowFuncExpr(node, contract, pim);
519
+ case "function-call": return renderFunctionCallExpr(node, contract, pim);
520
+ case "cast": return renderCastExpr(node, contract, pim);
521
+ case "case": return renderCaseExpr(node, contract, pim);
496
522
  case "json-object": return renderJsonObjectExpr(node, contract, pim);
497
523
  case "json-array-agg": return renderJsonArrayAggExpr(node, contract, pim);
498
524
  case "binary": return renderBinary(node, contract, pim);
@@ -511,7 +537,7 @@ function renderExpr(expr, contract, pim) {
511
537
  case "list": return renderListLiteral(node, contract, pim);
512
538
  case "raw-expr": return renderRawExpr(node, contract, pim);
513
539
  // v8 ignore next 4
514
- default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
540
+ default: throw new Error(`Unsupported expression node kind: ${unreachableKind(node)}`);
515
541
  }
516
542
  }
517
543
  function renderParamRef(ref, pim) {
@@ -588,7 +614,7 @@ function renderInsertValue(value, contract, pim) {
588
614
  case "column-ref": return renderColumn(value);
589
615
  case "raw-expr": return renderExpr(value, contract, pim);
590
616
  // v8 ignore next 4
591
- default: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);
617
+ default: throw new Error(`Unsupported value node in INSERT: ${unreachableKind(value)}`);
592
618
  }
593
619
  }
594
620
  function renderInsert(ast, contract, pim) {
@@ -626,7 +652,7 @@ function renderInsert(ast, contract, pim) {
626
652
  return ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
627
653
  }
628
654
  // v8 ignore next 4
629
- default: throw new Error(`Unsupported onConflict action: ${action.kind}`);
655
+ default: throw new Error(`Unsupported onConflict action: ${unreachableKind(action)}`);
630
656
  }
631
657
  })() : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
632
658
  }
@@ -998,7 +1024,8 @@ var PostgresControlAdapter = class {
998
1024
  numeric_precision,
999
1025
  numeric_scale,
1000
1026
  column_default,
1001
- format_type(a.atttypid, a.atttypmod) AS formatted_type
1027
+ format_type(a.atttypid, a.atttypmod) AS formatted_type,
1028
+ a.attidentity
1002
1029
  FROM information_schema.columns c
1003
1030
  JOIN pg_catalog.pg_class cl
1004
1031
  ON cl.relname = c.table_name
@@ -1013,64 +1040,74 @@ var PostgresControlAdapter = class {
1013
1040
  WHERE c.table_schema = $1
1014
1041
  ORDER BY c.table_name, c.ordinal_position`, [schema]);
1015
1042
  const pkResult = await driver.query(`SELECT
1016
- tc.table_name,
1017
- tc.constraint_name,
1018
- kcu.column_name,
1019
- kcu.ordinal_position
1020
- FROM information_schema.table_constraints tc
1021
- JOIN information_schema.key_column_usage kcu
1022
- ON tc.constraint_name = kcu.constraint_name
1023
- AND tc.table_schema = kcu.table_schema
1024
- AND tc.table_name = kcu.table_name
1025
- WHERE tc.table_schema = $1
1026
- AND tc.constraint_type = 'PRIMARY KEY'
1027
- ORDER BY tc.table_name, kcu.ordinal_position`, [schema]);
1043
+ cl.relname AS table_name,
1044
+ con.conname AS constraint_name,
1045
+ a.attname AS column_name,
1046
+ k.ord AS ordinal_position
1047
+ FROM pg_catalog.pg_constraint con
1048
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1049
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1050
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1051
+ JOIN pg_catalog.pg_attribute a
1052
+ ON a.attrelid = con.conrelid
1053
+ AND a.attnum = k.attnum
1054
+ WHERE ns.nspname = $1
1055
+ AND con.contype = 'p'
1056
+ ORDER BY cl.relname, k.ord`, [schema]);
1028
1057
  const fkResult = await driver.query(`SELECT
1029
- tc.table_name,
1030
- tc.constraint_name,
1031
- kcu.column_name,
1032
- kcu.ordinal_position,
1058
+ cl.relname AS table_name,
1059
+ con.conname AS constraint_name,
1060
+ a.attname AS column_name,
1061
+ k.ord AS ordinal_position,
1033
1062
  ref_ns.nspname AS referenced_table_schema,
1034
1063
  ref_cl.relname AS referenced_table_name,
1035
1064
  ref_att.attname AS referenced_column_name,
1036
- rc.delete_rule,
1037
- rc.update_rule
1038
- FROM information_schema.table_constraints tc
1039
- JOIN information_schema.key_column_usage kcu
1040
- ON tc.constraint_name = kcu.constraint_name
1041
- AND tc.table_schema = kcu.table_schema
1042
- AND tc.table_name = kcu.table_name
1043
- JOIN pg_catalog.pg_constraint pgc
1044
- ON pgc.conname = tc.constraint_name
1045
- AND pgc.connamespace = (
1046
- SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = tc.table_schema
1047
- )
1065
+ CASE con.confdeltype
1066
+ WHEN 'a' THEN 'NO ACTION'
1067
+ WHEN 'r' THEN 'RESTRICT'
1068
+ WHEN 'c' THEN 'CASCADE'
1069
+ WHEN 'n' THEN 'SET NULL'
1070
+ WHEN 'd' THEN 'SET DEFAULT'
1071
+ END AS delete_rule,
1072
+ CASE con.confupdtype
1073
+ WHEN 'a' THEN 'NO ACTION'
1074
+ WHEN 'r' THEN 'RESTRICT'
1075
+ WHEN 'c' THEN 'CASCADE'
1076
+ WHEN 'n' THEN 'SET NULL'
1077
+ WHEN 'd' THEN 'SET DEFAULT'
1078
+ END AS update_rule
1079
+ FROM pg_catalog.pg_constraint con
1080
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1081
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1082
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1083
+ JOIN pg_catalog.pg_attribute a
1084
+ ON a.attrelid = con.conrelid
1085
+ AND a.attnum = k.attnum
1048
1086
  JOIN pg_catalog.pg_class ref_cl
1049
- ON ref_cl.oid = pgc.confrelid
1087
+ ON ref_cl.oid = con.confrelid
1050
1088
  JOIN pg_catalog.pg_namespace ref_ns
1051
1089
  ON ref_ns.oid = ref_cl.relnamespace
1052
1090
  JOIN pg_catalog.pg_attribute ref_att
1053
- ON ref_att.attrelid = pgc.confrelid
1054
- AND ref_att.attnum = pgc.confkey[kcu.ordinal_position]
1055
- JOIN information_schema.referential_constraints rc
1056
- ON rc.constraint_name = tc.constraint_name
1057
- AND rc.constraint_schema = tc.table_schema
1058
- WHERE tc.table_schema = $1
1059
- AND tc.constraint_type = 'FOREIGN KEY'
1060
- ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position`, [schema]);
1091
+ ON ref_att.attrelid = con.confrelid
1092
+ AND ref_att.attnum = con.confkey[k.ord]
1093
+ WHERE ns.nspname = $1
1094
+ AND con.contype = 'f'
1095
+ ORDER BY cl.relname, con.conname, k.ord`, [schema]);
1061
1096
  const uniqueResult = await driver.query(`SELECT
1062
- tc.table_name,
1063
- tc.constraint_name,
1064
- kcu.column_name,
1065
- kcu.ordinal_position
1066
- FROM information_schema.table_constraints tc
1067
- JOIN information_schema.key_column_usage kcu
1068
- ON tc.constraint_name = kcu.constraint_name
1069
- AND tc.table_schema = kcu.table_schema
1070
- AND tc.table_name = kcu.table_name
1071
- WHERE tc.table_schema = $1
1072
- AND tc.constraint_type = 'UNIQUE'
1073
- ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position`, [schema]);
1097
+ cl.relname AS table_name,
1098
+ con.conname AS constraint_name,
1099
+ a.attname AS column_name,
1100
+ k.ord AS ordinal_position
1101
+ FROM pg_catalog.pg_constraint con
1102
+ JOIN pg_catalog.pg_class cl ON cl.oid = con.conrelid
1103
+ JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
1104
+ JOIN LATERAL unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord) ON true
1105
+ JOIN pg_catalog.pg_attribute a
1106
+ ON a.attrelid = con.conrelid
1107
+ AND a.attnum = k.attnum
1108
+ WHERE ns.nspname = $1
1109
+ AND con.contype = 'u'
1110
+ ORDER BY cl.relname, con.conname, k.ord`, [schema]);
1074
1111
  const indexResult = await driver.query(`SELECT
1075
1112
  i.tablename,
1076
1113
  i.indexname,
@@ -1091,10 +1128,9 @@ var PostgresControlAdapter = class {
1091
1128
  WHERE i.schemaname = $1
1092
1129
  AND NOT EXISTS (
1093
1130
  SELECT 1
1094
- FROM information_schema.table_constraints tc
1095
- WHERE tc.table_schema = $1
1096
- AND tc.table_name = i.tablename
1097
- AND tc.constraint_name = i.indexname
1131
+ FROM pg_catalog.pg_constraint con
1132
+ WHERE con.conindid = ic.oid
1133
+ AND con.contype IN ('p', 'u', 'x')
1098
1134
  )
1099
1135
  ORDER BY i.tablename, i.indexname, k.ord`, [schema]);
1100
1136
  const checkResult = await driver.query(`SELECT
@@ -1140,6 +1176,10 @@ var PostgresControlAdapter = class {
1140
1176
  if (many) nativeType = normalizeSchemaNativeType(nativeType.slice(0, -2));
1141
1177
  const resolvedNativeType = `${normalizeSchemaNativeType(nativeType)}${many ? "[]" : ""}`;
1142
1178
  const rawDefault = colRow.column_default ?? void 0;
1179
+ const resolvedDefault = colRow.attidentity === "a" || colRow.attidentity === "d" ? {
1180
+ kind: "function",
1181
+ expression: "autoincrement()"
1182
+ } : rawDefault !== void 0 ? parsePostgresDefault(rawDefault, resolvedNativeType) : void 0;
1143
1183
  columns[colRow.column_name] = {
1144
1184
  name: colRow.column_name,
1145
1185
  nativeType,
@@ -1147,14 +1187,15 @@ var PostgresControlAdapter = class {
1147
1187
  ...ifDefined("default", rawDefault),
1148
1188
  ...ifDefined("many", many),
1149
1189
  resolvedNativeType,
1150
- ...ifDefined("resolvedDefault", rawDefault !== void 0 ? parsePostgresDefault(rawDefault, resolvedNativeType) : void 0)
1190
+ ...ifDefined("resolvedDefault", resolvedDefault)
1151
1191
  };
1152
1192
  }
1153
1193
  const pkRows = [...pksByTable.get(tableName) ?? []];
1154
1194
  const primaryKeyColumns = pkRows.sort((a, b) => a.ordinal_position - b.ordinal_position).map((row) => row.column_name);
1155
1195
  const primaryKey = primaryKeyColumns.length > 0 ? {
1156
1196
  columns: primaryKeyColumns,
1157
- ...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {}
1197
+ ...pkRows[0]?.constraint_name ? { name: pkRows[0].constraint_name } : {},
1198
+ dependsOn: postgresColumnDependsOn(schema, tableName, primaryKeyColumns)
1158
1199
  } : void 0;
1159
1200
  const foreignKeysMap = /* @__PURE__ */ new Map();
1160
1201
  for (const fkRow of fksByTable.get(tableName) ?? []) {
@@ -1179,7 +1220,8 @@ var PostgresControlAdapter = class {
1179
1220
  referencedColumns: Object.freeze([...fk.referencedColumns]),
1180
1221
  name: fk.name,
1181
1222
  ...ifDefined("onDelete", mapReferentialAction(fk.deleteRule)),
1182
- ...ifDefined("onUpdate", mapReferentialAction(fk.updateRule))
1223
+ ...ifDefined("onUpdate", mapReferentialAction(fk.updateRule)),
1224
+ dependsOn: [postgresTableDependsOn(fk.referencedSchema, fk.referencedTable), ...postgresColumnDependsOn(schema, tableName, fk.columns)]
1183
1225
  }));
1184
1226
  const pkConstraints = pkConstraintsByTable.get(tableName) ?? /* @__PURE__ */ new Set();
1185
1227
  const uniquesMap = /* @__PURE__ */ new Map();
@@ -1194,7 +1236,8 @@ var PostgresControlAdapter = class {
1194
1236
  }
1195
1237
  const uniques = Array.from(uniquesMap.values()).map((uq) => ({
1196
1238
  columns: Object.freeze([...uq.columns]),
1197
- name: uq.name
1239
+ name: uq.name,
1240
+ dependsOn: postgresColumnDependsOn(schema, tableName, uq.columns)
1198
1241
  }));
1199
1242
  const indexesMap = /* @__PURE__ */ new Map();
1200
1243
  const indexNamesWithExpressionKey = /* @__PURE__ */ new Set();
@@ -1229,7 +1272,8 @@ var PostgresControlAdapter = class {
1229
1272
  name: idx.name,
1230
1273
  unique: idx.unique,
1231
1274
  ...idx.type !== void 0 && { type: idx.type },
1232
- ...idx.options !== void 0 && { options: idx.options }
1275
+ ...idx.options !== void 0 && { options: idx.options },
1276
+ dependsOn: postgresColumnDependsOn(schema, tableName, idx.columns)
1233
1277
  }));
1234
1278
  const checksForTable = [];
1235
1279
  for (const checkRow of checksByTable.get(tableName) ?? []) {
@@ -1281,7 +1325,8 @@ var PostgresControlAdapter = class {
1281
1325
  roles: policyRoles,
1282
1326
  ...row.qual !== null ? { using: row.qual } : {},
1283
1327
  ...row.with_check !== null ? { withCheck: row.with_check } : {},
1284
- permissive
1328
+ permissive,
1329
+ dependsOn: [postgresTableDependsOn(row.schemaname, row.tablename), ...policyRoles.map(postgresRoleDependsOn)]
1285
1330
  });
1286
1331
  const list = policiesByTable.get(row.tablename) ?? [];
1287
1332
  list.push(policy);
@@ -1447,6 +1492,49 @@ function mapReferentialAction(rule) {
1447
1492
  return mapped;
1448
1493
  }
1449
1494
  /**
1495
+ * A FK/policy dependency chain, mirroring the shape the expected-side
1496
+ * derivation stamps (`contractToPostgresDatabaseSchemaNode`): the database
1497
+ * root's fixed sentinel id, then the namespace, then the table.
1498
+ */
1499
+ function postgresTableDependsOn(namespaceId, tableName) {
1500
+ return [
1501
+ {
1502
+ nodeKind: PostgresSchemaNodeKind.database,
1503
+ id: "database"
1504
+ },
1505
+ {
1506
+ nodeKind: PostgresSchemaNodeKind.namespace,
1507
+ id: namespaceId
1508
+ },
1509
+ {
1510
+ nodeKind: PostgresSchemaNodeKind.table,
1511
+ id: tableName
1512
+ }
1513
+ ];
1514
+ }
1515
+ /** A policy's dependency chain onto one of the roles it grants to. */
1516
+ function postgresRoleDependsOn(role) {
1517
+ return [{
1518
+ nodeKind: PostgresSchemaNodeKind.database,
1519
+ id: "database"
1520
+ }, {
1521
+ nodeKind: PostgresSchemaNodeKind.role,
1522
+ id: role
1523
+ }];
1524
+ }
1525
+ /**
1526
+ * The chains from a table-child object (foreign key, index, unique, primary
1527
+ * key) to each of the own columns it is built on — the introspection-side
1528
+ * mirror of `contractToPostgresDatabaseSchemaNode`'s `columnDependsOn`. An
1529
+ * object is dropped before the columns it covers.
1530
+ */
1531
+ function postgresColumnDependsOn(namespaceId, tableName, columns) {
1532
+ return columns.map((column) => [...postgresTableDependsOn(namespaceId, tableName), {
1533
+ nodeKind: RelationalSchemaNodeKind.column,
1534
+ id: `column:${column}`
1535
+ }]);
1536
+ }
1537
+ /**
1450
1538
  * Groups an array of objects by a specified key.
1451
1539
  * Returns a Map for O(1) lookup by group key.
1452
1540
  */
@@ -1727,4 +1815,4 @@ async function pgRenderDdlExecuteRequest(ast, codecLookup) {
1727
1815
  //#endregion
1728
1816
  export { renderLoweredSql as n, createPostgresBuiltinCodecLookup as r, PostgresControlAdapter as t };
1729
1817
 
1730
- //# sourceMappingURL=control-adapter-w2BFxQ--.mjs.map
1818
+ //# sourceMappingURL=control-adapter-XtIRYsO-.mjs.map