@prisma-next/adapter-postgres 0.5.0-dev.6 → 0.5.0-dev.60

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.
Files changed (45) hide show
  1. package/README.md +21 -15
  2. package/dist/{adapter-hNElNHo4.mjs → adapter-_L4wXA4O.mjs} +9 -5
  3. package/dist/adapter-_L4wXA4O.mjs.map +1 -0
  4. package/dist/adapter.d.mts +2 -1
  5. package/dist/adapter.d.mts.map +1 -1
  6. package/dist/adapter.mjs +1 -1
  7. package/dist/column-types.d.mts +27 -23
  8. package/dist/column-types.d.mts.map +1 -1
  9. package/dist/column-types.mjs +27 -58
  10. package/dist/column-types.mjs.map +1 -1
  11. package/dist/control.d.mts +76 -3
  12. package/dist/control.d.mts.map +1 -1
  13. package/dist/control.mjs +47 -8
  14. package/dist/control.mjs.map +1 -1
  15. package/dist/{descriptor-meta-RTDzyrae.mjs → descriptor-meta-CpEka_0t.mjs} +30 -22
  16. package/dist/descriptor-meta-CpEka_0t.mjs.map +1 -0
  17. package/dist/operation-types.d.mts +11 -10
  18. package/dist/operation-types.d.mts.map +1 -1
  19. package/dist/runtime.d.mts +3 -11
  20. package/dist/runtime.d.mts.map +1 -1
  21. package/dist/runtime.mjs +27 -68
  22. package/dist/runtime.mjs.map +1 -1
  23. package/dist/{sql-renderer-pEaSP82_.mjs → sql-renderer-DLwYpnxz.mjs} +97 -36
  24. package/dist/sql-renderer-DLwYpnxz.mjs.map +1 -0
  25. package/dist/{types-CfRPdAk8.d.mts → types-tLtmYqCO.d.mts} +12 -1
  26. package/dist/types-tLtmYqCO.d.mts.map +1 -0
  27. package/dist/types.d.mts +1 -1
  28. package/package.json +21 -21
  29. package/src/core/adapter.ts +10 -2
  30. package/src/core/codec-lookup.ts +24 -0
  31. package/src/core/control-adapter.ts +68 -1
  32. package/src/core/control-mutation-defaults.ts +24 -18
  33. package/src/core/descriptor-meta.ts +32 -11
  34. package/src/core/sql-renderer.ts +118 -50
  35. package/src/core/types.ts +11 -0
  36. package/src/exports/column-types.ts +27 -58
  37. package/src/exports/control.ts +3 -2
  38. package/src/exports/runtime.ts +40 -48
  39. package/src/types/operation-types.ts +19 -9
  40. package/dist/adapter-hNElNHo4.mjs.map +0 -1
  41. package/dist/descriptor-meta-RTDzyrae.mjs.map +0 -1
  42. package/dist/sql-renderer-pEaSP82_.mjs.map +0 -1
  43. package/dist/types-CfRPdAk8.d.mts.map +0 -1
  44. package/src/core/json-schema-validator.ts +0 -54
  45. package/src/core/standard-schema.ts +0 -71
package/README.md CHANGED
@@ -131,10 +131,13 @@ flowchart TD
131
131
  - Exports column descriptors for built-in types and enum helpers (`enumType`, `enumColumn(typeRef, nativeType)`)
132
132
  - Parameterized helpers: `charColumn(length)`, `varcharColumn(length)`, `numericColumn(precision, scale?)`, `bitColumn(length)`, `varbitColumn(length)`, `timeColumn(precision?)`, `timetzColumn(precision?)`, `intervalColumn(precision?)`
133
133
 
134
- - Exports JSON helpers:
135
- - `jsonColumn`, `jsonbColumn`
136
- - `json(schema?)`, `jsonb(schema?)` where `schema` is a Standard Schema value (e.g., Arktype)
137
- - When a schema is provided, `typeParams` metadata is derived from the schema's `~standard` interface
134
+ - Exports raw JSON helpers:
135
+ - `jsonColumn`, `jsonbColumn` — untyped raw JSON / JSONB column descriptors
136
+ - For schema-typed JSON columns, use the per-library extension package
137
+ (`@prisma-next/extension-arktype-json` for arktype). The
138
+ schema-accepting `json(schema)` / `jsonb(schema)` overloads
139
+ previously shipped here retired in Phase C of the
140
+ codec-registry-unification project.
138
141
 
139
142
  ## Dependencies
140
143
 
@@ -156,7 +159,7 @@ flowchart TD
156
159
  - [ADR 068 - Error mapping to RuntimeError](../../../../docs/architecture%20docs/adrs/ADR%20068%20-%20Error%20mapping%20to%20RuntimeError.md)
157
160
  - [ADR 112 - Target Extension Packs](../../../../docs/architecture%20docs/adrs/ADR%20112%20-%20Target%20Extension%20Packs.md)
158
161
  - [ADR 114 - Extension codecs & branded types](../../../../docs/architecture%20docs/adrs/ADR%20114%20-%20Extension%20codecs%20&%20branded%20types.md)
159
- - [ADR 163 - Postgres JSON and JSONB typed columns](../../../../docs/architecture%20docs/adrs/ADR%20163%20-%20Postgres%20JSON%20and%20JSONB%20typed%20columns.md)
162
+ - [ADR 168 - Postgres JSON and JSONB typed columns](../../../../docs/architecture%20docs/adrs/ADR%20168%20-%20Postgres%20JSON%20and%20JSONB%20typed%20columns.md). Schema-typed JSON columns now ship from per-library extension packages (`@prisma-next/extension-arktype-json` for arktype); see [ADR 208 - Higher-order codecs for parameterized types](../../../../docs/architecture%20docs/adrs/ADR%20208%20-%20Higher-order%20codecs%20for%20parameterized%20types.md).
160
163
 
161
164
  ## Usage
162
165
 
@@ -277,7 +280,8 @@ Both `json` and `jsonb` accept any valid JSON value:
277
280
  ### Authoring helpers
278
281
 
279
282
  ```typescript
280
- import { json, jsonb } from '@prisma-next/adapter-postgres/column-types';
283
+ import { jsonbColumn } from '@prisma-next/adapter-postgres/column-types';
284
+ import { arktypeJson } from '@prisma-next/extension-arktype-json/column-types';
281
285
  import { type as arktype } from 'arktype';
282
286
 
283
287
  const auditPayloadSchema = arktype({
@@ -287,26 +291,28 @@ const auditPayloadSchema = arktype({
287
291
 
288
292
  table('event', (t) =>
289
293
  t
290
- .column('payload', { type: jsonb(auditPayloadSchema), nullable: false })
291
- .column('raw', { type: json(), nullable: true }),
294
+ // Schema-typed JSONB via the per-library extension package.
295
+ .column('payload', { type: arktypeJson(auditPayloadSchema), nullable: false })
296
+ // Untyped raw JSONB via the adapter's static descriptor.
297
+ .column('raw', { type: jsonbColumn, nullable: true }),
292
298
  );
293
299
  ```
294
300
 
295
301
  ### Typed fallback behavior
296
302
 
297
- - If a schema value is provided, emitted `contract.d.ts` derives a concrete type from that schema.
298
- - If no schema is provided, emitted type falls back to `JsonValue`.
303
+ - For schema-typed columns, use a per-library extension package
304
+ (e.g. `@prisma-next/extension-arktype-json`). The emit-path renderer
305
+ reads the schema's `expression` from typeParams and produces a concrete
306
+ TS type in `contract.d.ts`.
307
+ - For untyped columns (`jsonColumn`, `jsonbColumn`), the emitted type
308
+ falls back to `JsonValue`.
299
309
  - Runtime values still encode/decode as JSON-compatible values.
