@prisma-next/contract 0.11.0-dev.4 → 0.11.0-dev.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,5 @@
1
+ import { t as CrossReference } from "./cross-reference-t0TDbBTP.mjs";
2
+
1
3
  //#region src/domain-types.d.ts
2
4
  type ScalarFieldType = {
3
5
  readonly kind: 'scalar';
@@ -24,12 +26,12 @@ type ContractRelationOn = {
24
26
  readonly targetFields: readonly string[];
25
27
  };
26
28
  type ContractReferenceRelation = {
27
- readonly to: string;
29
+ readonly to: CrossReference;
28
30
  readonly cardinality: '1:1' | '1:N' | 'N:1';
29
31
  readonly on: ContractRelationOn;
30
32
  };
31
33
  type ContractEmbedRelation = {
32
- readonly to: string;
34
+ readonly to: CrossReference;
33
35
  readonly cardinality: '1:1' | '1:N';
34
36
  };
35
37
  type ContractRelation = ContractReferenceRelation | ContractEmbedRelation;
@@ -49,7 +51,7 @@ interface ContractModelBase<TModelStorage extends ModelStorageBase = ModelStorag
49
51
  readonly storage: TModelStorage;
50
52
  readonly discriminator?: ContractDiscriminator;
51
53
  readonly variants?: Record<string, ContractVariantEntry>;
52
- readonly base?: string;
54
+ readonly base?: CrossReference;
53
55
  readonly owner?: string;
54
56
  }
55
57
  interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> extends ContractModelBase<TModelStorage> {
@@ -252,7 +254,7 @@ type ContractExecutionSection<THash extends string = string> = {
252
254
  interface Contract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>> {
253
255
  readonly target: string;
254
256
  readonly targetFamily: string;
255
- readonly roots: Record<string, string>;
257
+ readonly roots: Record<string, CrossReference>;
256
258
  readonly models: TModels;
257
259
  readonly valueObjects?: Record<string, ContractValueObject>;
258
260
  /**
@@ -270,4 +272,4 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
270
272
  }
271
273
  //#endregion
272
274
  export { isExecutionMutationDefaultValue as A, ContractRelationOn as B, Source as C, executionHash as D, coreHash 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, isColumnDefault as O, ContractField as P, ContractReferenceRelation as R, ProfileHashBase as S, StorageHashBase 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, isColumnDefaultLiteralInputValue as k, DocCollection as l, ExecutionMutationDefaultValue as m, ContractExecutionSection as n, ColumnDefaultLiteralInputValue as o, ExecutionMutationDefaultPhases as p, UnionFieldType as q, $ as r, ColumnDefaultLiteralValue as s, Contract as t, DocIndex as u, GeneratedValueSpec as v, StorageBase as w, PlanMeta as x, JsonPrimitive as y, ContractRelation as z };
273
- //# sourceMappingURL=contract-types-Bt2uyqs3.d.mts.map
275
+ //# sourceMappingURL=contract-types-OSHtK6P5.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-types-OSHtK6P5.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contract-validation-error-Dp2vHZt5.mjs","names":[],"sources":["../src/contract-validation-error.ts"],"sourcesContent":["export 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"],"mappings":";AAEA,IAAa,0BAAb,cAA6C,MAAM;CACjD,OAAgB;CAChB;CAEA,YAAY,SAAiB,OAAgC;EAC3D,MAAM,QAAQ;EACd,KAAK,OAAO;EACZ,KAAK,QAAQ"}
1
+ {"version":3,"file":"contract-validation-error-Dp2vHZt5.mjs","names":[],"sources":["../src/contract-validation-error.ts"],"sourcesContent":["export 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"],"mappings":";AAEA,IAAa,0BAAb,cAA6C,MAAM;CACjD,OAAgB;CAChB;CAEA,YAAY,SAAiB,OAAgC;EAC3D,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ;CACf;AACF"}
@@ -0,0 +1,18 @@
1
+ import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
2
+
3
+ //#region src/namespace-id.d.ts
4
+ type NamespaceId = string & {
5
+ readonly __brand: 'NamespaceId';
6
+ };
7
+ declare function asNamespaceId(value: string): NamespaceId;
8
+ //#endregion
9
+ //#region src/cross-reference.d.ts
10
+ interface CrossReference {
11
+ readonly namespace: NamespaceId;
12
+ readonly model: string;
13
+ }
14
+ declare const CrossReferenceSchema: _$arktype_internal_variants_object_ts0.ObjectType<CrossReference, {}>;
15
+ declare function crossRef(model: string, namespace?: string): CrossReference;
16
+ //#endregion
17
+ export { asNamespaceId as a, NamespaceId as i, CrossReferenceSchema as n, crossRef as r, CrossReference as t };
18
+ //# sourceMappingURL=cross-reference-t0TDbBTP.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-reference-t0TDbBTP.d.mts","names":[],"sources":["../src/namespace-id.ts","../src/cross-reference.ts"],"mappings":";;;KAEY,WAAA;EAAA,SAAkC,OAAO;AAAA;AAAA,iBAErC,aAAA,CAAc,KAAA,WAAgB,WAAW;;;UCAxC,cAAA;EAAA,SACN,SAAA,EAAW,WAAW;EAAA,SACtB,KAAA;AAAA;AAAA,cAGE,oBAAA,EAAoB,sCAAA,CAAA,UAAA,CAAA,cAAA;AAAA,iBAajB,QAAA,CACd,KAAA,UACA,SAAA,YACC,cAAc"}
@@ -56,8 +56,9 @@ function omitDefaults(obj, path) {
56
56
  const isNamespaceTableIndexes = currentPath.length === 6 && currentPath[0] === "storage" && currentPath[1] === "namespaces" && currentPath[3] === "tables" && currentPath[5] === "indexes";
57
57
  const isNamespaceTableForeignKeys = currentPath.length === 6 && currentPath[0] === "storage" && currentPath[1] === "namespaces" && currentPath[3] === "tables" && currentPath[5] === "foreignKeys";
58
58
  const isStorageTypeTypeParams = currentPath.length === 4 && currentPath[0] === "storage" && currentPath[1] === "types" && key === "typeParams";
59
+ const isDomainUnboundTypeParams = currentPath.length === 5 && currentPath[0] === "domain" && currentPath[2] === "types" && key === "typeParams";
59
60
  const isFkBooleanField = currentPath.length === 7 && currentPath[0] === "storage" && currentPath[1] === "namespaces" && currentPath[3] === "tables" && currentPath[5] === "foreignKeys" && (key === "constraint" || key === "index");
60
- if (!isRequiredModels && !isRequiredNamespaces && !isNamespaceSlot && !isRequiredNamespaceTables && !isNamespaceTableEntry && !isRequiredRoots && !isRequiredExtensionPacks && !isRequiredCapabilities && !isRequiredMeta && !isRequiredExecutionDefaults && !isExtensionNamespace && !isModelRelations && !isModelStorage && !isNamespaceTableUniques && !isNamespaceTableIndexes && !isNamespaceTableForeignKeys && !isFkBooleanField && !(key === "nullable") && !isStorageTypeTypeParams) continue;
61
+ if (!isRequiredModels && !isRequiredNamespaces && !isNamespaceSlot && !isRequiredNamespaceTables && !isNamespaceTableEntry && !isRequiredRoots && !isRequiredExtensionPacks && !isRequiredCapabilities && !isRequiredMeta && !isRequiredExecutionDefaults && !isExtensionNamespace && !isModelRelations && !isModelStorage && !isNamespaceTableUniques && !isNamespaceTableIndexes && !isNamespaceTableForeignKeys && !isFkBooleanField && !(key === "nullable") && !isStorageTypeTypeParams && !isDomainUnboundTypeParams) continue;
61
62
  }
62
63
  result[key] = omitDefaults(value, currentPath);
63
64
  }
@@ -148,6 +149,7 @@ function canonicalizeContractToObject(contract, options) {
148
149
  roots: serialized["roots"],
149
150
  models: serialized["models"],
150
151
  ...ifDefined("valueObjects", serialized["valueObjects"]),
152
+ ...ifDefined("domain", serialized["domain"]),
151
153
  storage: serialized["storage"],
152
154
  ...ifDefined("execution", serialized["execution"]),
153
155
  extensionPacks: serialized["extensionPacks"],
@@ -201,4 +203,4 @@ function computeProfileHash(args) {
201
203
  //#endregion
202
204
  export { canonicalizeContractToObject as a, canonicalizeContract as i, computeProfileHash as n, computeStorageHash as r, computeExecutionHash as t };
203
205
 
204
- //# sourceMappingURL=hashing-rZiqFOlc.mjs.map
206
+ //# sourceMappingURL=hashing-BqnADuDo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashing-BqnADuDo.mjs","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { JsonObject } from '@prisma-next/utils/json';\n\nimport type { Contract } from './contract-types';\n\n/**\n * Per-target contract serializer hook. The framework canonicalizer uses\n * this to convert an in-memory contract (which may carry class-instance\n * IR nodes whose runtime-only fields must not appear in the on-disk\n * envelope) into a plain JsonObject before applying the family-agnostic\n * canonical-key ordering / default-omission / sort steps. Targets whose\n * contract is JSON-clean by construction return the contract unchanged.\n */\nexport type SerializeContract = (contract: Contract) => JsonObject;\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'valueObjects',\n 'domain',\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 isRequiredNamespaces = isArrayEqual(currentPath, ['storage', 'namespaces']);\n const isNamespaceSlot =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'namespaces']);\n const isRequiredNamespaceTables =\n currentPath.length === 4 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables';\n // Preserve per-table payloads even when empty. SQL tables are never\n // emitted empty; Mongo collections legitimately are (a declared\n // collection with no schema is a valid representation), and the\n // family-agnostic canonicalizer must not strip them.\n const isNamespaceTableEntry =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables';\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 isNamespaceTableUniques =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'uniques';\n const isNamespaceTableIndexes =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'indexes';\n const isNamespaceTableForeignKeys =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'foreignKeys';\n\n // `storage.types.<name>.typeParams` is part of the StorageTypeInstance\n // shape (validators require it). Preserve it even when empty so the\n // emitted contract.json remains structurally valid after a round-trip.\n const isStorageTypeTypeParams =\n currentPath.length === 4 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'types' &&\n key === 'typeParams';\n\n const isDomainUnboundTypeParams =\n currentPath.length === 5 &&\n currentPath[0] === 'domain' &&\n currentPath[2] === 'types' &&\n key === 'typeParams';\n\n const isFkBooleanField =\n currentPath.length === 7 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredNamespaces &&\n !isNamespaceSlot &&\n !isRequiredNamespaceTables &&\n !isNamespaceTableEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isNamespaceTableUniques &&\n !isNamespaceTableIndexes &&\n !isNamespaceTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField &&\n !isStorageTypeTypeParams &&\n !isDomainUnboundTypeParams\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 NamespaceObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype StorageObject = {\n namespaces?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortTableArrays(tableObj: TableObject): 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 return sortedTable;\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.namespaces || typeof storageObj.namespaces !== 'object') {\n return storage;\n }\n\n const namespaces = storageObj.namespaces;\n const result: StorageObject = { ...storageObj, namespaces: {} };\n const resultNamespaces = result.namespaces as Record<string, unknown>;\n\n for (const nsId of Object.keys(namespaces)) {\n const ns = namespaces[nsId];\n if (!ns || typeof ns !== 'object') {\n resultNamespaces[nsId] = ns;\n continue;\n }\n\n const nsObj = ns as NamespaceObject;\n if (!nsObj.tables || typeof nsObj.tables !== 'object') {\n resultNamespaces[nsId] = ns;\n continue;\n }\n\n const sortedTables: Record<string, unknown> = {};\n const sortedTableNames = Object.keys(nsObj.tables).sort();\n for (const tableName of sortedTableNames) {\n const table = nsObj.tables[tableName];\n if (!table || typeof table !== 'object') {\n sortedTables[tableName] = table;\n continue;\n }\n sortedTables[tableName] = sortTableArrays(table as TableObject);\n }\n\n resultNamespaces[nsId] = { ...nsObj, tables: sortedTables };\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 interface CanonicalizeContractOptions {\n readonly schemaVersion?: string;\n /**\n * Per-target hook that converts the in-memory contract (which may\n * carry class-instance IR nodes) into a plain JsonObject before the\n * family-agnostic canonicalization steps run.\n *\n * Routing through the hook is what lets each target decide which\n * fields appear in the on-disk envelope; runtime-only class API\n * fields stay invisible to the canonicalization walk by virtue of\n * the per-target serializer not putting them in the JSON shape.\n */\n readonly serializeContract: SerializeContract;\n}\n\n/**\n * Object-form variant of {@link canonicalizeContract}. Exported because the\n * emitter writes the canonical contract through a separate JSON-stringify\n * pass and consumes the structured object directly.\n */\nexport function canonicalizeContractToObject(\n contract: Contract,\n options: CanonicalizeContractOptions,\n): Record<string, unknown> {\n const serialized = options.serializeContract(contract);\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options.schemaVersion),\n targetFamily: serialized['targetFamily'],\n target: serialized['target'],\n profileHash: serialized['profileHash'],\n roots: serialized['roots'],\n models: serialized['models'],\n ...ifDefined('valueObjects', serialized['valueObjects']),\n ...ifDefined('domain', serialized['domain']),\n storage: serialized['storage'],\n ...ifDefined('execution', serialized['execution']),\n extensionPacks: serialized['extensionPacks'],\n capabilities: serialized['capabilities'],\n meta: serialized['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: CanonicalizeContractOptions,\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);\n}\n","import { createHash } from 'node:crypto';\nimport type { JsonObject } from '@prisma-next/utils/json';\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 // Blind cast: the synthesised object is a hash-only stand-in\n // — never returned to callers, never executed as a Contract.\n // `canonicalizeContract` only walks the storage / execution /\n // capabilities slices, all of which are populated above, so the\n // missing precise Contract typing on the other slots is\n // immaterial for the hash result.\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 unknown as Contract;\n return canonicalizeContract(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: (c) => JSON.parse(JSON.stringify(c)) as JsonObject,\n });\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 { S as ProfileHashBase, T as StorageHashBase, d as ExecutionHashBase, t as Contract } from "./contract-types-Bt2uyqs3.mjs";
1
+ import { S as ProfileHashBase, T as StorageHashBase, d as ExecutionHashBase, t as Contract } from "./contract-types-OSHtK6P5.mjs";
2
2
  import { JsonObject } from "@prisma-next/utils/json";
3
3
 
4
4
  //#region src/canonicalization.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"mappings":";;;;;;AAcA;;;;;;KAAY,iBAAA,IAAqB,QAAA,EAAU,QAAA,KAAa,UAAA;AAAA,UAuRvC,2BAAA;EAAA,SACN,aAAA;EADiC;;;;;;;;AAoB5C;;EApB4C,SAYjC,iBAAA,EAAmB,iBAAA;AAAA;;;;;;iBAQd,4BAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAAA,GACR,MAAA;AAAA,iBAuBa,oBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAAA;;;iBC7SK,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,OAAA,EAAS,MAAA;AAAA,IACP,eAAA;AAAA,iBAIY,oBAAA,CAAqB,IAAA;EACnC,MAAA;EACA,YAAA;EACA,SAAA,EAAW,MAAA;AAAA,IACT,iBAAA;AAAA,iBAIY,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,YAAA,EAAc,MAAA,SAAe,MAAA;AAAA,IAC3B,eAAA"}
1
+ {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"mappings":";;;;;;AAcA;;;;;;KAAY,iBAAA,IAAqB,QAAA,EAAU,QAAA,KAAa,UAAU;AAAA,UA8RjD,2BAAA;EAAA,SACN,aAAA;EADiC;;;;;;;AAYG;AAQ/C;;EApB4C,SAYjC,iBAAA,EAAmB,iBAAiB;AAAA;;;;;;iBAQ/B,4BAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAAA,GACR,MAAA;AAAA,iBAwBa,oBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAA2B;;;iBCrTtB,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,OAAA,EAAS,MAAA;AAAA,IACP,eAAe;AAAA,iBAIH,oBAAA,CAAqB,IAAA;EACnC,MAAA;EACA,YAAA;EACA,SAAA,EAAW,MAAA;AAAA,IACT,iBAAiB;AAAA,iBAIL,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,YAAA,EAAc,MAAA,SAAe,MAAA;AAAA,IAC3B,eAAA"}
package/dist/hashing.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-rZiqFOlc.mjs";
1
+ import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-BqnADuDo.mjs";
2
2
  export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };
@@ -1,10 +1,11 @@
1
- import { I as ContractModel, L as ContractModelBase, S as ProfileHashBase, T as StorageHashBase, V as ContractValueObject, W as ModelStorageBase, h as ExecutionSection, t as Contract, w as StorageBase } from "./contract-types-Bt2uyqs3.mjs";
1
+ import { t as CrossReference } from "./cross-reference-t0TDbBTP.mjs";
2
+ import { I as ContractModel, L as ContractModelBase, S as ProfileHashBase, T as StorageHashBase, V as ContractValueObject, W as ModelStorageBase, h as ExecutionSection, t as Contract, w as StorageBase } from "./contract-types-OSHtK6P5.mjs";
2
3
 
3
4
  //#region src/testing-factories.d.ts
4
5
  type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>> = {
5
6
  target?: string;
6
7
  targetFamily?: string;
7
- roots?: Record<string, string>;
8
+ roots?: Record<string, CrossReference>;
8
9
  models?: TModels;
9
10
  storage?: Omit<TStorage, 'storageHash'>;
10
11
  valueObjects?: Record<string, ContractValueObject>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"mappings":";;;KAYK,iBAAA,kBACc,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA;EAEnE,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA;EACR,MAAA,GAAS,OAAA;EACT,OAAA,GAAU,IAAA,CAAK,QAAA;EACf,YAAA,GAAe,MAAA,SAAe,mBAAA;EAC9B,YAAA,GAAe,MAAA,SAAe,MAAA;EAC9B,cAAA,GAAiB,MAAA;EACjB,SAAA,GAAY,IAAA,CAAK,gBAAA;EACjB,WAAA,GAAc,eAAA;EACd,IAAA,GAAO,MAAA;AAAA;AAAA,cAGH,UAAA,EAAoC,eAAA;AAAA,iBAe1B,cAAA,kBACG,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA,EAAA,CACnE,SAAA,GAAW,iBAAA,CAAkB,QAAA,EAAU,OAAA,IAAgB,QAAA,CAAS,QAAA,EAAU,OAAA;AAAA,KA+CvE,cAAA,GAAiB,WAAA;EAAA,SACX,UAAA,EAAY,QAAA,CACnB,MAAA;IAAA,SAA0B,EAAA;IAAA,SAAqB,MAAA,EAAQ,QAAA,CAAS,MAAA;EAAA;EAAA,SAEzD,KAAA,GAAQ,MAAA;AAAA;AAAA,KAGd,YAAA,GAAe,aAAA,CAAc,gBAAA;EAAqB,KAAA;AAAA;AAAA,iBAEvC,iBAAA,CACd,SAAA,GAAW,iBAAA,CAAkB,cAAA,EAAgB,MAAA,SAAe,YAAA,KAC3D,QAAA,CAAS,cAAA,EAAgB,MAAA,SAAe,YAAA"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"mappings":";;;;KAaK,iBAAA,kBACc,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA;EAEnE,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA,SAAe,cAAA;EACvB,MAAA,GAAS,OAAA;EACT,OAAA,GAAU,IAAA,CAAK,QAAA;EACf,YAAA,GAAe,MAAA,SAAe,mBAAA;EAC9B,YAAA,GAAe,MAAA,SAAe,MAAA;EAC9B,cAAA,GAAiB,MAAA;EACjB,SAAA,GAAY,IAAA,CAAK,gBAAA;EACjB,WAAA,GAAc,eAAA;EACd,IAAA,GAAO,MAAA;AAAA;AAAA,cAGH,UAAA,EAAoC,eAA1B;AAAA,iBAeA,cAAA,kBACG,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA,EAAA,CACnE,SAAA,GAAW,iBAAA,CAAkB,QAAA,EAAU,OAAA,IAAgB,QAAA,CAAS,QAAA,EAAU,OAAA;AAAA,KA+CvE,cAAA,GAAiB,WAAA;EAAA,SACX,UAAA,EAAY,QAAA,CACnB,MAAA;IAAA,SAA0B,EAAA;IAAA,SAAqB,MAAA,EAAQ,QAAA,CAAS,MAAA;EAAA;EAAA,SAEzD,KAAA,GAAQ,MAAA;AAAA;AAAA,KAGd,YAAA,GAAe,aAAa,CAAC,gBAAA;EAAqB,KAAA;AAAA;AAAA,iBAEvC,iBAAA,CACd,SAAA,GAAW,iBAAA,CAAkB,cAAA,EAAgB,MAAA,SAAe,YAAA,KAC3D,QAAA,CAAS,cAAA,EAAgB,MAAA,SAAe,YAAA"}
