@prisma-next/contract 0.3.0-dev.144 → 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.
Files changed (38) hide show
  1. package/README.md +2 -2
  2. package/dist/{contract-types-Cd9ic3zL.d.mts → contract-types-MYdoYIIh.d.mts} +30 -19
  3. package/dist/contract-types-MYdoYIIh.d.mts.map +1 -0
  4. package/dist/{hashing-BHjb-IPM.mjs → hashing-CyaA_Qvf.mjs} +4 -6
  5. package/dist/hashing-CyaA_Qvf.mjs.map +1 -0
  6. package/dist/hashing.d.mts +1 -1
  7. package/dist/hashing.d.mts.map +1 -1
  8. package/dist/hashing.mjs +1 -1
  9. package/dist/testing.d.mts +4 -3
  10. package/dist/testing.d.mts.map +1 -1
  11. package/dist/testing.mjs +4 -2
  12. package/dist/testing.mjs.map +1 -1
  13. package/dist/types-aMyNgejf.mjs +14 -0
  14. package/dist/types-aMyNgejf.mjs.map +1 -0
  15. package/dist/types.d.mts +2 -2
  16. package/dist/types.mjs +2 -2
  17. package/dist/validate-contract.d.mts +1 -1
  18. package/dist/validate-contract.d.mts.map +1 -1
  19. package/dist/validate-contract.mjs +1 -1
  20. package/dist/{validate-domain-BlwWyv01.mjs → validate-domain-CpCcTlqJ.mjs} +30 -2
  21. package/dist/validate-domain-CpCcTlqJ.mjs.map +1 -0
  22. package/dist/validate-domain.d.mts +3 -0
  23. package/dist/validate-domain.d.mts.map +1 -1
  24. package/dist/validate-domain.mjs +1 -1
  25. package/package.json +5 -5
  26. package/src/canonicalization.ts +3 -11
  27. package/src/contract-types.ts +3 -2
  28. package/src/domain-types.ts +30 -3
  29. package/src/exports/types.ts +7 -11
  30. package/src/testing-factories.ts +11 -3
  31. package/src/types.ts +2 -33
  32. package/src/validate-contract.ts +2 -0
  33. package/src/validate-domain.ts +62 -0
  34. package/dist/contract-types-Cd9ic3zL.d.mts.map +0 -1
  35. package/dist/hashing-BHjb-IPM.mjs.map +0 -1
  36. package/dist/types-BP4dqfP-.mjs +0 -27
  37. package/dist/types-BP4dqfP-.mjs.map +0 -1
  38. package/dist/validate-domain-BlwWyv01.mjs.map +0 -1
package/README.md CHANGED
@@ -45,7 +45,7 @@ Reference the appropriate JSON schema in your `contract.json` files to enable ID
45
45
  }
46
46
  ```
47
47
 
48
- For SQL contracts, use `@prisma-next/sql-contract-ts/schemas/data-contract-sql-v1.json` instead.
48
+ For SQL contracts, use `@prisma-next/sql-contract-ts/schema-sql` instead.
49
49
 
50
50
  ## Exports
51
51
 
@@ -88,4 +88,4 @@ For SQL contracts, use `@prisma-next/sql-contract-ts/schemas/data-contract-sql-v
88
88
  - [ADR 004 - Storage Hash vs Profile Hash](../../../../../docs/architecture%20docs/adrs/ADR%20004%20-%20Storage%20Hash%20vs%20Profile%20Hash.md)
89
89
  - [ADR 010 - Canonicalization Rules](../../../../../docs/architecture%20docs/adrs/ADR%20010%20-%20Canonicalization%20Rules.md)
90
90
  - [ADR 021 - Contract Marker Storage](../../../../../docs/architecture%20docs/adrs/ADR%20021%20-%20Contract%20Marker%20Storage.md)
91
- - [ADR 183 - SPI types live at the lowest consuming layer](../../../../../docs/architecture%20docs/adrs/ADR%20183%20-%20SPI%20types%20live%20at%20the%20lowest%20consuming%20layer.md)
91
+ - [ADR 185 - SPI types live at the lowest consuming layer](../../../../../docs/architecture%20docs/adrs/ADR%20185%20-%20SPI%20types%20live%20at%20the%20lowest%20consuming%20layer.md)
@@ -1,7 +1,23 @@
1
1
  //#region src/domain-types.d.ts
2
+ type ScalarFieldType = {
3
+ readonly kind: 'scalar';
4
+ readonly codecId: string;
5
+ readonly typeParams?: Record<string, unknown>;
6
+ };
7
+ type ValueObjectFieldType = {
8
+ readonly kind: 'valueObject';
9
+ readonly name: string;
10
+ };
11
+ type UnionFieldType = {
12
+ readonly kind: 'union';
13
+ readonly members: ReadonlyArray<ScalarFieldType | ValueObjectFieldType>;
14
+ };
15
+ type ContractFieldType = ScalarFieldType | ValueObjectFieldType | UnionFieldType;
2
16
  type ContractField = {
3
17
  readonly nullable: boolean;
4
- readonly codecId: string;
18
+ readonly type: ContractFieldType;
19
+ readonly many?: true;
20
+ readonly dict?: true;
5
21
  };
6
22
  type ContractRelationOn = {
7
23
  readonly localFields: readonly string[];
@@ -23,8 +39,11 @@ type ContractDiscriminator = {
23
39
  type ContractVariantEntry = {
24
40
  readonly value: string;
25
41
  };
42
+ type ContractValueObject = {
43
+ readonly fields: Record<string, ContractField>;
44
+ };
26
45
  type ModelStorageBase = Readonly<Record<string, unknown>>;
27
- interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> {
46
+ interface ContractModelBase<TModelStorage extends ModelStorageBase = ModelStorageBase> {
28
47
  readonly fields: Record<string, ContractField>;
29
48
  readonly relations: Record<string, ContractRelation>;
30
49
  readonly storage: TModelStorage;
@@ -33,6 +52,9 @@ interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBas
33
52
  readonly base?: string;
34
53
  readonly owner?: string;
35
54
  }
55
+ interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> extends ContractModelBase<TModelStorage> {
56
+ readonly fields: Record<string, ContractField>;
57
+ }
36
58
  type HasModelsWithRelations = {
37
59
  readonly models: Record<string, {
38
60
  readonly relations: Record<string, ContractRelation>;
@@ -98,20 +120,8 @@ type JsonPrimitive = string | number | boolean | null;
98
120
  type JsonValue = JsonPrimitive | {
99
121
  readonly [key: string]: JsonValue;
100
122
  } | readonly JsonValue[];
101
- type TaggedBigInt = {
102
- readonly $type: 'bigint';
103
- readonly value: string;
104
- };
105
- declare function isTaggedBigInt(value: unknown): value is TaggedBigInt;
106
- declare function bigintJsonReplacer(_key: string, value: unknown): unknown;
107
- type TaggedRaw = {
108
- readonly $type: 'raw';
109
- readonly value: JsonValue;
110
- };
111
- declare function isTaggedRaw(value: unknown): value is TaggedRaw;
112
- type TaggedLiteralValue = TaggedBigInt | TaggedRaw;
113
- type ColumnDefaultLiteralValue = JsonValue | TaggedLiteralValue;
114
- type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | bigint | Date;
123
+ type ColumnDefaultLiteralValue = JsonValue;
124
+ type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | Date;
115
125
  type ColumnDefault = {
116
126
  readonly kind: 'literal';
117
127
  readonly value: ColumnDefaultLiteralInputValue;
@@ -286,11 +296,12 @@ type ContractExecutionSection<THash extends string = string> = {
286
296
  * @template TModels Record of model name → {@link ContractModel} with
287
297
  * family-specific model storage.
288
298
  */
289
- interface Contract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModel> = Record<string, ContractModel>> {
299
+ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>> {
290
300
  readonly target: string;
291
301
  readonly targetFamily: string;
292
302
  readonly roots: Record<string, string>;
293
303
  readonly models: TModels;
304
+ readonly valueObjects?: Record<string, ContractValueObject>;
294
305
  readonly storage: TStorage;
295
306
  readonly capabilities: Record<string, Record<string, boolean>>;
296
307
  readonly extensionPacks: Record<string, unknown>;
@@ -299,5 +310,5 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
299
310
  readonly meta: Record<string, unknown>;
300
311
  }
301
312
  //#endregion
302
- export { TaggedLiteralValue as A, ContractField as B, PlanRefs as C, StorageBase as D, Source as E, isTaggedBigInt as F, ContractVariantEntry as G, ContractReferenceRelation as H, isTaggedRaw as I, ReferenceRelationKeys as J, EmbedRelationKeys as K, profileHash as L, bigintJsonReplacer as M, coreHash as N, StorageHashBase as O, executionHash as P, ContractDiscriminator as R, PlanMeta as S, ResultType as T, ContractRelation as U, ContractModel as V, ContractRelationOn as W, FieldType as _, ColumnDefault as a, JsonValue as b, ContractMarkerRecord as c, ExecutionHashBase as d, ExecutionMutationDefault as f, Expr as g, ExecutionSection as h, Brand as i, TaggedRaw as j, TaggedBigInt as k, DocCollection as l, ExecutionPlan as m, ContractExecutionSection as n, ColumnDefaultLiteralInputValue as o, ExecutionMutationDefaultValue as p, ModelStorageBase as q, $ as r, ColumnDefaultLiteralValue as s, Contract as t, DocIndex as u, GeneratedValueSpec as v, ProfileHashBase as w, ParamDescriptor as x, JsonPrimitive as y, ContractEmbedRelation as z };
303
- //# sourceMappingURL=contract-types-Cd9ic3zL.d.mts.map
313
+ export { executionHash as A, ContractRelationOn as B, PlanRefs as C, StorageBase as D, Source as E, ContractFieldType as F, ReferenceRelationKeys as G, ContractVariantEntry as H, ContractModel as I, ValueObjectFieldType as J, ScalarFieldType as K, ContractModelBase as L, ContractDiscriminator as M, ContractEmbedRelation as N, StorageHashBase as O, ContractField as P, ContractReferenceRelation as R, PlanMeta as S, ResultType as T, EmbedRelationKeys as U, ContractValueObject as V, ModelStorageBase as W, FieldType as _, ColumnDefault as a, JsonValue as b, ContractMarkerRecord as c, ExecutionHashBase as d, ExecutionMutationDefault as f, Expr as g, ExecutionSection as h, Brand as i, profileHash as j, coreHash as k, DocCollection as l, ExecutionPlan as m, ContractExecutionSection as n, ColumnDefaultLiteralInputValue as o, ExecutionMutationDefaultValue as p, UnionFieldType as q, $ as r, ColumnDefaultLiteralValue as s, Contract as t, DocIndex as u, GeneratedValueSpec as v, ProfileHashBase as w, ParamDescriptor as x, JsonPrimitive as y, ContractRelation as z };
314
+ //# sourceMappingURL=contract-types-MYdoYIIh.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-types-MYdoYIIh.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { t as bigintJsonReplacer } from "./types-BP4dqfP-.mjs";
2
1
  import { isArrayEqual } from "@prisma-next/utils/array-equal";
3
2
  import { ifDefined } from "@prisma-next/utils/defined";
4
3
  import { createHash } from "node:crypto";
@@ -12,6 +11,7 @@ const TOP_LEVEL_ORDER = [
12
11
  "profileHash",
13
12
  "roots",
14
13
  "models",
14
+ "valueObjects",
15
15
  "storage",
16
16
  "execution",
17
17
  "capabilities",
@@ -21,14 +21,12 @@ const TOP_LEVEL_ORDER = [
21
21
  function isDefaultValue(value) {
22
22
  if (value === false) return true;
23
23
  if (value === null) return false;
24
- if (value instanceof Date) return false;
25
24
  if (Array.isArray(value) && value.length === 0) return true;
26
25
  if (typeof value === "object" && value !== null) return Object.keys(value).length === 0;
27
26
  return false;
28
27
  }
29
28
  function omitDefaults(obj, path) {
30
29
  if (obj === null || typeof obj !== "object") return obj;
31
- if (obj instanceof Date) return obj;
32
30
  if (Array.isArray(obj)) return obj.map((item) => omitDefaults(item, path));
33
31
  const result = {};
34
32
  for (const [key, value] of Object.entries(obj)) {
@@ -89,7 +87,6 @@ function omitDefaults(obj, path) {
89
87
  }
90
88
  function sortObjectKeys(obj) {
91
89
  if (obj === null || typeof obj !== "object") return obj;
92
- if (obj instanceof Date) return obj;
93
90
  if (Array.isArray(obj)) return obj.map((item) => sortObjectKeys(item));
94
91
  const sorted = {};
95
92
  const keys = Object.keys(obj).sort();
@@ -144,6 +141,7 @@ function canonicalizeContractToObject(contract, options) {
144
141
  profileHash: contract.profileHash,
145
142
  roots: contract.roots,
146
143
  models: contract.models,
144
+ ...ifDefined("valueObjects", contract.valueObjects),
147
145
  storage: contract.storage,
148
146
  ...ifDefined("execution", contract.execution),
149
147
  extensionPacks: contract.extensionPacks,
@@ -157,7 +155,7 @@ function canonicalizeContractToObject(contract, options) {
157
155
  }));
158
156
  }
159
157
  function canonicalizeContract(contract, options) {
160
- return JSON.stringify(canonicalizeContractToObject(contract, options), bigintJsonReplacer, 2);
158
+ return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);
161
159
  }
162
160
 
163
161
  //#endregion
@@ -195,4 +193,4 @@ function computeProfileHash(args) {
195
193
 
196
194
  //#endregion
197
195
  export { canonicalizeContractToObject as a, canonicalizeContract as i, computeProfileHash as n, computeStorageHash as r, computeExecutionHash as t };
198
- //# sourceMappingURL=hashing-BHjb-IPM.mjs.map
196
+ //# sourceMappingURL=hashing-CyaA_Qvf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashing-CyaA_Qvf.mjs","names":["result: Record<string, unknown>","sorted: Record<string, unknown>","result: StorageObject","sortedTable: TableObject","ordered: Record<string, unknown>"],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nimport type { Contract } from './contract-types';\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'valueObjects',\n 'storage',\n 'execution',\n 'capabilities',\n 'extensionPacks',\n 'meta',\n] as const;\n\nfunction isDefaultValue(value: unknown): boolean {\n if (value === false) return true;\n if (value === null) return false;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n return keys.length === 0;\n }\n return false;\n}\n\nfunction omitDefaults(obj: unknown, path: readonly string[]): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => omitDefaults(item, path));\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n\n if (key === '_generated') {\n continue;\n }\n\n if (key === 'generated' && value === false) {\n continue;\n }\n\n if ((key === 'onDelete' || key === 'onUpdate') && value === 'noAction') {\n continue;\n }\n\n if (isDefaultValue(value)) {\n const isRequiredModels = isArrayEqual(currentPath, ['models']);\n const isRequiredTables = isArrayEqual(currentPath, ['storage', 'tables']);\n const isRequiredCollections = isArrayEqual(currentPath, ['storage', 'collections']);\n const isCollectionEntry =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'collections']);\n const isRequiredRoots = isArrayEqual(currentPath, ['roots']);\n const isRequiredExtensionPacks = isArrayEqual(currentPath, ['extensionPacks']);\n const isRequiredCapabilities = isArrayEqual(currentPath, ['capabilities']);\n const isRequiredMeta = isArrayEqual(currentPath, ['meta']);\n const isRequiredExecutionDefaults = isArrayEqual(currentPath, [\n 'execution',\n 'mutations',\n 'defaults',\n ]);\n const isExtensionNamespace = currentPath.length === 2 && currentPath[0] === 'extensionPacks';\n const isModelRelations =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'relations']);\n const isModelStorage =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'storage']);\n const isTableUniques =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'uniques'],\n );\n const isTableIndexes =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'indexes'],\n );\n const isTableForeignKeys =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'foreignKeys'],\n );\n\n const isFkBooleanField =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'tables' &&\n currentPath[3] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredTables &&\n !isRequiredCollections &&\n !isCollectionEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isTableUniques &&\n !isTableIndexes &&\n !isTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath);\n }\n\n return result;\n}\n\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sortObjectKeys(item));\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\ntype StorageObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortIndexesAndUniques(storage: unknown): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const storageObj = storage as StorageObject;\n if (!storageObj.tables || typeof storageObj.tables !== 'object') {\n return storage;\n }\n\n const tables = storageObj.tables;\n const result: StorageObject = { ...storageObj };\n\n result.tables = {};\n const sortedTableNames = Object.keys(tables).sort();\n for (const tableName of sortedTableNames) {\n const table = tables[tableName];\n if (!table || typeof table !== 'object') {\n result.tables[tableName] = table;\n continue;\n }\n\n const tableObj = table as TableObject;\n const sortedTable: TableObject = { ...tableObj };\n\n if (Array.isArray(tableObj.indexes)) {\n sortedTable.indexes = [...tableObj.indexes].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n if (Array.isArray(tableObj.uniques)) {\n sortedTable.uniques = [...tableObj.uniques].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n result.tables[tableName] = sortedTable;\n }\n\n return result;\n}\n\nexport function orderTopLevel(obj: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n const remaining = new Set(Object.keys(obj));\n\n for (const key of TOP_LEVEL_ORDER) {\n if (remaining.has(key)) {\n ordered[key] = obj[key];\n remaining.delete(key);\n }\n }\n\n for (const key of Array.from(remaining).sort()) {\n ordered[key] = obj[key];\n }\n\n return ordered;\n}\n\nexport function canonicalizeContractToObject(\n contract: Contract,\n options?: { schemaVersion?: string },\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options?.schemaVersion),\n targetFamily: contract.targetFamily,\n target: contract.target,\n profileHash: contract.profileHash,\n roots: contract.roots,\n models: contract.models,\n ...ifDefined('valueObjects', contract.valueObjects),\n storage: contract.storage,\n ...ifDefined('execution', contract.execution),\n extensionPacks: contract.extensionPacks,\n capabilities: contract.capabilities,\n meta: contract.meta,\n };\n const withDefaultsOmitted = omitDefaults(normalized, []) as Record<string, unknown>;\n const withSortedIndexes = sortIndexesAndUniques(withDefaultsOmitted['storage']);\n const withSortedStorage = { ...withDefaultsOmitted, storage: withSortedIndexes };\n const withSortedKeys = sortObjectKeys(withSortedStorage) as Record<string, unknown>;\n return orderTopLevel(withSortedKeys);\n}\n\nexport function canonicalizeContract(\n contract: Contract,\n options?: { schemaVersion?: string },\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalizeContract } from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './types';\n\nconst SCHEMA_VERSION = '1';\n\nfunction sha256(content: string): string {\n const hash = createHash('sha256');\n hash.update(content);\n return `sha256:${hash.digest('hex')}`;\n}\n\nfunction hashContract(section: Record<string, unknown>): string {\n const contract = {\n targetFamily: section['targetFamily'],\n target: section['target'],\n roots: {},\n models: {},\n storage: section['storage'] ?? {},\n execution: section['execution'],\n extensionPacks: {},\n capabilities: section['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...section,\n } as Contract;\n return canonicalizeContract(contract, { schemaVersion: SCHEMA_VERSION });\n}\n\nexport function computeStorageHash(args: {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n}): StorageHashBase<string> {\n return sha256(hashContract(args)) as StorageHashBase<string>;\n}\n\nexport function computeExecutionHash(args: {\n target: string;\n targetFamily: string;\n execution: Record<string, unknown>;\n}): ExecutionHashBase<string> {\n return sha256(hashContract(args)) as ExecutionHashBase<string>;\n}\n\nexport function computeProfileHash(args: {\n target: string;\n targetFamily: string;\n capabilities: Record<string, Record<string, boolean>>;\n}): ProfileHashBase<string> {\n return sha256(hashContract(args)) as ProfileHashBase<string>;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { O as StorageHashBase, d as ExecutionHashBase, t as Contract, w as ProfileHashBase } from "./contract-types-Cd9ic3zL.mjs";
1
+ import { O as StorageHashBase, d as ExecutionHashBase, t as Contract, w as ProfileHashBase } from "./contract-types-MYdoYIIh.mjs";
2
2
 
3
3
  //#region src/canonicalization.d.ts
4
4
  declare function canonicalizeContractToObject(contract: Contract, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":[],"mappings":";;;iBAiPgB,4BAAA,WACJ,iBAuBZ;EAxBgB,aAAA,CAAA,EAAA,MAAA;AAwBhB,CAAA,CAAA,EArBG,MAqBa,CAAA,MAAA,EAAA,OAAA,CAAoB;iBAApB,oBAAA,WACJ;;;;;iBC5OI,kBAAA;;EDmNA,YAAA,EAAA,MAAA;EAwBA,OAAA,ECxOL,MDwOK,CAAA,MAAA,EAAoB,OAAA,CAAA;ICvOhC;iBAIY,oBAAA;;EARA,YAAA,EAAA,MAAA;EAQA,SAAA,EAGH,MAHG,CAAA,MAAoB,EAAA,OAAA,CAAA;AAQpC,CAAA,CAAA,EAJI,iBAIY,CAAA,MAAkB,CAAA;AAGH,iBAHf,kBAAA,CAGe,IAAA,EAAA;EAAf,MAAA,EAAA,MAAA;EACZ,YAAA,EAAA,MAAA;EAAe,YAAA,EADH,MACG,CAAA,MAAA,EADY,MACZ,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;IAAf"}
1
+ {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":[],"mappings":";;;iBAwOgB,4BAAA,WACJ,iBAwBZ;EAzBgB,aAAA,CAAA,EAAA,MAAA;AAyBhB,CAAA,CAAA,EAtBG,MAsBa,CAAA,MAAA,EAAA,OAAA,CAAoB;iBAApB,oBAAA,WACJ;;;;;iBCpOI,kBAAA;;ED0MA,YAAA,EAAA,MAAA;EAyBA,OAAA,EChOL,MDgOK,CAAA,MAAA,EAAoB,OAAA,CAAA;IC/NhC;iBAIY,oBAAA;;EARA,YAAA,EAAA,MAAA;EAQA,SAAA,EAGH,MAHG,CAAA,MAAoB,EAAA,OAAA,CAAA;AAQpC,CAAA,CAAA,EAJI,iBAIY,CAAA,MAAkB,CAAA;AAGH,iBAHf,kBAAA,CAGe,IAAA,EAAA;EAAf,MAAA,EAAA,MAAA;EACZ,YAAA,EAAA,MAAA;EAAe,YAAA,EADH,MACG,CAAA,MAAA,EADY,MACZ,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;IAAf"}
package/dist/hashing.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-BHjb-IPM.mjs";
1
+ import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-CyaA_Qvf.mjs";
2
2
 
3
3
  export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };
@@ -1,12 +1,13 @@
1
- import { D as StorageBase, O as StorageHashBase, V as ContractModel, h as ExecutionSection, q as ModelStorageBase, t as Contract, w as ProfileHashBase } from "./contract-types-Cd9ic3zL.mjs";
1
+ import { D as StorageBase, I as ContractModel, L as ContractModelBase, O as StorageHashBase, V as ContractValueObject, W as ModelStorageBase, h as ExecutionSection, t as Contract, w as ProfileHashBase } from "./contract-types-MYdoYIIh.mjs";
2
2
 
3
3
  //#region src/testing-factories.d.ts
4
- type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModel> = Record<string, ContractModel>> = {
4
+ type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>> = {
5
5
  target?: string;
6
6
  targetFamily?: string;
7
7
  roots?: Record<string, string>;
8
8
  models?: TModels;
9
9
  storage?: Omit<TStorage, 'storageHash'>;
10
+ valueObjects?: Record<string, ContractValueObject>;
10
11
  capabilities?: Record<string, Record<string, boolean>>;
11
12
  extensionPacks?: Record<string, unknown>;
12
13
  execution?: Omit<ExecutionSection, 'executionHash'>;
@@ -14,7 +15,7 @@ type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels exten
14
15
  meta?: Record<string, unknown>;
15
16
  };
16
17
  declare const DUMMY_HASH: StorageHashBase<"sha256:test">;
17
- declare function createContract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModel> = Record<string, ContractModel>>(overrides?: ContractOverrides<TStorage, TModels>): Contract<TStorage, TModels>;
18
+ declare function createContract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>>(overrides?: ContractOverrides<TStorage, TModels>): Contract<TStorage, TModels>;
18
19
  type SqlStorageLike = StorageBase & {
19
20
  readonly tables: Record<string, unknown>;
20
21
  readonly types?: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":[],"mappings":";;;AAG8E,KAGzE,iBAAA,CAAA,iBACc,WADG,GACW,WADX,EAAA,gBAEJ,MAFI,CAAA,MAAA,EAEW,aAFX,CAAA,GAE4B,MAF5B,CAAA,MAAA,EAE2C,aAF3C,CAAA,CAAA,GAAA;EACH,MAAA,CAAA,EAAA,MAAA;EAAc,YAAA,CAAA,EAAA,MAAA;EACA,KAAA,CAAA,EAIvB,MAJuB,CAAA,MAAA,EAAA,MAAA,CAAA;EAAf,MAAA,CAAA,EAKP,OALO;EAA+C,OAAA,CAAA,EAMrD,IANqD,CAMhD,QANgD,EAAA,aAAA,CAAA;EAAf,YAAA,CAAA,EAOjC,MAPiC,CAAA,MAAA,EAOlB,MAPkB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAIxC,cAAA,CAAA,EAIS,MAJT,CAAA,MAAA,EAAA,OAAA,CAAA;EACC,SAAA,CAAA,EAIG,IAJH,CAIQ,gBAJR,EAAA,eAAA,CAAA;EACM,WAAA,CAAA,EAID,eAJC,CAAA,MAAA,CAAA;EAAL,IAAA,CAAA,EAKH,MALG,CAAA,MAAA,EAAA,OAAA,CAAA;CACoB;cAO1B,UAPW,EAOyB,eAPzB,CAAA,aAAA,CAAA;AACE,iBAQH,cARG,CAAA,iBASA,WATA,GASc,WATd,EAAA,gBAUD,MAVC,CAAA,MAAA,EAUc,aAVd,CAAA,GAU+B,MAV/B,CAAA,MAAA,EAU8C,aAV9C,CAAA,CAAA,CAAA,SAAA,CAAA,EAWN,iBAXM,CAWY,QAXZ,EAWsB,OAXtB,CAAA,CAAA,EAWsC,QAXtC,CAW+C,QAX/C,EAWyD,OAXzD,CAAA;KA0Dd,cAAA,GAAiB,WAzDH,GAAA;EAAL,SAAA,MAAA,EA0DK,MA1DL,CAAA,MAAA,EAAA,OAAA,CAAA;EACE,SAAA,KAAA,CAAA,EA0DG,MA1DH,CAAA,MAAA,EAAA,OAAA,CAAA;CACP;KA4DJ,YAAA,GAAe,aA5DL,CA4DmB,gBA5DnB,GAAA;EAGT,KAAA,EAAA,MAAoC;AAE1C,CAAA,CAAA;AACmB,iBAwDH,iBAAA,CAxDG,SAAA,CAAA,EAyDN,iBAzDM,CAyDY,cAzDZ,EAyD4B,MAzD5B,CAAA,MAAA,EAyD2C,YAzD3C,CAAA,CAAA,CAAA,EA0DhB,QA1DgB,CA0DP,cA1DO,EA0DS,MA1DT,CAAA,MAAA,EA0DwB,YA1DxB,CAAA,CAAA"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":[],"mappings":";;;AAS8E,KAGzE,iBAAA,CAAA,iBACc,WADG,GACW,WADX,EAAA,gBAEJ,MAFI,CAAA,MAAA,EAEW,iBAFX,CAAA,GAEgC,MAFhC,CAAA,MAAA,EAE+C,aAF/C,CAAA,CAAA,GAAA;EACH,MAAA,CAAA,EAAA,MAAA;EAAc,YAAA,CAAA,EAAA,MAAA;EACA,KAAA,CAAA,EAIvB,MAJuB,CAAA,MAAA,EAAA,MAAA,CAAA;EAAf,MAAA,CAAA,EAKP,OALO;EAAmD,OAAA,CAAA,EAMzD,IANyD,CAMpD,QANoD,EAAA,aAAA,CAAA;EAAf,YAAA,CAAA,EAOrC,MAPqC,CAAA,MAAA,EAOtB,mBAPsB,CAAA;EAI5C,YAAA,CAAA,EAIO,MAJP,CAAA,MAAA,EAIsB,MAJtB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EACC,cAAA,CAAA,EAIQ,MAJR,CAAA,MAAA,EAAA,OAAA,CAAA;EACM,SAAA,CAAA,EAIH,IAJG,CAIE,gBAJF,EAAA,eAAA,CAAA;EAAL,WAAA,CAAA,EAKI,eALJ,CAAA,MAAA,CAAA;EACoB,IAAA,CAAA,EAKvB,MALuB,CAAA,MAAA,EAAA,OAAA,CAAA;CAAf;cAQX,UAP0B,EAOU,eAPV,CAAA,aAAA,CAAA;AAAf,iBASD,cATC,CAAA,iBAUE,WAVF,GAUgB,WAVhB,EAAA,gBAWC,MAXD,CAAA,MAAA,EAWgB,iBAXhB,CAAA,GAWqC,MAXrC,CAAA,MAAA,EAWoD,aAXpD,CAAA,CAAA,CAAA,SAAA,CAAA,EAYJ,iBAZI,CAYc,QAZd,EAYwB,OAZxB,CAAA,CAAA,EAYwC,QAZxC,CAYiD,QAZjD,EAY2D,OAZ3D,CAAA;KA4DZ,cAAA,GAAiB,WA3DH,GAAA;EACA,SAAA,MAAA,EA2DA,MA3DA,CAAA,MAAA,EAAA,OAAA,CAAA;EAAL,SAAA,KAAA,CAAA,EA4DK,MA5DL,CAAA,MAAA,EAAA,OAAA,CAAA;CACE;KA8DX,YAAA,GAAe,aA7DX,CA6DyB,gBA7DzB,GAAA;EAAM,KAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAKC,iBA0DA,iBAAA,CA1Dc,SAAA,CAAA,EA2DjB,iBA3DiB,CA2DC,cA3DD,EA2DiB,MA3DjB,CAAA,MAAA,EA2DgC,YA3DhC,CAAA,CAAA,CAAA,EA4D3B,QA5D2B,CA4DlB,cA5DkB,EA4DF,MA5DE,CAAA,MAAA,EA4Da,YA5Db,CAAA,CAAA"}
package/dist/testing.mjs CHANGED
@@ -1,5 +1,6 @@
1
- import { n as coreHash } from "./types-BP4dqfP-.mjs";
2
- import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-BHjb-IPM.mjs";
1
+ import { t as coreHash } from "./types-aMyNgejf.mjs";
2
+ import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-CyaA_Qvf.mjs";
3
+ import { ifDefined } from "@prisma-next/utils/defined";
3
4
 
4
5
  //#region src/testing-factories.ts
5
6
  const DUMMY_HASH = coreHash("sha256:test");
@@ -27,6 +28,7 @@ function createContract(overrides = {}) {
27
28
  targetFamily,
28
29
  roots: overrides.roots ?? {},
29
30
  models: overrides.models ?? {},
31
+ ...ifDefined("valueObjects", overrides.valueObjects),
30
32
  storage,
31
33
  capabilities,
32
34
  extensionPacks: overrides.extensionPacks ?? {},
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":["import type { Contract } from './contract-types';\nimport type { ContractModel, ModelStorageBase } from './domain-types';\nimport { computeExecutionHash, computeProfileHash, computeStorageHash } from './hashing';\nimport type { ExecutionSection, ProfileHashBase, StorageBase } from './types';\nimport { coreHash } from './types';\n\ntype ContractOverrides<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModel> = Record<string, ContractModel>,\n> = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, string>;\n models?: TModels;\n storage?: Omit<TStorage, 'storageHash'>;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n execution?: Omit<ExecutionSection, 'executionHash'>;\n profileHash?: ProfileHashBase<string>;\n meta?: Record<string, unknown>;\n};\n\nconst DUMMY_HASH = coreHash('sha256:test');\n\nexport function createContract<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModel> = Record<string, ContractModel>,\n>(overrides: ContractOverrides<TStorage, TModels> = {}): Contract<TStorage, TModels> {\n const target = overrides.target ?? 'postgres';\n const targetFamily = overrides.targetFamily ?? 'sql';\n const capabilities = overrides.capabilities ?? {};\n\n const rawStorage =\n overrides.storage ?? ({ tables: {} } as unknown as Omit<TStorage, 'storageHash'>);\n\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: rawStorage as Record<string, unknown>,\n });\n\n const storage = {\n ...rawStorage,\n storageHash,\n } as TStorage;\n\n const computedProfileHash =\n overrides.profileHash ?? computeProfileHash({ target, targetFamily, capabilities });\n\n return {\n target,\n targetFamily,\n roots: overrides.roots ?? {},\n models: (overrides.models ?? {}) as TModels,\n storage,\n capabilities,\n extensionPacks: overrides.extensionPacks ?? {},\n ...(overrides.execution !== undefined\n ? {\n execution: {\n ...overrides.execution,\n executionHash: computeExecutionHash({\n target,\n targetFamily,\n execution: overrides.execution,\n }),\n },\n }\n : {}),\n profileHash: computedProfileHash,\n meta: overrides.meta ?? {},\n };\n}\n\ntype SqlStorageLike = StorageBase & {\n readonly tables: Record<string, unknown>;\n readonly types?: Record<string, unknown>;\n};\n\ntype SqlModelLike = ContractModel<ModelStorageBase & { table: string }>;\n\nexport function createSqlContract(\n overrides: ContractOverrides<SqlStorageLike, Record<string, SqlModelLike>> = {},\n): Contract<SqlStorageLike, Record<string, SqlModelLike>> {\n return createContract<SqlStorageLike, Record<string, SqlModelLike>>({\n target: 'postgres',\n targetFamily: 'sql',\n storage: overrides.storage ?? { tables: {} },\n ...overrides,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;AAsBA,MAAM,aAAa,SAAS,cAAc;AAE1C,SAAgB,eAGd,YAAkD,EAAE,EAA+B;CACnF,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,EAAE;CAEjD,MAAM,aACJ,UAAU,WAAY,EAAE,QAAQ,EAAE,EAAE;CAEtC,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA,SAAS;EACV,CAAC;CAEF,MAAM,UAAU;EACd,GAAG;EACH;EACD;CAED,MAAM,sBACJ,UAAU,eAAe,mBAAmB;EAAE;EAAQ;EAAc;EAAc,CAAC;AAErF,QAAO;EACL;EACA;EACA,OAAO,UAAU,SAAS,EAAE;EAC5B,QAAS,UAAU,UAAU,EAAE;EAC/B;EACA;EACA,gBAAgB,UAAU,kBAAkB,EAAE;EAC9C,GAAI,UAAU,cAAc,SACxB,EACE,WAAW;GACT,GAAG,UAAU;GACb,eAAe,qBAAqB;IAClC;IACA;IACA,WAAW,UAAU;IACtB,CAAC;GACH,EACF,GACD,EAAE;EACN,aAAa;EACb,MAAM,UAAU,QAAQ,EAAE;EAC3B;;AAUH,SAAgB,kBACd,YAA6E,EAAE,EACvB;AACxD,QAAO,eAA6D;EAClE,QAAQ;EACR,cAAc;EACd,SAAS,UAAU,WAAW,EAAE,QAAQ,EAAE,EAAE;EAC5C,GAAG;EACJ,CAAC"}
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { Contract } from './contract-types';\nimport type {\n ContractModel,\n ContractModelBase,\n ContractValueObject,\n ModelStorageBase,\n} from './domain-types';\nimport { computeExecutionHash, computeProfileHash, computeStorageHash } from './hashing';\nimport type { ExecutionSection, ProfileHashBase, StorageBase } from './types';\nimport { coreHash } from './types';\n\ntype ContractOverrides<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,\n> = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, string>;\n models?: TModels;\n storage?: Omit<TStorage, 'storageHash'>;\n valueObjects?: Record<string, ContractValueObject>;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n execution?: Omit<ExecutionSection, 'executionHash'>;\n profileHash?: ProfileHashBase<string>;\n meta?: Record<string, unknown>;\n};\n\nconst DUMMY_HASH = coreHash('sha256:test');\n\nexport function createContract<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,\n>(overrides: ContractOverrides<TStorage, TModels> = {}): Contract<TStorage, TModels> {\n const target = overrides.target ?? 'postgres';\n const targetFamily = overrides.targetFamily ?? 'sql';\n const capabilities = overrides.capabilities ?? {};\n\n const rawStorage =\n overrides.storage ?? ({ tables: {} } as unknown as Omit<TStorage, 'storageHash'>);\n\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: rawStorage as Record<string, unknown>,\n });\n\n const storage = {\n ...rawStorage,\n storageHash,\n } as TStorage;\n\n const computedProfileHash =\n overrides.profileHash ?? computeProfileHash({ target, targetFamily, capabilities });\n\n return {\n target,\n targetFamily,\n roots: overrides.roots ?? {},\n models: (overrides.models ?? {}) as TModels,\n ...ifDefined('valueObjects', overrides.valueObjects),\n storage,\n capabilities,\n extensionPacks: overrides.extensionPacks ?? {},\n ...(overrides.execution !== undefined\n ? {\n execution: {\n ...overrides.execution,\n executionHash: computeExecutionHash({\n target,\n targetFamily,\n execution: overrides.execution,\n }),\n },\n }\n : {}),\n profileHash: computedProfileHash,\n meta: overrides.meta ?? {},\n };\n}\n\ntype SqlStorageLike = StorageBase & {\n readonly tables: Record<string, unknown>;\n readonly types?: Record<string, unknown>;\n};\n\ntype SqlModelLike = ContractModel<ModelStorageBase & { table: string }>;\n\nexport function createSqlContract(\n overrides: ContractOverrides<SqlStorageLike, Record<string, SqlModelLike>> = {},\n): Contract<SqlStorageLike, Record<string, SqlModelLike>> {\n return createContract<SqlStorageLike, Record<string, SqlModelLike>>({\n target: 'postgres',\n targetFamily: 'sql',\n storage: overrides.storage ?? { tables: {} },\n ...overrides,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;;AA6BA,MAAM,aAAa,SAAS,cAAc;AAE1C,SAAgB,eAGd,YAAkD,EAAE,EAA+B;CACnF,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,EAAE;CAEjD,MAAM,aACJ,UAAU,WAAY,EAAE,QAAQ,EAAE,EAAE;CAEtC,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA,SAAS;EACV,CAAC;CAEF,MAAM,UAAU;EACd,GAAG;EACH;EACD;CAED,MAAM,sBACJ,UAAU,eAAe,mBAAmB;EAAE;EAAQ;EAAc;EAAc,CAAC;AAErF,QAAO;EACL;EACA;EACA,OAAO,UAAU,SAAS,EAAE;EAC5B,QAAS,UAAU,UAAU,EAAE;EAC/B,GAAG,UAAU,gBAAgB,UAAU,aAAa;EACpD;EACA;EACA,gBAAgB,UAAU,kBAAkB,EAAE;EAC9C,GAAI,UAAU,cAAc,SACxB,EACE,WAAW;GACT,GAAG,UAAU;GACb,eAAe,qBAAqB;IAClC;IACA;IACA,WAAW,UAAU;IACtB,CAAC;GACH,EACF,GACD,EAAE;EACN,aAAa;EACb,MAAM,UAAU,QAAQ,EAAE;EAC3B;;AAUH,SAAgB,kBACd,YAA6E,EAAE,EACvB;AACxD,QAAO,eAA6D;EAClE,QAAQ;EACR,cAAc;EACd,SAAS,UAAU,WAAW,EAAE,QAAQ,EAAE,EAAE;EAC5C,GAAG;EACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ //#region src/types.ts
2
+ function executionHash(value) {
3
+ return value;
4
+ }
5
+ function coreHash(value) {
6
+ return value;
7
+ }
8
+ function profileHash(value) {
9
+ return value;
10
+ }
11
+
12
+ //#endregion
13
+ export { executionHash as n, profileHash as r, coreHash as t };
14
+ //# sourceMappingURL=types-aMyNgejf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-aMyNgejf.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["/**\n * Unique symbol used as the key for branding types.\n */\nexport const $: unique symbol = Symbol('__prisma_next_brand__');\n\n/**\n * A helper type to brand a given type with a unique identifier.\n *\n * @template TKey Text used as the brand key.\n * @template TValue Optional value associated with the brand key. Defaults to `true`.\n */\nexport type Brand<TKey extends string | number | symbol, TValue = true> = {\n [$]: {\n [K in TKey]: TValue;\n };\n};\n\n/**\n * Base type for storage contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type StorageHash = StorageHashBase<'sha256:abc123...'>`\n */\nexport type StorageHashBase<THash extends string> = THash & Brand<'StorageHash'>;\n\n/**\n * Base type for execution contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ExecutionHash = ExecutionHashBase<'sha256:def456...'>`\n */\nexport type ExecutionHashBase<THash extends string> = THash & Brand<'ExecutionHash'>;\n\nexport function executionHash<const T extends string>(value: T): ExecutionHashBase<T> {\n return value as ExecutionHashBase<T>;\n}\n\nexport function coreHash<const T extends string>(value: T): StorageHashBase<T> {\n return value as StorageHashBase<T>;\n}\n\n/**\n * Base type for profile contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ProfileHash = ProfileHashBase<'sha256:def456...'>`\n */\nexport type ProfileHashBase<THash extends string> = THash & Brand<'ProfileHash'>;\n\nexport function profileHash<const T extends string>(value: T): ProfileHashBase<T> {\n return value as ProfileHashBase<T>;\n}\n\n/**\n * Base type for family-specific storage blocks.\n * Family storage types (SqlStorage, MongoStorage, etc.) extend this to carry the\n * storage hash alongside family-specific data (tables, collections, etc.).\n */\nexport interface StorageBase<THash extends string = string> {\n readonly storageHash: StorageHashBase<THash>;\n}\n\nexport interface FieldType {\n readonly type: string;\n readonly nullable: boolean;\n readonly items?: FieldType;\n readonly properties?: Record<string, FieldType>;\n}\n\nexport type GeneratedValueSpec = {\n readonly id: string;\n readonly params?: Record<string, unknown>;\n};\n\nexport type JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue =\n | JsonPrimitive\n | { readonly [key: string]: JsonValue }\n | readonly JsonValue[];\n\nexport type ColumnDefaultLiteralValue = JsonValue;\n\nexport type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | Date;\n\nexport type ColumnDefault =\n | {\n readonly kind: 'literal';\n readonly value: ColumnDefaultLiteralInputValue;\n }\n | { readonly kind: 'function'; readonly expression: string };\n\nexport type ExecutionMutationDefaultValue = {\n readonly kind: 'generator';\n readonly id: GeneratedValueSpec['id'];\n readonly params?: Record<string, unknown>;\n};\n\nexport type ExecutionMutationDefault = {\n readonly ref: { readonly table: string; readonly column: string };\n readonly onCreate?: ExecutionMutationDefaultValue;\n readonly onUpdate?: ExecutionMutationDefaultValue;\n};\n\nexport type ExecutionSection<THash extends string = string> = {\n readonly executionHash: ExecutionHashBase<THash>;\n readonly mutations: {\n readonly defaults: ReadonlyArray<ExecutionMutationDefault>;\n };\n};\n\nexport interface Source {\n readonly readOnly: boolean;\n readonly projection: Record<string, FieldType>;\n readonly origin?: Record<string, unknown>;\n readonly capabilities?: Record<string, boolean>;\n}\n\n// Document family types\nexport interface DocIndex {\n readonly name: string;\n readonly keys: Record<string, 'asc' | 'desc'>;\n readonly unique?: boolean;\n readonly where?: Expr;\n}\n\nexport type Expr =\n | { readonly kind: 'eq'; readonly path: ReadonlyArray<string>; readonly value: unknown }\n | { readonly kind: 'exists'; readonly path: ReadonlyArray<string> };\n\nexport interface DocCollection {\n readonly name: string;\n readonly id?: {\n readonly strategy: 'auto' | 'client' | 'uuid' | 'objectId';\n };\n readonly fields: Record<string, FieldType>;\n readonly indexes?: ReadonlyArray<DocIndex>;\n readonly readOnly?: boolean;\n}\n\n// Plan types - target-family agnostic execution types\nexport interface ParamDescriptor {\n readonly index?: number;\n readonly name?: string;\n readonly codecId?: string;\n readonly nativeType?: string;\n readonly nullable?: boolean;\n readonly source: 'dsl' | 'raw' | 'lane';\n readonly refs?: { table: string; column: string };\n}\n\nexport interface PlanRefs {\n readonly tables?: readonly string[];\n readonly columns?: ReadonlyArray<{ table: string; column: string }>;\n readonly indexes?: ReadonlyArray<{\n readonly table: string;\n readonly columns: ReadonlyArray<string>;\n readonly name?: string;\n }>;\n}\n\nexport interface PlanMeta {\n readonly target: string;\n readonly targetFamily?: string;\n readonly storageHash: string;\n readonly profileHash?: string;\n readonly lane: string;\n readonly annotations?: {\n codecs?: Record<string, string>; // alias/param → codec id ('ns/name@v')\n [key: string]: unknown;\n };\n readonly paramDescriptors: ReadonlyArray<ParamDescriptor>;\n readonly refs?: PlanRefs;\n readonly projection?: Record<string, string> | ReadonlyArray<string>;\n /**\n * Optional mapping of projection alias → column type ID (fully qualified ns/name@version).\n * Used for codec resolution when AST+refs don't provide enough type info.\n */\n readonly projectionTypes?: Record<string, string>;\n}\n\n/**\n * Canonical execution plan shape used by runtimes.\n *\n * - Row is the inferred result row type (TypeScript-only).\n * - Ast is the optional, family-specific AST type (e.g. SQL QueryAst).\n *\n * The payload executed by the runtime is represented by the sql + params pair\n * for now; future families can specialize this via Ast or additional metadata.\n */\nexport interface ExecutionPlan<Row = unknown, Ast = unknown> {\n readonly sql: string;\n readonly params: readonly unknown[];\n readonly ast?: Ast;\n readonly meta: PlanMeta;\n /**\n * Phantom property to carry the Row generic for type-level utilities.\n * Not set at runtime; used only for ResultType extraction.\n */\n readonly _row?: Row;\n}\n\n/**\n * Utility type to extract the Row type from an ExecutionPlan.\n * Example: `type Row = ResultType<typeof plan>`\n *\n * Works with both ExecutionPlan and SqlQueryPlan (SQL query plans before lowering).\n * SqlQueryPlan includes a phantom `_Row` property to preserve the generic parameter\n * for type extraction.\n */\nexport type ResultType<P> =\n P extends ExecutionPlan<infer R, unknown> ? R : P extends { readonly _Row?: infer R } ? R : never;\n\n/**\n * Contract marker record stored in the database.\n * Represents the current contract identity for a database.\n */\nexport interface ContractMarkerRecord {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson: unknown | null;\n readonly canonicalVersion: number | null;\n readonly updatedAt: Date;\n readonly appTag: string | null;\n readonly meta: Record<string, unknown>;\n}\n"],"mappings":";AA+BA,SAAgB,cAAsC,OAAgC;AACpF,QAAO;;AAGT,SAAgB,SAAiC,OAA8B;AAC7E,QAAO;;AAUT,SAAgB,YAAoC,OAA8B;AAChF,QAAO"}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as TaggedLiteralValue, B as ContractField, C as PlanRefs, D as StorageBase, E as Source, F as isTaggedBigInt, G as ContractVariantEntry, H as ContractReferenceRelation, I as isTaggedRaw, J as ReferenceRelationKeys, K as EmbedRelationKeys, L as profileHash, M as bigintJsonReplacer, N as coreHash, O as StorageHashBase, P as executionHash, R as ContractDiscriminator, S as PlanMeta, T as ResultType, U as ContractRelation, V as ContractModel, W as ContractRelationOn, _ as FieldType, a as ColumnDefault, b as JsonValue, c as ContractMarkerRecord, d as ExecutionHashBase, f as ExecutionMutationDefault, g as Expr, h as ExecutionSection, i as Brand, j as TaggedRaw, k as TaggedBigInt, l as DocCollection, m as ExecutionPlan, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultValue, q as ModelStorageBase, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as ProfileHashBase, x as ParamDescriptor, y as JsonPrimitive, z as ContractEmbedRelation } from "./contract-types-Cd9ic3zL.mjs";
2
- export { type $, type Brand, type ColumnDefault, type ColumnDefaultLiteralInputValue, type ColumnDefaultLiteralValue, type Contract, type ContractDiscriminator, type ContractEmbedRelation, type ContractExecutionSection, type ContractField, type ContractMarkerRecord, type ContractModel, type ContractReferenceRelation, type ContractRelation, type ContractRelationOn, type ContractVariantEntry, type DocCollection, type DocIndex, type EmbedRelationKeys, type ExecutionHashBase, type ExecutionMutationDefault, type ExecutionMutationDefaultValue, type ExecutionPlan, type ExecutionSection, type Expr, type FieldType, type GeneratedValueSpec, type JsonPrimitive, type JsonValue, type ModelStorageBase, type ParamDescriptor, type PlanMeta, type PlanRefs, type ProfileHashBase, type ReferenceRelationKeys, type ResultType, type Source, type StorageBase, type StorageHashBase, type TaggedBigInt, type TaggedLiteralValue, type TaggedRaw, bigintJsonReplacer, coreHash, executionHash, isTaggedBigInt, isTaggedRaw, profileHash };
1
+ import { A as executionHash, B as ContractRelationOn, C as PlanRefs, D as StorageBase, E as Source, F as ContractFieldType, G as ReferenceRelationKeys, H as ContractVariantEntry, I as ContractModel, J as ValueObjectFieldType, K as ScalarFieldType, L as ContractModelBase, M as ContractDiscriminator, N as ContractEmbedRelation, O as StorageHashBase, P as ContractField, R as ContractReferenceRelation, S as PlanMeta, T as ResultType, U as EmbedRelationKeys, V as ContractValueObject, W as ModelStorageBase, _ as FieldType, a as ColumnDefault, b as JsonValue, c as ContractMarkerRecord, d as ExecutionHashBase, f as ExecutionMutationDefault, g as Expr, h as ExecutionSection, i as Brand, j as profileHash, k as coreHash, l as DocCollection, m as ExecutionPlan, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultValue, q as UnionFieldType, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as ProfileHashBase, x as ParamDescriptor, y as JsonPrimitive, z as ContractRelation } from "./contract-types-MYdoYIIh.mjs";
2
+ export { type $, type Brand, type ColumnDefault, type ColumnDefaultLiteralInputValue, type ColumnDefaultLiteralValue, type Contract, type ContractDiscriminator, type ContractEmbedRelation, type ContractExecutionSection, type ContractField, type ContractFieldType, type ContractMarkerRecord, type ContractModel, type ContractModelBase, type ContractReferenceRelation, type ContractRelation, type ContractRelationOn, type ContractValueObject, type ContractVariantEntry, type DocCollection, type DocIndex, type EmbedRelationKeys, type ExecutionHashBase, type ExecutionMutationDefault, type ExecutionMutationDefaultValue, type ExecutionPlan, type ExecutionSection, type Expr, type FieldType, type GeneratedValueSpec, type JsonPrimitive, type JsonValue, type ModelStorageBase, type ParamDescriptor, type PlanMeta, type PlanRefs, type ProfileHashBase, type ReferenceRelationKeys, type ResultType, type ScalarFieldType, type Source, type StorageBase, type StorageHashBase, type UnionFieldType, type ValueObjectFieldType, coreHash, executionHash, profileHash };
package/dist/types.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as isTaggedRaw, i as isTaggedBigInt, n as coreHash, o as profileHash, r as executionHash, t as bigintJsonReplacer } from "./types-BP4dqfP-.mjs";
1
+ import { n as executionHash, r as profileHash, t as coreHash } from "./types-aMyNgejf.mjs";
2
2
 
3
- export { bigintJsonReplacer, coreHash, executionHash, isTaggedBigInt, isTaggedRaw, profileHash };
3
+ export { coreHash, executionHash, profileHash };
@@ -1,4 +1,4 @@
1
- import { t as Contract } from "./contract-types-Cd9ic3zL.mjs";
1
+ import { t as Contract } from "./contract-types-MYdoYIIh.mjs";
2
2
 
3
3
  //#region src/validate-contract.d.ts
4
4
  type ContractValidationPhase = 'structural' | 'domain' | 'storage';
@@ -1 +1 @@
1
- {"version":3,"file":"validate-contract.d.mts","names":[],"sources":["../src/validate-contract.ts"],"sourcesContent":[],"mappings":";;;KAKY,uBAAA;cAEC,uBAAA,SAAgC,KAAA;EAFjC,SAAA,IAAA,GAAA,4BAAuB;EAEtB,SAAA,KAAA,EAEK,uBAFmB;EAEnB,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAEoB,uBAFpB;;;;AAalB;AAmDA;AAAmD,KAnDvC,gBAAA,GAmDuC,CAAA,QAAA,EAnDT,QAmDS,EAAA,GAAA,IAAA;;;;;;;;;;;;;;;;;;;;iBAAnC,mCAAmC,4CAE/B,mBACjB"}
1
+ {"version":3,"file":"validate-contract.d.mts","names":[],"sources":["../src/validate-contract.ts"],"sourcesContent":[],"mappings":";;;KAKY,uBAAA;cAEC,uBAAA,SAAgC,KAAA;EAFjC,SAAA,IAAA,GAAA,4BAAuB;EAEtB,SAAA,KAAA,EAEK,uBAFmB;EAEnB,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAEoB,uBAFpB;;;;AAalB;AAqDA;AAAmD,KArDvC,gBAAA,GAqDuC,CAAA,QAAA,EArDT,QAqDS,EAAA,GAAA,IAAA;;;;;;;;;;;;;;;;;;;;iBAAnC,mCAAmC,4CAE/B,mBACjB"}
@@ -1,3 +1,3 @@
1
- import { n as ContractValidationError, r as validateContract } from "./validate-domain-BlwWyv01.mjs";
1
+ import { n as ContractValidationError, r as validateContract } from "./validate-domain-CpCcTlqJ.mjs";
2
2
 
3
3
  export { ContractValidationError, validateContract };
@@ -15,6 +15,7 @@ const ContractSchema = type({
15
15
  targetFamily: "string",
16
16
  roots: "Record<string, string>",
17
17
  models: "Record<string, unknown>",
18
+ "valueObjects?": "Record<string, unknown>",
18
19
  storage: "Record<string, unknown>",
19
20
  capabilities: "Record<string, Record<string, boolean>>",
20
21
  extensionPacks: "Record<string, unknown>",
@@ -32,7 +33,8 @@ function stripPersistenceFields(raw) {
32
33
  function extractDomainShape(contract) {
33
34
  return {
34
35
  roots: contract.roots,
35
- models: contract.models
36
+ models: contract.models,
37
+ ...contract.valueObjects ? { valueObjects: contract.valueObjects } : {}
36
38
  };
37
39
  }
38
40
  /**
@@ -74,6 +76,8 @@ function validateContractDomain(contract) {
74
76
  validateRelationTargets(contract, modelNames, errors);
75
77
  validateDiscriminators(contract, errors);
76
78
  validateOwnership(contract, modelNames, errors);
79
+ validateValueObjectReferences(contract, errors);
80
+ validateFieldModifiers(contract, errors);
77
81
  if (errors.length > 0) throw new ContractValidationError(`Contract domain validation failed:\n- ${errors.join("\n- ")}`, "domain");
78
82
  }
79
83
  function validateRoots(contract, modelNames, errors) {
@@ -131,7 +135,31 @@ function validateOwnership(contract, modelNames, errors) {
131
135
  for (const [rootKey, rootModel] of Object.entries(contract.roots)) if (rootModel === modelName) errors.push(`Owned model "${modelName}" must not appear in roots (found as root "${rootKey}")`);
132
136
  }
133
137
  }
138
+ function forEachContractField(contract, callback) {
139
+ for (const [modelName, model] of Object.entries(contract.models)) for (const [fieldName, field] of Object.entries(model.fields)) callback(field, `Model "${modelName}" field "${fieldName}"`);
140
+ for (const [voName, vo] of Object.entries(contract.valueObjects ?? {})) for (const [fieldName, field] of Object.entries(vo.fields)) callback(field, `Value object "${voName}" field "${fieldName}"`);
141
+ }
142
+ function validateValueObjectReferences(contract, errors) {
143
+ const voNames = new Set(Object.keys(contract.valueObjects ?? {}));
144
+ function checkType(type$1, location) {
145
+ if (!type$1) return;
146
+ if (type$1.kind === "valueObject" && type$1.name && !voNames.has(type$1.name)) {
147
+ errors.push(`${location} references value object "${type$1.name}" which does not exist in valueObjects`);
148
+ return;
149
+ }
150
+ if (type$1.kind === "union") for (const member of type$1.members ?? []) checkType(member, location);
151
+ }
152
+ forEachContractField(contract, (field, location) => {
153
+ checkType(field?.type, location);
154
+ });
155
+ }
156
+ function validateFieldModifiers(contract, errors) {
157
+ forEachContractField(contract, (field, location) => {
158
+ const f = field;
159
+ if (f?.many && f?.dict) errors.push(`${location} cannot have both "many" and "dict" modifiers`);
160
+ });
161
+ }
134
162
 
135
163
  //#endregion
136
164
  export { ContractValidationError as n, validateContract as r, validateContractDomain as t };
137
- //# sourceMappingURL=validate-domain-BlwWyv01.mjs.map
165
+ //# sourceMappingURL=validate-domain-CpCcTlqJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-domain-CpCcTlqJ.mjs","names":["errors: string[]","type"],"sources":["../src/validate-contract.ts","../src/validate-domain.ts"],"sourcesContent":["import { type } from 'arktype';\nimport type { Contract } from './contract-types';\nimport type { DomainContractShape } from './validate-domain';\nimport { validateContractDomain } from './validate-domain';\n\nexport type ContractValidationPhase = 'structural' | 'domain' | 'storage';\n\nexport class ContractValidationError extends Error {\n readonly code = 'CONTRACT.VALIDATION_FAILED';\n readonly phase: ContractValidationPhase;\n\n constructor(message: string, phase: ContractValidationPhase) {\n super(message);\n this.name = 'ContractValidationError';\n this.phase = phase;\n }\n}\n\n/**\n * Family-provided storage validator.\n * SQL validates tables/columns/FKs; Mongo validates collections/embedding.\n */\nexport type StorageValidator = (contract: Contract) => void;\n\nconst ContractSchema = type({\n target: 'string',\n targetFamily: 'string',\n roots: 'Record<string, string>',\n models: 'Record<string, unknown>',\n 'valueObjects?': 'Record<string, unknown>',\n storage: 'Record<string, unknown>',\n capabilities: 'Record<string, Record<string, boolean>>',\n extensionPacks: 'Record<string, unknown>',\n meta: 'Record<string, unknown>',\n 'execution?': {\n 'executionHash?': 'string',\n mutations: {\n defaults: 'unknown[]',\n },\n },\n profileHash: 'string',\n});\n\nfunction stripPersistenceFields(raw: Record<string, unknown>): Record<string, unknown> {\n const { schemaVersion: _, _generated: _g, ...rest } = raw;\n return rest;\n}\n\nfunction extractDomainShape(contract: Contract): DomainContractShape {\n return {\n roots: contract.roots,\n models: contract.models,\n ...(contract.valueObjects ? { valueObjects: contract.valueObjects } : {}),\n };\n}\n\n/**\n * Framework-level contract validation (ADR 182).\n *\n * Three-pass validation:\n * 1. **Structural validation** (arktype): verifies required fields exist with\n * correct base types.\n * 2. **Domain validation** (framework-owned): roots, relation targets,\n * variant/base consistency, discriminators, ownership, orphans.\n * 3. **Storage validation** (family-provided): SQL validates tables/columns/FKs;\n * Mongo validates collections/embedding.\n *\n * JSON persistence fields (`schemaVersion`, `_generated`) are stripped before\n * validation — they are not part of the in-memory contract representation.\n *\n * @template TContract The fully-typed contract type (preserves literal types).\n * @param value Raw contract value (e.g. parsed from JSON).\n * @param storageValidator Family-specific storage validation function.\n * @returns The validated contract with full literal types.\n */\nexport function validateContract<TContract extends Contract>(\n value: unknown,\n storageValidator: StorageValidator,\n): TContract {\n if (typeof value !== 'object' || value === null) {\n throw new ContractValidationError('Contract must be a non-null object', 'structural');\n }\n\n const stripped = stripPersistenceFields(value as Record<string, unknown>);\n\n const parsed = ContractSchema(stripped);\n if (parsed instanceof type.errors) {\n throw new ContractValidationError(\n `Invalid contract structure: ${parsed.summary}`,\n 'structural',\n );\n }\n\n const contract = parsed as unknown as Contract;\n\n validateContractDomain(extractDomainShape(contract));\n\n storageValidator(contract);\n\n return contract as unknown as TContract;\n}\n","import { ContractValidationError } from './validate-contract';\n\nexport interface DomainModelShape {\n readonly fields: Record<string, unknown>;\n readonly relations?: Record<string, { readonly to: string }>;\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, unknown>;\n readonly base?: string;\n readonly owner?: string;\n}\n\nexport interface DomainContractShape {\n readonly roots: Record<string, string>;\n readonly models: Record<string, DomainModelShape>;\n readonly valueObjects?: Record<string, { readonly fields: Record<string, unknown> }>;\n}\n\nexport function validateContractDomain(contract: DomainContractShape): void {\n const errors: string[] = [];\n const modelNames = new Set(Object.keys(contract.models));\n\n validateRoots(contract, modelNames, errors);\n validateVariantsAndBases(contract, modelNames, errors);\n validateRelationTargets(contract, modelNames, errors);\n validateDiscriminators(contract, errors);\n validateOwnership(contract, modelNames, errors);\n validateValueObjectReferences(contract, errors);\n validateFieldModifiers(contract, errors);\n\n if (errors.length > 0) {\n throw new ContractValidationError(\n `Contract domain validation failed:\\n- ${errors.join('\\n- ')}`,\n 'domain',\n );\n }\n}\n\nfunction validateRoots(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const seenValues = new Set<string>();\n for (const [rootKey, modelName] of Object.entries(contract.roots)) {\n if (seenValues.has(modelName)) {\n errors.push(`Duplicate root value: \"${modelName}\" is mapped by multiple root keys`);\n }\n seenValues.add(modelName);\n\n if (!modelNames.has(modelName)) {\n errors.push(\n `Root \"${rootKey}\" references model \"${modelName}\" which does not exist in models`,\n );\n }\n }\n}\n\nfunction validateVariantsAndBases(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const models = new Map(Object.entries(contract.models));\n\n for (const [modelName, model] of models) {\n if (model.variants) {\n for (const variantName of Object.keys(model.variants)) {\n if (!modelNames.has(variantName)) {\n errors.push(\n `Model \"${modelName}\" lists variant \"${variantName}\" which does not exist in models`,\n );\n continue;\n }\n const variantModel = models.get(variantName);\n if (!variantModel) continue;\n if (variantModel.base !== modelName) {\n errors.push(\n `Variant \"${variantName}\" has base \"${variantModel.base ?? '(none)'}\" but expected \"${modelName}\"`,\n );\n }\n }\n }\n\n if (model.base) {\n if (!modelNames.has(model.base)) {\n errors.push(`Model \"${modelName}\" has base \"${model.base}\" which does not exist in models`);\n continue;\n }\n const baseModel = models.get(model.base);\n if (!baseModel) continue;\n if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${model.base}\" which does not list it as a variant`,\n );\n }\n }\n }\n}\n\nfunction validateRelationTargets(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n if (!modelNames.has(relation.to)) {\n errors.push(\n `Relation \"${relName}\" on model \"${modelName}\" targets \"${relation.to}\" which does not exist in models`,\n );\n }\n }\n }\n}\n\nfunction validateDiscriminators(contract: DomainContractShape, errors: string[]): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.discriminator) {\n if (!model.variants || Object.keys(model.variants).length === 0) {\n errors.push(`Model \"${modelName}\" has discriminator but no variants`);\n }\n if (!Object.hasOwn(model.fields, model.discriminator.field)) {\n errors.push(\n `Discriminator field \"${model.discriminator.field}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (model.variants && Object.keys(model.variants).length > 0 && !model.discriminator) {\n errors.push(`Model \"${modelName}\" has variants but no discriminator`);\n }\n\n if (model.base) {\n if (model.discriminator) {\n errors.push(`Model \"${modelName}\" has base and must not have discriminator`);\n }\n if (model.variants && Object.keys(model.variants).length > 0) {\n errors.push(`Model \"${modelName}\" has base and must not have variants`);\n }\n }\n }\n}\n\nfunction validateOwnership(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (!model.owner) continue;\n\n if (model.owner === modelName) {\n errors.push(`Model \"${modelName}\" cannot own itself`);\n }\n\n if (!modelNames.has(model.owner)) {\n errors.push(`Model \"${modelName}\" has owner \"${model.owner}\" which does not exist in models`);\n }\n\n for (const [rootKey, rootModel] of Object.entries(contract.roots)) {\n if (rootModel === modelName) {\n errors.push(\n `Owned model \"${modelName}\" must not appear in roots (found as root \"${rootKey}\")`,\n );\n }\n }\n }\n}\n\ninterface FieldTypeLike {\n readonly kind?: string;\n readonly name?: string;\n readonly members?: readonly FieldTypeLike[];\n}\n\ninterface FieldLike {\n readonly type?: FieldTypeLike;\n readonly many?: boolean;\n readonly dict?: boolean;\n}\n\nfunction forEachContractField(\n contract: DomainContractShape,\n callback: (field: unknown, location: string) => void,\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [fieldName, field] of Object.entries(model.fields)) {\n callback(field, `Model \"${modelName}\" field \"${fieldName}\"`);\n }\n }\n for (const [voName, vo] of Object.entries(contract.valueObjects ?? {})) {\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n callback(field, `Value object \"${voName}\" field \"${fieldName}\"`);\n }\n }\n}\n\nfunction validateValueObjectReferences(contract: DomainContractShape, errors: string[]): void {\n const voNames = new Set(Object.keys(contract.valueObjects ?? {}));\n\n function checkType(type: FieldTypeLike | undefined, location: string): void {\n if (!type) return;\n if (type.kind === 'valueObject' && type.name && !voNames.has(type.name)) {\n errors.push(\n `${location} references value object \"${type.name}\" which does not exist in valueObjects`,\n );\n return;\n }\n if (type.kind === 'union') {\n for (const member of type.members ?? []) checkType(member, location);\n }\n }\n\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n checkType(f?.type, location);\n });\n}\n\nfunction validateFieldModifiers(contract: DomainContractShape, errors: string[]): void {\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n if (f?.many && f?.dict) {\n errors.push(`${location} cannot have both \"many\" and \"dict\" modifiers`);\n }\n });\n}\n"],"mappings":"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"}
@@ -14,6 +14,9 @@ interface DomainModelShape {
14
14
  interface DomainContractShape {
15
15
  readonly roots: Record<string, string>;
16
16
  readonly models: Record<string, DomainModelShape>;
17
+ readonly valueObjects?: Record<string, {
18
+ readonly fields: Record<string, unknown>;
19
+ }>;
17
20
  }
18
21
  declare function validateContractDomain(contract: DomainContractShape): void;
19
22
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"sourcesContent":[],"mappings":";UAEiB,gBAAA;EAAA,SAAA,MAAA,EACE,MADc,CAAA,MAAA,EAAA,OAAA,CAAA;EACd,SAAA,SAAA,CAAA,EACI,MADJ,CAAA,MAAA,EAAA;IACI,SAAA,EAAA,EAAA,MAAA;EAED,CAAA,CAAA;EAAM,SAAA,aAAA,CAAA,EAAA;IAKX,SAAA,KAAA,EAAA,MAAmB;EAClB,CAAA;EACgB,SAAA,QAAA,CAAA,EAPZ,MAOY,CAAA,MAAA,EAAA,OAAA,CAAA;EAAf,SAAA,IAAA,CAAA,EAAA,MAAA;EAAM,SAAA,KAAA,CAAA,EAAA,MAAA;AAGzB;UALiB,mBAAA;kBACC;mBACC,eAAe;;iBAGlB,sBAAA,WAAiC"}
1
+ {"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"sourcesContent":[],"mappings":";UAEiB,gBAAA;EAAA,SAAA,MAAA,EACE,MADc,CAAA,MAAA,EAAA,OAAA,CAAA;EACd,SAAA,SAAA,CAAA,EACI,MADJ,CAAA,MAAA,EAAA;IACI,SAAA,EAAA,EAAA,MAAA;EAED,CAAA,CAAA;EAAM,SAAA,aAAA,CAAA,EAAA;IAKX,SAAA,KAAA,EAAA,MAAmB;EAClB,CAAA;EACgB,SAAA,QAAA,CAAA,EAPZ,MAOY,CAAA,MAAA,EAAA,OAAA,CAAA;EAAf,SAAA,IAAA,CAAA,EAAA,MAAA;EACyC,SAAA,KAAA,CAAA,EAAA,MAAA;;AAA5B,UAHf,mBAAA,CAGe;EAGhB,SAAA,KAAA,EALE,MAKF,CAAA,MAAsB,EAAA,MAAW,CAAA;mBAJ9B,eAAe;0BACR;qBAAkC;;;iBAG5C,sBAAA,WAAiC"}
@@ -1,3 +1,3 @@
1
- import { t as validateContractDomain } from "./validate-domain-BlwWyv01.mjs";
1
+ import { t as validateContractDomain } from "./validate-domain-CpCcTlqJ.mjs";
2
2
 
3
3
  export { validateContractDomain };
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@prisma-next/contract",
3
- "version": "0.3.0-dev.144",
3
+ "version": "0.3.0-dev.146",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Data contract type definitions and JSON schema for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.29",
9
- "@prisma-next/utils": "0.3.0-dev.144"
9
+ "@prisma-next/utils": "0.3.0-dev.146"
10
10
  },
11
11
  "devDependencies": {
12
12
  "tsdown": "0.18.4",
13
13
  "typescript": "5.9.3",
14
14
  "vitest": "4.0.17",
15
15
  "@prisma-next/test-utils": "0.0.1",
16
- "@prisma-next/tsdown": "0.0.0",
17
- "@prisma-next/tsconfig": "0.0.0"
16
+ "@prisma-next/tsconfig": "0.0.0",
17
+ "@prisma-next/tsdown": "0.0.0"
18
18
  },
19
19
  "files": [
20
20
  "dist",
@@ -35,7 +35,7 @@
35
35
  "repository": {
36
36
  "type": "git",
37
37
  "url": "https://github.com/prisma/prisma-next.git",
38
- "directory": "packages/1-framework/0-foundation/shared/contract"
38
+ "directory": "packages/1-framework/0-foundation/contract"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsdown",
@@ -2,7 +2,6 @@ import { isArrayEqual } from '@prisma-next/utils/array-equal';
2
2
  import { ifDefined } from '@prisma-next/utils/defined';
3
3
 
4
4
  import type { Contract } from './contract-types';
5
- import { bigintJsonReplacer } from './types';
6
5
 
7
6
  const TOP_LEVEL_ORDER = [
8
7
  'schemaVersion',
@@ -12,6 +11,7 @@ const TOP_LEVEL_ORDER = [
12
11
  'profileHash',
13
12
  'roots',
14
13
  'models',
14
+ 'valueObjects',
15
15
  'storage',
16
16
  'execution',
17
17
  'capabilities',
@@ -22,7 +22,6 @@ const TOP_LEVEL_ORDER = [
22
22
  function isDefaultValue(value: unknown): boolean {
23
23
  if (value === false) return true;
24
24
  if (value === null) return false;
25
- if (value instanceof Date) return false;
26
25
  if (Array.isArray(value) && value.length === 0) return true;
27
26
  if (typeof value === 'object' && value !== null) {
28
27
  const keys = Object.keys(value);
@@ -36,10 +35,6 @@ function omitDefaults(obj: unknown, path: readonly string[]): unknown {
36
35
  return obj;
37
36
  }
38
37
 
39
- if (obj instanceof Date) {
40
- return obj;
41
- }
42
-
43
38
  if (Array.isArray(obj)) {
44
39
  return obj.map((item) => omitDefaults(item, path));
45
40
  }
@@ -146,10 +141,6 @@ function sortObjectKeys(obj: unknown): unknown {
146
141
  return obj;
147
142
  }
148
143
 
149
- if (obj instanceof Date) {
150
- return obj;
151
- }
152
-
153
144
  if (Array.isArray(obj)) {
154
145
  return obj.map((item) => sortObjectKeys(item));
155
146
  }
@@ -250,6 +241,7 @@ export function canonicalizeContractToObject(
250
241
  profileHash: contract.profileHash,
251
242
  roots: contract.roots,
252
243
  models: contract.models,
244
+ ...ifDefined('valueObjects', contract.valueObjects),
253
245
  storage: contract.storage,
254
246
  ...ifDefined('execution', contract.execution),
255
247
  extensionPacks: contract.extensionPacks,
@@ -267,5 +259,5 @@ export function canonicalizeContract(
267
259
  contract: Contract,
268
260
  options?: { schemaVersion?: string },
269
261
  ): string {
270
- return JSON.stringify(canonicalizeContractToObject(contract, options), bigintJsonReplacer, 2);
262
+ return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);
271
263
  }
@@ -1,4 +1,4 @@
1
- import type { ContractModel } from './domain-types';
1
+ import type { ContractModelBase, ContractValueObject } from './domain-types';
2
2
  import type {
3
3
  ExecutionHashBase,
4
4
  ExecutionMutationDefault,
@@ -39,12 +39,13 @@ export type ContractExecutionSection<THash extends string = string> = {
39
39
  */
40
40
  export interface Contract<
41
41
  TStorage extends StorageBase = StorageBase,
42
- TModels extends Record<string, ContractModel> = Record<string, ContractModel>,
42
+ TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>,
43
43
  > {
44
44
  readonly target: string;
45
45
  readonly targetFamily: string;
46
46
  readonly roots: Record<string, string>;
47
47
  readonly models: TModels;
48
+ readonly valueObjects?: Record<string, ContractValueObject>;
48
49
  readonly storage: TStorage;
49
50
  readonly capabilities: Record<string, Record<string, boolean>>;
50
51
  readonly extensionPacks: Record<string, unknown>;
@@ -1,6 +1,26 @@
1
+ export type ScalarFieldType = {
2
+ readonly kind: 'scalar';
3
+ readonly codecId: string;
4
+ readonly typeParams?: Record<string, unknown>;
5
+ };
6
+
7
+ export type ValueObjectFieldType = {
8
+ readonly kind: 'valueObject';
9
+ readonly name: string;
10
+ };
11
+
12
+ export type UnionFieldType = {
13
+ readonly kind: 'union';
14
+ readonly members: ReadonlyArray<ScalarFieldType | ValueObjectFieldType>;
15
+ };
16
+
17
+ export type ContractFieldType = ScalarFieldType | ValueObjectFieldType | UnionFieldType;
18
+
1
19
  export type ContractField = {
2
20
  readonly nullable: boolean;
3
- readonly codecId: string;
21
+ readonly type: ContractFieldType;
22
+ readonly many?: true;
23
+ readonly dict?: true;
4
24
  };
5
25
 
6
26
  export type ContractRelationOn = {
@@ -29,9 +49,13 @@ export type ContractVariantEntry = {
29
49
  readonly value: string;
30
50
  };
31
51
 
52
+ export type ContractValueObject = {
53
+ readonly fields: Record<string, ContractField>;
54
+ };
55
+
32
56
  export type ModelStorageBase = Readonly<Record<string, unknown>>;
33
57
 
34
- export interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> {
58
+ export interface ContractModelBase<TModelStorage extends ModelStorageBase = ModelStorageBase> {
35
59
  readonly fields: Record<string, ContractField>;
36
60
  readonly relations: Record<string, ContractRelation>;
37
61
  readonly storage: TModelStorage;
@@ -41,7 +65,10 @@ export interface ContractModel<TModelStorage extends ModelStorageBase = ModelSto
41
65
  readonly owner?: string;
42
66
  }
43
67
 
44
- // ── Backward-compatible aliases ──────────────────────────────────────────────
68
+ export interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase>
69
+ extends ContractModelBase<TModelStorage> {
70
+ readonly fields: Record<string, ContractField>;
71
+ }
45
72
 
46
73
  // ── Relation key helpers ─────────────────────────────────────────────────────
47
74
 
@@ -3,14 +3,20 @@ export type {
3
3
  ContractDiscriminator,
4
4
  ContractEmbedRelation,
5
5
  ContractField,
6
+ ContractFieldType,
6
7
  ContractModel,
8
+ ContractModelBase,
7
9
  ContractReferenceRelation,
8
10
  ContractRelation,
9
11
  ContractRelationOn,
12
+ ContractValueObject,
10
13
  ContractVariantEntry,
11
14
  EmbedRelationKeys,
12
15
  ModelStorageBase,
13
16
  ReferenceRelationKeys,
17
+ ScalarFieldType,
18
+ UnionFieldType,
19
+ ValueObjectFieldType,
14
20
  } from '../domain-types';
15
21
  export type {
16
22
  $,
@@ -39,15 +45,5 @@ export type {
39
45
  Source,
40
46
  StorageBase,
41
47
  StorageHashBase,
42
- TaggedBigInt,
43
- TaggedLiteralValue,
44
- TaggedRaw,
45
- } from '../types';
46
- export {
47
- bigintJsonReplacer,
48
- coreHash,
49
- executionHash,
50
- isTaggedBigInt,
51
- isTaggedRaw,
52
- profileHash,
53
48
  } from '../types';
49
+ export { coreHash, executionHash, profileHash } from '../types';
@@ -1,18 +1,25 @@
1
+ import { ifDefined } from '@prisma-next/utils/defined';
1
2
  import type { Contract } from './contract-types';
2
- import type { ContractModel, ModelStorageBase } from './domain-types';
3
+ import type {
4
+ ContractModel,
5
+ ContractModelBase,
6
+ ContractValueObject,
7
+ ModelStorageBase,
8
+ } from './domain-types';
3
9
  import { computeExecutionHash, computeProfileHash, computeStorageHash } from './hashing';
4
10
  import type { ExecutionSection, ProfileHashBase, StorageBase } from './types';
5
11
  import { coreHash } from './types';
6
12
 
7
13
  type ContractOverrides<
8
14
  TStorage extends StorageBase = StorageBase,
9
- TModels extends Record<string, ContractModel> = Record<string, ContractModel>,
15
+ TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,
10
16
  > = {
11
17
  target?: string;
12
18
  targetFamily?: string;
13
19
  roots?: Record<string, string>;
14
20
  models?: TModels;
15
21
  storage?: Omit<TStorage, 'storageHash'>;
22
+ valueObjects?: Record<string, ContractValueObject>;
16
23
  capabilities?: Record<string, Record<string, boolean>>;
17
24
  extensionPacks?: Record<string, unknown>;
18
25
  execution?: Omit<ExecutionSection, 'executionHash'>;
@@ -24,7 +31,7 @@ const DUMMY_HASH = coreHash('sha256:test');
24
31
 
25
32
  export function createContract<
26
33
  TStorage extends StorageBase = StorageBase,
27
- TModels extends Record<string, ContractModel> = Record<string, ContractModel>,
34
+ TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,
28
35
  >(overrides: ContractOverrides<TStorage, TModels> = {}): Contract<TStorage, TModels> {
29
36
  const target = overrides.target ?? 'postgres';
30
37
  const targetFamily = overrides.targetFamily ?? 'sql';
@@ -52,6 +59,7 @@ export function createContract<
52
59
  targetFamily,
53
60
  roots: overrides.roots ?? {},
54
61
  models: (overrides.models ?? {}) as TModels,
62
+ ...ifDefined('valueObjects', overrides.valueObjects),
55
63
  storage,
56
64
  capabilities,
57
65
  extensionPacks: overrides.extensionPacks ?? {},
package/src/types.ts CHANGED
@@ -76,40 +76,9 @@ export type JsonValue =
76
76
  | { readonly [key: string]: JsonValue }
77
77
  | readonly JsonValue[];
78
78
 
79
- export type TaggedBigInt = { readonly $type: 'bigint'; readonly value: string };
80
-
81
- export function isTaggedBigInt(value: unknown): value is TaggedBigInt {
82
- return (
83
- typeof value === 'object' &&
84
- value !== null &&
85
- (value as { $type?: unknown }).$type === 'bigint' &&
86
- typeof (value as { value?: unknown }).value === 'string'
87
- );
88
- }
89
-
90
- export function bigintJsonReplacer(_key: string, value: unknown): unknown {
91
- if (typeof value === 'bigint') {
92
- return { $type: 'bigint', value: value.toString() } satisfies TaggedBigInt;
93
- }
94
- return value;
95
- }
96
-
97
- export type TaggedRaw = { readonly $type: 'raw'; readonly value: JsonValue };
98
-
99
- export function isTaggedRaw(value: unknown): value is TaggedRaw {
100
- return (
101
- typeof value === 'object' &&
102
- value !== null &&
103
- (value as { $type?: unknown }).$type === 'raw' &&
104
- 'value' in (value as object)
105
- );
106
- }
107
-
108
- export type TaggedLiteralValue = TaggedBigInt | TaggedRaw;
109
-
110
- export type ColumnDefaultLiteralValue = JsonValue | TaggedLiteralValue;
79
+ export type ColumnDefaultLiteralValue = JsonValue;
111
80
 
112
- export type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | bigint | Date;
81
+ export type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | Date;
113
82
 
114
83
  export type ColumnDefault =
115
84
  | {
@@ -27,6 +27,7 @@ const ContractSchema = type({
27
27
  targetFamily: 'string',
28
28
  roots: 'Record<string, string>',
29
29
  models: 'Record<string, unknown>',
30
+ 'valueObjects?': 'Record<string, unknown>',
30
31
  storage: 'Record<string, unknown>',
31
32
  capabilities: 'Record<string, Record<string, boolean>>',
32
33
  extensionPacks: 'Record<string, unknown>',
@@ -49,6 +50,7 @@ function extractDomainShape(contract: Contract): DomainContractShape {
49
50
  return {
50
51
  roots: contract.roots,
51
52
  models: contract.models,
53
+ ...(contract.valueObjects ? { valueObjects: contract.valueObjects } : {}),
52
54
  };
53
55
  }
54
56
 
@@ -12,6 +12,7 @@ export interface DomainModelShape {
12
12
  export interface DomainContractShape {
13
13
  readonly roots: Record<string, string>;
14
14
  readonly models: Record<string, DomainModelShape>;
15
+ readonly valueObjects?: Record<string, { readonly fields: Record<string, unknown> }>;
15
16
  }
16
17
 
17
18
  export function validateContractDomain(contract: DomainContractShape): void {
@@ -23,6 +24,8 @@ export function validateContractDomain(contract: DomainContractShape): void {
23
24
  validateRelationTargets(contract, modelNames, errors);
24
25
  validateDiscriminators(contract, errors);
25
26
  validateOwnership(contract, modelNames, errors);
27
+ validateValueObjectReferences(contract, errors);
28
+ validateFieldModifiers(contract, errors);
26
29
 
27
30
  if (errors.length > 0) {
28
31
  throw new ContractValidationError(
@@ -163,3 +166,62 @@ function validateOwnership(
163
166
  }
164
167
  }
165
168
  }
169
+
170
+ interface FieldTypeLike {
171
+ readonly kind?: string;
172
+ readonly name?: string;
173
+ readonly members?: readonly FieldTypeLike[];
174
+ }
175
+
176
+ interface FieldLike {
177
+ readonly type?: FieldTypeLike;
178
+ readonly many?: boolean;
179
+ readonly dict?: boolean;
180
+ }
181
+
182
+ function forEachContractField(
183
+ contract: DomainContractShape,
184
+ callback: (field: unknown, location: string) => void,
185
+ ): void {
186
+ for (const [modelName, model] of Object.entries(contract.models)) {
187
+ for (const [fieldName, field] of Object.entries(model.fields)) {
188
+ callback(field, `Model "${modelName}" field "${fieldName}"`);
189
+ }
190
+ }
191
+ for (const [voName, vo] of Object.entries(contract.valueObjects ?? {})) {
192
+ for (const [fieldName, field] of Object.entries(vo.fields)) {
193
+ callback(field, `Value object "${voName}" field "${fieldName}"`);
194
+ }
195
+ }
196
+ }
197
+
198
+ function validateValueObjectReferences(contract: DomainContractShape, errors: string[]): void {
199
+ const voNames = new Set(Object.keys(contract.valueObjects ?? {}));
200
+
201
+ function checkType(type: FieldTypeLike | undefined, location: string): void {
202
+ if (!type) return;
203
+ if (type.kind === 'valueObject' && type.name && !voNames.has(type.name)) {
204
+ errors.push(
205
+ `${location} references value object "${type.name}" which does not exist in valueObjects`,
206
+ );
207
+ return;
208
+ }
209
+ if (type.kind === 'union') {
210
+ for (const member of type.members ?? []) checkType(member, location);
211
+ }
212
+ }
213
+
214
+ forEachContractField(contract, (field, location) => {
215
+ const f = field as FieldLike | undefined;
216
+ checkType(f?.type, location);
217
+ });
218
+ }
219
+
220
+ function validateFieldModifiers(contract: DomainContractShape, errors: string[]): void {
221
+ forEachContractField(contract, (field, location) => {
222
+ const f = field as FieldLike | undefined;
223
+ if (f?.many && f?.dict) {
224
+ errors.push(`${location} cannot have both "many" and "dict" modifiers`);
225
+ }
226
+ });
227
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract-types-Cd9ic3zL.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hashing-BHjb-IPM.mjs","names":["result: Record<string, unknown>","sorted: Record<string, unknown>","result: StorageObject","sortedTable: TableObject","ordered: Record<string, unknown>"],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nimport type { Contract } from './contract-types';\nimport { bigintJsonReplacer } from './types';\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'storage',\n 'execution',\n 'capabilities',\n 'extensionPacks',\n 'meta',\n] as const;\n\nfunction isDefaultValue(value: unknown): boolean {\n if (value === false) return true;\n if (value === null) return false;\n if (value instanceof Date) return false;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n return keys.length === 0;\n }\n return false;\n}\n\nfunction omitDefaults(obj: unknown, path: readonly string[]): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => omitDefaults(item, path));\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n\n if (key === '_generated') {\n continue;\n }\n\n if (key === 'generated' && value === false) {\n continue;\n }\n\n if ((key === 'onDelete' || key === 'onUpdate') && value === 'noAction') {\n continue;\n }\n\n if (isDefaultValue(value)) {\n const isRequiredModels = isArrayEqual(currentPath, ['models']);\n const isRequiredTables = isArrayEqual(currentPath, ['storage', 'tables']);\n const isRequiredCollections = isArrayEqual(currentPath, ['storage', 'collections']);\n const isCollectionEntry =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'collections']);\n const isRequiredRoots = isArrayEqual(currentPath, ['roots']);\n const isRequiredExtensionPacks = isArrayEqual(currentPath, ['extensionPacks']);\n const isRequiredCapabilities = isArrayEqual(currentPath, ['capabilities']);\n const isRequiredMeta = isArrayEqual(currentPath, ['meta']);\n const isRequiredExecutionDefaults = isArrayEqual(currentPath, [\n 'execution',\n 'mutations',\n 'defaults',\n ]);\n const isExtensionNamespace = currentPath.length === 2 && currentPath[0] === 'extensionPacks';\n const isModelRelations =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'relations']);\n const isModelStorage =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'storage']);\n const isTableUniques =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'uniques'],\n );\n const isTableIndexes =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'indexes'],\n );\n const isTableForeignKeys =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'foreignKeys'],\n );\n\n const isFkBooleanField =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'tables' &&\n currentPath[3] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredTables &&\n !isRequiredCollections &&\n !isCollectionEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isTableUniques &&\n !isTableIndexes &&\n !isTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath);\n }\n\n return result;\n}\n\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sortObjectKeys(item));\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\ntype StorageObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortIndexesAndUniques(storage: unknown): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const storageObj = storage as StorageObject;\n if (!storageObj.tables || typeof storageObj.tables !== 'object') {\n return storage;\n }\n\n const tables = storageObj.tables;\n const result: StorageObject = { ...storageObj };\n\n result.tables = {};\n const sortedTableNames = Object.keys(tables).sort();\n for (const tableName of sortedTableNames) {\n const table = tables[tableName];\n if (!table || typeof table !== 'object') {\n result.tables[tableName] = table;\n continue;\n }\n\n const tableObj = table as TableObject;\n const sortedTable: TableObject = { ...tableObj };\n\n if (Array.isArray(tableObj.indexes)) {\n sortedTable.indexes = [...tableObj.indexes].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n if (Array.isArray(tableObj.uniques)) {\n sortedTable.uniques = [...tableObj.uniques].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n result.tables[tableName] = sortedTable;\n }\n\n return result;\n}\n\nexport function orderTopLevel(obj: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n const remaining = new Set(Object.keys(obj));\n\n for (const key of TOP_LEVEL_ORDER) {\n if (remaining.has(key)) {\n ordered[key] = obj[key];\n remaining.delete(key);\n }\n }\n\n for (const key of Array.from(remaining).sort()) {\n ordered[key] = obj[key];\n }\n\n return ordered;\n}\n\nexport function canonicalizeContractToObject(\n contract: Contract,\n options?: { schemaVersion?: string },\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options?.schemaVersion),\n targetFamily: contract.targetFamily,\n target: contract.target,\n profileHash: contract.profileHash,\n roots: contract.roots,\n models: contract.models,\n storage: contract.storage,\n ...ifDefined('execution', contract.execution),\n extensionPacks: contract.extensionPacks,\n capabilities: contract.capabilities,\n meta: contract.meta,\n };\n const withDefaultsOmitted = omitDefaults(normalized, []) as Record<string, unknown>;\n const withSortedIndexes = sortIndexesAndUniques(withDefaultsOmitted['storage']);\n const withSortedStorage = { ...withDefaultsOmitted, storage: withSortedIndexes };\n const withSortedKeys = sortObjectKeys(withSortedStorage) as Record<string, unknown>;\n return orderTopLevel(withSortedKeys);\n}\n\nexport function canonicalizeContract(\n contract: Contract,\n options?: { schemaVersion?: string },\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), bigintJsonReplacer, 2);\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalizeContract } from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './types';\n\nconst SCHEMA_VERSION = '1';\n\nfunction sha256(content: string): string {\n const hash = createHash('sha256');\n hash.update(content);\n return `sha256:${hash.digest('hex')}`;\n}\n\nfunction hashContract(section: Record<string, unknown>): string {\n const contract = {\n targetFamily: section['targetFamily'],\n target: section['target'],\n roots: {},\n models: {},\n storage: section['storage'] ?? {},\n execution: section['execution'],\n extensionPacks: {},\n capabilities: section['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...section,\n } as Contract;\n return canonicalizeContract(contract, { schemaVersion: SCHEMA_VERSION });\n}\n\nexport function computeStorageHash(args: {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n}): StorageHashBase<string> {\n return sha256(hashContract(args)) as StorageHashBase<string>;\n}\n\nexport function computeExecutionHash(args: {\n target: string;\n targetFamily: string;\n execution: Record<string, unknown>;\n}): ExecutionHashBase<string> {\n return sha256(hashContract(args)) as ExecutionHashBase<string>;\n}\n\nexport function computeProfileHash(args: {\n target: string;\n targetFamily: string;\n capabilities: Record<string, Record<string, boolean>>;\n}): ProfileHashBase<string> {\n return sha256(hashContract(args)) as ProfileHashBase<string>;\n}\n"],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- //#region src/types.ts
2
- function executionHash(value) {
3
- return value;
4
- }
5
- function coreHash(value) {
6
- return value;
7
- }
8
- function profileHash(value) {
9
- return value;
10
- }
11
- function isTaggedBigInt(value) {
12
- return typeof value === "object" && value !== null && value.$type === "bigint" && typeof value.value === "string";
13
- }
14
- function bigintJsonReplacer(_key, value) {
15
- if (typeof value === "bigint") return {
16
- $type: "bigint",
17
- value: value.toString()
18
- };
19
- return value;
20
- }
21
- function isTaggedRaw(value) {
22
- return typeof value === "object" && value !== null && value.$type === "raw" && "value" in value;
23
- }
24
-
25
- //#endregion
26
- export { isTaggedRaw as a, isTaggedBigInt as i, coreHash as n, profileHash as o, executionHash as r, bigintJsonReplacer as t };
27
- //# sourceMappingURL=types-BP4dqfP-.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-BP4dqfP-.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["/**\n * Unique symbol used as the key for branding types.\n */\nexport const $: unique symbol = Symbol('__prisma_next_brand__');\n\n/**\n * A helper type to brand a given type with a unique identifier.\n *\n * @template TKey Text used as the brand key.\n * @template TValue Optional value associated with the brand key. Defaults to `true`.\n */\nexport type Brand<TKey extends string | number | symbol, TValue = true> = {\n [$]: {\n [K in TKey]: TValue;\n };\n};\n\n/**\n * Base type for storage contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type StorageHash = StorageHashBase<'sha256:abc123...'>`\n */\nexport type StorageHashBase<THash extends string> = THash & Brand<'StorageHash'>;\n\n/**\n * Base type for execution contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ExecutionHash = ExecutionHashBase<'sha256:def456...'>`\n */\nexport type ExecutionHashBase<THash extends string> = THash & Brand<'ExecutionHash'>;\n\nexport function executionHash<const T extends string>(value: T): ExecutionHashBase<T> {\n return value as ExecutionHashBase<T>;\n}\n\nexport function coreHash<const T extends string>(value: T): StorageHashBase<T> {\n return value as StorageHashBase<T>;\n}\n\n/**\n * Base type for profile contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ProfileHash = ProfileHashBase<'sha256:def456...'>`\n */\nexport type ProfileHashBase<THash extends string> = THash & Brand<'ProfileHash'>;\n\nexport function profileHash<const T extends string>(value: T): ProfileHashBase<T> {\n return value as ProfileHashBase<T>;\n}\n\n/**\n * Base type for family-specific storage blocks.\n * Family storage types (SqlStorage, MongoStorage, etc.) extend this to carry the\n * storage hash alongside family-specific data (tables, collections, etc.).\n */\nexport interface StorageBase<THash extends string = string> {\n readonly storageHash: StorageHashBase<THash>;\n}\n\nexport interface FieldType {\n readonly type: string;\n readonly nullable: boolean;\n readonly items?: FieldType;\n readonly properties?: Record<string, FieldType>;\n}\n\nexport type GeneratedValueSpec = {\n readonly id: string;\n readonly params?: Record<string, unknown>;\n};\n\nexport type JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue =\n | JsonPrimitive\n | { readonly [key: string]: JsonValue }\n | readonly JsonValue[];\n\nexport type TaggedBigInt = { readonly $type: 'bigint'; readonly value: string };\n\nexport function isTaggedBigInt(value: unknown): value is TaggedBigInt {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { $type?: unknown }).$type === 'bigint' &&\n typeof (value as { value?: unknown }).value === 'string'\n );\n}\n\nexport function bigintJsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === 'bigint') {\n return { $type: 'bigint', value: value.toString() } satisfies TaggedBigInt;\n }\n return value;\n}\n\nexport type TaggedRaw = { readonly $type: 'raw'; readonly value: JsonValue };\n\nexport function isTaggedRaw(value: unknown): value is TaggedRaw {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { $type?: unknown }).$type === 'raw' &&\n 'value' in (value as object)\n );\n}\n\nexport type TaggedLiteralValue = TaggedBigInt | TaggedRaw;\n\nexport type ColumnDefaultLiteralValue = JsonValue | TaggedLiteralValue;\n\nexport type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | bigint | Date;\n\nexport type ColumnDefault =\n | {\n readonly kind: 'literal';\n readonly value: ColumnDefaultLiteralInputValue;\n }\n | { readonly kind: 'function'; readonly expression: string };\n\nexport type ExecutionMutationDefaultValue = {\n readonly kind: 'generator';\n readonly id: GeneratedValueSpec['id'];\n readonly params?: Record<string, unknown>;\n};\n\nexport type ExecutionMutationDefault = {\n readonly ref: { readonly table: string; readonly column: string };\n readonly onCreate?: ExecutionMutationDefaultValue;\n readonly onUpdate?: ExecutionMutationDefaultValue;\n};\n\nexport type ExecutionSection<THash extends string = string> = {\n readonly executionHash: ExecutionHashBase<THash>;\n readonly mutations: {\n readonly defaults: ReadonlyArray<ExecutionMutationDefault>;\n };\n};\n\nexport interface Source {\n readonly readOnly: boolean;\n readonly projection: Record<string, FieldType>;\n readonly origin?: Record<string, unknown>;\n readonly capabilities?: Record<string, boolean>;\n}\n\n// Document family types\nexport interface DocIndex {\n readonly name: string;\n readonly keys: Record<string, 'asc' | 'desc'>;\n readonly unique?: boolean;\n readonly where?: Expr;\n}\n\nexport type Expr =\n | { readonly kind: 'eq'; readonly path: ReadonlyArray<string>; readonly value: unknown }\n | { readonly kind: 'exists'; readonly path: ReadonlyArray<string> };\n\nexport interface DocCollection {\n readonly name: string;\n readonly id?: {\n readonly strategy: 'auto' | 'client' | 'uuid' | 'objectId';\n };\n readonly fields: Record<string, FieldType>;\n readonly indexes?: ReadonlyArray<DocIndex>;\n readonly readOnly?: boolean;\n}\n\n// Plan types - target-family agnostic execution types\nexport interface ParamDescriptor {\n readonly index?: number;\n readonly name?: string;\n readonly codecId?: string;\n readonly nativeType?: string;\n readonly nullable?: boolean;\n readonly source: 'dsl' | 'raw' | 'lane';\n readonly refs?: { table: string; column: string };\n}\n\nexport interface PlanRefs {\n readonly tables?: readonly string[];\n readonly columns?: ReadonlyArray<{ table: string; column: string }>;\n readonly indexes?: ReadonlyArray<{\n readonly table: string;\n readonly columns: ReadonlyArray<string>;\n readonly name?: string;\n }>;\n}\n\nexport interface PlanMeta {\n readonly target: string;\n readonly targetFamily?: string;\n readonly storageHash: string;\n readonly profileHash?: string;\n readonly lane: string;\n readonly annotations?: {\n codecs?: Record<string, string>; // alias/param → codec id ('ns/name@v')\n [key: string]: unknown;\n };\n readonly paramDescriptors: ReadonlyArray<ParamDescriptor>;\n readonly refs?: PlanRefs;\n readonly projection?: Record<string, string> | ReadonlyArray<string>;\n /**\n * Optional mapping of projection alias → column type ID (fully qualified ns/name@version).\n * Used for codec resolution when AST+refs don't provide enough type info.\n */\n readonly projectionTypes?: Record<string, string>;\n}\n\n/**\n * Canonical execution plan shape used by runtimes.\n *\n * - Row is the inferred result row type (TypeScript-only).\n * - Ast is the optional, family-specific AST type (e.g. SQL QueryAst).\n *\n * The payload executed by the runtime is represented by the sql + params pair\n * for now; future families can specialize this via Ast or additional metadata.\n */\nexport interface ExecutionPlan<Row = unknown, Ast = unknown> {\n readonly sql: string;\n readonly params: readonly unknown[];\n readonly ast?: Ast;\n readonly meta: PlanMeta;\n /**\n * Phantom property to carry the Row generic for type-level utilities.\n * Not set at runtime; used only for ResultType extraction.\n */\n readonly _row?: Row;\n}\n\n/**\n * Utility type to extract the Row type from an ExecutionPlan.\n * Example: `type Row = ResultType<typeof plan>`\n *\n * Works with both ExecutionPlan and SqlQueryPlan (SQL query plans before lowering).\n * SqlQueryPlan includes a phantom `_Row` property to preserve the generic parameter\n * for type extraction.\n */\nexport type ResultType<P> =\n P extends ExecutionPlan<infer R, unknown> ? R : P extends { readonly _Row?: infer R } ? R : never;\n\n/**\n * Contract marker record stored in the database.\n * Represents the current contract identity for a database.\n */\nexport interface ContractMarkerRecord {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson: unknown | null;\n readonly canonicalVersion: number | null;\n readonly updatedAt: Date;\n readonly appTag: string | null;\n readonly meta: Record<string, unknown>;\n}\n"],"mappings":";AA+BA,SAAgB,cAAsC,OAAgC;AACpF,QAAO;;AAGT,SAAgB,SAAiC,OAA8B;AAC7E,QAAO;;AAUT,SAAgB,YAAoC,OAA8B;AAChF,QAAO;;AAiCT,SAAgB,eAAe,OAAuC;AACpE,QACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA8B,UAAU,YACzC,OAAQ,MAA8B,UAAU;;AAIpD,SAAgB,mBAAmB,MAAc,OAAyB;AACxE,KAAI,OAAO,UAAU,SACnB,QAAO;EAAE,OAAO;EAAU,OAAO,MAAM,UAAU;EAAE;AAErD,QAAO;;AAKT,SAAgB,YAAY,OAAoC;AAC9D,QACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA8B,UAAU,SACzC,WAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-domain-BlwWyv01.mjs","names":["errors: string[]"],"sources":["../src/validate-contract.ts","../src/validate-domain.ts"],"sourcesContent":["import { type } from 'arktype';\nimport type { Contract } from './contract-types';\nimport type { DomainContractShape } from './validate-domain';\nimport { validateContractDomain } from './validate-domain';\n\nexport type ContractValidationPhase = 'structural' | 'domain' | 'storage';\n\nexport class ContractValidationError extends Error {\n readonly code = 'CONTRACT.VALIDATION_FAILED';\n readonly phase: ContractValidationPhase;\n\n constructor(message: string, phase: ContractValidationPhase) {\n super(message);\n this.name = 'ContractValidationError';\n this.phase = phase;\n }\n}\n\n/**\n * Family-provided storage validator.\n * SQL validates tables/columns/FKs; Mongo validates collections/embedding.\n */\nexport type StorageValidator = (contract: Contract) => void;\n\nconst ContractSchema = type({\n target: 'string',\n targetFamily: 'string',\n roots: 'Record<string, string>',\n models: 'Record<string, unknown>',\n storage: 'Record<string, unknown>',\n capabilities: 'Record<string, Record<string, boolean>>',\n extensionPacks: 'Record<string, unknown>',\n meta: 'Record<string, unknown>',\n 'execution?': {\n 'executionHash?': 'string',\n mutations: {\n defaults: 'unknown[]',\n },\n },\n profileHash: 'string',\n});\n\nfunction stripPersistenceFields(raw: Record<string, unknown>): Record<string, unknown> {\n const { schemaVersion: _, _generated: _g, ...rest } = raw;\n return rest;\n}\n\nfunction extractDomainShape(contract: Contract): DomainContractShape {\n return {\n roots: contract.roots,\n models: contract.models,\n };\n}\n\n/**\n * Framework-level contract validation (ADR 182).\n *\n * Three-pass validation:\n * 1. **Structural validation** (arktype): verifies required fields exist with\n * correct base types.\n * 2. **Domain validation** (framework-owned): roots, relation targets,\n * variant/base consistency, discriminators, ownership, orphans.\n * 3. **Storage validation** (family-provided): SQL validates tables/columns/FKs;\n * Mongo validates collections/embedding.\n *\n * JSON persistence fields (`schemaVersion`, `_generated`) are stripped before\n * validation — they are not part of the in-memory contract representation.\n *\n * @template TContract The fully-typed contract type (preserves literal types).\n * @param value Raw contract value (e.g. parsed from JSON).\n * @param storageValidator Family-specific storage validation function.\n * @returns The validated contract with full literal types.\n */\nexport function validateContract<TContract extends Contract>(\n value: unknown,\n storageValidator: StorageValidator,\n): TContract {\n if (typeof value !== 'object' || value === null) {\n throw new ContractValidationError('Contract must be a non-null object', 'structural');\n }\n\n const stripped = stripPersistenceFields(value as Record<string, unknown>);\n\n const parsed = ContractSchema(stripped);\n if (parsed instanceof type.errors) {\n throw new ContractValidationError(\n `Invalid contract structure: ${parsed.summary}`,\n 'structural',\n );\n }\n\n const contract = parsed as unknown as Contract;\n\n validateContractDomain(extractDomainShape(contract));\n\n storageValidator(contract);\n\n return contract as unknown as TContract;\n}\n","import { ContractValidationError } from './validate-contract';\n\nexport interface DomainModelShape {\n readonly fields: Record<string, unknown>;\n readonly relations?: Record<string, { readonly to: string }>;\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, unknown>;\n readonly base?: string;\n readonly owner?: string;\n}\n\nexport interface DomainContractShape {\n readonly roots: Record<string, string>;\n readonly models: Record<string, DomainModelShape>;\n}\n\nexport function validateContractDomain(contract: DomainContractShape): void {\n const errors: string[] = [];\n const modelNames = new Set(Object.keys(contract.models));\n\n validateRoots(contract, modelNames, errors);\n validateVariantsAndBases(contract, modelNames, errors);\n validateRelationTargets(contract, modelNames, errors);\n validateDiscriminators(contract, errors);\n validateOwnership(contract, modelNames, errors);\n\n if (errors.length > 0) {\n throw new ContractValidationError(\n `Contract domain validation failed:\\n- ${errors.join('\\n- ')}`,\n 'domain',\n );\n }\n}\n\nfunction validateRoots(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const seenValues = new Set<string>();\n for (const [rootKey, modelName] of Object.entries(contract.roots)) {\n if (seenValues.has(modelName)) {\n errors.push(`Duplicate root value: \"${modelName}\" is mapped by multiple root keys`);\n }\n seenValues.add(modelName);\n\n if (!modelNames.has(modelName)) {\n errors.push(\n `Root \"${rootKey}\" references model \"${modelName}\" which does not exist in models`,\n );\n }\n }\n}\n\nfunction validateVariantsAndBases(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const models = new Map(Object.entries(contract.models));\n\n for (const [modelName, model] of models) {\n if (model.variants) {\n for (const variantName of Object.keys(model.variants)) {\n if (!modelNames.has(variantName)) {\n errors.push(\n `Model \"${modelName}\" lists variant \"${variantName}\" which does not exist in models`,\n );\n continue;\n }\n const variantModel = models.get(variantName);\n if (!variantModel) continue;\n if (variantModel.base !== modelName) {\n errors.push(\n `Variant \"${variantName}\" has base \"${variantModel.base ?? '(none)'}\" but expected \"${modelName}\"`,\n );\n }\n }\n }\n\n if (model.base) {\n if (!modelNames.has(model.base)) {\n errors.push(`Model \"${modelName}\" has base \"${model.base}\" which does not exist in models`);\n continue;\n }\n const baseModel = models.get(model.base);\n if (!baseModel) continue;\n if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${model.base}\" which does not list it as a variant`,\n );\n }\n }\n }\n}\n\nfunction validateRelationTargets(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n if (!modelNames.has(relation.to)) {\n errors.push(\n `Relation \"${relName}\" on model \"${modelName}\" targets \"${relation.to}\" which does not exist in models`,\n );\n }\n }\n }\n}\n\nfunction validateDiscriminators(contract: DomainContractShape, errors: string[]): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.discriminator) {\n if (!model.variants || Object.keys(model.variants).length === 0) {\n errors.push(`Model \"${modelName}\" has discriminator but no variants`);\n }\n if (!Object.hasOwn(model.fields, model.discriminator.field)) {\n errors.push(\n `Discriminator field \"${model.discriminator.field}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (model.variants && Object.keys(model.variants).length > 0 && !model.discriminator) {\n errors.push(`Model \"${modelName}\" has variants but no discriminator`);\n }\n\n if (model.base) {\n if (model.discriminator) {\n errors.push(`Model \"${modelName}\" has base and must not have discriminator`);\n }\n if (model.variants && Object.keys(model.variants).length > 0) {\n errors.push(`Model \"${modelName}\" has base and must not have variants`);\n }\n }\n }\n}\n\nfunction validateOwnership(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (!model.owner) continue;\n\n if (model.owner === modelName) {\n errors.push(`Model \"${modelName}\" cannot own itself`);\n }\n\n if (!modelNames.has(model.owner)) {\n errors.push(`Model \"${modelName}\" has owner \"${model.owner}\" which does not exist in models`);\n }\n\n for (const [rootKey, rootModel] of Object.entries(contract.roots)) {\n if (rootModel === modelName) {\n errors.push(\n `Owned model \"${modelName}\" must not appear in roots (found as root \"${rootKey}\")`,\n );\n }\n }\n }\n}\n"],"mappings":"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"}