300
310
 
301
- ### Standard Schema integration
302
-
303
- `json(schema)` and `jsonb(schema)` accept Standard Schema values. Arktype schemas work out of the box via their Standard Schema adapter (`schema['~standard']`).
304
-
305
311
  ## Exports
306
312
 
307
313
  - `./adapter`: Adapter implementation (`createPostgresAdapter`)
308
314
  - `./codec-types`: PostgreSQL codec types (`CodecTypes`, `JsonValue`, `dataTypes`)
309
- - `./column-types`: Column type descriptors and authoring helpers (`json`, `jsonb`, `jsonColumn`, `jsonbColumn`, `enumType`, `enumColumn`, `textColumn`, `int4Column`, etc.)
315
+ - `./column-types`: Column type descriptors and authoring helpers (`jsonColumn`, `jsonbColumn`, `enumType`, `enumColumn`, `textColumn`, `int4Column`, etc.)
310
316
  - `./types`: PostgreSQL-specific types
311
317
  - `./control`: Control-plane entry point (adapter descriptor)
312
318
  - `./runtime`: Runtime-plane entry point (runtime adapter descriptor)
@@ -1,5 +1,6 @@
1
- import { t as renderLoweredSql } from "./sql-renderer-pEaSP82_.mjs";
1
+ import { n as createPostgresBuiltinCodecLookup, t as renderLoweredSql } from "./sql-renderer-DLwYpnxz.mjs";
2
2
  import { createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
3
+ import { parseContractMarkerRow } from "@prisma-next/sql-runtime";
3
4
  import { codecDefinitions } from "@prisma-next/target-postgres/codecs";
4
5
  import { ifDefined } from "@prisma-next/utils/defined";
5
6
 
@@ -32,23 +33,26 @@ var PostgresAdapterImpl = class {
32
33
  for (const definition of Object.values(codecDefinitions)) registry.register(definition.codec);
33
34
  return registry;
34
35
  })();
36
+ codecLookup;
35
37
  constructor(options) {
38
+ this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();
36
39
  this.profile = Object.freeze({
37
40
  id: options?.profileId ?? "postgres/default@1",
38
41
  target: "postgres",
39
42
  capabilities: defaultCapabilities,
40
43
  codecs: () => this.codecRegistry,
41
44
  readMarkerStatement: () => ({
42
- sql: "select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta from prisma_contract.marker where id = $1",
45
+ sql: "select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from prisma_contract.marker where id = $1",
43
46
  params: [1]
44
- })
47
+ }),
48
+ parseMarkerRow: (row) => parseContractMarkerRow(row)
45
49
  });
46
50
  }
47
51
  parameterizedCodecs() {
48
52
  return parameterizedCodecs;
49
53
  }
50
54
  lower(ast, context) {
51
- return renderLoweredSql(ast, context.contract);
55
+ return renderLoweredSql(ast, context.contract, this.codecLookup);
52
56
  }
53
57
  };