package/dist/testing.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as coreHash } from "./types-CVGwkRLa.mjs";
2
- import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-rZiqFOlc.mjs";
2
+ import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-BqnADuDo.mjs";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  //#region src/testing-factories.ts
5
5
  const DUMMY_HASH = coreHash("sha256:test");
@@ -1 +1 @@
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\nconst DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} } as const;\n\nconst UNBOUND_NAMESPACE_ID = '__unbound__' as const;\n\nconst DEFAULT_SQL_STORAGE = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n tables: {},\n },\n },\n} as const;\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 = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;\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 namespaces: Readonly<\n Record<string, { readonly id: string; readonly tables: Readonly<Record<string, unknown>> }>\n >;\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 ...overrides,\n target: overrides.target ?? 'postgres',\n targetFamily: overrides.targetFamily ?? 'sql',\n storage: overrides.storage ?? DEFAULT_SQL_STORAGE,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;AA6BA,MAAM,aAAa,SAAS,cAAc;AAE1C,MAAM,4BAA4B,EAAE,YAAY,EAAE,EAAE;AAEpD,MAAM,uBAAuB;AAE7B,MAAM,sBAAsB,EAC1B,YAAY,GACT,uBAAuB;CACtB,IAAI;CACJ,QAAQ,EAAE;CACX,EACF,EACF;AAED,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,aAAa,UAAU,WAAW;CAExC,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;CAErF,OAAO;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,KAAA,IACxB,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;;AAYH,SAAgB,kBACd,YAA6E,EAAE,EACvB;CACxD,OAAO,eAA6D;EAClE,GAAG;EACH,QAAQ,UAAU,UAAU;EAC5B,cAAc,UAAU,gBAAgB;EACxC,SAAS,UAAU,WAAW;EAC/B,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 { CrossReference } from './cross-reference';\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, CrossReference>;\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\nconst DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} } as const;\n\nconst UNBOUND_NAMESPACE_ID = '__unbound__' as const;\n\nconst DEFAULT_SQL_STORAGE = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n tables: {},\n },\n },\n} as const;\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 = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;\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 namespaces: Readonly<\n Record<string, { readonly id: string; readonly tables: Readonly<Record<string, unknown>> }>\n >;\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 ...overrides,\n target: overrides.target ?? 'postgres',\n targetFamily: overrides.targetFamily ?? 'sql',\n storage: overrides.storage ?? DEFAULT_SQL_STORAGE,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;AA8BA,MAAM,aAAa,SAAS,aAAa;AAEzC,MAAM,4BAA4B,EAAE,YAAY,CAAC,EAAE;AAEnD,MAAM,uBAAuB;AAE7B,MAAM,sBAAsB,EAC1B,YAAY,GACT,uBAAuB;CACtB,IAAI;CACJ,QAAQ,CAAC;AACX,EACF,EACF;AAEA,SAAgB,eAGd,YAAkD,CAAC,GAAgC;CACnF,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,CAAC;CAEhD,MAAM,aAAa,UAAU,WAAW;CAExC,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA,SAAS;CACX,CAAC;CAED,MAAM,UAAU;EACd,GAAG;EACH;CACF;CAEA,MAAM,sBACJ,UAAU,eAAe,mBAAmB;EAAE;EAAQ;EAAc;CAAa,CAAC;CAEpF,OAAO;EACL;EACA;EACA,OAAO,UAAU,SAAS,CAAC;EAC3B,QAAS,UAAU,UAAU,CAAC;EAC9B,GAAG,UAAU,gBAAgB,UAAU,YAAY;EACnD;EACA;EACA,gBAAgB,UAAU,kBAAkB,CAAC;EAC7C,GAAI,UAAU,cAAc,KAAA,IACxB,EACE,WAAW;GACT,GAAG,UAAU;GACb,eAAe,qBAAqB;IAClC;IACA;IACA,WAAW,UAAU;GACvB,CAAC;EACH,EACF,IACA,CAAC;EACL,aAAa;EACb,MAAM,UAAU,QAAQ,CAAC;CAC3B;AACF;AAWA,SAAgB,kBACd,YAA6E,CAAC,GACtB;CACxD,OAAO,eAA6D;EAClE,GAAG;EACH,QAAQ,UAAU,UAAU;EAC5B,cAAc,UAAU,gBAAgB;EACxC,SAAS,UAAU,WAAW;CAChC,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"types-CVGwkRLa.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\n/**\n * Runtime predicate for `ColumnDefaultLiteralInputValue`. Authoring layers\n * resolve template values from caller-supplied args (typed `unknown` at the\n * boundary) and need to validate before constructing a `ColumnDefault`.\n * Accepts JSON primitives, plain arrays/objects of JSON values, and `Date`\n * instances. Rejects functions, class instances (other than `Date`),\n * `undefined`, `bigint`, `symbol`, and arrays/objects containing those.\n */\nexport function isColumnDefaultLiteralInputValue(\n value: unknown,\n): value is ColumnDefaultLiteralInputValue {\n if (value === null) return true;\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return true;\n if (value instanceof Date) return true;\n if (Array.isArray(value)) return value.every(isColumnDefaultLiteralInputValue);\n if (t === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n return Object.values(value as Record<string, unknown>).every(isColumnDefaultLiteralInputValue);\n }\n return false;\n}\n\nexport type ColumnDefault =\n | {\n readonly kind: 'literal';\n readonly value: ColumnDefaultLiteralInputValue;\n }\n | { readonly kind: 'function'; readonly expression: string };\n\nexport function isColumnDefault(value: unknown): value is ColumnDefault {\n if (typeof value !== 'object' || value === null) return false;\n const kind = (value as { kind?: unknown }).kind;\n if (kind === 'literal') {\n return 'value' in value;\n }\n if (kind === 'function') {\n return typeof (value as { expression?: unknown }).expression === 'string';\n }\n return false;\n}\n\nexport type ExecutionMutationDefaultValue = {\n readonly kind: 'generator';\n readonly id: GeneratedValueSpec['id'];\n readonly params?: Record<string, unknown>;\n};\n\nexport function isExecutionMutationDefaultValue(\n value: unknown,\n): value is ExecutionMutationDefaultValue {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as {\n kind?: unknown;\n id?: unknown;\n params?: unknown;\n };\n if (candidate.kind !== 'generator') return false;\n if (typeof candidate.id !== 'string') return false;\n if (\n candidate.params !== undefined &&\n (typeof candidate.params !== 'object' ||\n candidate.params === null ||\n Array.isArray(candidate.params))\n ) {\n return false;\n }\n return true;\n}\n\nexport type ExecutionMutationDefault = {\n readonly ref: { readonly table: string; readonly column: string };\n readonly onCreate?: ExecutionMutationDefaultValue;\n readonly onUpdate?: ExecutionMutationDefaultValue;\n};\n\n/**\n * `ExecutionMutationDefault` minus its `ref` — the per-field phases value\n * authoring layers attach to a column before the column ref is known.\n */\nexport type ExecutionMutationDefaultPhases = Omit<ExecutionMutationDefault, 'ref'>;\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\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 readonly [key: string]: unknown;\n };\n}\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 readonly invariants: readonly string[];\n}\n"],"mappings":";AA+BA,SAAgB,cAAsC,OAAgC;CACpF,OAAO;;AAGT,SAAgB,SAAiC,OAA8B;CAC7E,OAAO;;AAUT,SAAgB,YAAoC,OAA8B;CAChF,OAAO;;;;;;;;;;AA2CT,SAAgB,iCACd,OACyC;CACzC,IAAI,UAAU,MAAM,OAAO;CAC3B,MAAM,IAAI,OAAO;CACjB,IAAI,MAAM,YAAY,MAAM,YAAY,MAAM,WAAW,OAAO;CAChE,IAAI,iBAAiB,MAAM,OAAO;CAClC,IAAI,MAAM,QAAQ,MAAM,EAAE,OAAO,MAAM,MAAM,iCAAiC;CAC9E,IAAI,MAAM,YAAY,OAAO,eAAe,MAAM,KAAK,OAAO,WAC5D,OAAO,OAAO,OAAO,MAAiC,CAAC,MAAM,iCAAiC;CAEhG,OAAO;;AAUT,SAAgB,gBAAgB,OAAwC;CACtE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,OAAQ,MAA6B;CAC3C,IAAI,SAAS,WACX,OAAO,WAAW;CAEpB,IAAI,SAAS,YACX,OAAO,OAAQ,MAAmC,eAAe;CAEnE,OAAO;;AAST,SAAgB,gCACd,OACwC;CACxC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,YAAY;CAKlB,IAAI,UAAU,SAAS,aAAa,OAAO;CAC3C,IAAI,OAAO,UAAU,OAAO,UAAU,OAAO;CAC7C,IACE,UAAU,WAAW,KAAA,MACpB,OAAO,UAAU,WAAW,YAC3B,UAAU,WAAW,QACrB,MAAM,QAAQ,UAAU,OAAO,GAEjC,OAAO;CAET,OAAO"}
1
+ {"version":3,"file":"types-CVGwkRLa.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\n/**\n * Runtime predicate for `ColumnDefaultLiteralInputValue`. Authoring layers\n * resolve template values from caller-supplied args (typed `unknown` at the\n * boundary) and need to validate before constructing a `ColumnDefault`.\n * Accepts JSON primitives, plain arrays/objects of JSON values, and `Date`\n * instances. Rejects functions, class instances (other than `Date`),\n * `undefined`, `bigint`, `symbol`, and arrays/objects containing those.\n */\nexport function isColumnDefaultLiteralInputValue(\n value: unknown,\n): value is ColumnDefaultLiteralInputValue {\n if (value === null) return true;\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return true;\n if (value instanceof Date) return true;\n if (Array.isArray(value)) return value.every(isColumnDefaultLiteralInputValue);\n if (t === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n return Object.values(value as Record<string, unknown>).every(isColumnDefaultLiteralInputValue);\n }\n return false;\n}\n\nexport type ColumnDefault =\n | {\n readonly kind: 'literal';\n readonly value: ColumnDefaultLiteralInputValue;\n }\n | { readonly kind: 'function'; readonly expression: string };\n\nexport function isColumnDefault(value: unknown): value is ColumnDefault {\n if (typeof value !== 'object' || value === null) return false;\n const kind = (value as { kind?: unknown }).kind;\n if (kind === 'literal') {\n return 'value' in value;\n }\n if (kind === 'function') {\n return typeof (value as { expression?: unknown }).expression === 'string';\n }\n return false;\n}\n\nexport type ExecutionMutationDefaultValue = {\n readonly kind: 'generator';\n readonly id: GeneratedValueSpec['id'];\n readonly params?: Record<string, unknown>;\n};\n\nexport function isExecutionMutationDefaultValue(\n value: unknown,\n): value is ExecutionMutationDefaultValue {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as {\n kind?: unknown;\n id?: unknown;\n params?: unknown;\n };\n if (candidate.kind !== 'generator') return false;\n if (typeof candidate.id !== 'string') return false;\n if (\n candidate.params !== undefined &&\n (typeof candidate.params !== 'object' ||\n candidate.params === null ||\n Array.isArray(candidate.params))\n ) {\n return false;\n }\n return true;\n}\n\nexport type ExecutionMutationDefault = {\n readonly ref: { readonly table: string; readonly column: string };\n readonly onCreate?: ExecutionMutationDefaultValue;\n readonly onUpdate?: ExecutionMutationDefaultValue;\n};\n\n/**\n * `ExecutionMutationDefault` minus its `ref` — the per-field phases value\n * authoring layers attach to a column before the column ref is known.\n */\nexport type ExecutionMutationDefaultPhases = Omit<ExecutionMutationDefault, 'ref'>;\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\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 readonly [key: string]: unknown;\n };\n}\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 readonly invariants: readonly string[];\n}\n"],"mappings":";AA+BA,SAAgB,cAAsC,OAAgC;CACpF,OAAO;AACT;AAEA,SAAgB,SAAiC,OAA8B;CAC7E,OAAO;AACT;AASA,SAAgB,YAAoC,OAA8B;CAChF,OAAO;AACT;;;;;;;;;AA0CA,SAAgB,iCACd,OACyC;CACzC,IAAI,UAAU,MAAM,OAAO;CAC3B,MAAM,IAAI,OAAO;CACjB,IAAI,MAAM,YAAY,MAAM,YAAY,MAAM,WAAW,OAAO;CAChE,IAAI,iBAAiB,MAAM,OAAO;CAClC,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,gCAAgC;CAC7E,IAAI,MAAM,YAAY,OAAO,eAAe,KAAK,MAAM,OAAO,WAC5D,OAAO,OAAO,OAAO,KAAgC,EAAE,MAAM,gCAAgC;CAE/F,OAAO;AACT;AASA,SAAgB,gBAAgB,OAAwC;CACtE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,OAAQ,MAA6B;CAC3C,IAAI,SAAS,WACX,OAAO,WAAW;CAEpB,IAAI,SAAS,YACX,OAAO,OAAQ,MAAmC,eAAe;CAEnE,OAAO;AACT;AAQA,SAAgB,gCACd,OACwC;CACxC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,YAAY;CAKlB,IAAI,UAAU,SAAS,aAAa,OAAO;CAC3C,IAAI,OAAO,UAAU,OAAO,UAAU,OAAO;CAC7C,IACE,UAAU,WAAW,KAAA,MACpB,OAAO,UAAU,WAAW,YAC3B,UAAU,WAAW,QACrB,MAAM,QAAQ,UAAU,MAAM,IAEhC,OAAO;CAET,OAAO;AACT"}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,3 @@
1
- import { A as isExecutionMutationDefaultValue, B as ContractRelationOn, C as Source, D as executionHash, E as coreHash, 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 isColumnDefault, P as ContractField, R as ContractReferenceRelation, S as ProfileHashBase, T as StorageHashBase, 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 isColumnDefaultLiteralInputValue, l as DocCollection, m as ExecutionMutationDefaultValue, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultPhases, q as UnionFieldType, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as StorageBase, x as PlanMeta, y as JsonPrimitive, z as ContractRelation } from "./contract-types-Bt2uyqs3.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 ExecutionMutationDefaultPhases, type ExecutionMutationDefaultValue, type ExecutionSection, type Expr, type FieldType, type GeneratedValueSpec, type JsonPrimitive, type JsonValue, type ModelStorageBase, type PlanMeta, type ProfileHashBase, type ReferenceRelationKeys, type ScalarFieldType, type Source, type StorageBase, type StorageHashBase, type UnionFieldType, type ValueObjectFieldType, coreHash, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
1
+ import { a as asNamespaceId, i as NamespaceId, n as CrossReferenceSchema, r as crossRef, t as CrossReference } from "./cross-reference-t0TDbBTP.mjs";
2
+ import { A as isExecutionMutationDefaultValue, B as ContractRelationOn, C as Source, D as executionHash, E as coreHash, 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 isColumnDefault, P as ContractField, R as ContractReferenceRelation, S as ProfileHashBase, T as StorageHashBase, 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 isColumnDefaultLiteralInputValue, l as DocCollection, m as ExecutionMutationDefaultValue, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultPhases, q as UnionFieldType, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as StorageBase, x as PlanMeta, y as JsonPrimitive, z as ContractRelation } from "./contract-types-OSHtK6P5.mjs";
3
+ 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 CrossReference, CrossReferenceSchema, type DocCollection, type DocIndex, type EmbedRelationKeys, type ExecutionHashBase, type ExecutionMutationDefault, type ExecutionMutationDefaultPhases, type ExecutionMutationDefaultValue, type ExecutionSection, type Expr, type FieldType, type GeneratedValueSpec, type JsonPrimitive, type JsonValue, type ModelStorageBase, type NamespaceId, type PlanMeta, type ProfileHashBase, type ReferenceRelationKeys, type ScalarFieldType, type Source, type StorageBase, type StorageHashBase, type UnionFieldType, type ValueObjectFieldType, asNamespaceId, coreHash, crossRef, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
package/dist/types.mjs CHANGED
@@ -1,2 +1,25 @@
1
1
  import { a as isExecutionMutationDefaultValue, i as isColumnDefaultLiteralInputValue, n as executionHash, o as profileHash, r as isColumnDefault, t as coreHash } from "./types-CVGwkRLa.mjs";
2
- export { coreHash, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
2
+ import { blindCast } from "@prisma-next/utils/casts";
3
+ import { type } from "arktype";
4
+ //#region src/namespace-id.ts
5
+ function asNamespaceId(value) {
6
+ return blindCast(value);
7
+ }
8
+ //#endregion
9
+ //#region src/cross-reference.ts
10
+ const CrossReferenceSchema = blindCast(type({
11
+ "+": "reject",
12
+ namespace: "string",
13
+ model: "string"
14
+ }));
15
+ const DEFAULT_CROSS_REF_NAMESPACE = "__unbound__";
16
+ function crossRef(model, namespace = DEFAULT_CROSS_REF_NAMESPACE) {
17
+ return {
18
+ namespace: asNamespaceId(namespace),
19
+ model
20
+ };
21
+ }
22
+ //#endregion
23
+ export { CrossReferenceSchema, asNamespaceId, coreHash, crossRef, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
24
+
25
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../src/namespace-id.ts","../src/cross-reference.ts"],"sourcesContent":["import { blindCast } from '@prisma-next/utils/casts';\n\nexport type NamespaceId = string & { readonly __brand: 'NamespaceId' };\n\nexport function asNamespaceId(value: string): NamespaceId {\n return blindCast<\n NamespaceId,\n 'NamespaceId is a compile-time-only brand on string; this factory is the sole assertion site'\n >(value);\n}\n","import { blindCast } from '@prisma-next/utils/casts';\nimport { type Type, type } from 'arktype';\nimport { asNamespaceId, type NamespaceId } from './namespace-id';\n\nexport interface CrossReference {\n readonly namespace: NamespaceId;\n readonly model: string;\n}\n\nexport const CrossReferenceSchema = blindCast<\n Type<CrossReference>,\n 'namespace is validated as string at runtime and branded to NamespaceId by asNamespaceId in crossRef(); the schema accepts plain strings but the public type reflects the branded shape'\n>(\n type({\n '+': 'reject',\n namespace: 'string',\n model: 'string',\n }),\n);\n\nconst DEFAULT_CROSS_REF_NAMESPACE = '__unbound__';\n\nexport function crossRef(\n model: string,\n namespace: string = DEFAULT_CROSS_REF_NAMESPACE,\n): CrossReference {\n return { namespace: asNamespaceId(namespace), model };\n}\n"],"mappings":";;;;AAIA,SAAgB,cAAc,OAA4B;CACxD,OAAO,UAGL,KAAK;AACT;;;ACAA,MAAa,uBAAuB,UAIlC,KAAK;CACH,KAAK;CACL,WAAW;CACX,OAAO;AACT,CAAC,CACH;AAEA,MAAM,8BAA8B;AAEpC,SAAgB,SACd,OACA,YAAoB,6BACJ;CAChB,OAAO;EAAE,WAAW,cAAc,SAAS;EAAG;CAAM;AACtD"}
@@ -1,18 +1,20 @@
1
+ import { t as CrossReference } from "./cross-reference-t0TDbBTP.mjs";
2
+
1
3
  //#region src/validate-domain.d.ts
2
4
  interface DomainModelShape {
3
5
  readonly fields: Record<string, unknown>;
4
6
  readonly relations?: Record<string, {
5
- readonly to: string;
7
+ readonly to: CrossReference;
6
8
  }>;
7
9
  readonly discriminator?: {
8
10
  readonly field: string;
9
11
  };
10
12
  readonly variants?: Record<string, unknown>;
11
- readonly base?: string;
13
+ readonly base?: CrossReference;
12
14
  readonly owner?: string;
13
15
  }
14
16
  interface DomainContractShape {
15
- readonly roots: Record<string, string>;
17
+ readonly roots: Record<string, CrossReference>;
16
18
  readonly models: Record<string, DomainModelShape>;
17
19
  readonly valueObjects?: Record<string, {
18
20
  readonly fields: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"mappings":";UAEiB,gBAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,SAAA,GAAY,MAAA;IAAA,SAA0B,EAAA;EAAA;EAAA,SACtC,aAAA;IAAA,SAA2B,KAAA;EAAA;EAAA,SAC3B,QAAA,GAAW,MAAA;EAAA,SACX,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,UAGM,mBAAA;EAAA,SACN,KAAA,EAAO,MAAA;EAAA,SACP,MAAA,EAAQ,MAAA,SAAe,gBAAA;EAAA,SACvB,YAAA,GAAe,MAAA;IAAA,SAA0B,MAAA,EAAQ,MAAA;EAAA;AAAA;AAAA,iBAG5C,sBAAA,CAAuB,QAAA,EAAU,mBAAA"}
1
+ {"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"mappings":";;;UAGiB,gBAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,SAAA,GAAY,MAAA;IAAA,SAA0B,EAAA,EAAI,cAAA;EAAA;EAAA,SAC1C,aAAA;IAAA,SAA2B,KAAA;EAAA;EAAA,SAC3B,QAAA,GAAW,MAAA;EAAA,SACX,IAAA,GAAO,cAAA;EAAA,SACP,KAAA;AAAA;AAAA,UAGM,mBAAA;EAAA,SACN,KAAA,EAAO,MAAA,SAAe,cAAA;EAAA,SACtB,MAAA,EAAQ,MAAA,SAAe,gBAAA;EAAA,SACvB,YAAA,GAAe,MAAA;IAAA,SAA0B,MAAA,EAAQ,MAAA;EAAA;AAAA;AAAA,iBAG5C,sBAAA,CAAuB,QAA6B,EAAnB,mBAAmB"}
@@ -14,9 +14,11 @@ function validateContractDomain(contract) {
14
14
  }
15
15
  function validateRoots(contract, modelNames, errors) {
16
16
  const seenValues = /* @__PURE__ */ new Set();
17
- for (const [rootKey, modelName] of Object.entries(contract.roots)) {
18
- if (seenValues.has(modelName)) errors.push(`Duplicate root value: "${modelName}" is mapped by multiple root keys`);
19
- seenValues.add(modelName);
17
+ for (const [rootKey, crossRef] of Object.entries(contract.roots)) {
18
+ const modelName = crossRef.model;
19
+ const dedupeKey = `${crossRef.namespace}:${modelName}`;
20
+ if (seenValues.has(dedupeKey)) errors.push(`Duplicate root value: "${modelName}" is mapped by multiple root keys`);
21
+ seenValues.add(dedupeKey);
20
22
  if (!modelNames.has(modelName)) errors.push(`Root "${rootKey}" references model "${modelName}" which does not exist in models`);
21
23
  }
22
24
  }
@@ -30,21 +32,25 @@ function validateVariantsAndBases(contract, modelNames, errors) {
30
32
  }
31
33
  const variantModel = models.get(variantName);
32
34
  if (!variantModel) continue;
33
- if (variantModel.base !== modelName) errors.push(`Variant "${variantName}" has base "${variantModel.base ?? "(none)"}" but expected "${modelName}"`);
35
+ if (variantModel.base?.model !== modelName) errors.push(`Variant "${variantName}" has base "${variantModel.base?.model ?? "(none)"}" but expected "${modelName}"`);
34
36
  }
35
37
  if (model.base) {
36
- if (!modelNames.has(model.base)) {
37
- errors.push(`Model "${modelName}" has base "${model.base}" which does not exist in models`);
38
+ const baseModelName = model.base.model;
39
+ if (!modelNames.has(baseModelName)) {
40
+ errors.push(`Model "${modelName}" has base "${baseModelName}" which does not exist in models`);
38
41
  continue;
39
42
  }
40
- const baseModel = models.get(model.base);
43
+ const baseModel = models.get(baseModelName);
41
44
  if (!baseModel) continue;
42
- if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) errors.push(`Model "${modelName}" has base "${model.base}" which does not list it as a variant`);
45
+ if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) errors.push(`Model "${modelName}" has base "${baseModelName}" which does not list it as a variant`);
43
46
  }
44
47
  }
45
48
  }
46
49
  function validateRelationTargets(contract, modelNames, errors) {
47
- for (const [modelName, model] of Object.entries(contract.models)) for (const [relName, relation] of Object.entries(model.relations ?? {})) if (!modelNames.has(relation.to)) errors.push(`Relation "${relName}" on model "${modelName}" targets "${relation.to}" which does not exist in models`);
50
+ for (const [modelName, model] of Object.entries(contract.models)) for (const [relName, relation] of Object.entries(model.relations ?? {})) {
51
+ const targetModelName = relation.to.model;
52
+ if (!modelNames.has(targetModelName)) errors.push(`Relation "${relName}" on model "${modelName}" targets "${targetModelName}" which does not exist in models`);
53
+ }
48
54
  }
49
55
  function validateDiscriminators(contract, errors) {
50
56
  for (const [modelName, model] of Object.entries(contract.models)) {
@@ -64,7 +70,7 @@ function validateOwnership(contract, modelNames, errors) {
64
70
  if (!model.owner) continue;
65
71
  if (model.owner === modelName) errors.push(`Model "${modelName}" cannot own itself`);
66
72
  if (!modelNames.has(model.owner)) errors.push(`Model "${modelName}" has owner "${model.owner}" which does not exist in models`);
67
- 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}")`);
73
+ for (const [rootKey, rootRef] of Object.entries(contract.roots)) if (rootRef.model === modelName) errors.push(`Owned model "${modelName}" must not appear in roots (found as root "${rootKey}")`);
68
74
  }
69
75
  }
70
76
  function forEachContractField(contract, callback) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-domain.mjs","names":["f"],"sources":["../src/validate-domain.ts"],"sourcesContent":["import { ContractValidationError } from './contract-validation-error';\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":";;AAiBA,SAAgB,uBAAuB,UAAqC;CAC1E,MAAM,SAAmB,EAAE;CAC3B,MAAM,aAAa,IAAI,IAAI,OAAO,KAAK,SAAS,OAAO,CAAC;CAExD,cAAc,UAAU,YAAY,OAAO;CAC3C,yBAAyB,UAAU,YAAY,OAAO;CACtD,wBAAwB,UAAU,YAAY,OAAO;CACrD,uBAAuB,UAAU,OAAO;CACxC,kBAAkB,UAAU,YAAY,OAAO;CAC/C,8BAA8B,UAAU,OAAO;CAC/C,uBAAuB,UAAU,OAAO;CAExC,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,wBACR,yCAAyC,OAAO,KAAK,OAAO,IAC5D,SACD;;AAIL,SAAS,cACP,UACA,YACA,QACM;CACN,MAAM,6BAAa,IAAI,KAAa;CACpC,KAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,SAAS,MAAM,EAAE;EACjE,IAAI,WAAW,IAAI,UAAU,EAC3B,OAAO,KAAK,0BAA0B,UAAU,mCAAmC;EAErF,WAAW,IAAI,UAAU;EAEzB,IAAI,CAAC,WAAW,IAAI,UAAU,EAC5B,OAAO,KACL,SAAS,QAAQ,sBAAsB,UAAU,kCAClD;;;AAKP,SAAS,yBACP,UACA,YACA,QACM;CACN,MAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,SAAS,OAAO,CAAC;CAEvD,KAAK,MAAM,CAAC,WAAW,UAAU,QAAQ;EACvC,IAAI,MAAM,UACR,KAAK,MAAM,eAAe,OAAO,KAAK,MAAM,SAAS,EAAE;GACrD,IAAI,CAAC,WAAW,IAAI,YAAY,EAAE;IAChC,OAAO,KACL,UAAU,UAAU,mBAAmB,YAAY,kCACpD;IACD;;GAEF,MAAM,eAAe,OAAO,IAAI,YAAY;GAC5C,IAAI,CAAC,cAAc;GACnB,IAAI,aAAa,SAAS,WACxB,OAAO,KACL,YAAY,YAAY,cAAc,aAAa,QAAQ,SAAS,kBAAkB,UAAU,GACjG;;EAKP,IAAI,MAAM,MAAM;GACd,IAAI,CAAC,WAAW,IAAI,MAAM,KAAK,EAAE;IAC/B,OAAO,KAAK,UAAU,UAAU,cAAc,MAAM,KAAK,kCAAkC;IAC3F;;GAEF,MAAM,YAAY,OAAO,IAAI,MAAM,KAAK;GACxC,IAAI,CAAC,WAAW;GAChB,IAAI,CAAC,UAAU,YAAY,CAAC,OAAO,OAAO,UAAU,UAAU,UAAU,EACtE,OAAO,KACL,UAAU,UAAU,cAAc,MAAM,KAAK,uCAC9C;;;;AAMT,SAAS,wBACP,UACA,YACA,QACM;CACN,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAC9D,KAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,MAAM,aAAa,EAAE,CAAC,EACrE,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,EAC9B,OAAO,KACL,aAAa,QAAQ,cAAc,UAAU,aAAa,SAAS,GAAG,kCACvE;;AAMT,SAAS,uBAAuB,UAA+B,QAAwB;CACrF,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;EAChE,IAAI,MAAM,eAAe;GACvB,IAAI,CAAC,MAAM,YAAY,OAAO,KAAK,MAAM,SAAS,CAAC,WAAW,GAC5D,OAAO,KAAK,UAAU,UAAU,qCAAqC;GAEvE,IAAI,CAAC,OAAO,OAAO,MAAM,QAAQ,MAAM,cAAc,MAAM,EACzD,OAAO,KACL,wBAAwB,MAAM,cAAc,MAAM,6BAA6B,UAAU,GAC1F;;EAIL,IAAI,MAAM,YAAY,OAAO,KAAK,MAAM,SAAS,CAAC,SAAS,KAAK,CAAC,MAAM,eACrE,OAAO,KAAK,UAAU,UAAU,qCAAqC;EAGvE,IAAI,MAAM,MAAM;GACd,IAAI,MAAM,eACR,OAAO,KAAK,UAAU,UAAU,4CAA4C;GAE9E,IAAI,MAAM,YAAY,OAAO,KAAK,MAAM,SAAS,CAAC,SAAS,GACzD,OAAO,KAAK,UAAU,UAAU,uCAAuC;;;;AAM/E,SAAS,kBACP,UACA,YACA,QACM;CACN,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;EAChE,IAAI,CAAC,MAAM,OAAO;EAElB,IAAI,MAAM,UAAU,WAClB,OAAO,KAAK,UAAU,UAAU,qBAAqB;EAGvD,IAAI,CAAC,WAAW,IAAI,MAAM,MAAM,EAC9B,OAAO,KAAK,UAAU,UAAU,eAAe,MAAM,MAAM,kCAAkC;EAG/F,KAAK,MAAM,CAAC,SAAS,cAAc,OAAO,QAAQ,SAAS,MAAM,EAC/D,IAAI,cAAc,WAChB,OAAO,KACL,gBAAgB,UAAU,6CAA6C,QAAQ,IAChF;;;AAkBT,SAAS,qBACP,UACA,UACM;CACN,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAC9D,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,MAAM,OAAO,EAC3D,SAAS,OAAO,UAAU,UAAU,WAAW,UAAU,GAAG;CAGhE,KAAK,MAAM,CAAC,QAAQ,OAAO,OAAO,QAAQ,SAAS,gBAAgB,EAAE,CAAC,EACpE,KAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,GAAG,OAAO,EACxD,SAAS,OAAO,iBAAiB,OAAO,WAAW,UAAU,GAAG;;AAKtE,SAAS,8BAA8B,UAA+B,QAAwB;CAC5F,MAAM,UAAU,IAAI,IAAI,OAAO,KAAK,SAAS,gBAAgB,EAAE,CAAC,CAAC;CAEjE,SAAS,UAAU,MAAiC,UAAwB;EAC1E,IAAI,CAAC,MAAM;EACX,IAAI,KAAK,SAAS,iBAAiB,KAAK,QAAQ,CAAC,QAAQ,IAAI,KAAK,KAAK,EAAE;GACvE,OAAO,KACL,GAAG,SAAS,4BAA4B,KAAK,KAAK,wCACnD;GACD;;EAEF,IAAI,KAAK,SAAS,SAChB,KAAK,MAAM,UAAU,KAAK,WAAW,EAAE,EAAE,UAAU,QAAQ,SAAS;;CAIxE,qBAAqB,WAAW,OAAO,aAAa;EAElD,UAAUA,OAAG,MAAM,SAAS;GAC5B;;AAGJ,SAAS,uBAAuB,UAA+B,QAAwB;CACrF,qBAAqB,WAAW,OAAO,aAAa;EAClD,MAAM,IAAI;EACV,IAAI,GAAG,QAAQ,GAAG,MAChB,OAAO,KAAK,GAAG,SAAS,+CAA+C;GAEzE"}
1
+ {"version":3,"file":"validate-domain.mjs","names":["f"],"sources":["../src/validate-domain.ts"],"sourcesContent":["import { ContractValidationError } from './contract-validation-error';\nimport type { CrossReference } from './cross-reference';\n\nexport interface DomainModelShape {\n readonly fields: Record<string, unknown>;\n readonly relations?: Record<string, { readonly to: CrossReference }>;\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, unknown>;\n readonly base?: CrossReference;\n readonly owner?: string;\n}\n\nexport interface DomainContractShape {\n readonly roots: Record<string, CrossReference>;\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, crossRef] of Object.entries(contract.roots)) {\n const modelName = crossRef.model;\n const dedupeKey = `${crossRef.namespace}:${modelName}`;\n if (seenValues.has(dedupeKey)) {\n errors.push(`Duplicate root value: \"${modelName}\" is mapped by multiple root keys`);\n }\n seenValues.add(dedupeKey);\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?.model !== modelName) {\n errors.push(\n `Variant \"${variantName}\" has base \"${variantModel.base?.model ?? '(none)'}\" but expected \"${modelName}\"`,\n );\n }\n }\n }\n\n if (model.base) {\n const baseModelName = model.base.model;\n if (!modelNames.has(baseModelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${baseModelName}\" which does not exist in models`,\n );\n continue;\n }\n const baseModel = models.get(baseModelName);\n if (!baseModel) continue;\n if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${baseModelName}\" 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 const targetModelName = relation.to.model;\n if (!modelNames.has(targetModelName)) {\n errors.push(\n `Relation \"${relName}\" on model \"${modelName}\" targets \"${targetModelName}\" 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, rootRef] of Object.entries(contract.roots)) {\n if (rootRef.model === 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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"}
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@prisma-next/contract",
3
- "version": "0.11.0-dev.4",
3
+ "version": "0.11.0-dev.41",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "Data contract type definitions and JSON schema for Prisma Next",
8
8
  "dependencies": {
9
- "@prisma-next/utils": "0.11.0-dev.4",
9
+ "@prisma-next/utils": "0.11.0-dev.41",
10
10
  "@standard-schema/spec": "^1.1.0",
11
11
  "arktype": "^2.2.0"
12
12
  },
13
13
  "devDependencies": {
14
- "@prisma-next/test-utils": "0.11.0-dev.4",
15
- "@prisma-next/tsconfig": "0.11.0-dev.4",
16
- "@prisma-next/tsdown": "0.11.0-dev.4",
14
+ "@prisma-next/test-utils": "0.11.0-dev.41",
15
+ "@prisma-next/tsconfig": "0.11.0-dev.41",
16
+ "@prisma-next/tsdown": "0.11.0-dev.41",
17
17
  "tsdown": "0.22.0",
18
18
  "typescript": "5.9.3",
19
19
  "vitest": "4.1.6"
@@ -132,6 +132,12 @@ function omitDefaults(obj: unknown, path: readonly string[]): unknown {
132
132
  currentPath[1] === 'types' &&
133
133
  key === 'typeParams';
134
134
 
135
+ const isDomainUnboundTypeParams =
136
+ currentPath.length === 5 &&
137
+ currentPath[0] === 'domain' &&
138
+ currentPath[2] === 'types' &&
139
+ key === 'typeParams';
140
+
135
141
  const isFkBooleanField =
136
142
  currentPath.length === 7 &&
137
143
  currentPath[0] === 'storage' &&
@@ -161,7 +167,8 @@ function omitDefaults(obj: unknown, path: readonly string[]): unknown {
161
167
  !isNamespaceTableForeignKeys &&
162
168
  !isFkBooleanField &&
163
169
  !isNullableField &&
164
- !isStorageTypeTypeParams
170
+ !isStorageTypeTypeParams &&
171
+ !isDomainUnboundTypeParams
165
172
  ) {
166
173
  continue;
167
174
  }
@@ -324,6 +331,7 @@ export function canonicalizeContractToObject(
324
331
  roots: serialized['roots'],
325
332
  models: serialized['models'],
326
333
  ...ifDefined('valueObjects', serialized['valueObjects']),
334
+ ...ifDefined('domain', serialized['domain']),
327
335
  storage: serialized['storage'],
328
336
  ...ifDefined('execution', serialized['execution']),
329
337
  extensionPacks: serialized['extensionPacks'],
@@ -1,3 +1,4 @@
1
+ import type { CrossReference } from './cross-reference';
1
2
  import type { ContractModelBase, ContractValueObject } from './domain-types';
2
3
  import type {
3
4
  ExecutionHashBase,
@@ -43,7 +44,7 @@ export interface Contract<
43
44
  > {
44
45
  readonly target: string;
45
46
  readonly targetFamily: string;
46
- readonly roots: Record<string, string>;
47
+ readonly roots: Record<string, CrossReference>;
47
48
  readonly models: TModels;
48
49
  readonly valueObjects?: Record<string, ContractValueObject>;
49
50
  /**
@@ -0,0 +1,28 @@
1
+ import { blindCast } from '@prisma-next/utils/casts';
2
+ import { type Type, type } from 'arktype';
3
+ import { asNamespaceId, type NamespaceId } from './namespace-id';
4
+
5
+ export interface CrossReference {
6
+ readonly namespace: NamespaceId;
7
+ readonly model: string;
8
+ }
9
+
10
+ export const CrossReferenceSchema = blindCast<
11
+ Type<CrossReference>,
12
+ 'namespace is validated as string at runtime and branded to NamespaceId by asNamespaceId in crossRef(); the schema accepts plain strings but the public type reflects the branded shape'
13
+ >(
14
+ type({
15
+ '+': 'reject',
16
+ namespace: 'string',
17
+ model: 'string',
18
+ }),
19
+ );
20
+
21
+ const DEFAULT_CROSS_REF_NAMESPACE = '__unbound__';
22
+
23
+ export function crossRef(
24
+ model: string,
25
+ namespace: string = DEFAULT_CROSS_REF_NAMESPACE,
26
+ ): CrossReference {
27
+ return { namespace: asNamespaceId(namespace), model };
28
+ }
@@ -1,3 +1,5 @@
1
+ import type { CrossReference } from './cross-reference';
2
+
1
3
  export type ScalarFieldType = {
2
4
  readonly kind: 'scalar';
3
5
  readonly codecId: string;
@@ -29,13 +31,13 @@ export type ContractRelationOn = {
29
31
  };
30
32
 
31
33
  export type ContractReferenceRelation = {
32
- readonly to: string;
34
+ readonly to: CrossReference;
33
35
  readonly cardinality: '1:1' | '1:N' | 'N:1';
34
36
  readonly on: ContractRelationOn;
35
37
  };
36
38
 
37
39
  export type ContractEmbedRelation = {
38
- readonly to: string;
40
+ readonly to: CrossReference;
39
41
  readonly cardinality: '1:1' | '1:N';
40
42
  };
41
43
 
@@ -61,7 +63,7 @@ export interface ContractModelBase<TModelStorage extends ModelStorageBase = Mode
61
63
  readonly storage: TModelStorage;
62
64
  readonly discriminator?: ContractDiscriminator;
63
65
  readonly variants?: Record<string, ContractVariantEntry>;
64
- readonly base?: string;
66
+ readonly base?: CrossReference;
65
67
  readonly owner?: string;
66
68
  }
67
69
 
@@ -1,4 +1,6 @@
1
1
  export type { Contract, ContractExecutionSection } from '../contract-types';
2
+ export type { CrossReference } from '../cross-reference';
3
+ export { CrossReferenceSchema, crossRef } from '../cross-reference';
2
4
  export type {
3
5
  ContractDiscriminator,
4
6
  ContractEmbedRelation,
@@ -18,6 +20,8 @@ export type {
18
20
  UnionFieldType,
19
21
  ValueObjectFieldType,
20
22
  } from '../domain-types';
23
+ export type { NamespaceId } from '../namespace-id';
24
+ export { asNamespaceId } from '../namespace-id';
21
25
  export type {
22
26
  $,
23
27
  Brand,
@@ -0,0 +1,10 @@
1
+ import { blindCast } from '@prisma-next/utils/casts';
2
+
3
+ export type NamespaceId = string & { readonly __brand: 'NamespaceId' };
4
+
5
+ export function asNamespaceId(value: string): NamespaceId {
6
+ return blindCast<
7
+ NamespaceId,
8
+ 'NamespaceId is a compile-time-only brand on string; this factory is the sole assertion site'
9
+ >(value);
10
+ }
@@ -1,5 +1,6 @@
1
1
  import { ifDefined } from '@prisma-next/utils/defined';
2
2
  import type { Contract } from './contract-types';
3
+ import type { CrossReference } from './cross-reference';
3
4
  import type {
4
5
  ContractModel,
5
6
  ContractModelBase,
@@ -16,7 +17,7 @@ type ContractOverrides<
16
17
  > = {
17
18
  target?: string;
18
19
  targetFamily?: string;
19
- roots?: Record<string, string>;
20
+ roots?: Record<string, CrossReference>;
20
21
  models?: TModels;
21
22
  storage?: Omit<TStorage, 'storageHash'>;
22
23
  valueObjects?: Record<string, ContractValueObject>;
@@ -1,16 +1,17 @@
1
1
  import { ContractValidationError } from './contract-validation-error';
2
+ import type { CrossReference } from './cross-reference';
2
3
 
3
4
  export interface DomainModelShape {
4
5
  readonly fields: Record<string, unknown>;
5
- readonly relations?: Record<string, { readonly to: string }>;
6
+ readonly relations?: Record<string, { readonly to: CrossReference }>;
6
7
  readonly discriminator?: { readonly field: string };
7
8
  readonly variants?: Record<string, unknown>;
8
- readonly base?: string;
9
+ readonly base?: CrossReference;
9
10
  readonly owner?: string;
10
11
  }
11
12
 
12
13
  export interface DomainContractShape {
13
- readonly roots: Record<string, string>;
14
+ readonly roots: Record<string, CrossReference>;
14
15
  readonly models: Record<string, DomainModelShape>;
15
16
  readonly valueObjects?: Record<string, { readonly fields: Record<string, unknown> }>;
16
17
  }
@@ -41,11 +42,13 @@ function validateRoots(
41
42
  errors: string[],
42
43
  ): void {
43
44
  const seenValues = new Set<string>();
44
- for (const [rootKey, modelName] of Object.entries(contract.roots)) {
45
- if (seenValues.has(modelName)) {
45
+ for (const [rootKey, crossRef] of Object.entries(contract.roots)) {
46
+ const modelName = crossRef.model;
47
+ const dedupeKey = `${crossRef.namespace}:${modelName}`;
48
+ if (seenValues.has(dedupeKey)) {
46
49
  errors.push(`Duplicate root value: "${modelName}" is mapped by multiple root keys`);
47
50
  }
48
- seenValues.add(modelName);
51
+ seenValues.add(dedupeKey);
49
52
 
50
53
  if (!modelNames.has(modelName)) {
51
54
  errors.push(
@@ -73,24 +76,27 @@ function validateVariantsAndBases(
73
76
  }
74
77
  const variantModel = models.get(variantName);
75
78
  if (!variantModel) continue;
76
- if (variantModel.base !== modelName) {
79
+ if (variantModel.base?.model !== modelName) {
77
80
  errors.push(
78
- `Variant "${variantName}" has base "${variantModel.base ?? '(none)'}" but expected "${modelName}"`,
81
+ `Variant "${variantName}" has base "${variantModel.base?.model ?? '(none)'}" but expected "${modelName}"`,
79
82
  );
80
83
  }
81
84
  }
82
85
  }
83
86
 
84
87
  if (model.base) {
85
- if (!modelNames.has(model.base)) {
86
- errors.push(`Model "${modelName}" has base "${model.base}" which does not exist in models`);
88
+ const baseModelName = model.base.model;
89
+ if (!modelNames.has(baseModelName)) {
90
+ errors.push(
91
+ `Model "${modelName}" has base "${baseModelName}" which does not exist in models`,
92
+ );
87
93
  continue;
88
94
  }
89
- const baseModel = models.get(model.base);
95
+ const baseModel = models.get(baseModelName);
90
96
  if (!baseModel) continue;
91
97
  if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {
92
98
  errors.push(
93
- `Model "${modelName}" has base "${model.base}" which does not list it as a variant`,
99
+ `Model "${modelName}" has base "${baseModelName}" which does not list it as a variant`,
94
100
  );
95
101
  }
96
102
  }
@@ -104,9 +110,10 @@ function validateRelationTargets(
104
110
  ): void {
105
111
  for (const [modelName, model] of Object.entries(contract.models)) {
106
112
  for (const [relName, relation] of Object.entries(model.relations ?? {})) {
107
- if (!modelNames.has(relation.to)) {
113
+ const targetModelName = relation.to.model;
114
+ if (!modelNames.has(targetModelName)) {
108
115
  errors.push(
109
- `Relation "${relName}" on model "${modelName}" targets "${relation.to}" which does not exist in models`,
116
+ `Relation "${relName}" on model "${modelName}" targets "${targetModelName}" which does not exist in models`,
110
117
  );
111
118
  }
112
119
  }
@@ -157,8 +164,8 @@ function validateOwnership(
157
164
  errors.push(`Model "${modelName}" has owner "${model.owner}" which does not exist in models`);
158
165
  }
159
166
 
160
- for (const [rootKey, rootModel] of Object.entries(contract.roots)) {
161
- if (rootModel === modelName) {
167
+ for (const [rootKey, rootRef] of Object.entries(contract.roots)) {
168
+ if (rootRef.model === modelName) {
162
169
  errors.push(
163
170
  `Owned model "${modelName}" must not appear in roots (found as root "${rootKey}")`,
164
171
  );
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract-types-Bt2uyqs3.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hashing-rZiqFOlc.mjs","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { JsonObject } from '@prisma-next/utils/json';\n\nimport type { Contract } from './contract-types';\n\n/**\n * Per-target contract serializer hook. The framework canonicalizer uses\n * this to convert an in-memory contract (which may carry class-instance\n * IR nodes whose runtime-only fields must not appear in the on-disk\n * envelope) into a plain JsonObject before applying the family-agnostic\n * canonical-key ordering / default-omission / sort steps. Targets whose\n * contract is JSON-clean by construction return the contract unchanged.\n */\nexport type SerializeContract = (contract: Contract) => JsonObject;\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'valueObjects',\n 'domain',\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 isRequiredNamespaces = isArrayEqual(currentPath, ['storage', 'namespaces']);\n const isNamespaceSlot =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'namespaces']);\n const isRequiredNamespaceTables =\n currentPath.length === 4 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables';\n // Preserve per-table payloads even when empty. SQL tables are never\n // emitted empty; Mongo collections legitimately are (a declared\n // collection with no schema is a valid representation), and the\n // family-agnostic canonicalizer must not strip them.\n const isNamespaceTableEntry =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables';\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 isNamespaceTableUniques =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'uniques';\n const isNamespaceTableIndexes =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'indexes';\n const isNamespaceTableForeignKeys =\n currentPath.length === 6 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'foreignKeys';\n\n // `storage.types.<name>.typeParams` is part of the StorageTypeInstance\n // shape (validators require it). Preserve it even when empty so the\n // emitted contract.json remains structurally valid after a round-trip.\n const isStorageTypeTypeParams =\n currentPath.length === 4 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'types' &&\n key === 'typeParams';\n\n const isFkBooleanField =\n currentPath.length === 7 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'namespaces' &&\n currentPath[3] === 'tables' &&\n currentPath[5] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredNamespaces &&\n !isNamespaceSlot &&\n !isRequiredNamespaceTables &&\n !isNamespaceTableEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isNamespaceTableUniques &&\n !isNamespaceTableIndexes &&\n !isNamespaceTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField &&\n !isStorageTypeTypeParams\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 NamespaceObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype StorageObject = {\n namespaces?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortTableArrays(tableObj: TableObject): 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 return sortedTable;\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.namespaces || typeof storageObj.namespaces !== 'object') {\n return storage;\n }\n\n const namespaces = storageObj.namespaces;\n const result: StorageObject = { ...storageObj, namespaces: {} };\n const resultNamespaces = result.namespaces as Record<string, unknown>;\n\n for (const nsId of Object.keys(namespaces)) {\n const ns = namespaces[nsId];\n if (!ns || typeof ns !== 'object') {\n resultNamespaces[nsId] = ns;\n continue;\n }\n\n const nsObj = ns as NamespaceObject;\n if (!nsObj.tables || typeof nsObj.tables !== 'object') {\n resultNamespaces[nsId] = ns;\n continue;\n }\n\n const sortedTables: Record<string, unknown> = {};\n const sortedTableNames = Object.keys(nsObj.tables).sort();\n for (const tableName of sortedTableNames) {\n const table = nsObj.tables[tableName];\n if (!table || typeof table !== 'object') {\n sortedTables[tableName] = table;\n continue;\n }\n sortedTables[tableName] = sortTableArrays(table as TableObject);\n }\n\n resultNamespaces[nsId] = { ...nsObj, tables: sortedTables };\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 interface CanonicalizeContractOptions {\n readonly schemaVersion?: string;\n /**\n * Per-target hook that converts the in-memory contract (which may\n * carry class-instance IR nodes) into a plain JsonObject before the\n * family-agnostic canonicalization steps run.\n *\n * Routing through the hook is what lets each target decide which\n * fields appear in the on-disk envelope; runtime-only class API\n * fields stay invisible to the canonicalization walk by virtue of\n * the per-target serializer not putting them in the JSON shape.\n */\n readonly serializeContract: SerializeContract;\n}\n\n/**\n * Object-form variant of {@link canonicalizeContract}. Exported because the\n * emitter writes the canonical contract through a separate JSON-stringify\n * pass and consumes the structured object directly.\n */\nexport function canonicalizeContractToObject(\n contract: Contract,\n options: CanonicalizeContractOptions,\n): Record<string, unknown> {\n const serialized = options.serializeContract(contract);\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options.schemaVersion),\n targetFamily: serialized['targetFamily'],\n target: serialized['target'],\n profileHash: serialized['profileHash'],\n roots: serialized['roots'],\n models: serialized['models'],\n ...ifDefined('valueObjects', serialized['valueObjects']),\n storage: serialized['storage'],\n ...ifDefined('execution', serialized['execution']),\n extensionPacks: serialized['extensionPacks'],\n capabilities: serialized['capabilities'],\n meta: serialized['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: CanonicalizeContractOptions,\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);\n}\n","import { createHash } from 'node:crypto';\nimport type { JsonObject } from '@prisma-next/utils/json';\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 // Blind cast: the synthesised object is a hash-only stand-in\n // — never returned to callers, never executed as a Contract.\n // `canonicalizeContract` only walks the storage / execution /\n // capabilities slices, all of which are populated above, so the\n // missing precise Contract typing on the other slots is\n // immaterial for the hash result.\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 unknown as Contract;\n return canonicalizeContract(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: (c) => JSON.parse(JSON.stringify(c)) as JsonObject,\n });\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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"}