@prisma-next/contract 0.12.0-dev.7 → 0.12.0-dev.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/apply-specifier-default-control-policy.d.mts +7 -0
  2. package/dist/apply-specifier-default-control-policy.d.mts.map +1 -0
  3. package/dist/apply-specifier-default-control-policy.mjs +12 -0
  4. package/dist/apply-specifier-default-control-policy.mjs.map +1 -0
  5. package/dist/{canonicalization-CM6bJ8i8.d.mts → canonicalization-DGjO7GM3.d.mts} +2 -2
  6. package/dist/canonicalization-DGjO7GM3.d.mts.map +1 -0
  7. package/dist/{canonicalization-path-match-b2jFuEso.mjs → canonicalization-path-match-CNgHuwM_.mjs} +1 -1
  8. package/dist/{canonicalization-path-match-b2jFuEso.mjs.map → canonicalization-path-match-CNgHuwM_.mjs.map} +1 -1
  9. package/dist/{contract-types-9BbapbkL.d.mts → contract-types-DTijd98n.d.mts} +27 -11
  10. package/dist/contract-types-DTijd98n.d.mts.map +1 -0
  11. package/dist/{contract-validation-error-ClZaKqMW.mjs → contract-validation-error-BFA66rwU.mjs} +1 -1
  12. package/dist/{contract-validation-error-ClZaKqMW.mjs.map → contract-validation-error-BFA66rwU.mjs.map} +1 -1
  13. package/dist/{contract-validation-error-T5LH4DW-.d.mts → contract-validation-error-D7g0kmcc.d.mts} +1 -1
  14. package/dist/{contract-validation-error-T5LH4DW-.d.mts.map → contract-validation-error-D7g0kmcc.d.mts.map} +1 -1
  15. package/dist/contract-validation-error.d.mts +1 -1
  16. package/dist/contract-validation-error.mjs +1 -1
  17. package/dist/default-namespace-D5X_k6hJ.d.mts +25 -0
  18. package/dist/default-namespace-D5X_k6hJ.d.mts.map +1 -0
  19. package/dist/default-namespace-rpdJeUMq.mjs +33 -0
  20. package/dist/default-namespace-rpdJeUMq.mjs.map +1 -0
  21. package/dist/default-namespace.d.mts +2 -0
  22. package/dist/default-namespace.mjs +2 -0
  23. package/dist/{domain-envelope-Cv5OTm8D.d.mts → domain-envelope-o7r176OX.d.mts} +52 -14
  24. package/dist/domain-envelope-o7r176OX.d.mts.map +1 -0
  25. package/dist/hashing-utils.d.mts +1 -1
  26. package/dist/hashing-utils.d.mts.map +1 -1
  27. package/dist/hashing-utils.mjs +5 -4
  28. package/dist/hashing-utils.mjs.map +1 -1
  29. package/dist/hashing.d.mts +2 -2
  30. package/dist/hashing.d.mts.map +1 -1
  31. package/dist/hashing.mjs +38 -11
  32. package/dist/hashing.mjs.map +1 -1
  33. package/dist/{namespace-id-CVpkSFUK.mjs → namespace-id-CUxYd4KL.mjs} +1 -1
  34. package/dist/{namespace-id-CVpkSFUK.mjs.map → namespace-id-CUxYd4KL.mjs.map} +1 -1
  35. package/dist/resolve-domain-model-B8fnCEH0.d.mts +17 -0
  36. package/dist/resolve-domain-model-B8fnCEH0.d.mts.map +1 -0
  37. package/dist/resolve-domain-model-BovPAsW2.mjs +20 -0
  38. package/dist/resolve-domain-model-BovPAsW2.mjs.map +1 -0
  39. package/dist/resolve-domain-model.d.mts +2 -0
  40. package/dist/resolve-domain-model.mjs +2 -0
  41. package/dist/types.d.mts +21 -4
  42. package/dist/types.d.mts.map +1 -0
  43. package/dist/types.mjs +28 -31
  44. package/dist/types.mjs.map +1 -1
  45. package/dist/validate-domain.d.mts +1 -1
  46. package/dist/validate-domain.mjs +6 -3
  47. package/dist/validate-domain.mjs.map +1 -1
  48. package/package.json +9 -6
  49. package/src/apply-specifier-default-control-policy.ts +12 -0
  50. package/src/canonicalization-storage-sort.ts +8 -1
  51. package/src/canonicalization.ts +13 -4
  52. package/src/contract-types.ts +8 -6
  53. package/src/control-policy.ts +3 -3
  54. package/src/cross-reference.ts +13 -1
  55. package/src/default-namespace.ts +36 -0
  56. package/src/domain-envelope.ts +3 -61
  57. package/src/domain-namespace-access.ts +32 -0
  58. package/src/domain-types.ts +12 -0
  59. package/src/exports/apply-specifier-default-control-policy.ts +1 -0
  60. package/src/exports/default-namespace.ts +1 -0
  61. package/src/exports/resolve-domain-model.ts +1 -0
  62. package/src/exports/types.ts +12 -8
  63. package/src/hashing.ts +42 -13
  64. package/src/resolve-domain-model.ts +27 -0
  65. package/src/types.ts +18 -2
  66. package/src/validate-domain.ts +6 -0
  67. package/src/value-set-ref.ts +26 -0
  68. package/dist/canonicalization-CM6bJ8i8.d.mts.map +0 -1
  69. package/dist/contract-types-9BbapbkL.d.mts.map +0 -1
  70. package/dist/domain-envelope-Cv5OTm8D.d.mts.map +0 -1
@@ -0,0 +1,7 @@
1
+ import { L as ControlPolicy, t as Contract } from "./contract-types-DTijd98n.mjs";
2
+
3
+ //#region src/apply-specifier-default-control-policy.d.ts
4
+ declare function applySpecifierDefaultControlPolicy(contract: Contract, specifierDefault: ControlPolicy | undefined): Contract;
5
+ //#endregion
6
+ export { applySpecifierDefaultControlPolicy };
7
+ //# sourceMappingURL=apply-specifier-default-control-policy.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-specifier-default-control-policy.d.mts","names":[],"sources":["../src/apply-specifier-default-control-policy.ts"],"mappings":";;;iBAGgB,kCAAA,CACd,QAAA,EAAU,QAAA,EACV,gBAAA,EAAkB,aAAA,eACjB,QAAA"}
@@ -0,0 +1,12 @@
1
+ //#region src/apply-specifier-default-control-policy.ts
2
+ function applySpecifierDefaultControlPolicy(contract, specifierDefault) {
3
+ if (specifierDefault === void 0 || contract.defaultControlPolicy !== void 0) return contract;
4
+ return {
5
+ ...contract,
6
+ defaultControlPolicy: specifierDefault
7
+ };
8
+ }
9
+ //#endregion
10
+ export { applySpecifierDefaultControlPolicy };
11
+
12
+ //# sourceMappingURL=apply-specifier-default-control-policy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-specifier-default-control-policy.mjs","names":[],"sources":["../src/apply-specifier-default-control-policy.ts"],"sourcesContent":["import type { Contract } from './contract-types';\nimport type { ControlPolicy } from './control-policy';\n\nexport function applySpecifierDefaultControlPolicy(\n contract: Contract,\n specifierDefault: ControlPolicy | undefined,\n): Contract {\n if (specifierDefault === undefined || contract.defaultControlPolicy !== undefined) {\n return contract;\n }\n return { ...contract, defaultControlPolicy: specifierDefault };\n}\n"],"mappings":";AAGA,SAAgB,mCACd,UACA,kBACU;CACV,IAAI,qBAAqB,KAAA,KAAa,SAAS,yBAAyB,KAAA,GACtE,OAAO;CAET,OAAO;EAAE,GAAG;EAAU,sBAAsB;CAAiB;AAC/D"}
@@ -1,4 +1,4 @@
1
- import { t as Contract } from "./contract-types-9BbapbkL.mjs";
1
+ import { t as Contract } from "./contract-types-DTijd98n.mjs";
2
2
  import { JsonObject } from "@prisma-next/utils/json";
