@prisma-next/sql-contract 0.3.0-dev.135 → 0.3.0-dev.146

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,5 +1,5 @@
1
- import { C as SqlModelStorage, D as StorageColumn, E as SqlStorage, M as UniqueConstraint, O as StorageTable, S as SqlModelFieldStorage, f as Index, l as ForeignKey, m as PrimaryKey, u as ForeignKeyOptions, x as SqlContract } from "./types-D6K16_9R.mjs";
2
- import { ExecutionHashBase, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
1
+ import { C as SqlModelStorage, D as StorageTable, E as StorageColumn, S as SqlModelFieldStorage, d as ForeignKeyOptions, h as PrimaryKey, j as UniqueConstraint, p as Index, u as ForeignKey } from "./types-D6o_FjCJ.mjs";
2
+ import { ScalarFieldType } from "@prisma-next/contract/types";
3
3
 
4
4
  //#region src/factories.d.ts
5
5
  declare function col(nativeType: string, codecId: string, nullable?: boolean): StorageColumn;
@@ -19,26 +19,11 @@ declare function table(columns: Record<string, StorageColumn>, opts?: {
19
19
  declare function model(tableName: string, fields: Record<string, SqlModelFieldStorage>, relations?: Record<string, unknown>): {
20
20
  storage: SqlModelStorage;
21
21
  fields: Record<string, {
22
- nullable: boolean;
23
- codecId?: string;
22
+ readonly nullable: boolean;
23
+ readonly type: ScalarFieldType;
24
24
  }>;
25
25
  relations: Record<string, unknown>;
26
26
  };
27
- declare function storage(tables: Record<string, StorageTable>): SqlStorage;
28
- declare function contract<TStorageHash extends StorageHashBase<string> = StorageHashBase<string>, TExecutionHash extends ExecutionHashBase<string> = ExecutionHashBase<string>, TProfileHash extends ProfileHashBase<string> = ProfileHashBase<string>>(opts: {
29
- target: string;
30
- storageHash: TStorageHash;
31
- executionHash?: TExecutionHash;
32
- storage: SqlStorage;
33
- models?: Record<string, unknown>;
34
- schemaVersion?: '1';
35
- targetFamily?: 'sql';
36
- profileHash?: TProfileHash;
37
- capabilities?: Record<string, Record<string, boolean>>;
38
- extensionPacks?: Record<string, unknown>;
39
- meta?: Record<string, unknown>;
40
- sources?: Record<string, unknown>;
41
- }): SqlContract<SqlStorage, Record<string, unknown>, TStorageHash, TExecutionHash, TProfileHash>;
42
27
  //#endregion
43
- export { col, contract, fk, index, model, pk, storage, table, unique };
28
+ export { col, fk, index, model, pk, table, unique };
44
29
  //# sourceMappingURL=factories.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factories.d.mts","names":[],"sources":["../src/factories.ts"],"sourcesContent":[],"mappings":";;;;iBAqBgB,GAAA,2DAA4D;iBAQ5D,EAAA,iCAAmC;AARnC,iBAcA,MAAA,CAd4D,GAAA,OAAa,EAAA,SAAA,MAAA,EAAA,CAAA,EAclC,gBAdkC;AAQzE,iBAYA,KAAA,CAZmC,GAAU,OAAA,EAAA,SAAA,MAAA,EAAA,CAAA,EAYP,KAZO;AAM7C,iBAYA,EAAA,CAZuC,OAAA,EAAA,SAAgB,MAAA,EAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,MAAA,EAAA,EAAA,IAiCvE,CAjCuE,EAgB9D,iBAhB8D,GAAA;EAMvD,UAAK,CAAA,EAAA,OAAiC;EAMtC,KAAE,CAAA,EAAA,OAAA;AAqBlB,CAAA,CAAA,EAhBG,UAgBkB;AACK,iBADV,KAAA,CACU,OAAA,EAAf,MAAe,CAAA,MAAA,EAAA,aAAA,CAAA,EAAA,IAKP,CALO,EAAA;EAAf,EAAA,CAAA,EAEF,UAFE;EAEF,OAAA,CAAA,EAAA,SACc,gBADd,EAAA;EACc,OAAA,CAAA,EAAA,SACA,KADA,EAAA;EACA,GAAA,CAAA,EAAA,SACJ,UADI,EAAA;CACJ,CAAA,EAEhB,YAFgB;AAEhB,iBAUa,KAAA,CAVb,SAAA,EAAA,MAAA,EAAA,MAAA,EAYO,MAZP,CAAA,MAAA,EAYsB,oBAZtB,CAAA,EAAA,SAAA,CAAA,EAaU,MAbV,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA;EAAY,OAAA,EAeJ,eAfI;EAUC,MAAA,EAMN,MANW,CAAA,MAAA,EAAA;IAEI,QAAA,EAAA,OAAA;IAAf,OAAA,CAAA,EAAA,MAAA;EACG,CAAA,CAAA;EAEF,SAAA,EAEE,MAFF,CAAA,MAAA,EAAA,OAAA,CAAA;CACD;AACG,iBAmBG,OAAA,CAnBH,MAAA,EAmBmB,MAnBnB,CAAA,MAAA,EAmBkC,YAnBlC,CAAA,CAAA,EAmBkD,UAnBlD;AAAM,iBAuBH,QAvBG,CAAA,qBAwBI,eAxBJ,CAAA,MAAA,CAAA,GAwB8B,eAxB9B,CAAA,MAAA,CAAA,EAAA,uBAyBM,iBAzBN,CAAA,MAAA,CAAA,GAyBkC,iBAzBlC,CAAA,MAAA,CAAA,EAAA,qBA0BI,eA1BJ,CAAA,MAAA,CAAA,GA0B8B,eA1B9B,CAAA,MAAA,CAAA,CAAA,CAAA,IAAA,EAAA;EAmBH,MAAA,EAAA,MAAO;EAAwB,WAAA,EAUhC,YAVgC;EAAf,aAAA,CAAA,EAWd,cAXc;EAA+B,OAAA,EAYpD,UAZoD;EAAU,MAAA,CAAA,EAa9D,MAb8D,CAAA,MAAA,EAAA,OAAA,CAAA;EAIzD,aAAQ,CAAA,EAAA,GAAA;EACD,YAAA,CAAA,EAAA,KAAA;EAA0B,WAAA,CAAA,EAWjC,YAXiC;EACxB,YAAA,CAAA,EAWR,MAXQ,CAAA,MAAA,EAWO,MAXP,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAA4B,cAAA,CAAA,EAYlC,MAZkC,CAAA,MAAA,EAAA,OAAA,CAAA;EAC9B,IAAA,CAAA,EAYd,MAZc,CAAA,MAAA,EAAA,OAAA,CAAA;EAA0B,OAAA,CAAA,EAarC,MAbqC,CAAA,MAAA,EAAA,OAAA,CAAA;CAGlC,CAAA,EAWX,WAXW,CAWC,UAXD,EAWa,MAXb,CAAA,MAAA,EAAA,OAAA,CAAA,EAWsC,YAXtC,EAWoD,cAXpD,EAWoE,YAXpE,CAAA"}
1
+ {"version":3,"file":"factories.d.mts","names":[],"sources":["../src/factories.ts"],"sourcesContent":[],"mappings":";;;;iBAegB,GAAA,2DAA4D;iBAQ5D,EAAA,iCAAmC;AARnC,iBAcA,MAAA,CAd4D,GAAA,OAAa,EAAA,SAAA,MAAA,EAAA,CAAA,EAclC,gBAdkC;AAQzE,iBAYA,KAAA,CAZmC,GAAU,OAAA,EAAA,SAAA,MAAA,EAAA,CAAA,EAYP,KAZO;AAM7C,iBAYA,EAAA,CAZuC,OAAA,EAAA,SAAgB,MAAA,EAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,MAAA,EAAA,EAAA,IAiCvE,CAjCuE,EAgB9D,iBAhB8D,GAAA;EAMvD,UAAK,CAAA,EAAA,OAAiC;EAMtC,KAAE,CAAA,EAAA,OAAA;AAqBlB,CAAA,CAAA,EAhBG,UAgBkB;AACK,iBADV,KAAA,CACU,OAAA,EAAf,MAAe,CAAA,MAAA,EAAA,aAAA,CAAA,EAAA,IAKP,CALO,EAAA;EAAf,EAAA,CAAA,EAEF,UAFE;EAEF,OAAA,CAAA,EAAA,SACc,gBADd,EAAA;EACc,OAAA,CAAA,EAAA,SACA,KADA,EAAA;EACA,GAAA,CAAA,EAAA,SACJ,UADI,EAAA;CACJ,CAAA,EAEhB,YAFgB;AAEhB,iBAUa,KAAA,CAVb,SAAA,EAAA,MAAA,EAAA,MAAA,EAYO,MAZP,CAAA,MAAA,EAYsB,oBAZtB,CAAA,EAAA,SAAA,CAAA,EAaU,MAbV,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAAA;EAAY,OAAA,EAeJ,eAfI;EAUC,MAAA,EAMN,MANW,CAAA,MAAA,EAAA;IAEI,SAAA,QAAA,EAAA,OAAA;IAAf,SAAA,IAAA,EAI4D,eAJ5D;EACG,CAAA,CAAA;EAEF,SAAA,EAEE,MAFF,CAAA,MAAA,EAAA,OAAA,CAAA;CAC2D"}
@@ -50,32 +50,15 @@ function model(tableName, fields, relations = {}) {
50
50
  },
51
51
  fields: Object.fromEntries(Object.entries(fields).map(([name, field]) => [name, {
52
52
  nullable: field.nullable ?? false,
53
- ...field.codecId !== void 0 ? { codecId: field.codecId } : {}
53
+ type: {
54
+ kind: "scalar",
55
+ codecId: field.codecId ?? "core/unknown@1"
56
+ }
54
57
  }])),
55
58
  relations
56
59
  };
57
60
  }
58
- function storage(tables) {
59
- return { tables };
60
- }
61
- function contract(opts) {
62
- return {
63
- schemaVersion: opts.schemaVersion ?? "1",
64
- target: opts.target,
65
- targetFamily: opts.targetFamily ?? "sql",
66
- storageHash: opts.storageHash,
67
- ...opts.executionHash !== void 0 && { executionHash: opts.executionHash },
68
- storage: opts.storage,
69
- models: opts.models ?? {},
70
- roots: {},
71
- ...opts.profileHash !== void 0 && { profileHash: opts.profileHash },
72
- ...opts.capabilities !== void 0 && { capabilities: opts.capabilities },
73
- ...opts.extensionPacks !== void 0 && { extensionPacks: opts.extensionPacks },
74
- ...opts.meta !== void 0 && { meta: opts.meta },
75
- ...opts.sources !== void 0 && { sources: opts.sources }
76
- };
77
- }
78
61
 
79
62
  //#endregion
80
- export { col, contract, fk, index, model, pk, storage, table, unique };
63
+ export { col, fk, index, model, pk, table, unique };
81
64
  //# sourceMappingURL=factories.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"factories.mjs","names":[],"sources":["../src/factories.ts"],"sourcesContent":["import type {\n ExecutionHashBase,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\nimport type {\n ForeignKey,\n ForeignKeyOptions,\n ForeignKeyReferences,\n Index,\n PrimaryKey,\n SqlContract,\n SqlModelFieldStorage,\n SqlModelStorage,\n SqlStorage,\n StorageColumn,\n StorageTable,\n UniqueConstraint,\n} from './types';\nimport { applyFkDefaults } from './types';\n\nexport function col(nativeType: string, codecId: string, nullable = false): StorageColumn {\n return {\n nativeType,\n codecId,\n nullable,\n };\n}\n\nexport function pk(...columns: readonly string[]): PrimaryKey {\n return {\n columns,\n };\n}\n\nexport function unique(...columns: readonly string[]): UniqueConstraint {\n return {\n columns,\n };\n}\n\nexport function index(...columns: readonly string[]): Index {\n return {\n columns,\n };\n}\n\nexport function fk(\n columns: readonly string[],\n refTable: string,\n refColumns: readonly string[],\n opts?: ForeignKeyOptions & { constraint?: boolean; index?: boolean },\n): ForeignKey {\n const references: ForeignKeyReferences = {\n table: refTable,\n columns: refColumns,\n };\n\n return {\n columns,\n references,\n ...(opts?.name !== undefined && { name: opts.name }),\n ...(opts?.onDelete !== undefined && { onDelete: opts.onDelete }),\n ...(opts?.onUpdate !== undefined && { onUpdate: opts.onUpdate }),\n ...applyFkDefaults({ constraint: opts?.constraint, index: opts?.index }),\n };\n}\n\nexport function table(\n columns: Record<string, StorageColumn>,\n opts?: {\n pk?: PrimaryKey;\n uniques?: readonly UniqueConstraint[];\n indexes?: readonly Index[];\n fks?: readonly ForeignKey[];\n },\n): StorageTable {\n return {\n columns,\n ...(opts?.pk !== undefined && { primaryKey: opts.pk }),\n uniques: opts?.uniques ?? [],\n indexes: opts?.indexes ?? [],\n foreignKeys: opts?.fks ?? [],\n };\n}\n\nexport function model(\n tableName: string,\n fields: Record<string, SqlModelFieldStorage>,\n relations: Record<string, unknown> = {},\n): {\n storage: SqlModelStorage;\n fields: Record<string, { nullable: boolean; codecId?: string }>;\n relations: Record<string, unknown>;\n} {\n const storage: SqlModelStorage = { table: tableName, fields };\n const domainFields = Object.fromEntries(\n Object.entries(fields).map(([name, field]) => [\n name,\n {\n nullable: field.nullable ?? false,\n ...(field.codecId !== undefined ? { codecId: field.codecId } : {}),\n },\n ]),\n ) as Record<string, { nullable: boolean; codecId?: string }>;\n return {\n storage,\n fields: domainFields,\n relations,\n };\n}\n\nexport function storage(tables: Record<string, StorageTable>): SqlStorage {\n return { tables };\n}\n\nexport function contract<\n TStorageHash extends StorageHashBase<string> = StorageHashBase<string>,\n TExecutionHash extends ExecutionHashBase<string> = ExecutionHashBase<string>,\n TProfileHash extends ProfileHashBase<string> = ProfileHashBase<string>,\n>(opts: {\n target: string;\n storageHash: TStorageHash;\n executionHash?: TExecutionHash;\n storage: SqlStorage;\n models?: Record<string, unknown>;\n schemaVersion?: '1';\n targetFamily?: 'sql';\n profileHash?: TProfileHash;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n sources?: Record<string, unknown>;\n}): SqlContract<SqlStorage, Record<string, unknown>, TStorageHash, TExecutionHash, TProfileHash> {\n return {\n schemaVersion: opts.schemaVersion ?? '1',\n target: opts.target,\n targetFamily: opts.targetFamily ?? 'sql',\n storageHash: opts.storageHash,\n ...(opts.executionHash !== undefined && { executionHash: opts.executionHash }),\n storage: opts.storage,\n models: opts.models ?? {},\n roots: {},\n ...(opts.profileHash !== undefined && { profileHash: opts.profileHash }),\n ...(opts.capabilities !== undefined && { capabilities: opts.capabilities }),\n ...(opts.extensionPacks !== undefined && { extensionPacks: opts.extensionPacks }),\n ...(opts.meta !== undefined && { meta: opts.meta }),\n ...(opts.sources !== undefined && { sources: opts.sources as Record<string, unknown> }),\n } as SqlContract<SqlStorage, Record<string, unknown>, TStorageHash, TExecutionHash, TProfileHash>;\n}\n"],"mappings":";;;AAqBA,SAAgB,IAAI,YAAoB,SAAiB,WAAW,OAAsB;AACxF,QAAO;EACL;EACA;EACA;EACD;;AAGH,SAAgB,GAAG,GAAG,SAAwC;AAC5D,QAAO,EACL,SACD;;AAGH,SAAgB,OAAO,GAAG,SAA8C;AACtE,QAAO,EACL,SACD;;AAGH,SAAgB,MAAM,GAAG,SAAmC;AAC1D,QAAO,EACL,SACD;;AAGH,SAAgB,GACd,SACA,UACA,YACA,MACY;AAMZ,QAAO;EACL;EACA,YAPuC;GACvC,OAAO;GACP,SAAS;GACV;EAKC,GAAI,MAAM,SAAS,UAAa,EAAE,MAAM,KAAK,MAAM;EACnD,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,KAAK,UAAU;EAC/D,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,KAAK,UAAU;EAC/D,GAAG,gBAAgB;GAAE,YAAY,MAAM;GAAY,OAAO,MAAM;GAAO,CAAC;EACzE;;AAGH,SAAgB,MACd,SACA,MAMc;AACd,QAAO;EACL;EACA,GAAI,MAAM,OAAO,UAAa,EAAE,YAAY,KAAK,IAAI;EACrD,SAAS,MAAM,WAAW,EAAE;EAC5B,SAAS,MAAM,WAAW,EAAE;EAC5B,aAAa,MAAM,OAAO,EAAE;EAC7B;;AAGH,SAAgB,MACd,WACA,QACA,YAAqC,EAAE,EAKvC;AAWA,QAAO;EACL,SAX+B;GAAE,OAAO;GAAW;GAAQ;EAY3D,QAXmB,OAAO,YAC1B,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,MAAM,WAAW,CAC5C,MACA;GACE,UAAU,MAAM,YAAY;GAC5B,GAAI,MAAM,YAAY,SAAY,EAAE,SAAS,MAAM,SAAS,GAAG,EAAE;GAClE,CACF,CAAC,CACH;EAIC;EACD;;AAGH,SAAgB,QAAQ,QAAkD;AACxE,QAAO,EAAE,QAAQ;;AAGnB,SAAgB,SAId,MAa+F;AAC/F,QAAO;EACL,eAAe,KAAK,iBAAiB;EACrC,QAAQ,KAAK;EACb,cAAc,KAAK,gBAAgB;EACnC,aAAa,KAAK;EAClB,GAAI,KAAK,kBAAkB,UAAa,EAAE,eAAe,KAAK,eAAe;EAC7E,SAAS,KAAK;EACd,QAAQ,KAAK,UAAU,EAAE;EACzB,OAAO,EAAE;EACT,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,aAAa;EACvE,GAAI,KAAK,iBAAiB,UAAa,EAAE,cAAc,KAAK,cAAc;EAC1E,GAAI,KAAK,mBAAmB,UAAa,EAAE,gBAAgB,KAAK,gBAAgB;EAChF,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,MAAM;EAClD,GAAI,KAAK,YAAY,UAAa,EAAE,SAAS,KAAK,SAAoC;EACvF"}
1
+ {"version":3,"file":"factories.mjs","names":[],"sources":["../src/factories.ts"],"sourcesContent":["import type { ScalarFieldType } from '@prisma-next/contract/types';\nimport type {\n ForeignKey,\n ForeignKeyOptions,\n ForeignKeyReferences,\n Index,\n PrimaryKey,\n SqlModelFieldStorage,\n SqlModelStorage,\n StorageColumn,\n StorageTable,\n UniqueConstraint,\n} from './types';\nimport { applyFkDefaults } from './types';\n\nexport function col(nativeType: string, codecId: string, nullable = false): StorageColumn {\n return {\n nativeType,\n codecId,\n nullable,\n };\n}\n\nexport function pk(...columns: readonly string[]): PrimaryKey {\n return {\n columns,\n };\n}\n\nexport function unique(...columns: readonly string[]): UniqueConstraint {\n return {\n columns,\n };\n}\n\nexport function index(...columns: readonly string[]): Index {\n return {\n columns,\n };\n}\n\nexport function fk(\n columns: readonly string[],\n refTable: string,\n refColumns: readonly string[],\n opts?: ForeignKeyOptions & { constraint?: boolean; index?: boolean },\n): ForeignKey {\n const references: ForeignKeyReferences = {\n table: refTable,\n columns: refColumns,\n };\n\n return {\n columns,\n references,\n ...(opts?.name !== undefined && { name: opts.name }),\n ...(opts?.onDelete !== undefined && { onDelete: opts.onDelete }),\n ...(opts?.onUpdate !== undefined && { onUpdate: opts.onUpdate }),\n ...applyFkDefaults({ constraint: opts?.constraint, index: opts?.index }),\n };\n}\n\nexport function table(\n columns: Record<string, StorageColumn>,\n opts?: {\n pk?: PrimaryKey;\n uniques?: readonly UniqueConstraint[];\n indexes?: readonly Index[];\n fks?: readonly ForeignKey[];\n },\n): StorageTable {\n return {\n columns,\n ...(opts?.pk !== undefined && { primaryKey: opts.pk }),\n uniques: opts?.uniques ?? [],\n indexes: opts?.indexes ?? [],\n foreignKeys: opts?.fks ?? [],\n };\n}\n\nexport function model(\n tableName: string,\n fields: Record<string, SqlModelFieldStorage>,\n relations: Record<string, unknown> = {},\n): {\n storage: SqlModelStorage;\n fields: Record<string, { readonly nullable: boolean; readonly type: ScalarFieldType }>;\n relations: Record<string, unknown>;\n} {\n const storage: SqlModelStorage = { table: tableName, fields };\n const domainFields = Object.fromEntries(\n Object.entries(fields).map(([name, field]) => [\n name,\n {\n nullable: field.nullable ?? false,\n type: { kind: 'scalar' as const, codecId: field.codecId ?? 'core/unknown@1' },\n },\n ]),\n ) as Record<string, { nullable: boolean; type: ScalarFieldType }>;\n return {\n storage,\n fields: domainFields,\n relations,\n };\n}\n"],"mappings":";;;AAeA,SAAgB,IAAI,YAAoB,SAAiB,WAAW,OAAsB;AACxF,QAAO;EACL;EACA;EACA;EACD;;AAGH,SAAgB,GAAG,GAAG,SAAwC;AAC5D,QAAO,EACL,SACD;;AAGH,SAAgB,OAAO,GAAG,SAA8C;AACtE,QAAO,EACL,SACD;;AAGH,SAAgB,MAAM,GAAG,SAAmC;AAC1D,QAAO,EACL,SACD;;AAGH,SAAgB,GACd,SACA,UACA,YACA,MACY;AAMZ,QAAO;EACL;EACA,YAPuC;GACvC,OAAO;GACP,SAAS;GACV;EAKC,GAAI,MAAM,SAAS,UAAa,EAAE,MAAM,KAAK,MAAM;EACnD,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,KAAK,UAAU;EAC/D,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,KAAK,UAAU;EAC/D,GAAG,gBAAgB;GAAE,YAAY,MAAM;GAAY,OAAO,MAAM;GAAO,CAAC;EACzE;;AAGH,SAAgB,MACd,SACA,MAMc;AACd,QAAO;EACL;EACA,GAAI,MAAM,OAAO,UAAa,EAAE,YAAY,KAAK,IAAI;EACrD,SAAS,MAAM,WAAW,EAAE;EAC5B,SAAS,MAAM,WAAW,EAAE;EAC5B,aAAa,MAAM,OAAO,EAAE;EAC7B;;AAGH,SAAgB,MACd,WACA,QACA,YAAqC,EAAE,EAKvC;AAWA,QAAO;EACL,SAX+B;GAAE,OAAO;GAAW;GAAQ;EAY3D,QAXmB,OAAO,YAC1B,OAAO,QAAQ,OAAO,CAAC,KAAK,CAAC,MAAM,WAAW,CAC5C,MACA;GACE,UAAU,MAAM,YAAY;GAC5B,MAAM;IAAE,MAAM;IAAmB,SAAS,MAAM,WAAW;IAAkB;GAC9E,CACF,CAAC,CACH;EAIC;EACD"}
@@ -1,4 +1,4 @@
1
- import { ColumnDefault, ContractBase, DomainRelationOn, ExecutionHashBase, ExecutionSection, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
1
+ import { ColumnDefault, StorageBase } from "@prisma-next/contract/types";
2
2
 
3
3
  //#region src/types.d.ts
4
4
 
@@ -95,7 +95,7 @@ type StorageTypeInstance = {
95
95
  readonly nativeType: string;
96
96
  readonly typeParams: Record<string, unknown>;
97
97
  };
98
- type SqlStorage = {
98
+ type SqlStorage<THash extends string = string> = StorageBase<THash> & {
99
99
  readonly tables: Record<string, StorageTable>;
100
100
  /**
101
101
  * Named type instances for parameterized/custom types.
@@ -112,11 +112,6 @@ type SqlModelStorage = {
112
112
  readonly table: string;
113
113
  readonly fields: Record<string, SqlModelFieldStorage>;
114
114
  };
115
- type SqlRelation = {
116
- readonly to: string;
117
- readonly cardinality: '1:1' | '1:N' | 'N:1';
118
- readonly on: DomainRelationOn;
119
- };
120
115
  declare const DEFAULT_FK_CONSTRAINT = true;
121
116
  declare const DEFAULT_FK_INDEX = true;
122
117
  declare function applyFkDefaults(fk: {
@@ -131,10 +126,11 @@ declare function applyFkDefaults(fk: {
131
126
  };
132
127
  type TypeMaps<TCodecTypes extends Record<string, {
133
128
  output: unknown;
134
- }> = Record<string, never>, TOperationTypes extends Record<string, unknown> = Record<string, never>, TQueryOperationTypes extends Record<string, unknown> = Record<string, never>> = {
129
+ }> = Record<string, never>, TOperationTypes extends Record<string, unknown> = Record<string, never>, TQueryOperationTypes extends Record<string, unknown> = Record<string, never>, TFieldOutputTypes extends Record<string, Record<string, unknown>> = Record<string, never>> = {
135
130
  readonly codecTypes: TCodecTypes;
136
131
  readonly operationTypes: TOperationTypes;
137
132
  readonly queryOperationTypes: TQueryOperationTypes;
133
+ readonly fieldOutputTypes: TFieldOutputTypes;
138
134
  };
139
135
  type CodecTypesOf<T> = [T] extends [never] ? Record<string, never> : T extends {
140
136
  readonly codecTypes: infer C;
@@ -161,18 +157,15 @@ type QueryOperationTypesOf<T> = [T] extends [never] ? Record<string, never> : T
161
157
  } ? Q extends Record<string, unknown> ? Q : Record<string, never> : Record<string, never>;
162
158
  type TypeMapsPhantomKey = '__@prisma-next/sql-contract/typeMaps@__';
163
159
  type ContractWithTypeMaps<TContract, TTypeMaps> = TContract & { readonly [K in TypeMapsPhantomKey]?: TTypeMaps };
164
- type SqlContract<S extends SqlStorage = SqlStorage, TModels extends Record<string, unknown> = Record<string, unknown>, TStorageHash extends StorageHashBase<string> = StorageHashBase<string>, TExecutionHash extends ExecutionHashBase<string> = ExecutionHashBase<string>, TProfileHash extends ProfileHashBase<string> = ProfileHashBase<string>> = Omit<ContractBase<TStorageHash, TExecutionHash, TProfileHash>, 'models'> & {
165
- readonly targetFamily: string;
166
- readonly storage: S;
167
- readonly models: TModels;
168
- readonly execution?: ExecutionSection;
169
- };
170
160
  type ExtractTypeMapsFromContract<T> = TypeMapsPhantomKey extends keyof T ? NonNullable<T[TypeMapsPhantomKey & keyof T]> : never;
161
+ type FieldOutputTypesOf<T> = [T] extends [never] ? Record<string, never> : T extends {
162
+ readonly fieldOutputTypes: infer F;
163
+ } ? F extends Record<string, Record<string, unknown>> ? F : Record<string, never> : Record<string, never>;
171
164
  type ExtractCodecTypes<T> = CodecTypesOf<ExtractTypeMapsFromContract<T>>;
172
- type ExtractOperationTypes<T> = OperationTypesOf<ExtractTypeMapsFromContract<T>>;
173
165
  type ExtractQueryOperationTypes<T> = QueryOperationTypesOf<ExtractTypeMapsFromContract<T>>;
166
+ type ExtractFieldOutputTypes<T> = FieldOutputTypesOf<ExtractTypeMapsFromContract<T>>;
174
167
  type ResolveCodecTypes<TContract, TTypeMaps> = [TTypeMaps] extends [never] ? ExtractCodecTypes<TContract> : CodecTypesOf<TTypeMaps>;
175
- type ResolveOperationTypes<TContract, TTypeMaps> = [TTypeMaps] extends [never] ? ExtractOperationTypes<TContract> : OperationTypesOf<TTypeMaps>;
168
+ type ResolveOperationTypes<_TContract, TTypeMaps> = OperationTypesOf<TTypeMaps>;
176
169
  //#endregion
177
- export { TypeMaps as A, SqlModelStorage as C, StorageColumn as D, SqlStorage as E, UniqueConstraint as M, applyFkDefaults as N, StorageTable as O, SqlModelFieldStorage as S, SqlRelation as T, QueryOperationTypesOf as _, ExtractCodecTypes as a, ResolveOperationTypes as b, ExtractTypeMapsFromContract as c, ForeignKeyReferences as d, Index as f, QueryOperationTypesBase as g, QueryOperationTypeEntry as h, DEFAULT_FK_INDEX as i, TypeMapsPhantomKey as j, StorageTypeInstance as k, ForeignKey as l, PrimaryKey as m, ContractWithTypeMaps as n, ExtractOperationTypes as o, OperationTypesOf as p, DEFAULT_FK_CONSTRAINT as r, ExtractQueryOperationTypes as s, CodecTypesOf as t, ForeignKeyOptions as u, ReferentialAction as v, SqlQueryOperationTypes as w, SqlContract as x, ResolveCodecTypes as y };
178
- //# sourceMappingURL=types-D6K16_9R.d.mts.map
170
+ export { TypeMapsPhantomKey as A, SqlModelStorage as C, StorageTable as D, StorageColumn as E, applyFkDefaults as M, StorageTypeInstance as O, SqlModelFieldStorage as S, SqlStorage as T, QueryOperationTypesBase as _, ExtractCodecTypes as a, ResolveCodecTypes as b, ExtractTypeMapsFromContract as c, ForeignKeyOptions as d, ForeignKeyReferences as f, QueryOperationTypeEntry as g, PrimaryKey as h, DEFAULT_FK_INDEX as i, UniqueConstraint as j, TypeMaps as k, FieldOutputTypesOf as l, OperationTypesOf as m, ContractWithTypeMaps as n, ExtractFieldOutputTypes as o, Index as p, DEFAULT_FK_CONSTRAINT as r, ExtractQueryOperationTypes as s, CodecTypesOf as t, ForeignKey as u, QueryOperationTypesOf as v, SqlQueryOperationTypes as w, ResolveOperationTypes as x, ReferentialAction as y };
171
+ //# sourceMappingURL=types-D6o_FjCJ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-D6o_FjCJ.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types-DRR5stkj.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type {\n ColumnDefault,\n ContractBase,\n DomainRelationOn,\n ExecutionHashBase,\n ExecutionSection,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\n\n/**\n * A column definition in storage.\n *\n * `typeParams` is optional because most columns use non-parameterized types.\n * Columns with parameterized types can either inline `typeParams` or reference\n * a named {@link StorageTypeInstance} via `typeRef`.\n */\nexport type StorageColumn = {\n readonly nativeType: string;\n readonly codecId: string;\n readonly nullable: boolean;\n /**\n * Opaque, codec-owned JS/type parameters.\n * The codec that owns `codecId` defines the shape and semantics.\n * Mutually exclusive with `typeRef`.\n */\n readonly typeParams?: Record<string, unknown>;\n /**\n * Reference to a named type instance in `storage.types`.\n * Mutually exclusive with `typeParams`.\n */\n readonly typeRef?: string;\n /**\n * Default value for the column.\n * Can be a literal value or database function.\n */\n readonly default?: ColumnDefault;\n};\n\nexport type PrimaryKey = {\n readonly columns: readonly string[];\n readonly name?: string;\n};\n\nexport type UniqueConstraint = {\n readonly columns: readonly string[];\n readonly name?: string;\n};\n\nexport type Index = {\n readonly columns: readonly string[];\n readonly name?: string;\n /**\n * Optional access method identifier.\n * Extension-specific methods are represented as strings and interpreted\n * by the owning extension package.\n */\n readonly using?: string;\n /**\n * Optional extension-owned index configuration payload.\n */\n readonly config?: Record<string, unknown>;\n};\n\nexport type ForeignKeyReferences = {\n readonly table: string;\n readonly columns: readonly string[];\n};\n\nexport type ReferentialAction = 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n\nexport type ForeignKeyOptions = {\n readonly name?: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n};\n\nexport type ForeignKey = {\n readonly columns: readonly string[];\n readonly references: ForeignKeyReferences;\n readonly name?: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n /** Whether to emit FK constraint DDL (ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY). */\n readonly constraint: boolean;\n /** Whether to emit a backing index for the FK columns. */\n readonly index: boolean;\n};\n\nexport type StorageTable = {\n readonly columns: Record<string, StorageColumn>;\n readonly primaryKey?: PrimaryKey;\n readonly uniques: ReadonlyArray<UniqueConstraint>;\n readonly indexes: ReadonlyArray<Index>;\n readonly foreignKeys: ReadonlyArray<ForeignKey>;\n};\n\n/**\n * A named, parameterized type instance.\n * These are registered in `storage.types` for reuse across columns\n * and to enable ergonomic schema surfaces like `schema.types.MyType`.\n *\n * Unlike {@link StorageColumn}, `typeParams` is required here because\n * `StorageTypeInstance` exists specifically to define reusable parameterized types.\n * A type instance without parameters would be redundant—columns can reference\n * the codec directly via `codecId`.\n */\nexport type StorageTypeInstance = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams: Record<string, unknown>;\n};\n\nexport type SqlStorage = {\n readonly tables: Record<string, StorageTable>;\n /**\n * Named type instances for parameterized/custom types.\n * Columns can reference these via `typeRef`.\n */\n readonly types?: Record<string, StorageTypeInstance>;\n};\n\nexport type SqlModelFieldStorage = {\n readonly column: string;\n readonly codecId?: string;\n readonly nullable?: boolean;\n};\n\nexport type SqlModelStorage = {\n readonly table: string;\n readonly fields: Record<string, SqlModelFieldStorage>;\n};\n\nexport type SqlRelation = {\n readonly to: string;\n readonly cardinality: '1:1' | '1:N' | 'N:1';\n readonly on: DomainRelationOn;\n};\n\nexport const DEFAULT_FK_CONSTRAINT = true;\nexport const DEFAULT_FK_INDEX = true;\n\nexport function applyFkDefaults(\n fk: { constraint?: boolean | undefined; index?: boolean | undefined },\n overrideDefaults?: { constraint?: boolean | undefined; index?: boolean | undefined },\n): { constraint: boolean; index: boolean } {\n return {\n constraint: fk.constraint ?? overrideDefaults?.constraint ?? DEFAULT_FK_CONSTRAINT,\n index: fk.index ?? overrideDefaults?.index ?? DEFAULT_FK_INDEX,\n };\n}\n\nexport type TypeMaps<\n TCodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n TOperationTypes extends Record<string, unknown> = Record<string, never>,\n TQueryOperationTypes extends Record<string, unknown> = Record<string, never>,\n> = {\n readonly codecTypes: TCodecTypes;\n readonly operationTypes: TOperationTypes;\n readonly queryOperationTypes: TQueryOperationTypes;\n};\n\nexport type CodecTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly codecTypes: infer C }\n ? C extends Record<string, { output: unknown }>\n ? C\n : Record<string, never>\n : Record<string, never>;\n\nexport type OperationTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly operationTypes: infer O }\n ? O extends Record<string, unknown>\n ? O\n : Record<string, never>\n : Record<string, never>;\n\nexport type QueryOperationTypeEntry = {\n readonly args: readonly { readonly codecId: string; readonly nullable: boolean }[];\n readonly returns: { readonly codecId: string; readonly nullable: boolean };\n};\n\nexport type SqlQueryOperationTypes<T extends Record<string, QueryOperationTypeEntry>> = T;\n\nexport type QueryOperationTypesBase = Record<string, QueryOperationTypeEntry>;\n\nexport type QueryOperationTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly queryOperationTypes: infer Q }\n ? Q extends Record<string, unknown>\n ? Q\n : Record<string, never>\n : Record<string, never>;\n\nexport type TypeMapsPhantomKey = '__@prisma-next/sql-contract/typeMaps@__';\n\nexport type ContractWithTypeMaps<TContract, TTypeMaps> = TContract & {\n readonly [K in TypeMapsPhantomKey]?: TTypeMaps;\n};\n\nexport type SqlContract<\n S extends SqlStorage = SqlStorage,\n TModels extends Record<string, unknown> = Record<string, unknown>,\n TStorageHash extends StorageHashBase<string> = StorageHashBase<string>,\n TExecutionHash extends ExecutionHashBase<string> = ExecutionHashBase<string>,\n TProfileHash extends ProfileHashBase<string> = ProfileHashBase<string>,\n> = Omit<ContractBase<TStorageHash, TExecutionHash, TProfileHash>, 'models'> & {\n readonly targetFamily: string;\n readonly storage: S;\n readonly models: TModels;\n readonly execution?: ExecutionSection;\n};\n\nexport type ExtractTypeMapsFromContract<T> = TypeMapsPhantomKey extends keyof T\n ? NonNullable<T[TypeMapsPhantomKey & keyof T]>\n : never;\n\nexport type ExtractCodecTypes<T> = CodecTypesOf<ExtractTypeMapsFromContract<T>>;\nexport type ExtractOperationTypes<T> = OperationTypesOf<ExtractTypeMapsFromContract<T>>;\nexport type ExtractQueryOperationTypes<T> = QueryOperationTypesOf<ExtractTypeMapsFromContract<T>>;\n\nexport type ResolveCodecTypes<TContract, TTypeMaps> = [TTypeMaps] extends [never]\n ? ExtractCodecTypes<TContract>\n : CodecTypesOf<TTypeMaps>;\n\nexport type ResolveOperationTypes<TContract, TTypeMaps> = [TTypeMaps] extends [never]\n ? ExtractOperationTypes<TContract>\n : OperationTypesOf<TTypeMaps>;\n"],"mappings":";AA2IA,MAAa,wBAAwB;AACrC,MAAa,mBAAmB;AAEhC,SAAgB,gBACd,IACA,kBACyC;AACzC,QAAO;EACL,YAAY,GAAG,cAAc,kBAAkB,cAAc;EAC7D,OAAO,GAAG,SAAS,kBAAkB,SAAS;EAC/C"}
1
+ {"version":3,"file":"types-DRR5stkj.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { ColumnDefault, StorageBase } from '@prisma-next/contract/types';\n\n/**\n * A column definition in storage.\n *\n * `typeParams` is optional because most columns use non-parameterized types.\n * Columns with parameterized types can either inline `typeParams` or reference\n * a named {@link StorageTypeInstance} via `typeRef`.\n */\nexport type StorageColumn = {\n readonly nativeType: string;\n readonly codecId: string;\n readonly nullable: boolean;\n /**\n * Opaque, codec-owned JS/type parameters.\n * The codec that owns `codecId` defines the shape and semantics.\n * Mutually exclusive with `typeRef`.\n */\n readonly typeParams?: Record<string, unknown>;\n /**\n * Reference to a named type instance in `storage.types`.\n * Mutually exclusive with `typeParams`.\n */\n readonly typeRef?: string;\n /**\n * Default value for the column.\n * Can be a literal value or database function.\n */\n readonly default?: ColumnDefault;\n};\n\nexport type PrimaryKey = {\n readonly columns: readonly string[];\n readonly name?: string;\n};\n\nexport type UniqueConstraint = {\n readonly columns: readonly string[];\n readonly name?: string;\n};\n\nexport type Index = {\n readonly columns: readonly string[];\n readonly name?: string;\n /**\n * Optional access method identifier.\n * Extension-specific methods are represented as strings and interpreted\n * by the owning extension package.\n */\n readonly using?: string;\n /**\n * Optional extension-owned index configuration payload.\n */\n readonly config?: Record<string, unknown>;\n};\n\nexport type ForeignKeyReferences = {\n readonly table: string;\n readonly columns: readonly string[];\n};\n\nexport type ReferentialAction = 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';\n\nexport type ForeignKeyOptions = {\n readonly name?: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n};\n\nexport type ForeignKey = {\n readonly columns: readonly string[];\n readonly references: ForeignKeyReferences;\n readonly name?: string;\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n /** Whether to emit FK constraint DDL (ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY). */\n readonly constraint: boolean;\n /** Whether to emit a backing index for the FK columns. */\n readonly index: boolean;\n};\n\nexport type StorageTable = {\n readonly columns: Record<string, StorageColumn>;\n readonly primaryKey?: PrimaryKey;\n readonly uniques: ReadonlyArray<UniqueConstraint>;\n readonly indexes: ReadonlyArray<Index>;\n readonly foreignKeys: ReadonlyArray<ForeignKey>;\n};\n\n/**\n * A named, parameterized type instance.\n * These are registered in `storage.types` for reuse across columns\n * and to enable ergonomic schema surfaces like `schema.types.MyType`.\n *\n * Unlike {@link StorageColumn}, `typeParams` is required here because\n * `StorageTypeInstance` exists specifically to define reusable parameterized types.\n * A type instance without parameters would be redundant—columns can reference\n * the codec directly via `codecId`.\n */\nexport type StorageTypeInstance = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams: Record<string, unknown>;\n};\n\nexport type SqlStorage<THash extends string = string> = StorageBase<THash> & {\n readonly tables: Record<string, StorageTable>;\n /**\n * Named type instances for parameterized/custom types.\n * Columns can reference these via `typeRef`.\n */\n readonly types?: Record<string, StorageTypeInstance>;\n};\n\nexport type SqlModelFieldStorage = {\n readonly column: string;\n readonly codecId?: string;\n readonly nullable?: boolean;\n};\n\nexport type SqlModelStorage = {\n readonly table: string;\n readonly fields: Record<string, SqlModelFieldStorage>;\n};\n\nexport const DEFAULT_FK_CONSTRAINT = true;\nexport const DEFAULT_FK_INDEX = true;\n\nexport function applyFkDefaults(\n fk: { constraint?: boolean | undefined; index?: boolean | undefined },\n overrideDefaults?: { constraint?: boolean | undefined; index?: boolean | undefined },\n): { constraint: boolean; index: boolean } {\n return {\n constraint: fk.constraint ?? overrideDefaults?.constraint ?? DEFAULT_FK_CONSTRAINT,\n index: fk.index ?? overrideDefaults?.index ?? DEFAULT_FK_INDEX,\n };\n}\n\nexport type TypeMaps<\n TCodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n TOperationTypes extends Record<string, unknown> = Record<string, never>,\n TQueryOperationTypes extends Record<string, unknown> = Record<string, never>,\n TFieldOutputTypes extends Record<string, Record<string, unknown>> = Record<string, never>,\n> = {\n readonly codecTypes: TCodecTypes;\n readonly operationTypes: TOperationTypes;\n readonly queryOperationTypes: TQueryOperationTypes;\n readonly fieldOutputTypes: TFieldOutputTypes;\n};\n\nexport type CodecTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly codecTypes: infer C }\n ? C extends Record<string, { output: unknown }>\n ? C\n : Record<string, never>\n : Record<string, never>;\n\nexport type OperationTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly operationTypes: infer O }\n ? O extends Record<string, unknown>\n ? O\n : Record<string, never>\n : Record<string, never>;\n\nexport type QueryOperationTypeEntry = {\n readonly args: readonly { readonly codecId: string; readonly nullable: boolean }[];\n readonly returns: { readonly codecId: string; readonly nullable: boolean };\n};\n\nexport type SqlQueryOperationTypes<T extends Record<string, QueryOperationTypeEntry>> = T;\n\nexport type QueryOperationTypesBase = Record<string, QueryOperationTypeEntry>;\n\nexport type QueryOperationTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly queryOperationTypes: infer Q }\n ? Q extends Record<string, unknown>\n ? Q\n : Record<string, never>\n : Record<string, never>;\n\nexport type TypeMapsPhantomKey = '__@prisma-next/sql-contract/typeMaps@__';\n\nexport type ContractWithTypeMaps<TContract, TTypeMaps> = TContract & {\n readonly [K in TypeMapsPhantomKey]?: TTypeMaps;\n};\n\nexport type ExtractTypeMapsFromContract<T> = TypeMapsPhantomKey extends keyof T\n ? NonNullable<T[TypeMapsPhantomKey & keyof T]>\n : never;\n\nexport type FieldOutputTypesOf<T> = [T] extends [never]\n ? Record<string, never>\n : T extends { readonly fieldOutputTypes: infer F }\n ? F extends Record<string, Record<string, unknown>>\n ? F\n : Record<string, never>\n : Record<string, never>;\n\nexport type ExtractCodecTypes<T> = CodecTypesOf<ExtractTypeMapsFromContract<T>>;\nexport type ExtractQueryOperationTypes<T> = QueryOperationTypesOf<ExtractTypeMapsFromContract<T>>;\nexport type ExtractFieldOutputTypes<T> = FieldOutputTypesOf<ExtractTypeMapsFromContract<T>>;\n\nexport type ResolveCodecTypes<TContract, TTypeMaps> = [TTypeMaps] extends [never]\n ? ExtractCodecTypes<TContract>\n : CodecTypesOf<TTypeMaps>;\n\nexport type ResolveOperationTypes<_TContract, TTypeMaps> = OperationTypesOf<TTypeMaps>;\n"],"mappings":";AA6HA,MAAa,wBAAwB;AACrC,MAAa,mBAAmB;AAEhC,SAAgB,gBACd,IACA,kBACyC;AACzC,QAAO;EACL,YAAY,GAAG,cAAc,kBAAkB,cAAc;EAC7D,OAAO,GAAG,SAAS,kBAAkB,SAAS;EAC/C"}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as TypeMaps, C as SqlModelStorage, D as StorageColumn, E as SqlStorage, M as UniqueConstraint, N as applyFkDefaults, O as StorageTable, S as SqlModelFieldStorage, T as SqlRelation, _ as QueryOperationTypesOf, a as ExtractCodecTypes, b as ResolveOperationTypes, c as ExtractTypeMapsFromContract, d as ForeignKeyReferences, f as Index, g as QueryOperationTypesBase, h as QueryOperationTypeEntry, i as DEFAULT_FK_INDEX, j as TypeMapsPhantomKey, k as StorageTypeInstance, l as ForeignKey, m as PrimaryKey, n as ContractWithTypeMaps, o as ExtractOperationTypes, p as OperationTypesOf, r as DEFAULT_FK_CONSTRAINT, s as ExtractQueryOperationTypes, t as CodecTypesOf, u as ForeignKeyOptions, v as ReferentialAction, w as SqlQueryOperationTypes, x as SqlContract, y as ResolveCodecTypes } from "./types-D6K16_9R.mjs";
2
- export { type CodecTypesOf, type ContractWithTypeMaps, DEFAULT_FK_CONSTRAINT, DEFAULT_FK_INDEX, type ExtractCodecTypes, type ExtractOperationTypes, type ExtractQueryOperationTypes, type ExtractTypeMapsFromContract, type ForeignKey, type ForeignKeyOptions, type ForeignKeyReferences, type Index, type OperationTypesOf, type PrimaryKey, type QueryOperationTypeEntry, type QueryOperationTypesBase, type QueryOperationTypesOf, type ReferentialAction, type ResolveCodecTypes, type ResolveOperationTypes, type SqlContract, type SqlModelFieldStorage, type SqlModelStorage, type SqlQueryOperationTypes, type SqlRelation, type SqlStorage, type StorageColumn, type StorageTable, type StorageTypeInstance, type TypeMaps, type TypeMapsPhantomKey, type UniqueConstraint, applyFkDefaults };
1
+ import { A as TypeMapsPhantomKey, C as SqlModelStorage, D as StorageTable, E as StorageColumn, M as applyFkDefaults, O as StorageTypeInstance, S as SqlModelFieldStorage, T as SqlStorage, _ as QueryOperationTypesBase, a as ExtractCodecTypes, b as ResolveCodecTypes, c as ExtractTypeMapsFromContract, d as ForeignKeyOptions, f as ForeignKeyReferences, g as QueryOperationTypeEntry, h as PrimaryKey, i as DEFAULT_FK_INDEX, j as UniqueConstraint, k as TypeMaps, l as FieldOutputTypesOf, m as OperationTypesOf, n as ContractWithTypeMaps, o as ExtractFieldOutputTypes, p as Index, r as DEFAULT_FK_CONSTRAINT, s as ExtractQueryOperationTypes, t as CodecTypesOf, u as ForeignKey, v as QueryOperationTypesOf, w as SqlQueryOperationTypes, x as ResolveOperationTypes, y as ReferentialAction } from "./types-D6o_FjCJ.mjs";
2
+ export { type CodecTypesOf, type ContractWithTypeMaps, DEFAULT_FK_CONSTRAINT, DEFAULT_FK_INDEX, type ExtractCodecTypes, type ExtractFieldOutputTypes, type ExtractQueryOperationTypes, type ExtractTypeMapsFromContract, type FieldOutputTypesOf, type ForeignKey, type ForeignKeyOptions, type ForeignKeyReferences, type Index, type OperationTypesOf, type PrimaryKey, type QueryOperationTypeEntry, type QueryOperationTypesBase, type QueryOperationTypesOf, type ReferentialAction, type ResolveCodecTypes, type ResolveOperationTypes, type SqlModelFieldStorage, type SqlModelStorage, type SqlQueryOperationTypes, type SqlStorage, type StorageColumn, type StorageTable, type StorageTypeInstance, type TypeMaps, type TypeMapsPhantomKey, type UniqueConstraint, applyFkDefaults };
@@ -1,11 +1,9 @@
1
- import { D as StorageColumn, E as SqlStorage, x as SqlContract } from "./types-D6K16_9R.mjs";
2
- import "@prisma-next/contract/types";
1
+ import { T as SqlStorage } from "./types-D6o_FjCJ.mjs";
2
+ import { Contract } from "@prisma-next/contract/types";
3
+ import { CodecLookup } from "@prisma-next/framework-components/codec";
3
4
 
4
5
  //#region src/validate.d.ts
5
- declare function isBigIntColumn(column: StorageColumn): boolean;
6
- declare function decodeContractDefaults<T extends SqlContract<SqlStorage>>(contract: T): T;
7
- declare function normalizeContract(contract: unknown): SqlContract<SqlStorage>;
8
- declare function validateContract<TContract extends SqlContract<SqlStorage>>(value: unknown): TContract;
6
+ declare function validateContract<TContract extends Contract<SqlStorage>>(value: unknown, codecLookup: CodecLookup): TContract;
9
7
  //#endregion
10
- export { decodeContractDefaults, isBigIntColumn, normalizeContract, validateContract };
8
+ export { validateContract };
11
9
  //# sourceMappingURL=validate.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.mts","names":[],"sources":["../src/validate.ts"],"sourcesContent":[],"mappings":";;;;iBAgIgB,cAAA,SAAuB;AAAvB,iBAkCA,sBAlCuB,CAAa,UAkCH,WAlCG,CAkCS,UAlCT,CAAA,CAAA,CAAA,QAAA,EAkCgC,CAlChC,CAAA,EAkCoC,CAlCpC;AAkCpC,iBA+GA,iBAAA,CA/GsB,QAAA,EAAA,OAAA,CAAA,EA+GgB,WA/GhB,CA+G4B,UA/G5B,CAAA;AAAuB,iBAoJ7C,gBApJ6C,CAAA,kBAoJV,WApJU,CAoJE,UApJF,CAAA,CAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAsJ1D,SAtJ0D"}
1
+ {"version":3,"file":"validate.d.mts","names":[],"sources":["../src/validate.ts"],"sourcesContent":[],"mappings":";;;;;iBAoNgB,mCAAmC,SAAS,0CAE7C,cACZ"}
package/dist/validate.mjs CHANGED
@@ -1,38 +1,22 @@
1
- import { r as applyFkDefaults } from "./types-DRR5stkj.mjs";
2
- import { d as validateStorageSemantics, l as validateSqlContract } from "./validators-i9MX9Dti.mjs";
3
- import { isTaggedBigInt, isTaggedRaw } from "@prisma-next/contract/types";
4
- import { validateContractDomain } from "@prisma-next/contract/validate-domain";
1
+ import { d as validateStorageSemantics, l as validateSqlContract } from "./validators-BjZ6lOS1.mjs";
2
+ import { ContractValidationError, validateContract as validateContract$1 } from "@prisma-next/contract/validate-contract";
5
3
 
6
- //#region src/construct.ts
7
- function stripGenerated(obj) {
8
- const { _generated: _, ...rest } = obj;
9
- return rest;
10
- }
11
- function constructContract(input) {
12
- return stripGenerated(input);
13
- }
14
-
15
- //#endregion
16
4
  //#region src/validate.ts
17
- function extractDomainShape(contract) {
18
- return {
19
- roots: contract.roots,
20
- models: contract.models
21
- };
22
- }
23
5
  function validateModelStorageReferences(contract) {
24
- const models = contract.models;
25
- for (const [modelName, model] of Object.entries(models)) {
26
- const storageTable = model.storage?.table;
27
- if (!storageTable) continue;
6
+ for (const [modelName, model] of Object.entries(contract.models)) {
7
+ const storageTable = model.storage.table;
28
8
  const table = contract.storage.tables[storageTable];
29
- if (!table) throw new Error(`Model "${modelName}" references non-existent table "${storageTable}"`);
30
- const storageFields = model.storage?.fields;
31
- if (!storageFields) continue;
9
+ if (!table) throw new ContractValidationError(`Model "${modelName}" references non-existent table "${storageTable}"`, "storage");
32
10
  const columnNames = new Set(Object.keys(table.columns));
33
- for (const [fieldName, field] of Object.entries(storageFields)) {
34
- const column = field.column;
35
- if (column && !columnNames.has(column)) throw new Error(`Model "${modelName}" field "${fieldName}" references non-existent column "${column}" in table "${storageTable}"`);
11
+ for (const [fieldName, field] of Object.entries(model.storage.fields)) if (!columnNames.has(field.column)) throw new ContractValidationError(`Model "${modelName}" field "${fieldName}" references non-existent column "${field.column}" in table "${storageTable}"`, "storage");
12
+ const JSON_NATIVE_TYPES = new Set(["json", "jsonb"]);
13
+ for (const [fieldName, domainField] of Object.entries(model.fields)) {
14
+ if (domainField.type?.kind !== "valueObject") continue;
15
+ const storageField = model.storage.fields[fieldName];
16
+ if (!storageField) continue;
17
+ const column = table.columns[storageField.column];
18
+ if (!column) continue;
19
+ if (!JSON_NATIVE_TYPES.has(column.nativeType)) throw new ContractValidationError(`Model "${modelName}" field "${fieldName}" is a value object but storage column "${storageField.column}" has nativeType "${column.nativeType}" (expected json or jsonb)`, "storage");
36
20
  }
37
21
  }
38
22
  }
@@ -41,42 +25,30 @@ function validateContractLogic(contract) {
41
25
  for (const [tableName, table] of Object.entries(contract.storage.tables)) {
42
26
  const columnNames = new Set(Object.keys(table.columns));
43
27
  if (table.primaryKey) {
44
- for (const colName of table.primaryKey.columns) if (!columnNames.has(colName)) throw new Error(`Table "${tableName}" primaryKey references non-existent column "${colName}"`);
28
+ for (const colName of table.primaryKey.columns) if (!columnNames.has(colName)) throw new ContractValidationError(`Table "${tableName}" primaryKey references non-existent column "${colName}"`, "storage");
45
29
  }
46
- for (const unique of table.uniques) for (const colName of unique.columns) if (!columnNames.has(colName)) throw new Error(`Table "${tableName}" unique constraint references non-existent column "${colName}"`);
47
- for (const index of table.indexes) for (const colName of index.columns) if (!columnNames.has(colName)) throw new Error(`Table "${tableName}" index references non-existent column "${colName}"`);
48
- for (const [colName, column] of Object.entries(table.columns)) if (!column.nullable && column.default?.kind === "literal" && column.default.value === null) throw new Error(`Table "${tableName}" column "${colName}" is NOT NULL but has a literal null default`);
30
+ for (const unique of table.uniques) for (const colName of unique.columns) if (!columnNames.has(colName)) throw new ContractValidationError(`Table "${tableName}" unique constraint references non-existent column "${colName}"`, "storage");
31
+ for (const index of table.indexes) for (const colName of index.columns) if (!columnNames.has(colName)) throw new ContractValidationError(`Table "${tableName}" index references non-existent column "${colName}"`, "storage");
32
+ for (const [colName, column] of Object.entries(table.columns)) if (!column.nullable && column.default?.kind === "literal" && column.default.value === null) throw new ContractValidationError(`Table "${tableName}" column "${colName}" is NOT NULL but has a literal null default`, "storage");
49
33
  for (const fk of table.foreignKeys) {
50
- for (const colName of fk.columns) if (!columnNames.has(colName)) throw new Error(`Table "${tableName}" foreignKey references non-existent column "${colName}"`);
51
- if (!tableNames.has(fk.references.table)) throw new Error(`Table "${tableName}" foreignKey references non-existent table "${fk.references.table}"`);
34
+ for (const colName of fk.columns) if (!columnNames.has(colName)) throw new ContractValidationError(`Table "${tableName}" foreignKey references non-existent column "${colName}"`, "storage");
35
+ if (!tableNames.has(fk.references.table)) throw new ContractValidationError(`Table "${tableName}" foreignKey references non-existent table "${fk.references.table}"`, "storage");
52
36
  const referencedTable = contract.storage.tables[fk.references.table];
37
+ if (!referencedTable) continue;
53
38
  const referencedColumnNames = new Set(Object.keys(referencedTable.columns));
54
- for (const colName of fk.references.columns) if (!referencedColumnNames.has(colName)) throw new Error(`Table "${tableName}" foreignKey references non-existent column "${colName}" in table "${fk.references.table}"`);
55
- if (fk.columns.length !== fk.references.columns.length) throw new Error(`Table "${tableName}" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`);
39
+ for (const colName of fk.references.columns) if (!referencedColumnNames.has(colName)) throw new ContractValidationError(`Table "${tableName}" foreignKey references non-existent column "${colName}" in table "${fk.references.table}"`, "storage");
40
+ if (fk.columns.length !== fk.references.columns.length) throw new ContractValidationError(`Table "${tableName}" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`, "storage");
56
41
  }
57
42
  }
58
43
  }
59
- const BIGINT_NATIVE_TYPES = new Set(["bigint", "int8"]);
60
- function isBigIntColumn(column) {
61
- const nativeType = column.nativeType?.toLowerCase() ?? "";
62
- if (BIGINT_NATIVE_TYPES.has(nativeType)) return true;
63
- const codecId = column.codecId?.toLowerCase() ?? "";
64
- return codecId.includes("int8") || codecId.includes("bigint");
44
+ function validateSqlStorage(contract) {
45
+ const sqlContract = validateSqlContract(contract);
46
+ validateContractLogic(sqlContract);
47
+ validateModelStorageReferences(sqlContract);
48
+ const semanticErrors = validateStorageSemantics(sqlContract.storage);
49
+ if (semanticErrors.length > 0) throw new ContractValidationError(`Contract semantic validation failed: ${semanticErrors.join("; ")}`, "storage");
65
50
  }
66
- function decodeDefaultLiteralValue(value, column, tableName, columnName) {
67
- if (value instanceof Date) return value;
68
- if (isTaggedRaw(value)) return value.value;
69
- if (isTaggedBigInt(value)) {
70
- if (!isBigIntColumn(column)) return value;
71
- try {
72
- return BigInt(value.value);
73
- } catch {
74
- throw new Error(`Invalid tagged bigint for default value on "${tableName}.${columnName}": "${value.value}" is not a valid integer`);
75
- }
76
- }
77
- return value;
78
- }
79
- function decodeContractDefaults(contract) {
51
+ function decodeContractDefaults(contract, codecLookup) {
80
52
  const tables = contract.storage.tables;
81
53
  let tablesChanged = false;
82
54
  const decodedTables = {};
@@ -85,17 +57,20 @@ function decodeContractDefaults(contract) {
85
57
  const decodedColumns = {};
86
58
  for (const [columnName, column] of Object.entries(table.columns)) {
87
59
  if (column.default?.kind === "literal") {
88
- const decodedValue = decodeDefaultLiteralValue(column.default.value, column, tableName, columnName);
89
- if (decodedValue !== column.default.value) {
90
- columnsChanged = true;
91
- decodedColumns[columnName] = {
92
- ...column,
93
- default: {
94
- kind: "literal",
95
- value: decodedValue
96
- }
97
- };
98
- continue;
60
+ const codec = codecLookup.get(column.codecId);
61
+ if (codec) {
62
+ const decodedValue = codec.decodeJson(column.default.value);
63
+ if (decodedValue !== column.default.value) {
64
+ columnsChanged = true;
65
+ decodedColumns[columnName] = {
66
+ ...column,
67
+ default: {
68
+ kind: "literal",
69
+ value: decodedValue
70
+ }
71
+ };
72
+ continue;
73
+ }
99
74
  }
100
75
  }
101
76
  decodedColumns[columnName] = column;
@@ -117,90 +92,16 @@ function decodeContractDefaults(contract) {
117
92
  }
118
93
  };
119
94
  }
120
- function normalizeStorage(contractObj) {
121
- const normalizedStorage = contractObj["storage"];
122
- if (!normalizedStorage || typeof normalizedStorage !== "object") return normalizedStorage;
123
- const storage = normalizedStorage;
124
- const tables = storage["tables"];
125
- if (!tables) return storage;
126
- const normalizedTables = {};
127
- for (const [tableName, table] of Object.entries(tables)) {
128
- const tableObj = table;
129
- const columns = tableObj["columns"];
130
- if (columns) {
131
- const normalizedColumns = {};
132
- for (const [columnName, column] of Object.entries(columns)) {
133
- const columnObj = column;
134
- normalizedColumns[columnName] = {
135
- ...columnObj,
136
- nullable: columnObj["nullable"] ?? false
137
- };
138
- }
139
- const normalizedForeignKeys = (tableObj["foreignKeys"] ?? []).map((fk) => ({
140
- ...fk,
141
- ...applyFkDefaults({
142
- constraint: typeof fk["constraint"] === "boolean" ? fk["constraint"] : void 0,
143
- index: typeof fk["index"] === "boolean" ? fk["index"] : void 0
144
- })
145
- }));
146
- normalizedTables[tableName] = {
147
- ...tableObj,
148
- columns: normalizedColumns,
149
- uniques: tableObj["uniques"] ?? [],
150
- indexes: tableObj["indexes"] ?? [],
151
- foreignKeys: normalizedForeignKeys
152
- };
153
- } else normalizedTables[tableName] = tableObj;
95
+ function validateContract(value, codecLookup) {
96
+ const validated = validateContract$1(value, validateSqlStorage);
97
+ try {
98
+ return decodeContractDefaults(validated, codecLookup);
99
+ } catch (error) {
100
+ if (error instanceof ContractValidationError) throw error;
101
+ throw new ContractValidationError(error instanceof Error ? error.message : String(error), "storage");
154
102
  }
155
- return {
156
- ...storage,
157
- tables: normalizedTables
158
- };
159
- }
160
- function normalizeModels(models) {
161
- const normalized = {};
162
- for (const [modelName, model] of Object.entries(models)) normalized[modelName] = {
163
- ...model,
164
- relations: model["relations"] ?? {}
165
- };
166
- return normalized;
167
- }
168
- function normalizeContract(contract) {
169
- if (typeof contract !== "object" || contract === null) return contract;
170
- const contractObj = contract;
171
- const normalizedStorage = normalizeStorage(contractObj);
172
- const rawModels = contractObj["models"];
173
- const models = rawModels && typeof rawModels === "object" && rawModels !== null ? normalizeModels(rawModels) : rawModels ?? {};
174
- const pick = (key) => key in contractObj && contractObj[key] !== void 0 ? { [key]: contractObj[key] } : {};
175
- return {
176
- ...pick("schemaVersion"),
177
- target: contractObj["target"],
178
- targetFamily: contractObj["targetFamily"],
179
- ...pick("coreHash"),
180
- storageHash: contractObj["storageHash"],
181
- ...pick("executionHash"),
182
- ...pick("profileHash"),
183
- ...pick("_generated"),
184
- roots: contractObj["roots"] ?? {},
185
- models,
186
- storage: normalizedStorage,
187
- extensionPacks: contractObj["extensionPacks"] ?? {},
188
- capabilities: contractObj["capabilities"] ?? {},
189
- meta: contractObj["meta"] ?? {},
190
- sources: contractObj["sources"] ?? {},
191
- ...pick("execution")
192
- };
193
- }
194
- function validateContract(value) {
195
- const structurallyValid = validateSqlContract(normalizeContract(value));
196
- validateContractDomain(extractDomainShape(structurallyValid));
197
- validateContractLogic(structurallyValid);
198
- validateModelStorageReferences(structurallyValid);
199
- const semanticErrors = validateStorageSemantics(structurallyValid.storage);
200
- if (semanticErrors.length > 0) throw new Error(`Contract semantic validation failed: ${semanticErrors.join("; ")}`);
201
- return decodeContractDefaults(constructContract(structurallyValid));
202
103
  }
203
104
 
204
105
  //#endregion
205
- export { decodeContractDefaults, isBigIntColumn, normalizeContract, validateContract };
106
+ export { validateContract };
206
107
  //# sourceMappingURL=validate.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.mjs","names":["decodedTables: Record<string, StorageTable>","decodedColumns: Record<string, StorageColumn>","normalizedTables: Record<string, unknown>","normalizedColumns: Record<string, unknown>","normalized: Record<string, Record<string, unknown>>"],"sources":["../src/construct.ts","../src/validate.ts"],"sourcesContent":["import type { SqlContract, SqlStorage } from './types';\n\ntype ValidatedContractInput = SqlContract<SqlStorage> & { _generated?: unknown };\n\nfunction stripGenerated(obj: ValidatedContractInput): Omit<ValidatedContractInput, '_generated'> {\n const input = obj as unknown as Record<string, unknown>;\n const { _generated: _, ...rest } = input;\n return rest as Omit<ValidatedContractInput, '_generated'>;\n}\n\nexport function constructContract<TContract extends SqlContract<SqlStorage>>(\n input: ValidatedContractInput,\n): TContract {\n const stripped = stripGenerated(input);\n return stripped as TContract;\n}\n","import type { ColumnDefaultLiteralInputValue } from '@prisma-next/contract/types';\nimport { isTaggedBigInt, isTaggedRaw } from '@prisma-next/contract/types';\nimport type { DomainContractShape, DomainModelShape } from '@prisma-next/contract/validate-domain';\nimport { validateContractDomain } from '@prisma-next/contract/validate-domain';\nimport { constructContract } from './construct';\nimport type { SqlContract, SqlStorage, StorageColumn, StorageTable } from './types';\nimport { applyFkDefaults } from './types';\nimport { validateSqlContract, validateStorageSemantics } from './validators';\n\nfunction extractDomainShape(contract: SqlContract<SqlStorage>): DomainContractShape {\n return {\n roots: contract.roots,\n models: contract.models as Record<string, DomainModelShape>,\n };\n}\n\nfunction validateModelStorageReferences(contract: SqlContract<SqlStorage>): void {\n const models = contract.models as Record<\n string,\n { storage?: { table?: string; fields?: Record<string, { column?: string }> } }\n >;\n\n for (const [modelName, model] of Object.entries(models)) {\n const storageTable = model.storage?.table;\n if (!storageTable) continue;\n\n const table = contract.storage.tables[storageTable] as\n | (typeof contract.storage.tables)[string]\n | undefined;\n if (!table) {\n throw new Error(`Model \"${modelName}\" references non-existent table \"${storageTable}\"`);\n }\n\n const storageFields = model.storage?.fields;\n if (!storageFields) continue;\n\n const columnNames = new Set(Object.keys(table.columns));\n for (const [fieldName, field] of Object.entries(storageFields)) {\n const column = field.column;\n if (column && !columnNames.has(column)) {\n throw new Error(\n `Model \"${modelName}\" field \"${fieldName}\" references non-existent column \"${column}\" in table \"${storageTable}\"`,\n );\n }\n }\n }\n}\n\nfunction validateContractLogic(contract: SqlContract<SqlStorage>): void {\n const tableNames = new Set(Object.keys(contract.storage.tables));\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n const columnNames = new Set(Object.keys(table.columns));\n\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(`Table \"${tableName}\" index references non-existent column \"${colName}\"`);\n }\n }\n }\n\n for (const [colName, column] of Object.entries(table.columns)) {\n if (!column.nullable && column.default?.kind === 'literal' && column.default.value === null) {\n throw new Error(\n `Table \"${tableName}\" column \"${colName}\" is NOT NULL but has a literal null default`,\n );\n }\n }\n\n for (const fk of table.foreignKeys) {\n for (const colName of fk.columns) {\n if (!columnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n if (!tableNames.has(fk.references.table)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n\n const referencedTable = contract.storage.tables[\n fk.references.table\n ] as (typeof contract.storage.tables)[string];\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n );\n }\n }\n }\n}\n\nconst BIGINT_NATIVE_TYPES = new Set(['bigint', 'int8']);\n\nexport function isBigIntColumn(column: StorageColumn): boolean {\n const nativeType = column.nativeType?.toLowerCase() ?? '';\n if (BIGINT_NATIVE_TYPES.has(nativeType)) return true;\n const codecId = column.codecId?.toLowerCase() ?? '';\n return codecId.includes('int8') || codecId.includes('bigint');\n}\n\nexport function decodeDefaultLiteralValue(\n value: ColumnDefaultLiteralInputValue,\n column: StorageColumn,\n tableName: string,\n columnName: string,\n): ColumnDefaultLiteralInputValue {\n if (value instanceof Date) {\n return value;\n }\n if (isTaggedRaw(value)) {\n return value.value;\n }\n if (isTaggedBigInt(value)) {\n if (!isBigIntColumn(column)) {\n return value;\n }\n try {\n return BigInt(value.value);\n } catch {\n throw new Error(\n `Invalid tagged bigint for default value on \"${tableName}.${columnName}\": \"${value.value}\" is not a valid integer`,\n );\n }\n }\n return value;\n}\n\nexport function decodeContractDefaults<T extends SqlContract<SqlStorage>>(contract: T): T {\n const tables = contract.storage.tables;\n let tablesChanged = false;\n const decodedTables: Record<string, StorageTable> = {};\n\n for (const [tableName, table] of Object.entries(tables)) {\n let columnsChanged = false;\n const decodedColumns: Record<string, StorageColumn> = {};\n\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (column.default?.kind === 'literal') {\n const decodedValue = decodeDefaultLiteralValue(\n column.default.value,\n column,\n tableName,\n columnName,\n );\n if (decodedValue !== column.default.value) {\n columnsChanged = true;\n decodedColumns[columnName] = {\n ...column,\n default: { kind: 'literal', value: decodedValue },\n };\n continue;\n }\n }\n decodedColumns[columnName] = column;\n }\n\n if (columnsChanged) {\n tablesChanged = true;\n decodedTables[tableName] = { ...table, columns: decodedColumns };\n } else {\n decodedTables[tableName] = table;\n }\n }\n\n if (!tablesChanged) {\n return contract;\n }\n\n return {\n ...contract,\n storage: {\n ...contract.storage,\n tables: decodedTables,\n },\n } as T;\n}\n\nfunction normalizeStorage(contractObj: Record<string, unknown>): Record<string, unknown> {\n const normalizedStorage = contractObj['storage'];\n if (!normalizedStorage || typeof normalizedStorage !== 'object')\n return normalizedStorage as Record<string, unknown>;\n\n const storage = normalizedStorage as Record<string, unknown>;\n const tables = storage['tables'] as Record<string, unknown> | undefined;\n if (!tables) return storage;\n\n const normalizedTables: Record<string, unknown> = {};\n for (const [tableName, table] of Object.entries(tables)) {\n const tableObj = table as Record<string, unknown>;\n const columns = tableObj['columns'] as Record<string, unknown> | undefined;\n\n if (columns) {\n const normalizedColumns: Record<string, unknown> = {};\n for (const [columnName, column] of Object.entries(columns)) {\n const columnObj = column as Record<string, unknown>;\n normalizedColumns[columnName] = {\n ...columnObj,\n nullable: columnObj['nullable'] ?? false,\n };\n }\n\n const rawForeignKeys = (tableObj['foreignKeys'] ?? []) as Array<Record<string, unknown>>;\n const normalizedForeignKeys = rawForeignKeys.map((fk) => ({\n ...fk,\n ...applyFkDefaults({\n constraint: typeof fk['constraint'] === 'boolean' ? fk['constraint'] : undefined,\n index: typeof fk['index'] === 'boolean' ? fk['index'] : undefined,\n }),\n }));\n\n normalizedTables[tableName] = {\n ...tableObj,\n columns: normalizedColumns,\n uniques: tableObj['uniques'] ?? [],\n indexes: tableObj['indexes'] ?? [],\n foreignKeys: normalizedForeignKeys,\n };\n } else {\n normalizedTables[tableName] = tableObj;\n }\n }\n\n return { ...storage, tables: normalizedTables };\n}\n\nfunction normalizeModels(\n models: Record<string, Record<string, unknown>>,\n): Record<string, Record<string, unknown>> {\n const normalized: Record<string, Record<string, unknown>> = {};\n for (const [modelName, model] of Object.entries(models)) {\n normalized[modelName] = {\n ...model,\n relations: model['relations'] ?? {},\n };\n }\n return normalized;\n}\n\nexport function normalizeContract(contract: unknown): SqlContract<SqlStorage> {\n if (typeof contract !== 'object' || contract === null) {\n return contract as SqlContract<SqlStorage>;\n }\n\n const contractObj = contract as Record<string, unknown>;\n const normalizedStorage = normalizeStorage(contractObj);\n\n const rawModels = contractObj['models'];\n const models =\n rawModels && typeof rawModels === 'object' && rawModels !== null\n ? normalizeModels(rawModels as Record<string, Record<string, unknown>>)\n : (rawModels ?? {});\n\n const pick = (key: string) =>\n key in contractObj && contractObj[key] !== undefined ? { [key]: contractObj[key] } : {};\n\n return {\n ...pick('schemaVersion'),\n target: contractObj['target'],\n targetFamily: contractObj['targetFamily'],\n ...pick('coreHash'),\n storageHash: contractObj['storageHash'],\n ...pick('executionHash'),\n ...pick('profileHash'),\n ...pick('_generated'),\n roots: contractObj['roots'] ?? {},\n models,\n storage: normalizedStorage,\n extensionPacks: contractObj['extensionPacks'] ?? {},\n capabilities: contractObj['capabilities'] ?? {},\n meta: contractObj['meta'] ?? {},\n sources: contractObj['sources'] ?? {},\n ...pick('execution'),\n } as SqlContract<SqlStorage>;\n}\n\nexport function validateContract<TContract extends SqlContract<SqlStorage>>(\n value: unknown,\n): TContract {\n const normalized = normalizeContract(value);\n\n const structurallyValid = validateSqlContract<SqlContract<SqlStorage>>(normalized);\n\n validateContractDomain(extractDomainShape(structurallyValid));\n\n validateContractLogic(structurallyValid);\n\n validateModelStorageReferences(structurallyValid);\n\n const semanticErrors = validateStorageSemantics(structurallyValid.storage);\n if (semanticErrors.length > 0) {\n throw new Error(`Contract semantic validation failed: ${semanticErrors.join('; ')}`);\n }\n\n const constructed = constructContract<TContract>(structurallyValid);\n return decodeContractDefaults(constructed) as TContract;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validate.mjs","names":["decodedTables: Record<string, StorageTable>","decodedColumns: Record<string, StorageColumn>","frameworkValidateContract"],"sources":["../src/validate.ts"],"sourcesContent":["import type {\n ColumnDefaultLiteralInputValue,\n Contract,\n ContractField,\n ContractModel,\n JsonValue,\n} from '@prisma-next/contract/types';\nimport {\n ContractValidationError,\n validateContract as frameworkValidateContract,\n} from '@prisma-next/contract/validate-contract';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type { SqlModelStorage, SqlStorage, StorageColumn, StorageTable } from './types';\nimport { validateSqlContract, validateStorageSemantics } from './validators';\n\ntype SqlValidationContract = Contract<SqlStorage, Record<string, ContractModel<SqlModelStorage>>>;\n\nfunction validateModelStorageReferences(contract: SqlValidationContract): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n const storageTable = model.storage.table;\n\n const table = contract.storage.tables[storageTable] as\n | (typeof contract.storage.tables)[string]\n | undefined;\n if (!table) {\n throw new ContractValidationError(\n `Model \"${modelName}\" references non-existent table \"${storageTable}\"`,\n 'storage',\n );\n }\n\n const columnNames = new Set(Object.keys(table.columns));\n for (const [fieldName, field] of Object.entries(model.storage.fields)) {\n if (!columnNames.has(field.column)) {\n throw new ContractValidationError(\n `Model \"${modelName}\" field \"${fieldName}\" references non-existent column \"${field.column}\" in table \"${storageTable}\"`,\n 'storage',\n );\n }\n }\n\n const JSON_NATIVE_TYPES = new Set(['json', 'jsonb']);\n for (const [fieldName, domainField] of Object.entries(model.fields)) {\n const f = domainField as ContractField;\n if (f.type?.kind !== 'valueObject') continue;\n const storageField = model.storage.fields[fieldName];\n if (!storageField) continue;\n const column = table.columns[storageField.column];\n if (!column) continue;\n if (!JSON_NATIVE_TYPES.has(column.nativeType)) {\n throw new ContractValidationError(\n `Model \"${modelName}\" field \"${fieldName}\" is a value object but storage column \"${storageField.column}\" has nativeType \"${column.nativeType}\" (expected json or jsonb)`,\n 'storage',\n );\n }\n }\n }\n}\n\nfunction validateContractLogic(contract: Contract<SqlStorage>): void {\n const tableNames = new Set(Object.keys(contract.storage.tables));\n\n for (const [tableName, table] of Object.entries(contract.storage.tables)) {\n const columnNames = new Set(Object.keys(table.columns));\n\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n 'storage',\n );\n }\n }\n }\n\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n 'storage',\n );\n }\n }\n }\n\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" index references non-existent column \"${colName}\"`,\n 'storage',\n );\n }\n }\n }\n\n for (const [colName, column] of Object.entries(table.columns)) {\n if (!column.nullable && column.default?.kind === 'literal' && column.default.value === null) {\n throw new ContractValidationError(\n `Table \"${tableName}\" column \"${colName}\" is NOT NULL but has a literal null default`,\n 'storage',\n );\n }\n }\n\n for (const fk of table.foreignKeys) {\n for (const colName of fk.columns) {\n if (!columnNames.has(colName)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n 'storage',\n );\n }\n }\n\n if (!tableNames.has(fk.references.table)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n 'storage',\n );\n }\n\n const referencedTable = contract.storage.tables[fk.references.table];\n if (!referencedTable) continue;\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n throw new ContractValidationError(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n 'storage',\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n throw new ContractValidationError(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n 'storage',\n );\n }\n }\n }\n}\n\nfunction validateSqlStorage(contract: Contract): void {\n const sqlContract = validateSqlContract<SqlValidationContract>(contract);\n validateContractLogic(sqlContract);\n validateModelStorageReferences(sqlContract);\n const semanticErrors = validateStorageSemantics(sqlContract.storage);\n if (semanticErrors.length > 0) {\n throw new ContractValidationError(\n `Contract semantic validation failed: ${semanticErrors.join('; ')}`,\n 'storage',\n );\n }\n}\n\nfunction decodeContractDefaults<T extends Contract<SqlStorage>>(\n contract: T,\n codecLookup: CodecLookup,\n): T {\n const tables = contract.storage.tables;\n let tablesChanged = false;\n const decodedTables: Record<string, StorageTable> = {};\n\n for (const [tableName, table] of Object.entries(tables)) {\n let columnsChanged = false;\n const decodedColumns: Record<string, StorageColumn> = {};\n\n for (const [columnName, column] of Object.entries(table.columns)) {\n if (column.default?.kind === 'literal') {\n const codec = codecLookup.get(column.codecId);\n if (codec) {\n const decodedValue = codec.decodeJson(\n column.default.value as JsonValue,\n ) as ColumnDefaultLiteralInputValue;\n if (decodedValue !== column.default.value) {\n columnsChanged = true;\n decodedColumns[columnName] = {\n ...column,\n default: { kind: 'literal', value: decodedValue },\n };\n continue;\n }\n }\n }\n decodedColumns[columnName] = column;\n }\n\n if (columnsChanged) {\n tablesChanged = true;\n decodedTables[tableName] = { ...table, columns: decodedColumns };\n } else {\n decodedTables[tableName] = table;\n }\n }\n\n if (!tablesChanged) {\n return contract;\n }\n\n return {\n ...contract,\n storage: {\n ...contract.storage,\n tables: decodedTables,\n },\n } as T;\n}\n\nexport function validateContract<TContract extends Contract<SqlStorage>>(\n value: unknown,\n codecLookup: CodecLookup,\n): TContract {\n const validated = frameworkValidateContract<TContract>(value, validateSqlStorage);\n try {\n return decodeContractDefaults(validated, codecLookup);\n } catch (error) {\n if (error instanceof ContractValidationError) throw error;\n throw new ContractValidationError(\n error instanceof Error ? error.message : String(error),\n 'storage',\n );\n }\n}\n"],"mappings":"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"}