54
58
  function createPostgresAdapter(options) {
@@ -57,4 +61,4 @@ function createPostgresAdapter(options) {
57
61
 
58
62
  //#endregion
59
63
  export { createPostgresAdapter as t };
60
- //# sourceMappingURL=adapter-hNElNHo4.mjs.map
64
+ //# sourceMappingURL=adapter-_L4wXA4O.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-_L4wXA4O.mjs","names":["parameterizedCodecs: ReadonlyArray<CodecParamsDescriptor>"],"sources":["../src/core/adapter.ts"],"sourcesContent":["import type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport {\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 { createPostgresBuiltinCodecLookup } from './codec-lookup';\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 private readonly codecLookup: CodecLookup;\n\n constructor(options?: PostgresAdapterOptions) {\n this.codecLookup = options?.codecLookup ?? createPostgresBuiltinCodecLookup();\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, this.codecLookup);\n }\n}\n\nexport function createPostgresAdapter(options?: PostgresAdapterOptions) {\n return Object.freeze(new PostgresAdapterImpl(options));\n}\n"],"mappings":";;;;;;;AAgBA,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;CACJ,AAAiB;CAEjB,YAAY,SAAkC;AAC5C,OAAK,cAAc,SAAS,eAAe,kCAAkC;AAC7E,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,UAAU,KAAK,YAAY;;;AAIpE,SAAgB,sBAAsB,SAAkC;AACtE,QAAO,OAAO,OAAO,IAAI,oBAAoB,QAAQ,CAAC"}
@@ -1,4 +1,4 @@
1
- import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-CfRPdAk8.mjs";
1
+ import { c as PostgresContract, l as PostgresLoweredStatement, s as PostgresAdapterOptions } from "./types-tLtmYqCO.mjs";
2
2
  import { Adapter, AdapterProfile, AnyQueryAst, CodecParamsDescriptor, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
3
 
4
4
  //#region src/core/adapter.d.ts
@@ -7,6 +7,7 @@ declare class PostgresAdapterImpl implements Adapter<AnyQueryAst, PostgresContra
7
7
  readonly targetId: "postgres";
8
8
  readonly profile: AdapterProfile<'postgres'>;
9
9
  private readonly codecRegistry;
10
+ private readonly codecLookup;
10
11
  constructor(options?: PostgresAdapterOptions);
11
12
  parameterizedCodecs(): ReadonlyArray<CodecParamsDescriptor>;
12
13
  lower(ast: AnyQueryAst, context: LowererContext<PostgresContract>): PostgresLoweredStatement;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":[],"mappings":";;;;cA4CM,mBAAA,YACO,QAAQ,aAAa,kBAAkB;;EAD9C,SAAA,QAAA,EAAA,UACJ;EAAmB,SAAA,OAAA,EAOD,cAPC,CAAA,UAAA,CAAA;EAAa,iBAAA,aAAA;EAAkB,WAAA,CAAA,OAAA,CAAA,EAgB5B,sBAhB4B;EAOhC,mBAAA,CAAA,CAAA,EAsBK,aAtBL,CAsBmB,qBAtBnB,CAAA;EASI,KAAA,CAAA,GAAA,EAiBX,WAjBW,EAAA,OAAA,EAiBW,cAjBX,CAiB0B,gBAjB1B,CAAA,CAAA,EAiB8C,wBAjB9C;;AAaC,iBAST,qBAAA,CATS,OAAA,CAAA,EASuB,sBATvB,CAAA,EAS6C,QAT7C,CAS6C,mBAT7C,CAAA"}
1
+ {"version":3,"file":"adapter.d.mts","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":[],"mappings":";;;;cA+CM,mBAAA,YACO,QAAQ,aAAa,kBAAkB;;EAD9C,SAAA,QAAA,EAAA,UACJ;EAAmB,SAAA,OAAA,EAOD,cAPC,CAAA,UAAA,CAAA;EAAa,iBAAA,aAAA;EAAkB,iBAAA,WAAA;EAOhC,WAAA,CAAA,OAAA,CAAA,EAUI,sBAVJ;EAUI,mBAAA,CAAA,CAAA,EAiBC,aAjBD,CAiBe,qBAjBf,CAAA;EAiBe,KAAA,CAAA,GAAA,EAI1B,WAJ0B,EAAA,OAAA,EAIJ,cAJI,CAIW,gBAJX,CAAA,CAAA,EAI+B,wBAJ/B;;AAI1B,iBAKG,qBAAA,CALH,OAAA,CAAA,EAKmC,sBALnC,CAAA,EAKyD,QALzD,CAKyD,mBALzD,CAAA"}
package/dist/adapter.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { t as createPostgresAdapter } from "./adapter-hNElNHo4.mjs";
1
+ import { t as createPostgresAdapter } from "./adapter-_L4wXA4O.mjs";
2
2
 
3
3
  export { createPostgresAdapter };
@@ -1,27 +1,8 @@
1
1
  import { StorageTypeInstance } from "@prisma-next/sql-contract/types";
2
2
  import { ColumnTypeDescriptor } from "@prisma-next/contract-authoring";
3
3
 
4
- //#region src/core/standard-schema.d.ts
5
- type StandardSchemaJsonSchemaField = {
6
- readonly output?: unknown;
7
- };
8
- /**
9
- * Runtime view of the Standard Schema protocol.
10
- * Reads `~standard.jsonSchema.output` for the serializable JSON Schema representation,
11
- * and `.expression` for an optional TypeScript type expression string (Arktype-specific).
12
- *
13
- * This differs from the compile-time `StandardSchemaLike` in `codec-types.ts`, which reads
14
- * `~standard.types.output` for TypeScript type narrowing in contract.d.ts.
15
- */
16
- type StandardSchemaLike = {
17
- readonly '~standard'?: {
18
- readonly version?: number;
19
- readonly jsonSchema?: StandardSchemaJsonSchemaField;
20
- };
21
- readonly expression?: unknown;
22
- };
23
- //#endregion
24
4
  //#region src/exports/column-types.d.ts
5
+
25
6
  declare const textColumn: {
26
7
  readonly codecId: "pg/text@1";
27
8
  readonly nativeType: "text";
@@ -94,21 +75,44 @@ declare function varbitColumn(length: number): ColumnTypeDescriptor & {
94
75
  readonly length: number;
95
76
  };
96
77
  };
78
+ /**
79
+ * Postgres `bytea` column descriptor — variable-length binary string.
80
+ *
81
+ * Round-trips as `Uint8Array` on the JS side. The pg wire-protocol text
82
+ * encoding (`\x` followed by hex-encoded bytes, canonical for Postgres ≥ 9.0)
83
+ * and binary encoding are both handled by the underlying driver; the codec
84
+ * only normalizes the JS-side representation to a plain `Uint8Array` view.
85
+ */
86
+ declare const byteaColumn: {
87
+ readonly codecId: "pg/bytea@1";
88
+ readonly nativeType: "bytea";
89
+ };
97
90
  declare function intervalColumn(precision?: number): ColumnTypeDescriptor & {
98
91
  readonly typeParams?: {
99
92
  readonly precision: number;
100
93
  };
101
94
  };
95
+ /**
96
+ * Postgres `json` column descriptor — untyped raw JSON.
97
+ *
98
+ * For schema-typed JSON columns, use the per-library extension package
99
+ * (`@prisma-next/extension-arktype-json` ships `arktypeJson(schema)` for
100
+ * arktype). The schema-accepting `json(schema)` / `jsonb(schema)`
101
+ * overloads previously shipped from this module retired in Phase C of
102
+ * the codec-registry-unification project — see spec § AC-7.
103
+ */
102
104
  declare const jsonColumn: {
103
105
  readonly codecId: "pg/json@1";
104
106
  readonly nativeType: "json";
105
107
  };
108
+ /**
109
+ * Postgres `jsonb` column descriptor — untyped raw JSONB. Same retirement
110
+ * note as {@link jsonColumn}.
111
+ */
106
112
  declare const jsonbColumn: {
107
113
  readonly codecId: "pg/jsonb@1";
108
114
  readonly nativeType: "jsonb";
109
115
  };
110
- declare function json(schema?: StandardSchemaLike): ColumnTypeDescriptor;
111
- declare function jsonb(schema?: StandardSchemaLike): ColumnTypeDescriptor;
112
116
  declare function enumType<const Values extends readonly string[]>(name: string, values: Values): StorageTypeInstance & {
113
117
  readonly typeParams: {
114
118
  readonly values: Values;
@@ -118,5 +122,5 @@ declare function enumColumn<TypeName extends string>(typeName: TypeName, nativeT
118
122
  readonly typeRef: TypeName;
119
123
  };
120
124
  //#endregion
121
- export { bitColumn, boolColumn, charColumn, enumColumn, enumType, float4Column, float8Column, int2Column, int4Column, int8Column, intervalColumn, json, jsonColumn, jsonb, jsonbColumn, numericColumn, textColumn, timeColumn, timestampColumn, timestamptzColumn, timetzColumn, varbitColumn, varcharColumn };
125
+ export { bitColumn, boolColumn, byteaColumn, charColumn, enumColumn, enumType, float4Column, float8Column, int2Column, int4Column, int8Column, intervalColumn, jsonColumn, jsonbColumn, numericColumn, textColumn, timeColumn, timestampColumn, timestamptzColumn, timetzColumn, varbitColumn, varcharColumn };
122
126
  //# sourceMappingURL=column-types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/core/standard-schema.ts","../src/exports/column-types.ts"],"sourcesContent":[],"mappings":";;;;KAEK,6BAAA;;;AAFsB;AAc3B;;;;ACwBA;AAKA;AAUA;AAUa,KDjDD,kBAAA,GCoD6B;EAE5B,SAAA,WAG4B,CAAA,EAAA;IAE5B,SAG4B,OAAA,CAAA,EAAA,MAAA;IAE5B,SAAA,UAG4B,CAAA,EDhEf,6BCgEe;EAE5B,CAAA;EAKG,SAAA,UAAa,CAAA,EAAA,OAG1B;AAUH,CAAA;;;AA/Da,cAAA,UAG4B,EAAA;EAEzB,SAAA,OAAU,EAAA,WAAkB;EAU5B,SAAA,UAAa,EAAA,MAAkB;AAU/C,CAAA;AAKa,iBAzBG,UAAA,CA4ByB,MAAA,EAAA,MAAA,CAAA,EA5BG,oBA4BH,GAAA;EAE5B,SAAA,UAG4B,EAAA;IAE5B,SAAA,MAG4B,EAAA,MAAA;EAE5B,CAAA;AAKb,CAAA;AAaa,iBAhDG,aAAA,CAmDyB,MAAA,EAAA,MAAA,CAAA,EAnDM,oBAmDN,GAAA;EAE5B,SAAA,UAAA,EAG4B;IAEzB,SAAU,MAAA,EAAA,MAAsB;EAUhC,CAAA;AAUhB,CAAA;AAKgB,cAzEH,UAyE8B,EAAA;EAU3B,SAAA,OAAY,EAAA,WAAkB;EAU9B,SAAA,UAAc,EAAA,MAAA;AAU9B,CAAA;AAKa,cAvGA,UA0G4B,EAAA;EA8CzB,SAAI,OAAA,EAAA,WAAU;EAId,SAAK,UAAA,EAAU,MAAA;AAI/B,CAAA;AAEU,cA7JG,UA6JH,EAAA;EACP,SAAA,OAAA,EAAA,WAAA;EAAgE,SAAA,UAAA,EAAA,MAAA;CAAM;AAQzD,cAjKH,YAiKa,EAAA;EACd,SAAA,OAAA,EAAA,aAAA;EAET,SAAA,UAAA,EAAA,QAAA;CAA2C;AAAQ,cA/JzC,YA+JyC,EAAA;;;;iBA1JtC,aAAA,qCAGb;;;;;;cAUU;;;;cAKA;;;;iBAKG,UAAA,sBAAgC;;;;;iBAUhC,YAAA,sBAAkC;;;;;cAUrC;;;;iBAKG,SAAA,kBAA2B;;;;;iBAU3B,YAAA,kBAA8B;;;;;iBAU9B,cAAA,sBAAoC;;;;;cAUvC;;;;cAKA;;;;iBAiDG,IAAA,UAAc,qBAAqB;iBAInC,KAAA,UAAe,qBAAqB;iBAIpC,uEAEN,SACP;;qBAAgE;;;iBAQnD,8CACJ,+BAET;oBAA2C"}
1
+ {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/exports/column-types.ts"],"sourcesContent":[],"mappings":";;;;;AA+Da,cA9BA,UAiC4B,EAAA;EAE5B,SAAA,OAG4B,EAAA,WAAA;EAE5B,SAAA,UAG4B,EAAA,MAAA;AAEzC,CAAA;AAKgB,iBA7CA,UAAA,CAgDb,MAAA,EAAA,MAAA,CAAA,EAhDyC,oBAgDrB,GAAA;EAUV,SAAA,UAG4B,EAAA;IAE5B,SAAA,MAAA,EAG4B,MAAA;EAEzB,CAAA;AAUhB,CAAA;AAUa,iBA9EG,aAAA,CAiFyB,MAAA,EAAA,MAAA,CAAA,EAjFM,oBAiFN,GAAA;EAEzB,SAAA,UAAS,EAAA;IAUT,SAAA,MAAY,EAAA,MAAkB;EAkBjC,CAAA;AAKb,CAAA;AAmBa,cA7HA,UAgI4B,EAAA;EAM5B,SAAA,OAG4B,EAAA,WAAA;EAEzB,SAAA,UAAQ,EAAA,MAAA;CAEd;AACP,cAzIU,UAyIV,EAAA;EAAgE,SAAA,OAAA,EAAA,WAAA;EAAM,SAAA,UAAA,EAAA,MAAA;AAQzE,CAAA;AACY,cA7IC,UA6ID,EAAA;EAET,SAAA,OAAA,EAAA,WAAA;EAA2C,SAAA,UAAA,EAAA,MAAA;CAAQ;cA1IzC;;;;cAKA;;;;iBAKG,aAAA,qCAGb;;;;;;cAUU;;;;cAKA;;;;iBAKG,UAAA,sBAAgC;;;;;iBAUhC,YAAA,sBAAkC;;;;;cAUrC;;;;iBAKG,SAAA,kBAA2B;;;;;iBAU3B,YAAA,kBAA8B;;;;;;;;;;;;;cAkBjC;;;;iBAKG,cAAA,sBAAoC;;;;;;;;;;;;;;cAmBvC;;;;;;;;cASA;;;;iBAKG,uEAEN,SACP;;qBAAgE;;;iBAQnD,8CACJ,+BAET;oBAA2C"}
@@ -1,32 +1,5 @@
1
- import { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_VARCHAR_CODEC_ID } from "@prisma-next/target-postgres/codec-ids";
1
+ import { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_BYTEA_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_VARCHAR_CODEC_ID } from "@prisma-next/target-postgres/codec-ids";
2
2
 
3
- //#region src/core/standard-schema.ts
4
- function isObjectLike(value) {
5
- return (typeof value === "object" || typeof value === "function") && value !== null;
6
- }
7
- function resolveOutputJsonSchemaField(schema) {
8
- const jsonSchema = schema["~standard"]?.jsonSchema;
9
- if (!jsonSchema) return;
10
- if (typeof jsonSchema.output === "function") return jsonSchema.output({ target: "draft-07" });
11
- return jsonSchema.output;
12
- }
13
- function extractStandardSchemaOutputJsonSchema(schema) {
14
- const outputSchema = resolveOutputJsonSchemaField(schema);
15
- if (!isObjectLike(outputSchema)) return;
16
- return outputSchema;
17
- }
18
- function extractStandardSchemaTypeExpression(schema) {
19
- const expression = schema.expression;
20
- if (typeof expression !== "string") return;
21
- const trimmedExpression = expression.trim();
22
- if (trimmedExpression.length === 0) return;
23
- return trimmedExpression;
24
- }
25
- function isStandardSchemaLike(value) {
26
- return isObjectLike(value) && isObjectLike(value["~standard"]);
27
- }
28
-
29
- //#endregion
30
3
  //#region src/exports/column-types.ts
31
4
  const textColumn = {
32
5
  codecId: PG_TEXT_CODEC_ID,
@@ -116,6 +89,18 @@ function varbitColumn(length) {
116
89
  typeParams: { length }
117
90
  };
118
91
  }
92
+ /**
93
+ * Postgres `bytea` column descriptor — variable-length binary string.
94
+ *
95
+ * Round-trips as `Uint8Array` on the JS side. The pg wire-protocol text
96
+ * encoding (`\x` followed by hex-encoded bytes, canonical for Postgres ≥ 9.0)
97
+ * and binary encoding are both handled by the underlying driver; the codec
98
+ * only normalizes the JS-side representation to a plain `Uint8Array` view.
99
+ */
100
+ const byteaColumn = {
101
+ codecId: PG_BYTEA_CODEC_ID,
102
+ nativeType: "bytea"
103
+ };
119
104
  function intervalColumn(precision) {
120
105
  return {
121
106
  codecId: PG_INTERVAL_CODEC_ID,
@@ -123,43 +108,27 @@ function intervalColumn(precision) {
123
108
  ...precision === void 0 ? {} : { typeParams: { precision } }
124
109
  };
125
110
  }
111
+ /**
112
+ * Postgres `json` column descriptor — untyped raw JSON.
113
+ *
114
+ * For schema-typed JSON columns, use the per-library extension package
115
+ * (`@prisma-next/extension-arktype-json` ships `arktypeJson(schema)` for
116
+ * arktype). The schema-accepting `json(schema)` / `jsonb(schema)`
117
+ * overloads previously shipped from this module retired in Phase C of
118
+ * the codec-registry-unification project — see spec § AC-7.
119
+ */
126
120
  const jsonColumn = {
127
121
  codecId: PG_JSON_CODEC_ID,
128
122
  nativeType: "json"
129
123
  };
124
+ /**
125
+ * Postgres `jsonb` column descriptor — untyped raw JSONB. Same retirement
126
+ * note as {@link jsonColumn}.
127
+ */
130
128
  const jsonbColumn = {
131
129
  codecId: PG_JSONB_CODEC_ID,
132
130
  nativeType: "jsonb"
133
131
  };
134
- function createJsonTypeParams(schema) {
135
- const outputSchema = extractStandardSchemaOutputJsonSchema(schema);
136
- if (!outputSchema) throw new Error("JSON schema must expose ~standard.jsonSchema.output()");
137
- const expression = extractStandardSchemaTypeExpression(schema);
138
- if (expression) return {
139
- schemaJson: outputSchema,
140
- type: expression
141
- };
142
- return { schemaJson: outputSchema };
143
- }
144
- function createJsonColumnFactory(codecId, nativeType, staticDescriptor) {
145
- return (schema) => {
146
- if (!schema) return staticDescriptor;
147
- if (!isStandardSchemaLike(schema)) throw new Error(`${nativeType}(schema) expects a Standard Schema value`);
148
- return {
149
- codecId,
150
- nativeType,
151
- typeParams: createJsonTypeParams(schema)
152
- };
153
- };
154
- }
155
- const _json = createJsonColumnFactory(PG_JSON_CODEC_ID, "json", jsonColumn);
156
- const _jsonb = createJsonColumnFactory(PG_JSONB_CODEC_ID, "jsonb", jsonbColumn);
157
- function json(schema) {
158
- return _json(schema);
159
- }
160
- function jsonb(schema) {
161
- return _jsonb(schema);
162
- }
163
132
  function enumType(name, values) {
164
133
  return {
165
134
  codecId: PG_ENUM_CODEC_ID,
@@ -176,5 +145,5 @@ function enumColumn(typeName, nativeType) {
176
145
  }
177
146
 
178
147
  //#endregion
179
- export { bitColumn, boolColumn, charColumn, enumColumn, enumType, float4Column, float8Column, int2Column, int4Column, int8Column, intervalColumn, json, jsonColumn, jsonb, jsonbColumn, numericColumn, textColumn, timeColumn, timestampColumn, timestamptzColumn, timetzColumn, varbitColumn, varcharColumn };
148
+ export { bitColumn, boolColumn, byteaColumn, charColumn, enumColumn, enumType, float4Column, float8Column, int2Column, int4Column, int8Column, intervalColumn, jsonColumn, jsonbColumn, numericColumn, textColumn, timeColumn, timestampColumn, timestamptzColumn, timetzColumn, varbitColumn, varcharColumn };
180
149
  //# sourceMappingURL=column-types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.mjs","names":[],"sources":["../src/core/standard-schema.ts","../src/exports/column-types.ts"],"sourcesContent":["type UnknownRecord = Record<string, unknown>;\n\ntype StandardSchemaJsonSchemaField = {\n readonly output?: unknown;\n};\n\n/**\n * Runtime view of the Standard Schema protocol.\n * Reads `~standard.jsonSchema.output` for the serializable JSON Schema representation,\n * and `.expression` for an optional TypeScript type expression string (Arktype-specific).\n *\n * This differs from the compile-time `StandardSchemaLike` in `codec-types.ts`, which reads\n * `~standard.types.output` for TypeScript type narrowing in contract.d.ts.\n */\nexport type StandardSchemaLike = {\n readonly '~standard'?: {\n readonly version?: number;\n readonly jsonSchema?: StandardSchemaJsonSchemaField;\n };\n readonly expression?: unknown;\n};\n\nfunction isObjectLike(value: unknown): value is UnknownRecord {\n return (typeof value === 'object' || typeof value === 'function') && value !== null;\n}\n\nfunction resolveOutputJsonSchemaField(schema: StandardSchemaLike): unknown {\n const jsonSchema = schema['~standard']?.jsonSchema;\n if (!jsonSchema) {\n return undefined;\n }\n\n if (typeof jsonSchema.output === 'function') {\n return jsonSchema.output({\n target: 'draft-07',\n });\n }\n\n return jsonSchema.output;\n}\n\nexport function extractStandardSchemaOutputJsonSchema(\n schema: StandardSchemaLike,\n): UnknownRecord | undefined {\n const outputSchema = resolveOutputJsonSchemaField(schema);\n if (!isObjectLike(outputSchema)) {\n return undefined;\n }\n\n return outputSchema;\n}\n\nexport function extractStandardSchemaTypeExpression(\n schema: StandardSchemaLike,\n): string | undefined {\n const expression = schema.expression;\n if (typeof expression !== 'string') {\n return undefined;\n }\n\n const trimmedExpression = expression.trim();\n if (trimmedExpression.length === 0) {\n return undefined;\n }\n\n return trimmedExpression;\n}\n\nexport function isStandardSchemaLike(value: unknown): value is StandardSchemaLike {\n return isObjectLike(value) && isObjectLike((value as StandardSchemaLike)['~standard']);\n}\n","/**\n * Column type descriptors for Postgres adapter.\n *\n * These descriptors provide both codecId and nativeType for use in contract authoring.\n * They are derived from the same source of truth as codec definitions and manifests.\n */\n\nimport type { ColumnTypeDescriptor } from '@prisma-next/contract-authoring';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n PG_BIT_CODEC_ID,\n PG_BOOL_CODEC_ID,\n PG_ENUM_CODEC_ID,\n PG_FLOAT4_CODEC_ID,\n PG_FLOAT8_CODEC_ID,\n PG_INT2_CODEC_ID,\n PG_INT4_CODEC_ID,\n PG_INT8_CODEC_ID,\n PG_INTERVAL_CODEC_ID,\n PG_JSON_CODEC_ID,\n PG_JSONB_CODEC_ID,\n PG_NUMERIC_CODEC_ID,\n PG_TEXT_CODEC_ID,\n PG_TIME_CODEC_ID,\n PG_TIMESTAMP_CODEC_ID,\n PG_TIMESTAMPTZ_CODEC_ID,\n PG_TIMETZ_CODEC_ID,\n PG_VARBIT_CODEC_ID,\n SQL_CHAR_CODEC_ID,\n SQL_VARCHAR_CODEC_ID,\n} from '@prisma-next/target-postgres/codec-ids';\nimport {\n extractStandardSchemaOutputJsonSchema,\n extractStandardSchemaTypeExpression,\n isStandardSchemaLike,\n type StandardSchemaLike,\n} from '../core/standard-schema';\n\nexport const textColumn = {\n codecId: PG_TEXT_CODEC_ID,\n nativeType: 'text',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function charColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: SQL_CHAR_CODEC_ID,\n nativeType: 'character',\n typeParams: { length },\n } as const;\n}\n\nexport function varcharColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: SQL_VARCHAR_CODEC_ID,\n nativeType: 'character varying',\n typeParams: { length },\n } as const;\n}\n\nexport const int4Column = {\n codecId: PG_INT4_CODEC_ID,\n nativeType: 'int4',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const int2Column = {\n codecId: PG_INT2_CODEC_ID,\n nativeType: 'int2',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const int8Column = {\n codecId: PG_INT8_CODEC_ID,\n nativeType: 'int8',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const float4Column = {\n codecId: PG_FLOAT4_CODEC_ID,\n nativeType: 'float4',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const float8Column = {\n codecId: PG_FLOAT8_CODEC_ID,\n nativeType: 'float8',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function numericColumn(\n precision: number,\n scale?: number,\n): ColumnTypeDescriptor & {\n readonly typeParams: { readonly precision: number; readonly scale?: number };\n} {\n return {\n codecId: PG_NUMERIC_CODEC_ID,\n nativeType: 'numeric',\n typeParams: scale === undefined ? { precision } : { precision, scale },\n } as const;\n}\n\nexport const timestampColumn = {\n codecId: PG_TIMESTAMP_CODEC_ID,\n nativeType: 'timestamp',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const timestamptzColumn = {\n codecId: PG_TIMESTAMPTZ_CODEC_ID,\n nativeType: 'timestamptz',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function timeColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_TIME_CODEC_ID,\n nativeType: 'time',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\nexport function timetzColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_TIMETZ_CODEC_ID,\n nativeType: 'timetz',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\nexport const boolColumn = {\n codecId: PG_BOOL_CODEC_ID,\n nativeType: 'bool',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function bitColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: PG_BIT_CODEC_ID,\n nativeType: 'bit',\n typeParams: { length },\n } as const;\n}\n\nexport function varbitColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: PG_VARBIT_CODEC_ID,\n nativeType: 'bit varying',\n typeParams: { length },\n } as const;\n}\n\nexport function intervalColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_INTERVAL_CODEC_ID,\n nativeType: 'interval',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\nexport const jsonColumn = {\n codecId: PG_JSON_CODEC_ID,\n nativeType: 'json',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const jsonbColumn = {\n codecId: PG_JSONB_CODEC_ID,\n nativeType: 'jsonb',\n} as const satisfies ColumnTypeDescriptor;\n\ntype JsonSchemaTypeParams = {\n readonly schemaJson: Record<string, unknown>;\n readonly type?: string;\n};\n\nfunction createJsonTypeParams(schema: StandardSchemaLike): JsonSchemaTypeParams {\n const outputSchema = extractStandardSchemaOutputJsonSchema(schema);\n if (!outputSchema) {\n throw new Error('JSON schema must expose ~standard.jsonSchema.output()');\n }\n\n const expression = extractStandardSchemaTypeExpression(schema);\n if (expression) {\n return { schemaJson: outputSchema, type: expression };\n }\n\n return { schemaJson: outputSchema };\n}\n\nfunction createJsonColumnFactory(\n codecId: string,\n nativeType: string,\n staticDescriptor: ColumnTypeDescriptor,\n) {\n return (schema?: StandardSchemaLike): ColumnTypeDescriptor => {\n if (!schema) {\n return staticDescriptor;\n }\n\n if (!isStandardSchemaLike(schema)) {\n throw new Error(`${nativeType}(schema) expects a Standard Schema value`);\n }\n\n return {\n codecId,\n nativeType,\n typeParams: createJsonTypeParams(schema),\n };\n };\n}\n\nconst _json = createJsonColumnFactory(PG_JSON_CODEC_ID, 'json', jsonColumn);\nconst _jsonb = createJsonColumnFactory(PG_JSONB_CODEC_ID, 'jsonb', jsonbColumn);\n\nexport function json(schema?: StandardSchemaLike): ColumnTypeDescriptor {\n return _json(schema);\n}\n\nexport function jsonb(schema?: StandardSchemaLike): ColumnTypeDescriptor {\n return _jsonb(schema);\n}\n\nexport function enumType<const Values extends readonly string[]>(\n name: string,\n values: Values,\n): StorageTypeInstance & { readonly typeParams: { readonly values: Values } } {\n return {\n codecId: PG_ENUM_CODEC_ID,\n nativeType: name,\n typeParams: { values },\n } as const;\n}\n\nexport function enumColumn<TypeName extends string>(\n typeName: TypeName,\n nativeType: string,\n): ColumnTypeDescriptor & { readonly typeRef: TypeName } {\n return {\n codecId: PG_ENUM_CODEC_ID,\n nativeType,\n typeRef: typeName,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column-types.mjs","names":[],"sources":["../src/exports/column-types.ts"],"sourcesContent":["/**\n * Column type descriptors for Postgres adapter.\n *\n * These descriptors provide both codecId and nativeType for use in contract authoring.\n * They are derived from the same source of truth as codec definitions and manifests.\n */\n\nimport type { ColumnTypeDescriptor } from '@prisma-next/contract-authoring';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n PG_BIT_CODEC_ID,\n PG_BOOL_CODEC_ID,\n PG_BYTEA_CODEC_ID,\n PG_ENUM_CODEC_ID,\n PG_FLOAT4_CODEC_ID,\n PG_FLOAT8_CODEC_ID,\n PG_INT2_CODEC_ID,\n PG_INT4_CODEC_ID,\n PG_INT8_CODEC_ID,\n PG_INTERVAL_CODEC_ID,\n PG_JSON_CODEC_ID,\n PG_JSONB_CODEC_ID,\n PG_NUMERIC_CODEC_ID,\n PG_TEXT_CODEC_ID,\n PG_TIME_CODEC_ID,\n PG_TIMESTAMP_CODEC_ID,\n PG_TIMESTAMPTZ_CODEC_ID,\n PG_TIMETZ_CODEC_ID,\n PG_VARBIT_CODEC_ID,\n SQL_CHAR_CODEC_ID,\n SQL_VARCHAR_CODEC_ID,\n} from '@prisma-next/target-postgres/codec-ids';\n\nexport const textColumn = {\n codecId: PG_TEXT_CODEC_ID,\n nativeType: 'text',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function charColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: SQL_CHAR_CODEC_ID,\n nativeType: 'character',\n typeParams: { length },\n } as const;\n}\n\nexport function varcharColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: SQL_VARCHAR_CODEC_ID,\n nativeType: 'character varying',\n typeParams: { length },\n } as const;\n}\n\nexport const int4Column = {\n codecId: PG_INT4_CODEC_ID,\n nativeType: 'int4',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const int2Column = {\n codecId: PG_INT2_CODEC_ID,\n nativeType: 'int2',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const int8Column = {\n codecId: PG_INT8_CODEC_ID,\n nativeType: 'int8',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const float4Column = {\n codecId: PG_FLOAT4_CODEC_ID,\n nativeType: 'float4',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const float8Column = {\n codecId: PG_FLOAT8_CODEC_ID,\n nativeType: 'float8',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function numericColumn(\n precision: number,\n scale?: number,\n): ColumnTypeDescriptor & {\n readonly typeParams: { readonly precision: number; readonly scale?: number };\n} {\n return {\n codecId: PG_NUMERIC_CODEC_ID,\n nativeType: 'numeric',\n typeParams: scale === undefined ? { precision } : { precision, scale },\n } as const;\n}\n\nexport const timestampColumn = {\n codecId: PG_TIMESTAMP_CODEC_ID,\n nativeType: 'timestamp',\n} as const satisfies ColumnTypeDescriptor;\n\nexport const timestamptzColumn = {\n codecId: PG_TIMESTAMPTZ_CODEC_ID,\n nativeType: 'timestamptz',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function timeColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_TIME_CODEC_ID,\n nativeType: 'time',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\nexport function timetzColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_TIMETZ_CODEC_ID,\n nativeType: 'timetz',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\nexport const boolColumn = {\n codecId: PG_BOOL_CODEC_ID,\n nativeType: 'bool',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function bitColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: PG_BIT_CODEC_ID,\n nativeType: 'bit',\n typeParams: { length },\n } as const;\n}\n\nexport function varbitColumn(length: number): ColumnTypeDescriptor & {\n readonly typeParams: { readonly length: number };\n} {\n return {\n codecId: PG_VARBIT_CODEC_ID,\n nativeType: 'bit varying',\n typeParams: { length },\n } as const;\n}\n\n/**\n * Postgres `bytea` column descriptor — variable-length binary string.\n *\n * Round-trips as `Uint8Array` on the JS side. The pg wire-protocol text\n * encoding (`\\x` followed by hex-encoded bytes, canonical for Postgres ≥ 9.0)\n * and binary encoding are both handled by the underlying driver; the codec\n * only normalizes the JS-side representation to a plain `Uint8Array` view.\n */\nexport const byteaColumn = {\n codecId: PG_BYTEA_CODEC_ID,\n nativeType: 'bytea',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function intervalColumn(precision?: number): ColumnTypeDescriptor & {\n readonly typeParams?: { readonly precision: number };\n} {\n return {\n codecId: PG_INTERVAL_CODEC_ID,\n nativeType: 'interval',\n ...(precision === undefined ? {} : { typeParams: { precision } }),\n } as const;\n}\n\n/**\n * Postgres `json` column descriptor — untyped raw JSON.\n *\n * For schema-typed JSON columns, use the per-library extension package\n * (`@prisma-next/extension-arktype-json` ships `arktypeJson(schema)` for\n * arktype). The schema-accepting `json(schema)` / `jsonb(schema)`\n * overloads previously shipped from this module retired in Phase C of\n * the codec-registry-unification project — see spec § AC-7.\n */\nexport const jsonColumn = {\n codecId: PG_JSON_CODEC_ID,\n nativeType: 'json',\n} as const satisfies ColumnTypeDescriptor;\n\n/**\n * Postgres `jsonb` column descriptor — untyped raw JSONB. Same retirement\n * note as {@link jsonColumn}.\n */\nexport const jsonbColumn = {\n codecId: PG_JSONB_CODEC_ID,\n nativeType: 'jsonb',\n} as const satisfies ColumnTypeDescriptor;\n\nexport function enumType<const Values extends readonly string[]>(\n name: string,\n values: Values,\n): StorageTypeInstance & { readonly typeParams: { readonly values: Values } } {\n return {\n codecId: PG_ENUM_CODEC_ID,\n nativeType: name,\n typeParams: { values },\n } as const;\n}\n\nexport function enumColumn<TypeName extends string>(\n typeName: TypeName,\n nativeType: string,\n): ColumnTypeDescriptor & { readonly typeRef: TypeName } {\n return {\n codecId: PG_ENUM_CODEC_ID,\n nativeType,\n typeRef: typeName,\n };\n}\n"],"mappings":";;;AAiCA,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,SAAgB,WAAW,QAEzB;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,EAAE,QAAQ;EACvB;;AAGH,SAAgB,cAAc,QAE5B;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,EAAE,QAAQ;EACvB;;AAGH,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,eAAe;CAC1B,SAAS;CACT,YAAY;CACb;AAED,MAAa,eAAe;CAC1B,SAAS;CACT,YAAY;CACb;AAED,SAAgB,cACd,WACA,OAGA;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,UAAU,SAAY,EAAE,WAAW,GAAG;GAAE;GAAW;GAAO;EACvE;;AAGH,MAAa,kBAAkB;CAC7B,SAAS;CACT,YAAY;CACb;AAED,MAAa,oBAAoB;CAC/B,SAAS;CACT,YAAY;CACb;AAED,SAAgB,WAAW,WAEzB;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,GAAI,cAAc,SAAY,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE;EACjE;;AAGH,SAAgB,aAAa,WAE3B;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,GAAI,cAAc,SAAY,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE;EACjE;;AAGH,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,SAAgB,UAAU,QAExB;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,EAAE,QAAQ;EACvB;;AAGH,SAAgB,aAAa,QAE3B;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,EAAE,QAAQ;EACvB;;;;;;;;;;AAWH,MAAa,cAAc;CACzB,SAAS;CACT,YAAY;CACb;AAED,SAAgB,eAAe,WAE7B;AACA,QAAO;EACL,SAAS;EACT,YAAY;EACZ,GAAI,cAAc,SAAY,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE;EACjE;;;;;;;;;;;AAYH,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;;;;;AAMD,MAAa,cAAc;CACzB,SAAS;CACT,YAAY;CACb;AAED,SAAgB,SACd,MACA,QAC4E;AAC5E,QAAO;EACL,SAAS;EACT,YAAY;EACZ,YAAY,EAAE,QAAQ;EACvB;;AAGH,SAAgB,WACd,UACA,YACuD;AACvD,QAAO;EACL,SAAS;EACT;EACA,SAAS;EACV"}
@@ -1,10 +1,83 @@
1
+ import { AnyQueryAst, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
1
2
  import { SqlEscapeError, escapeLiteral, qualifyName, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
2
- import { parsePostgresDefault } from "@prisma-next/target-postgres/default-normalizer";
3
- import { normalizeSchemaNativeType } from "@prisma-next/target-postgres/native-type-normalizer";
3
+ import { parsePostgresDefault, parsePostgresDefault as parsePostgresDefault$1 } from "@prisma-next/target-postgres/default-normalizer";
4
+ import { normalizeSchemaNativeType, normalizeSchemaNativeType as normalizeSchemaNativeType$1 } from "@prisma-next/target-postgres/native-type-normalizer";
4
5
  import { SqlControlAdapterDescriptor } from "@prisma-next/family-sql/control";
6
+ import { ControlDriverInstance } from "@prisma-next/framework-components/control";
7
+ import { ContractMarkerRecord } from "@prisma-next/contract/types";
8
+ import { CodecLookup } from "@prisma-next/framework-components/codec";
9
+ import { SqlControlAdapter } from "@prisma-next/family-sql/control-adapter";
10
+ import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
5
11
 
12
+ //#region src/core/control-adapter.d.ts
13
+ /**
14
+ * Postgres control plane adapter for control-plane operations like introspection.
15
+ * Provides target-specific implementations for control-plane domain actions.
16
+ */
17
+ declare class PostgresControlAdapter implements SqlControlAdapter<'postgres'> {
18
+ readonly familyId: "sql";
19
+ readonly targetId: "postgres";
20
+ private readonly codecLookup;
21
+ /**
22
+ * @param codecLookup - Codec lookup used by the SQL renderer to resolve
23
+ * per-codec metadata at lower-time. Defaults to a Postgres-builtins-only
24
+ * lookup when omitted. Stack-aware callers
25
+ * (`SqlControlAdapterDescriptor.create(stack)`) supply
26
+ * `stack.codecLookup` so extension codecs are visible to the renderer.
27
+ */
28
+ constructor(codecLookup?: CodecLookup);
29
+ /**
30
+ * Target-specific normalizer for raw Postgres default expressions.
31
+ * Used by schema verification to normalize raw defaults before comparison.
32
+ */
33
+ readonly normalizeDefault: typeof parsePostgresDefault$1;
34
+ /**
35
+ * Target-specific normalizer for Postgres schema native type names.
36
+ * Used by schema verification to normalize introspected type names
37
+ * before comparison with contract native types.
38
+ */
39
+ readonly normalizeNativeType: typeof normalizeSchemaNativeType$1;
40
+ /**
41
+ * Lower a SQL query AST into a Postgres-flavored `{ sql, params }` payload.
42
+ *
43
+ * Delegates to the shared `renderLoweredSql` renderer so the control adapter
44
+ * emits byte-identical SQL to `PostgresAdapterImpl.lower()` for the same AST
45
+ * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)
46
+ * without instantiating the runtime adapter.
47
+ */
48
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;
49
+ /**
50
+ * Reads the contract marker from `prisma_contract.marker`. Probes
51
+ * `information_schema.tables` first so a fresh database (where the
52
+ * `prisma_contract` schema doesn't yet exist) returns `null` instead of a
53
+ * "relation does not exist" error — some Postgres wire-protocol clients
54
+ * (e.g. PGlite's TCP proxy) don't fully recover from extended-protocol
55
+ * parse errors, so we probe before reading.
56
+ */
57
+ readMarker(driver: ControlDriverInstance<'sql', 'postgres'>): Promise<ContractMarkerRecord | null>;
58
+ /**
59
+ * Introspects a Postgres database schema and returns a raw SqlSchemaIR.
60
+ *
61
+ * This is a pure schema discovery operation that queries the Postgres catalog
62
+ * and returns the schema structure without type mapping or contract enrichment.
63
+ * Type mapping and enrichment are handled separately by enrichment helpers.
64
+ *
65
+ * Uses batched queries to minimize database round trips (7 queries instead of 5T+3).
66
+ *
67
+ * @param driver - ControlDriverInstance<'sql', 'postgres'> instance for executing queries
68
+ * @param contract - Optional contract for contract-guided introspection (filtering, optimization)
69
+ * @param schema - Schema name to introspect (defaults to 'public')
70
+ * @returns Promise resolving to SqlSchemaIR representing the live database schema
71
+ */
72
+ introspect(driver: ControlDriverInstance<'sql', 'postgres'>, _contract?: unknown, schema?: string): Promise<SqlSchemaIR>;
73
+ /**
74
+ * Gets the Postgres version from the database.
75
+ */
76
+ private getPostgresVersion;
77
+ }
78
+ //#endregion
6
79
  //#region src/exports/control.d.ts
7
80
  declare const postgresAdapterDescriptor: SqlControlAdapterDescriptor<'postgres'>;
8
81
  //#endregion
9
- export { SqlEscapeError, postgresAdapterDescriptor as default, escapeLiteral, normalizeSchemaNativeType, parsePostgresDefault, qualifyName, quoteIdentifier };
82
+ export { PostgresControlAdapter, SqlEscapeError, postgresAdapterDescriptor as default, escapeLiteral, normalizeSchemaNativeType, parsePostgresDefault, qualifyName, quoteIdentifier };
10
83
  //# sourceMappingURL=control.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/exports/control.ts"],"sourcesContent":[],"mappings":";;;;;;cAgBM,2BAA2B"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;AAiCa,cAAA,sBAAA,YAAkC,iBAAX,CAAA,UAAA,CAAA,CAAA;EAaR,SAAA,QAAA,EAAA,KAAA;EAQD,SAAA,QAAA,EAAA,UAAA;EAOG,iBAAA,WAAA;EAUjB;;;;;;;EAwEA,WAAA,CAAA,WAAA,CAAA,EAjGe,WAiGf;EAAR;;;;oCAzFsB;;AC/CqB;;;;uCDsDlB;;;;;;;;;aAUjB,sBAAsB,0BAA0B;;;;;;;;;qBAajD,2CACP,QAAQ;;;;;;;;;;;;;;;qBAuDD,iFAGP,QAAQ;;;;;;;;cC/HP,2BAA2B"}
package/dist/control.mjs CHANGED
@@ -1,9 +1,11 @@
1
- import { t as renderLoweredSql } from "./sql-renderer-pEaSP82_.mjs";
2
- import { r as pgEnumControlHooks, t as postgresAdapterDescriptorMeta } from "./descriptor-meta-RTDzyrae.mjs";
1
+ import { n as createPostgresBuiltinCodecLookup, t as renderLoweredSql } from "./sql-renderer-DLwYpnxz.mjs";
2
+ import { r as pgEnumControlHooks, t as postgresAdapterDescriptorMeta } from "./descriptor-meta-CpEka_0t.mjs";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  import { SqlEscapeError, escapeLiteral, qualifyName, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
5
+ import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
5
6
  import { parsePostgresDefault, parsePostgresDefault as parsePostgresDefault$1 } from "@prisma-next/target-postgres/default-normalizer";
6
7
  import { normalizeSchemaNativeType, normalizeSchemaNativeType as normalizeSchemaNativeType$1 } from "@prisma-next/target-postgres/native-type-normalizer";
8
+ import { timestampNowControlDescriptor } from "@prisma-next/family-sql/control";
7
9
  import { builtinGeneratorRegistryMetadata, resolveBuiltinGeneratedColumnDescriptor } from "@prisma-next/ids";
8
10
 
9
11
  //#region src/core/control-adapter.ts
@@ -14,6 +16,17 @@ import { builtinGeneratorRegistryMetadata, resolveBuiltinGeneratedColumnDescript
14
16
  var PostgresControlAdapter = class {
15
17
  familyId = "sql";
16
18
  targetId = "postgres";
19
+ codecLookup;
20
+ /**
21
+ * @param codecLookup - Codec lookup used by the SQL renderer to resolve
22
+ * per-codec metadata at lower-time. Defaults to a Postgres-builtins-only
23
+ * lookup when omitted. Stack-aware callers
24
+ * (`SqlControlAdapterDescriptor.create(stack)`) supply
25
+ * `stack.codecLookup` so extension codecs are visible to the renderer.
26
+ */
27
+ constructor(codecLookup) {
28
+ this.codecLookup = codecLookup ?? createPostgresBuiltinCodecLookup();
29
+ }
17
30
  /**
18
31
  * Target-specific normalizer for raw Postgres default expressions.
19
32
  * Used by schema verification to normalize raw defaults before comparison.
@@ -34,7 +47,33 @@ var PostgresControlAdapter = class {
34
47
  * without instantiating the runtime adapter.
35
48
  */
36
49
  lower(ast, context) {
37
- return renderLoweredSql(ast, context.contract);
50
+ return renderLoweredSql(ast, context.contract, this.codecLookup);
51
+ }
52
+ /**
53
+ * Reads the contract marker from `prisma_contract.marker`. Probes
54
+ * `information_schema.tables` first so a fresh database (where the
55
+ * `prisma_contract` schema doesn't yet exist) returns `null` instead of a
56
+ * "relation does not exist" error — some Postgres wire-protocol clients
57
+ * (e.g. PGlite's TCP proxy) don't fully recover from extended-protocol
58
+ * parse errors, so we probe before reading.
59
+ */
60
+ async readMarker(driver) {
61
+ if ((await driver.query(`select 1
62
+ from information_schema.tables
63
+ where table_schema = $1 and table_name = $2`, ["prisma_contract", "marker"])).rows.length === 0) return null;
64
+ const row = (await driver.query(`select
65
+ core_hash,
66
+ profile_hash,
67
+ contract_json,
68
+ canonical_version,
69
+ updated_at,
70
+ app_tag,
71
+ meta,
72
+ invariants
73
+ from prisma_contract.marker
74
+ where id = $1`, [1])).rows[0];
75
+ if (!row) return null;
76
+ return parseContractMarkerRow(row);
38
77
  }
39
78
  /**
40
79
  * Introspects a Postgres database schema and returns a raw SqlSchemaIR.
@@ -566,7 +605,7 @@ function createPostgresDefaultFunctionRegistry() {
566
605
  return new Map(postgresDefaultFunctionRegistryEntries);
567
606
  }
568
607
  function createPostgresMutationDefaultGeneratorDescriptors() {
569
- return builtinGeneratorRegistryMetadata.map(({ id, applicableCodecIds }) => ({
608
+ return [...builtinGeneratorRegistryMetadata.map(({ id, applicableCodecIds }) => ({
570
609
  id,
571
610
  applicableCodecIds,
572
611
  resolveGeneratedColumnDescriptor: ({ generated }) => {
@@ -582,7 +621,7 @@ function createPostgresMutationDefaultGeneratorDescriptors() {
582
621
  ...descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}
583
622
  };
584
623
  }
585
- }));
624
+ })), timestampNowControlDescriptor()];
586
625
  }
587
626
  function createPostgresScalarTypeDescriptors() {
588
627
  return new Map(postgresScalarTypeDescriptors);
@@ -597,12 +636,12 @@ const postgresAdapterDescriptor = {
597
636
  defaultFunctionRegistry: createPostgresDefaultFunctionRegistry(),
598
637
  generatorDescriptors: createPostgresMutationDefaultGeneratorDescriptors()
599
638
  },
600
- create(_stack) {
601
- return new PostgresControlAdapter();
639
+ create(stack) {
640
+ return new PostgresControlAdapter(stack.codecLookup);
602
641
  }
603
642
  };
604
643
  var control_default = postgresAdapterDescriptor;
605
644
 
606
645
  //#endregion
607
- export { SqlEscapeError, control_default as default, escapeLiteral, normalizeSchemaNativeType, parsePostgresDefault, qualifyName, quoteIdentifier };
646
+ export { PostgresControlAdapter, SqlEscapeError, control_default as default, escapeLiteral, normalizeSchemaNativeType, parsePostgresDefault, qualifyName, quoteIdentifier };
608
647
  //# sourceMappingURL=control.mjs.map