3
3
 
4
4
  //#region src/canonicalization.d.ts
@@ -66,4 +66,4 @@ declare function canonicalizeContractToObject(contract: Contract, options: Canon
66
66
  declare function canonicalizeContract(contract: Contract, options: CanonicalizeContractOptions): string;
67
67
  //#endregion
68
68
  export { canonicalizeContract as a, StorageSort as i, PreserveEmptyPredicate as n, canonicalizeContractToObject as o, SerializeContract as r, CanonicalizeContractOptions as t };
69
- //# sourceMappingURL=canonicalization-CM6bJ8i8.d.mts.map
69
+ //# sourceMappingURL=canonicalization-DGjO7GM3.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalization-DGjO7GM3.d.mts","names":[],"sources":["../src/canonicalization.ts"],"mappings":";;;;;;AAcA;;;;;;KAAY,iBAAA,IAAqB,QAAA,EAAU,QAAA,KAAa,UAAU;;AAAA;AAUlE;;;;AAA6D;AAS7D;KATY,sBAAA,IAA0B,IAAuB;;;AASlB;AAqL3C;;;;KArLY,WAAA,IAAe,OAAgB;AAAA,UAqL1B,2BAAA;EAAA,SACN,aAAA;EAAA;;;;;;;;AA0ByB;AAQpC;EAlCW,SAWA,iBAAA,EAAmB,iBAAA;;;;;;;WAOnB,mBAAA,GAAsB,sBAAA;EAiB/B;;;;;AAEO;AA2BT;EA7BE,SATS,WAAA,GAAc,WAAA;AAAA;;;;;;iBAQT,4BAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAAA,GACR,MAAA;AAAA,iBA2Ba,oBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAA2B"}
@@ -22,4 +22,4 @@ function createPreserveEmptyPredicate(patterns) {
22
22
  //#endregion
23
23
  export { matchesPathPattern as n, createPreserveEmptyPredicate as t };
24
24
 
25
- //# sourceMappingURL=canonicalization-path-match-b2jFuEso.mjs.map
25
+ //# sourceMappingURL=canonicalization-path-match-CNgHuwM_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonicalization-path-match-b2jFuEso.mjs","names":[],"sources":["../src/canonicalization-path-match.ts"],"sourcesContent":["import type { PreserveEmptyPredicate } from './canonicalization';\n\nexport type PathSegment = string | '*' | readonly string[];\n\nexport type PathPattern = readonly PathSegment[];\n\nexport function matchesPathPattern(path: readonly string[], pattern: PathPattern): boolean {\n if (path.length !== pattern.length) {\n return false;\n }\n\n for (let i = 0; i < pattern.length; i++) {\n const segment = pattern[i];\n const value = path[i];\n if (segment === undefined || value === undefined) {\n return false;\n }\n\n if (segment === '*') {\n continue;\n }\n\n if (typeof segment === 'string') {\n if (value !== segment) {\n return false;\n }\n continue;\n }\n\n if (Array.isArray(segment)) {\n if (!segment.includes(value)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function createPreserveEmptyPredicate(\n patterns: readonly PathPattern[],\n): PreserveEmptyPredicate {\n return (path) => patterns.some((pattern) => matchesPathPattern(path, pattern));\n}\n"],"mappings":";AAMA,SAAgB,mBAAmB,MAAyB,SAA+B;CACzF,IAAI,KAAK,WAAW,QAAQ,QAC1B,OAAO;CAGT,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,UAAU,QAAQ;EACxB,MAAM,QAAQ,KAAK;EACnB,IAAI,YAAY,KAAA,KAAa,UAAU,KAAA,GACrC,OAAO;EAGT,IAAI,YAAY,KACd;EAGF,IAAI,OAAO,YAAY,UAAU;GAC/B,IAAI,UAAU,SACZ,OAAO;GAET;EACF;EAEA,IAAI,MAAM,QAAQ,OAAO;OACnB,CAAC,QAAQ,SAAS,KAAK,GACzB,OAAO;EAAA;CAGb;CAEA,OAAO;AACT;AAEA,SAAgB,6BACd,UACwB;CACxB,QAAQ,SAAS,SAAS,MAAM,YAAY,mBAAmB,MAAM,OAAO,CAAC;AAC/E"}
1
+ {"version":3,"file":"canonicalization-path-match-CNgHuwM_.mjs","names":[],"sources":["../src/canonicalization-path-match.ts"],"sourcesContent":["import type { PreserveEmptyPredicate } from './canonicalization';\n\nexport type PathSegment = string | '*' | readonly string[];\n\nexport type PathPattern = readonly PathSegment[];\n\nexport function matchesPathPattern(path: readonly string[], pattern: PathPattern): boolean {\n if (path.length !== pattern.length) {\n return false;\n }\n\n for (let i = 0; i < pattern.length; i++) {\n const segment = pattern[i];\n const value = path[i];\n if (segment === undefined || value === undefined) {\n return false;\n }\n\n if (segment === '*') {\n continue;\n }\n\n if (typeof segment === 'string') {\n if (value !== segment) {\n return false;\n }\n continue;\n }\n\n if (Array.isArray(segment)) {\n if (!segment.includes(value)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport function createPreserveEmptyPredicate(\n patterns: readonly PathPattern[],\n): PreserveEmptyPredicate {\n return (path) => patterns.some((pattern) => matchesPathPattern(path, pattern));\n}\n"],"mappings":";AAMA,SAAgB,mBAAmB,MAAyB,SAA+B;CACzF,IAAI,KAAK,WAAW,QAAQ,QAC1B,OAAO;CAGT,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,UAAU,QAAQ;EACxB,MAAM,QAAQ,KAAK;EACnB,IAAI,YAAY,KAAA,KAAa,UAAU,KAAA,GACrC,OAAO;EAGT,IAAI,YAAY,KACd;EAGF,IAAI,OAAO,YAAY,UAAU;GAC/B,IAAI,UAAU,SACZ,OAAO;GAET;EACF;EAEA,IAAI,MAAM,QAAQ,OAAO;OACnB,CAAC,QAAQ,SAAS,KAAK,GACzB,OAAO;EAAA;CAGb;CAEA,OAAO;AACT;AAEA,SAAgB,6BACd,UACwB;CACxB,QAAQ,SAAS,SAAS,MAAM,YAAY,mBAAmB,MAAM,OAAO,CAAC;AAC/E"}
@@ -1,4 +1,4 @@
1
- import { T as CrossReference, _ as ContractValueObject, p as ContractModelBase, t as ApplicationDomain } from "./domain-envelope-Cv5OTm8D.mjs";
1
+ import { C as CrossReference, m as ContractValueObject, t as ApplicationDomain, u as ContractModelBase } from "./domain-envelope-o7r176OX.mjs";
2
2
 
3
3
  //#region src/control-policy.d.ts
4
4
  /**
@@ -19,7 +19,7 @@ type ControlPolicy = 'managed' | 'tolerated' | 'external' | 'observed';
19
19
  * Both parameters are optional raw values so this function stays node-type-agnostic
20
20
  * and can be called by any consumer (verifier, planner, etc.) without importing IR classes.
21
21
  */
22
- declare function effectiveControl(nodeControl: ControlPolicy | undefined, defaultControl: ControlPolicy | undefined): ControlPolicy;
22
+ declare function effectiveControlPolicy(nodeControl: ControlPolicy | undefined, defaultControlPolicy: ControlPolicy | undefined): ControlPolicy;
23
23
  //#endregion
24
24
  //#region src/types.d.ts
25
25
  /**
@@ -64,11 +64,13 @@ declare function profileHash<const T extends string>(value: T): ProfileHashBase<
64
64
  type StorageEntitySlot = Readonly<Record<string, unknown>>;
65
65
  /**
66
66
  * Plain-data namespace entry in a storage block. Every hydrated contract
67
- * carries at least `id` plus zero or more entity-kind slot maps (`tables`,
68
- * `collections`, …). Foundation declares only this shape — no IR machinery.
67
+ * carries at least `id` plus entity-kind slot maps under `entries`
68
+ * (`table`, `collection`, …). Foundation declares only this shape — no IR
69
+ * machinery.
69
70
  */
70
71
  interface StorageNamespace {
71
72
  readonly id: string;
73
+ readonly entries: Readonly<Record<string, StorageEntitySlot>>;
72
74
  }
73
75
  /**
74
76
  * Base type for family-specific storage blocks.
@@ -194,6 +196,19 @@ interface ContractMarkerRecord {
194
196
  readonly meta: Record<string, unknown>;
195
197
  readonly invariants: readonly string[];
196
198
  }
199
+ /**
200
+ * One applied migration edge from the per-space ledger journal.
201
+ * Returned by `readLedger` in append (apply) order.
202
+ */
203
+ interface LedgerEntryRecord {
204
+ readonly space: string;
205
+ readonly migrationName: string;
206
+ readonly migrationHash: string;
207
+ readonly from: string | null;
208
+ readonly to: string;
209
+ readonly appliedAt: Date;
210
+ readonly operationCount: number;
211
+ }
197
212
  //#endregion
198
213
  //#region src/contract-types.d.ts
199
214
  /**
@@ -241,15 +256,16 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
241
256
  readonly execution?: ContractExecutionSection;
242
257
  readonly profileHash: ProfileHashBase<string>;
243
258
  readonly meta: Record<string, unknown>;
244
- readonly defaultControl?: ControlPolicy;
259
+ readonly defaultControlPolicy?: ControlPolicy;
245
260
  }
246
- type ContractModelsMap<TContract extends Contract> = TContract extends Contract<StorageBase, infer TModels> ? TModels : never;
247
- type ExactlyOneKey<T extends Record<string, unknown>> = keyof T extends infer Only extends keyof T ? [keyof T] extends [Only] ? Only : never : never;
261
+ /** Model definitions union carried on a {@link Contract}'s `TModels` type parameter. */
262
+ type ContractModelDefinitions<TContract extends Contract> = TContract extends Contract<StorageBase, infer TModels> ? TModels : never;
263
+ type ExactlyOneNamespace<T extends Record<string, unknown>> = keyof T extends infer Only extends keyof T ? [keyof T] extends [Only] ? Only : never : never;
248
264
  type NamespaceValueObjectsOf<TNamespace> = TNamespace extends {
249
265
  readonly valueObjects?: infer VO;
250
266
  } ? VO extends Record<string, ContractValueObject> ? VO : Record<never, never> : Record<never, never>;
251
- /** Value-object map for the contract's sole domain namespace (type-level single-namespace projection). */
252
- type ContractValueObjectsMap<TContract extends Contract> = NamespaceValueObjectsOf<TContract['domain']['namespaces'][ExactlyOneKey<TContract['domain']['namespaces']>]> extends infer Projected ? Projected extends Record<string, ContractValueObject> ? Projected : Record<never, never> : Record<never, never>;
267
+ /** Value-object map when the contract declares exactly one domain namespace. */
268
+ type ContractValueObjectDefinitions<TContract extends Contract> = NamespaceValueObjectsOf<TContract['domain']['namespaces'][ExactlyOneNamespace<TContract['domain']['namespaces']>]> extends infer Projected ? Projected extends Record<string, ContractValueObject> ? Projected : Record<never, never> : Record<never, never>;
253
269
  //#endregion
254
- export { coreHash as A, PlanMeta as C, StorageEntitySlot as D, StorageBase as E, profileHash as F, ControlPolicy as I, effectiveControl as L, isColumnDefault as M, isColumnDefaultLiteralInputValue as N, StorageHashBase as O, isExecutionMutationDefaultValue as P, JsonValue as S, Source as T, ExecutionSection as _, $ as a, GeneratedValueSpec as b, ColumnDefaultLiteralInputValue as c, DocCollection as d, DocIndex as f, ExecutionMutationDefaultValue as g, ExecutionMutationDefaultPhases as h, ContractValueObjectsMap as i, executionHash as j, StorageNamespace as k, ColumnDefaultLiteralValue as l, ExecutionMutationDefault as m, ContractExecutionSection as n, Brand as o, ExecutionHashBase as p, ContractModelsMap as r, ColumnDefault as s, Contract as t, ContractMarkerRecord as u, Expr as v, ProfileHashBase as w, JsonPrimitive as x, FieldType as y };
255
- //# sourceMappingURL=contract-types-9BbapbkL.d.mts.map
270
+ export { StorageNamespace as A, LedgerEntryRecord as C, StorageBase as D, Source as E, isExecutionMutationDefaultValue as F, profileHash as I, ControlPolicy as L, executionHash as M, isColumnDefault as N, StorageEntitySlot as O, isColumnDefaultLiteralInputValue as P, effectiveControlPolicy as R, JsonValue as S, ProfileHashBase as T, ExecutionSection as _, $ as a, GeneratedValueSpec as b, ColumnDefaultLiteralInputValue as c, DocCollection as d, DocIndex as f, ExecutionMutationDefaultValue as g, ExecutionMutationDefaultPhases as h, ContractValueObjectDefinitions as i, coreHash as j, StorageHashBase as k, ColumnDefaultLiteralValue as l, ExecutionMutationDefault as m, ContractExecutionSection as n, Brand as o, ExecutionHashBase as p, ContractModelDefinitions as r, ColumnDefault as s, Contract as t, ContractMarkerRecord as u, Expr as v, PlanMeta as w, JsonPrimitive as x, FieldType as y };
271
+ //# sourceMappingURL=contract-types-DTijd98n.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-types-DTijd98n.d.mts","names":[],"sources":["../src/control-policy.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
@@ -17,4 +17,4 @@ var DomainNamespaceResolutionError = class extends Error {
17
17
  //#endregion
18
18
  export { DomainNamespaceResolutionError as n, ContractValidationError as t };
19
19
 
20
- //# sourceMappingURL=contract-validation-error-ClZaKqMW.mjs.map
20
+ //# sourceMappingURL=contract-validation-error-BFA66rwU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-validation-error-ClZaKqMW.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\nexport class DomainNamespaceResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DomainNamespaceResolutionError';\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;AAEA,IAAa,iCAAb,cAAoD,MAAM;CACxD,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF"}
1
+ {"version":3,"file":"contract-validation-error-BFA66rwU.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\nexport class DomainNamespaceResolutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DomainNamespaceResolutionError';\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;AAEA,IAAa,iCAAb,cAAoD,MAAM;CACxD,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF"}
@@ -10,4 +10,4 @@ declare class DomainNamespaceResolutionError extends Error {
10
10
  }
11
11
  //#endregion
12
12
  export { ContractValidationPhase as n, DomainNamespaceResolutionError as r, ContractValidationError as t };
13
- //# sourceMappingURL=contract-validation-error-T5LH4DW-.d.mts.map
13
+ //# sourceMappingURL=contract-validation-error-D7g0kmcc.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-validation-error-T5LH4DW-.d.mts","names":[],"sources":["../src/contract-validation-error.ts"],"mappings":";KAAY,uBAAA;AAAA,cAEC,uBAAA,SAAgC,KAAA;EAAA,SAClC,IAAA;EAAA,SACA,KAAA,EAAO,uBAAA;cAEJ,OAAA,UAAiB,KAAA,EAAO,uBAAA;AAAA;AAAA,cAOzB,8BAAA,SAAuC,KAAK;cAC3C,OAAA;AAAA"}
1
+ {"version":3,"file":"contract-validation-error-D7g0kmcc.d.mts","names":[],"sources":["../src/contract-validation-error.ts"],"mappings":";KAAY,uBAAA;AAAA,cAEC,uBAAA,SAAgC,KAAA;EAAA,SAClC,IAAA;EAAA,SACA,KAAA,EAAO,uBAAA;cAEJ,OAAA,UAAiB,KAAA,EAAO,uBAAA;AAAA;AAAA,cAOzB,8BAAA,SAAuC,KAAK;cAC3C,OAAA;AAAA"}
@@ -1,2 +1,2 @@
1
- import { n as ContractValidationPhase, r as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-T5LH4DW-.mjs";
1
+ import { n as ContractValidationPhase, r as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-D7g0kmcc.mjs";
2
2
  export { ContractValidationError, type ContractValidationPhase, DomainNamespaceResolutionError };
@@ -1,2 +1,2 @@
1
- import { n as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-ClZaKqMW.mjs";
1
+ import { n as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-BFA66rwU.mjs";
2
2
  export { ContractValidationError, DomainNamespaceResolutionError };
@@ -0,0 +1,25 @@
1
+ //#region src/default-namespace.d.ts
2
+ /**
3
+ * Reserved sentinel domain namespace id for the late-bound application-domain
4
+ * slot — the namespace a model lands in when it is authored without an explicit
5
+ * namespace. This is target-agnostic: targets that allow un-namespaced
6
+ * authoring (e.g. Mongo, SQLite) declare this id as their default on the target
7
+ * descriptor; the framework names the sentinel, never a target. Mirrors
8
+ * storage's `UNBOUND_NAMESPACE_ID` on the domain plane.
9
+ */
10
+ declare const UNBOUND_DOMAIN_NAMESPACE_ID: "__unbound__";
11
+ /**
12
+ * Resolve the single domain namespace of a single-namespace contract.
13
+ *
14
+ * Bare-name access (`db.User`) reads "the contract's one namespace". Every
15
+ * contract in scope today declares exactly one domain namespace, so this is
16
+ * exact — there is nothing to infer. A contract that declares more than one
17
+ * namespace is ambiguous for a bare name, so rather than silently pick one this
18
+ * throws; cross-namespace selection is made explicit (TML-2550).
19
+ */
20
+ declare function soleDomainNamespaceId(domain: {
21
+ readonly namespaces: Readonly<Record<string, unknown>>;
22
+ }): string;
23
+ //#endregion
24
+ export { soleDomainNamespaceId as n, UNBOUND_DOMAIN_NAMESPACE_ID as t };
25
+ //# sourceMappingURL=default-namespace-D5X_k6hJ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-namespace-D5X_k6hJ.d.mts","names":[],"sources":["../src/default-namespace.ts"],"mappings":";;AAUA;;;;AAAiE;AAWjE;;cAXa,2BAAA;;;;;;;AAaZ;;;iBAFe,qBAAA,CAAsB,MAAA;EAAA,SAC3B,UAAA,EAAY,QAAQ,CAAC,MAAA;AAAA"}
@@ -0,0 +1,33 @@
1
+ import { n as DomainNamespaceResolutionError } from "./contract-validation-error-BFA66rwU.mjs";
2
+ //#region src/default-namespace.ts
3
+ /**
4
+ * Reserved sentinel domain namespace id for the late-bound application-domain
5
+ * slot — the namespace a model lands in when it is authored without an explicit
6
+ * namespace. This is target-agnostic: targets that allow un-namespaced
7
+ * authoring (e.g. Mongo, SQLite) declare this id as their default on the target
8
+ * descriptor; the framework names the sentinel, never a target. Mirrors
9
+ * storage's `UNBOUND_NAMESPACE_ID` on the domain plane.
10
+ */
11
+ const UNBOUND_DOMAIN_NAMESPACE_ID = "__unbound__";
12
+ /**
13
+ * Resolve the single domain namespace of a single-namespace contract.
14
+ *
15
+ * Bare-name access (`db.User`) reads "the contract's one namespace". Every
16
+ * contract in scope today declares exactly one domain namespace, so this is
17
+ * exact — there is nothing to infer. A contract that declares more than one
18
+ * namespace is ambiguous for a bare name, so rather than silently pick one this
19
+ * throws; cross-namespace selection is made explicit (TML-2550).
20
+ */
21
+ function soleDomainNamespaceId(domain) {
22
+ const [soleNamespaceId, ...rest] = Object.keys(domain.namespaces);
23
+ if (soleNamespaceId === void 0) throw new DomainNamespaceResolutionError("domain has no namespaces");
24
+ if (rest.length > 0) {
25
+ const all = [soleNamespaceId, ...rest];
26
+ throw new DomainNamespaceResolutionError(`bare-name resolution requires exactly one domain namespace, found ${all.length} (${all.join(", ")}); select a namespace explicitly`);
27
+ }
28
+ return soleNamespaceId;
29
+ }
30
+ //#endregion
31
+ export { soleDomainNamespaceId as n, UNBOUND_DOMAIN_NAMESPACE_ID as t };
32
+
33
+ //# sourceMappingURL=default-namespace-rpdJeUMq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-namespace-rpdJeUMq.mjs","names":[],"sources":["../src/default-namespace.ts"],"sourcesContent":["import { DomainNamespaceResolutionError } from './contract-validation-error';\n\n/**\n * Reserved sentinel domain namespace id for the late-bound application-domain\n * slot — the namespace a model lands in when it is authored without an explicit\n * namespace. This is target-agnostic: targets that allow un-namespaced\n * authoring (e.g. Mongo, SQLite) declare this id as their default on the target\n * descriptor; the framework names the sentinel, never a target. Mirrors\n * storage's `UNBOUND_NAMESPACE_ID` on the domain plane.\n */\nexport const UNBOUND_DOMAIN_NAMESPACE_ID = '__unbound__' as const;\n\n/**\n * Resolve the single domain namespace of a single-namespace contract.\n *\n * Bare-name access (`db.User`) reads \"the contract's one namespace\". Every\n * contract in scope today declares exactly one domain namespace, so this is\n * exact — there is nothing to infer. A contract that declares more than one\n * namespace is ambiguous for a bare name, so rather than silently pick one this\n * throws; cross-namespace selection is made explicit (TML-2550).\n */\nexport function soleDomainNamespaceId(domain: {\n readonly namespaces: Readonly<Record<string, unknown>>;\n}): string {\n const [soleNamespaceId, ...rest] = Object.keys(domain.namespaces);\n if (soleNamespaceId === undefined) {\n throw new DomainNamespaceResolutionError('domain has no namespaces');\n }\n if (rest.length > 0) {\n const all = [soleNamespaceId, ...rest];\n throw new DomainNamespaceResolutionError(\n `bare-name resolution requires exactly one domain namespace, found ${all.length} (${all.join(', ')}); select a namespace explicitly`,\n );\n }\n return soleNamespaceId;\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAa,8BAA8B;;;;;;;;;;AAW3C,SAAgB,sBAAsB,QAE3B;CACT,MAAM,CAAC,iBAAiB,GAAG,QAAQ,OAAO,KAAK,OAAO,UAAU;CAChE,IAAI,oBAAoB,KAAA,GACtB,MAAM,IAAI,+BAA+B,0BAA0B;CAErE,IAAI,KAAK,SAAS,GAAG;EACnB,MAAM,MAAM,CAAC,iBAAiB,GAAG,IAAI;EACrC,MAAM,IAAI,+BACR,qEAAqE,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,iCACrG;CACF;CACA,OAAO;AACT"}
@@ -0,0 +1,2 @@
1
+ import { n as soleDomainNamespaceId, t as UNBOUND_DOMAIN_NAMESPACE_ID } from "./default-namespace-D5X_k6hJ.mjs";
2
+ export { UNBOUND_DOMAIN_NAMESPACE_ID, soleDomainNamespaceId };
@@ -0,0 +1,2 @@
1
+ import { n as soleDomainNamespaceId, t as UNBOUND_DOMAIN_NAMESPACE_ID } from "./default-namespace-rpdJeUMq.mjs";
2
+ export { UNBOUND_DOMAIN_NAMESPACE_ID, soleDomainNamespaceId };
@@ -1,5 +1,3 @@
1
- import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
2
-
3
1
  //#region src/namespace-id.d.ts
4
2
  type NamespaceId = string & {
5
3
  readonly __brand: 'NamespaceId';
@@ -10,9 +8,43 @@ declare function asNamespaceId(value: string): NamespaceId;
10
8
  interface CrossReference {
11
9
  readonly namespace: NamespaceId;
12
10
  readonly model: string;
11
+ /**
12
+ * Contract-space identity for cross-space relations. When present, the
13
+ * referenced model lives in a different contract space. Absent for local
14
+ * (same-space) relations.
15
+ */
16
+ readonly space?: string;
17
+ }
18
+ declare const CrossReferenceSchema: import("arktype/internal/variants/object.ts").ObjectType<CrossReference, {}>;
19
+ declare function crossRef(model: string, namespace?: string, space?: string): CrossReference;
20
+ //#endregion
21
+ //#region src/value-set-ref.d.ts
22
+ /**
23
+ * Space-aware reference coordinate for a domain enum or storage value-set.
24
+ *
25
+ * `plane` names the contract plane the referenced entity lives in:
26
+ * - `'domain'` — the entity lives in the domain plane's `enum` slot.
27
+ * - `'storage'` — the entity lives in the storage plane's `valueSet` slot.
28
+ *
29
+ * `entityKind` names the source entity-kind:
30
+ * - `'enum'` — the referenced entity is a domain enum.
31
+ * - `'value-set'` — the referenced entity is a storage value-set.
32
+ *
33
+ * `namespaceId` admits the `UNBOUND_NAMESPACE_ID` (`__unbound__`) sentinel for
34
+ * single-namespace (unbound) references.
35
+ *
36
+ * Cross-space discrimination is presence-based: when `spaceId` is absent the
37
+ * reference is local (same contract-space); when `spaceId` is present the
38
+ * reference is cross-space. This mirrors the `ForeignKeyReference` carrier
39
+ * convention — no separate tag field — so local refs are JSON-minimal.
40
+ */
41
+ interface ValueSetRef {
42
+ readonly plane: 'domain' | 'storage';
43
+ readonly namespaceId: string;
44
+ readonly entityKind: 'enum' | 'value-set';
45
+ readonly name: string;
46
+ readonly spaceId?: string;
13
47
  }
14
- declare const CrossReferenceSchema: _$arktype_internal_variants_object_ts0.ObjectType<CrossReference, {}>;
15
- declare function crossRef(model: string, namespace?: string): CrossReference;
16
48
  //#endregion
17
49
  //#region src/domain-types.d.ts
18
50
  type ScalarFieldType = {
@@ -34,6 +66,19 @@ type ContractField = {
34
66
  readonly type: ContractFieldType;
35
67
  readonly many?: true;
36
68
  readonly dict?: true;
69
+ readonly valueSet?: ValueSetRef;
70
+ };
71
+ /**
72
+ * A domain enum: an ordered set of named members, each with a codec-encoded
73
+ * value. The `codecId` identifies the codec used to encode member values in
74
+ * storage. The `members` array is ordered (declaration order is preserved).
75
+ */
76
+ type ContractEnum = {
77
+ readonly codecId: string;
78
+ readonly members: readonly {
79
+ readonly name: string;
80
+ readonly value: string;
81
+ }[];
37
82
  };
38
83
  type ContractRelationOn = {
39
84
  readonly localFields: readonly string[];
@@ -79,7 +124,6 @@ type EmbedRelationKeys<TModels extends Record<string, {
79
124
  }>, ModelName extends string & keyof TModels> = { [K in keyof TModels[ModelName]['relations']]: TModels[ModelName]['relations'][K] extends ContractReferenceRelation ? never : K }[keyof TModels[ModelName]['relations']];
80
125
  //#endregion
81
126
  //#region src/domain-envelope.d.ts
82
- declare const UNBOUND_DOMAIN_NAMESPACE_ID: "__unbound__";
83
127
  /**
84
128
  * One namespace's application-domain entities — models and optional value
85
129
  * objects keyed by entity name within that namespace coordinate.
@@ -87,6 +131,7 @@ declare const UNBOUND_DOMAIN_NAMESPACE_ID: "__unbound__";
87
131
  interface ApplicationDomainNamespace<TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>> {
88
132
  readonly models: TModels;
89
133
  readonly valueObjects?: Record<string, ContractValueObject>;
134
+ readonly enum?: Record<string, ContractEnum>;
90
135
  }
91
136
  /**
92
137
  * Application-domain envelope: entity content keyed by namespace id.
@@ -98,13 +143,6 @@ interface ApplicationDomain<TModels extends Record<string, ContractModelBase> =
98
143
  type ContractWithDomain = {
99
144
  readonly domain: ApplicationDomain;
100
145
  };
101
- declare function resolveSingleDomainNamespaceId(domain: ApplicationDomain, namespaceId?: string): string;
102
- declare function contractModels<TModels extends Record<string, ContractModelBase>>(contract: {
103
- readonly domain: ApplicationDomain<TModels>;
104
- }, namespaceId?: string): TModels;
105
- declare function contractValueObjects<TModels extends Record<string, ContractModelBase>>(contract: {
106
- readonly domain: ApplicationDomain<TModels>;
107
- }, namespaceId?: string): Record<string, ContractValueObject> | undefined;
108
146
  //#endregion
109
- export { UnionFieldType as C, crossRef as D, CrossReferenceSchema as E, NamespaceId as O, ScalarFieldType as S, CrossReference as T, ContractValueObject as _, contractModels as a, ModelStorageBase as b, ContractDiscriminator as c, ContractFieldType as d, ContractModel as f, ContractRelationOn as g, ContractRelation as h, UNBOUND_DOMAIN_NAMESPACE_ID as i, asNamespaceId as k, ContractEmbedRelation as l, ContractReferenceRelation as m, ApplicationDomainNamespace as n, contractValueObjects as o, ContractModelBase as p, ContractWithDomain as r, resolveSingleDomainNamespaceId as s, ApplicationDomain as t, ContractField as u, ContractVariantEntry as v, ValueObjectFieldType as w, ReferenceRelationKeys as x, EmbedRelationKeys as y };
110
- //# sourceMappingURL=domain-envelope-Cv5OTm8D.d.mts.map
147
+ export { CrossReference as C, asNamespaceId as D, NamespaceId as E, ValueSetRef as S, crossRef as T, ModelStorageBase as _, ContractEmbedRelation as a, UnionFieldType as b, ContractFieldType as c, ContractReferenceRelation as d, ContractRelation as f, EmbedRelationKeys as g, ContractVariantEntry as h, ContractDiscriminator as i, ContractModel as l, ContractValueObject as m, ApplicationDomainNamespace as n, ContractEnum as o, ContractRelationOn as p, ContractWithDomain as r, ContractField as s, ApplicationDomain as t, ContractModelBase as u, ReferenceRelationKeys as v, CrossReferenceSchema as w, ValueObjectFieldType as x, ScalarFieldType as y };
148
+ //# sourceMappingURL=domain-envelope-o7r176OX.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-envelope-o7r176OX.d.mts","names":[],"sources":["../src/namespace-id.ts","../src/cross-reference.ts","../src/value-set-ref.ts","../src/domain-types.ts","../src/domain-envelope.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { i as StorageSort, n as PreserveEmptyPredicate } from "./canonicalization-CM6bJ8i8.mjs";
1
+ import { i as StorageSort, n as PreserveEmptyPredicate } from "./canonicalization-DGjO7GM3.mjs";
2
2
 
3
3
  //#region src/canonicalization-path-match.d.ts
4
4
  type PathSegment = string | '*' | readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"hashing-utils.d.mts","names":[],"sources":["../src/canonicalization-path-match.ts","../src/canonicalization-storage-sort.ts"],"mappings":";;;KAEY,WAAA;AAAA,KAEA,WAAA,YAAuB,WAAW;AAAA,iBAE9B,kBAAA,CAAmB,IAAA,qBAAyB,OAAA,EAAS,WAAW;AAAA,iBAiChE,4BAAA,CACd,QAAA,WAAmB,WAAA,KAClB,sBAAsB;;;KCvCb,aAAA;AAAA,UAEK,oBAAA;EAAA,SACN,IAAA,WAAe,aAAW;EAAA,SAC1B,SAAA;AAAA;AAAA,iBAOK,qBAAA,CAAsB,CAAA,WAAY,CAAU;AAAA,iBA2D5C,iBAAA,CACd,OAAA,WAAkB,oBAAA,IAClB,OAAA,IAAU,CAAA,WAAY,CAAA,uBACrB,WAAW"}
1
+ {"version":3,"file":"hashing-utils.d.mts","names":[],"sources":["../src/canonicalization-path-match.ts","../src/canonicalization-storage-sort.ts"],"mappings":";;;KAEY,WAAA;AAAA,KAEA,WAAA,YAAuB,WAAW;AAAA,iBAE9B,kBAAA,CAAmB,IAAA,qBAAyB,OAAA,EAAS,WAAW;AAAA,iBAiChE,4BAAA,CACd,QAAA,WAAmB,WAAA,KAClB,sBAAsB;;;KCvCb,aAAA;AAAA,UAEK,oBAAA;EAAA,SACN,IAAA,WAAe,aAAW;EAAA,SAC1B,SAAA;AAAA;AAAA,iBAcK,qBAAA,CAAsB,CAAA,WAAY,CAAU;AAAA,iBA2D5C,iBAAA,CACd,OAAA,WAAkB,oBAAA,IAClB,OAAA,IAAU,CAAA,WAAY,CAAA,uBACrB,WAAW"}
@@ -1,12 +1,13 @@
1
- import { n as matchesPathPattern, t as createPreserveEmptyPredicate } from "./canonicalization-path-match-b2jFuEso.mjs";
1
+ import { n as matchesPathPattern, t as createPreserveEmptyPredicate } from "./canonicalization-path-match-CNgHuwM_.mjs";
2
2
  //#region src/canonicalization-storage-sort.ts
3
3
  function isPlainRecord(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);
5
5
  }
6
+ function compareCodeUnits(a, b) {
7
+ return a < b ? -1 : a > b ? 1 : 0;
8
+ }
6
9
  function compareByNameProperty(a, b) {
7
- const nameA = isPlainRecord(a) && typeof a["name"] === "string" ? a["name"] : "";
8
- const nameB = isPlainRecord(b) && typeof b["name"] === "string" ? b["name"] : "";
9
- return nameA.localeCompare(nameB);
10
+ return compareCodeUnits(isPlainRecord(a) && typeof a["name"] === "string" ? a["name"] : "", isPlainRecord(b) && typeof b["name"] === "string" ? b["name"] : "");
10
11
  }
11
12
  function sortArrayKeysOnRecord(record, arrayKeys, compare) {
12
13
  const sorted = { ...record };
@@ -1 +1 @@
1
- {"version":3,"file":"hashing-utils.mjs","names":[],"sources":["../src/canonicalization-storage-sort.ts"],"sourcesContent":["import type { StorageSort } from './canonicalization';\n\nexport type PathSegment = string | '*';\n\nexport interface NamedArraySortTarget {\n readonly path: readonly PathSegment[];\n readonly arrayKeys: readonly string[];\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function compareByNameProperty(a: unknown, b: unknown): number {\n const nameA = isPlainRecord(a) && typeof a['name'] === 'string' ? a['name'] : '';\n const nameB = isPlainRecord(b) && typeof b['name'] === 'string' ? b['name'] : '';\n return nameA.localeCompare(nameB);\n}\n\nfunction sortArrayKeysOnRecord(\n record: Record<string, unknown>,\n arrayKeys: readonly string[],\n compare: (a: unknown, b: unknown) => number,\n): Record<string, unknown> {\n const sorted: Record<string, unknown> = { ...record };\n for (const key of arrayKeys) {\n const value = record[key];\n if (Array.isArray(value)) {\n sorted[key] = [...value].sort(compare);\n }\n }\n return sorted;\n}\n\nfunction walkAndSort(\n node: unknown,\n pathSegments: readonly PathSegment[],\n arrayKeys: readonly string[],\n compare: (a: unknown, b: unknown) => number,\n): unknown {\n if (pathSegments.length === 0) {\n if (!isPlainRecord(node)) {\n return node;\n }\n return sortArrayKeysOnRecord(node, arrayKeys, compare);\n }\n\n if (!isPlainRecord(node)) {\n return node;\n }\n\n const [head, ...rest] = pathSegments;\n if (head === undefined) {\n return node;\n }\n\n if (head === '*') {\n const sorted: Record<string, unknown> = { ...node };\n for (const key of Object.keys(node)) {\n sorted[key] = walkAndSort(node[key], rest, arrayKeys, compare);\n }\n return sorted;\n }\n\n const child = node[head];\n if (child === undefined) {\n return node;\n }\n\n return { ...node, [head]: walkAndSort(child, rest, arrayKeys, compare) };\n}\n\nexport function createStorageSort(\n targets: readonly NamedArraySortTarget[],\n compare: (a: unknown, b: unknown) => number = compareByNameProperty,\n): StorageSort {\n return (storage) => {\n if (!isPlainRecord(storage)) {\n return storage;\n }\n\n let result: unknown = storage;\n for (const target of targets) {\n result = walkAndSort(result, target.path, target.arrayKeys, compare);\n }\n return result;\n };\n}\n"],"mappings":";;AASA,SAAS,cAAc,OAAkD;CACvE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAgB,sBAAsB,GAAY,GAAoB;CACpE,MAAM,QAAQ,cAAc,CAAC,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;CAC9E,MAAM,QAAQ,cAAc,CAAC,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;CAC9E,OAAO,MAAM,cAAc,KAAK;AAClC;AAEA,SAAS,sBACP,QACA,WACA,SACyB;CACzB,MAAM,SAAkC,EAAE,GAAG,OAAO;CACpD,KAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,QAAQ,OAAO;EACrB,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,OAAO;CAEzC;CACA,OAAO;AACT;AAEA,SAAS,YACP,MACA,cACA,WACA,SACS;CACT,IAAI,aAAa,WAAW,GAAG;EAC7B,IAAI,CAAC,cAAc,IAAI,GACrB,OAAO;EAET,OAAO,sBAAsB,MAAM,WAAW,OAAO;CACvD;CAEA,IAAI,CAAC,cAAc,IAAI,GACrB,OAAO;CAGT,MAAM,CAAC,MAAM,GAAG,QAAQ;CACxB,IAAI,SAAS,KAAA,GACX,OAAO;CAGT,IAAI,SAAS,KAAK;EAChB,MAAM,SAAkC,EAAE,GAAG,KAAK;EAClD,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAChC,OAAO,OAAO,YAAY,KAAK,MAAM,MAAM,WAAW,OAAO;EAE/D,OAAO;CACT;CAEA,MAAM,QAAQ,KAAK;CACnB,IAAI,UAAU,KAAA,GACZ,OAAO;CAGT,OAAO;EAAE,GAAG;GAAO,OAAO,YAAY,OAAO,MAAM,WAAW,OAAO;CAAE;AACzE;AAEA,SAAgB,kBACd,SACA,UAA8C,uBACjC;CACb,QAAQ,YAAY;EAClB,IAAI,CAAC,cAAc,OAAO,GACxB,OAAO;EAGT,IAAI,SAAkB;EACtB,KAAK,MAAM,UAAU,SACnB,SAAS,YAAY,QAAQ,OAAO,MAAM,OAAO,WAAW,OAAO;EAErE,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"hashing-utils.mjs","names":[],"sources":["../src/canonicalization-storage-sort.ts"],"sourcesContent":["import type { StorageSort } from './canonicalization';\n\nexport type PathSegment = string | '*';\n\nexport interface NamedArraySortTarget {\n readonly path: readonly PathSegment[];\n readonly arrayKeys: readonly string[];\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Order by UTF-16 code unit, not locale collation: canonicalization feeds\n// storageHash, which must be byte-identical across hosts, and locale\n// collation (localeCompare/Intl) varies by the engine's ICU build.\nfunction compareCodeUnits(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function compareByNameProperty(a: unknown, b: unknown): number {\n const nameA = isPlainRecord(a) && typeof a['name'] === 'string' ? a['name'] : '';\n const nameB = isPlainRecord(b) && typeof b['name'] === 'string' ? b['name'] : '';\n return compareCodeUnits(nameA, nameB);\n}\n\nfunction sortArrayKeysOnRecord(\n record: Record<string, unknown>,\n arrayKeys: readonly string[],\n compare: (a: unknown, b: unknown) => number,\n): Record<string, unknown> {\n const sorted: Record<string, unknown> = { ...record };\n for (const key of arrayKeys) {\n const value = record[key];\n if (Array.isArray(value)) {\n sorted[key] = [...value].sort(compare);\n }\n }\n return sorted;\n}\n\nfunction walkAndSort(\n node: unknown,\n pathSegments: readonly PathSegment[],\n arrayKeys: readonly string[],\n compare: (a: unknown, b: unknown) => number,\n): unknown {\n if (pathSegments.length === 0) {\n if (!isPlainRecord(node)) {\n return node;\n }\n return sortArrayKeysOnRecord(node, arrayKeys, compare);\n }\n\n if (!isPlainRecord(node)) {\n return node;\n }\n\n const [head, ...rest] = pathSegments;\n if (head === undefined) {\n return node;\n }\n\n if (head === '*') {\n const sorted: Record<string, unknown> = { ...node };\n for (const key of Object.keys(node)) {\n sorted[key] = walkAndSort(node[key], rest, arrayKeys, compare);\n }\n return sorted;\n }\n\n const child = node[head];\n if (child === undefined) {\n return node;\n }\n\n return { ...node, [head]: walkAndSort(child, rest, arrayKeys, compare) };\n}\n\nexport function createStorageSort(\n targets: readonly NamedArraySortTarget[],\n compare: (a: unknown, b: unknown) => number = compareByNameProperty,\n): StorageSort {\n return (storage) => {\n if (!isPlainRecord(storage)) {\n return storage;\n }\n\n let result: unknown = storage;\n for (const target of targets) {\n result = walkAndSort(result, target.path, target.arrayKeys, compare);\n }\n return result;\n };\n}\n"],"mappings":";;AASA,SAAS,cAAc,OAAkD;CACvE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKA,SAAS,iBAAiB,GAAW,GAAmB;CACtD,OAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,SAAgB,sBAAsB,GAAY,GAAoB;CAGpE,OAAO,iBAFO,cAAc,CAAC,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,IAChE,cAAc,CAAC,KAAK,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,EAC1C;AACtC;AAEA,SAAS,sBACP,QACA,WACA,SACyB;CACzB,MAAM,SAAkC,EAAE,GAAG,OAAO;CACpD,KAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,QAAQ,OAAO;EACrB,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,OAAO;CAEzC;CACA,OAAO;AACT;AAEA,SAAS,YACP,MACA,cACA,WACA,SACS;CACT,IAAI,aAAa,WAAW,GAAG;EAC7B,IAAI,CAAC,cAAc,IAAI,GACrB,OAAO;EAET,OAAO,sBAAsB,MAAM,WAAW,OAAO;CACvD;CAEA,IAAI,CAAC,cAAc,IAAI,GACrB,OAAO;CAGT,MAAM,CAAC,MAAM,GAAG,QAAQ;CACxB,IAAI,SAAS,KAAA,GACX,OAAO;CAGT,IAAI,SAAS,KAAK;EAChB,MAAM,SAAkC,EAAE,GAAG,KAAK;EAClD,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAChC,OAAO,OAAO,YAAY,KAAK,MAAM,MAAM,WAAW,OAAO;EAE/D,OAAO;CACT;CAEA,MAAM,QAAQ,KAAK;CACnB,IAAI,UAAU,KAAA,GACZ,OAAO;CAGT,OAAO;EAAE,GAAG;GAAO,OAAO,YAAY,OAAO,MAAM,WAAW,OAAO;CAAE;AACzE;AAEA,SAAgB,kBACd,SACA,UAA8C,uBACjC;CACb,QAAQ,YAAY;EAClB,IAAI,CAAC,cAAc,OAAO,GACxB,OAAO;EAGT,IAAI,SAAkB;EACtB,KAAK,MAAM,UAAU,SACnB,SAAS,YAAY,QAAQ,OAAO,MAAM,OAAO,WAAW,OAAO;EAErE,OAAO;CACT;AACF"}
@@ -1,5 +1,5 @@
1
- import { O as StorageHashBase, p as ExecutionHashBase, w as ProfileHashBase } from "./contract-types-9BbapbkL.mjs";
2
- import { a as canonicalizeContract, i as StorageSort, n as PreserveEmptyPredicate, o as canonicalizeContractToObject, r as SerializeContract, t as CanonicalizeContractOptions } from "./canonicalization-CM6bJ8i8.mjs";
1
+ import { T as ProfileHashBase, k as StorageHashBase, p as ExecutionHashBase } from "./contract-types-DTijd98n.mjs";
2
+ import { a as canonicalizeContract, i as StorageSort, n as PreserveEmptyPredicate, o as canonicalizeContractToObject, r as SerializeContract, t as CanonicalizeContractOptions } from "./canonicalization-DGjO7GM3.mjs";
3
3
 
4
4
  //#region src/hashing.d.ts
5
5
  type ComputeStorageHashArgs = {
@@ -1 +1 @@
1
- {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/hashing.ts"],"mappings":";;;;KAqDY,sBAAA;EACV,MAAA;EACA,YAAA;EACA,OAAA,EAAS,MAAA;EAAA,SACA,mBAAA,GAAsB,sBAAA;EAAA,SACtB,WAAA,GAAc,WAAA;AAAA;AAAA,iBAGT,kBAAA,CAAmB,IAAA,EAAM,sBAAA,GAAyB,eAAe;AAAA,iBAIjE,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"}
1
+ {"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/hashing.ts"],"mappings":";;;;KA4EY,sBAAA;EACV,MAAA;EACA,YAAA;EACA,OAAA,EAAS,MAAA;EAAA,SACA,mBAAA,GAAsB,sBAAA;EAAA,SACtB,WAAA,GAAc,WAAA;AAAA;AAAA,iBAGT,kBAAA,CAAmB,IAAA,EAAM,sBAAA,GAAyB,eAAe;AAAA,iBAMjE,oBAAA,CAAqB,IAAA;EACnC,MAAA;EACA,YAAA;EACA,SAAA,EAAW,MAAA;AAAA,IACT,iBAAiB;AAAA,iBAML,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,YAAA,EAAc,MAAA,SAAe,MAAA;AAAA,IAC3B,eAAA"}
package/dist/hashing.mjs CHANGED
@@ -1,4 +1,5 @@
1
- import { n as matchesPathPattern } from "./canonicalization-path-match-b2jFuEso.mjs";
1
+ import { n as matchesPathPattern } from "./canonicalization-path-match-CNgHuwM_.mjs";
2
+ import { blindCast, castAs } from "@prisma-next/utils/casts";
2
3
  import { isArrayEqual } from "@prisma-next/utils/array-equal";
3
4
  import { ifDefined } from "@prisma-next/utils/defined";
4
5
  import { createHash } from "node:crypto";
@@ -30,6 +31,12 @@ const DOMAIN_MODEL_STORAGE_PATTERN = [
30
31
  "*",
31
32
  "storage"
32
33
  ];
34
+ const STORAGE_NAMESPACE_ENTRIES_PATTERN = [
35
+ "storage",
36
+ "namespaces",
37
+ "*",
38
+ "entries"
39
+ ];
33
40
  const TOP_LEVEL_ORDER = [
34
41
  "schemaVersion",
35
42
  "canonicalVersion",
@@ -42,6 +49,7 @@ const TOP_LEVEL_ORDER = [
42
49
  "execution",
43
50
  "capabilities",
44
51
  "extensionPacks",
52
+ "defaultControlPolicy",
45
53
  "meta"
46
54
  ];
47
55
  function isDefaultValue(value) {
@@ -65,7 +73,7 @@ function omitDefaults(obj, path, shouldPreserveEmpty) {
65
73
  const isDomainNamespaceSlot = matchesPathPattern(currentPath, DOMAIN_NAMESPACE_SLOT_PATTERN);
66
74
  const isRequiredDomainModels = matchesPathPattern(currentPath, DOMAIN_MODELS_CONTAINER_PATTERN);
67
75
  const isRequiredStorageNamespaces = isArrayEqual(currentPath, ["storage", "namespaces"]);
68
- const isStorageNamespaceSlot = currentPath.length === 3 && isArrayEqual([currentPath[0], currentPath[1]], ["storage", "namespaces"]);
76
+ const isStorageNamespaceEntries = matchesPathPattern(currentPath, STORAGE_NAMESPACE_ENTRIES_PATTERN);
69
77
  const isRequiredRoots = isArrayEqual(currentPath, ["roots"]);
70
78
  const isRequiredExtensionPacks = isArrayEqual(currentPath, ["extensionPacks"]);
71
79
  const isRequiredCapabilities = isArrayEqual(currentPath, ["capabilities"]);
@@ -80,7 +88,7 @@ function omitDefaults(obj, path, shouldPreserveEmpty) {
80
88
  const isModelStorage = matchesPathPattern(currentPath, DOMAIN_MODEL_STORAGE_PATTERN);
81
89
  const isNullableField = key === "nullable";
82
90
  const isFamilyPreserved = shouldPreserveEmpty?.(currentPath) ?? false;
83
- if (!isRequiredDomainNamespaces && !isDomainNamespaceSlot && !isRequiredDomainModels && !isRequiredStorageNamespaces && !isStorageNamespaceSlot && !isRequiredRoots && !isRequiredExtensionPacks && !isRequiredCapabilities && !isRequiredMeta && !isRequiredExecutionDefaults && !isExtensionNamespace && !isModelRelations && !isModelStorage && !isNullableField && !isFamilyPreserved) continue;
91
+ if (!isRequiredDomainNamespaces && !isDomainNamespaceSlot && !isRequiredDomainModels && !isRequiredStorageNamespaces && !isStorageNamespaceEntries && !isRequiredRoots && !isRequiredExtensionPacks && !isRequiredCapabilities && !isRequiredMeta && !isRequiredExecutionDefaults && !isExtensionNamespace && !isModelRelations && !isModelStorage && !isNullableField && !isFamilyPreserved) continue;
84
92
  }
85
93
  result[key] = omitDefaults(value, currentPath, shouldPreserveEmpty);
86
94
  }
@@ -122,6 +130,7 @@ function canonicalizeContractToObject(contract, options) {
122
130
  ...ifDefined("execution", serialized["execution"]),
123
131
  extensionPacks: serialized["extensionPacks"],
124
132
  capabilities: serialized["capabilities"],
133
+ ...ifDefined("defaultControlPolicy", serialized["defaultControlPolicy"]),
125
134
  meta: serialized["meta"]
126
135
  }, [], options.shouldPreserveEmpty);
127
136
  return orderTopLevel(sortObjectKeys(options.sortStorage ? {
@@ -135,6 +144,23 @@ function canonicalizeContract(contract, options) {
135
144
  //#endregion
136
145
  //#region src/hashing.ts
137
146
  const SCHEMA_VERSION = "1";
147
+ function isPlainRecord(value) {
148
+ return value !== null && typeof value === "object" && !Array.isArray(value);
149
+ }
150
+ function omitNamespaceKindsForHash(storage) {
151
+ if (!isPlainRecord(storage)) return storage;
152
+ const namespaces = storage["namespaces"];
153
+ if (!isPlainRecord(namespaces)) return storage;
154
+ const stripped = {};
155
+ for (const [nsId, ns] of Object.entries(namespaces)) if (isPlainRecord(ns)) {
156
+ const { kind: _kind, ...rest } = ns;
157
+ stripped[nsId] = rest;
158
+ } else stripped[nsId] = ns;
159
+ return {
160
+ ...storage,
161
+ namespaces: stripped
162
+ };
163
+ }
138
164
  function sha256(content) {
139
165
  const hash = createHash("sha256");
140
166
  hash.update(content);
@@ -142,33 +168,34 @@ function sha256(content) {
142
168
  }
143
169
  function hashContract(section) {
144
170
  const { shouldPreserveEmpty, sortStorage, ...sectionData } = section;
145
- return canonicalizeContract({
171
+ const storageForHash = omitNamespaceKindsForHash(sectionData["storage"] ?? {});
172
+ return canonicalizeContract(blindCast({
146
173
  targetFamily: sectionData["targetFamily"],
147
174
  target: sectionData["target"],
148
175
  roots: {},
149
176
  domain: { namespaces: {} },
150
- storage: sectionData["storage"] ?? {},
151
177
  execution: sectionData["execution"],
152
178
  extensionPacks: {},
153
179
  capabilities: sectionData["capabilities"] ?? {},
154
180
  meta: {},
155
181
  profileHash: "",
156
- ...sectionData
157
- }, {
182
+ ...sectionData,
183
+ storage: storageForHash
184
+ }), {
158
185
  schemaVersion: SCHEMA_VERSION,
159
- serializeContract: (c) => JSON.parse(JSON.stringify(c)),
186
+ serializeContract: (c) => castAs(JSON.parse(JSON.stringify(c))),
160
187
  ...ifDefined("shouldPreserveEmpty", shouldPreserveEmpty),
161
188
  ...ifDefined("sortStorage", sortStorage)
162
189
  });
163
190
  }
164
191
  function computeStorageHash(args) {
165
- return sha256(hashContract(args));
192
+ return blindCast(sha256(hashContract(args)));
166
193
  }
167
194
  function computeExecutionHash(args) {
168
- return sha256(hashContract(args));
195
+ return blindCast(sha256(hashContract(args)));
169
196
  }
170
197
  function computeProfileHash(args) {
171
- return sha256(hashContract(args));
198
+ return blindCast(sha256(hashContract(args)));
172
199
  }
173
200
  //#endregion
174
201
  export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };