@prisma-next/contract 0.12.0-dev.5 → 0.12.0-dev.51
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.
- package/dist/apply-specifier-default-control-policy.d.mts +7 -0
- package/dist/apply-specifier-default-control-policy.d.mts.map +1 -0
- package/dist/apply-specifier-default-control-policy.mjs +12 -0
- package/dist/apply-specifier-default-control-policy.mjs.map +1 -0
- package/dist/{canonicalization-CM6bJ8i8.d.mts → canonicalization-D_iHy7iE.d.mts} +2 -2
- package/dist/canonicalization-D_iHy7iE.d.mts.map +1 -0
- package/dist/{canonicalization-path-match-b2jFuEso.mjs → canonicalization-path-match-Czn4Vds5.mjs} +1 -1
- package/dist/{canonicalization-path-match-b2jFuEso.mjs.map → canonicalization-path-match-Czn4Vds5.mjs.map} +1 -1
- package/dist/{contract-types-9BbapbkL.d.mts → contract-types-D5lcjipq.d.mts} +27 -11
- package/dist/contract-types-D5lcjipq.d.mts.map +1 -0
- package/dist/{contract-validation-error-T5LH4DW-.d.mts → contract-validation-error-B8UtbPEl.d.mts} +1 -1
- package/dist/{contract-validation-error-T5LH4DW-.d.mts.map → contract-validation-error-B8UtbPEl.d.mts.map} +1 -1
- package/dist/contract-validation-error.d.mts +1 -1
- package/dist/default-namespace-Bhu0oN8U.mjs +33 -0
- package/dist/default-namespace-Bhu0oN8U.mjs.map +1 -0
- package/dist/default-namespace-CWdFpoc_.d.mts +25 -0
- package/dist/default-namespace-CWdFpoc_.d.mts.map +1 -0
- package/dist/default-namespace.d.mts +2 -0
- package/dist/default-namespace.mjs +2 -0
- package/dist/{domain-envelope-Cv5OTm8D.d.mts → domain-envelope-BFYbgufo.d.mts} +2 -10
- package/dist/{domain-envelope-Cv5OTm8D.d.mts.map → domain-envelope-BFYbgufo.d.mts.map} +1 -1
- package/dist/hashing-utils.d.mts +1 -1
- package/dist/hashing-utils.d.mts.map +1 -1
- package/dist/hashing-utils.mjs +5 -4
- package/dist/hashing-utils.mjs.map +1 -1
- package/dist/hashing.d.mts +2 -2
- package/dist/hashing.d.mts.map +1 -1
- package/dist/hashing.mjs +38 -11
- package/dist/hashing.mjs.map +1 -1
- package/dist/{namespace-id-CVpkSFUK.mjs → namespace-id-BSCer2Vd.mjs} +1 -1
- package/dist/{namespace-id-CVpkSFUK.mjs.map → namespace-id-BSCer2Vd.mjs.map} +1 -1
- package/dist/resolve-domain-model-DMXbLLjV.d.mts +17 -0
- package/dist/resolve-domain-model-DMXbLLjV.d.mts.map +1 -0
- package/dist/resolve-domain-model-R4txseVc.mjs +20 -0
- package/dist/resolve-domain-model-R4txseVc.mjs.map +1 -0
- package/dist/resolve-domain-model.d.mts +2 -0
- package/dist/resolve-domain-model.mjs +2 -0
- package/dist/types.d.mts +21 -4
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +22 -27
- package/dist/types.mjs.map +1 -1
- package/dist/validate-domain.d.mts +1 -1
- package/dist/validate-domain.mjs +1 -1
- package/package.json +7 -4
- package/src/apply-specifier-default-control-policy.ts +12 -0
- package/src/canonicalization-storage-sort.ts +8 -1
- package/src/canonicalization.ts +13 -4
- package/src/contract-types.ts +8 -6
- package/src/control-policy.ts +3 -3
- package/src/default-namespace.ts +36 -0
- package/src/domain-envelope.ts +1 -60
- package/src/domain-namespace-access.ts +32 -0
- package/src/exports/apply-specifier-default-control-policy.ts +1 -0
- package/src/exports/default-namespace.ts +1 -0
- package/src/exports/resolve-domain-model.ts +1 -0
- package/src/exports/types.ts +10 -8
- package/src/hashing.ts +42 -13
- package/src/resolve-domain-model.ts +27 -0
- package/src/types.ts +18 -2
- package/dist/canonicalization-CM6bJ8i8.d.mts.map +0 -1
- package/dist/contract-types-9BbapbkL.d.mts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { L as ControlPolicy, t as Contract } from "./contract-types-D5lcjipq.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-
|
|
1
|
+
import { t as Contract } from "./contract-types-D5lcjipq.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-
|
|
69
|
+
//# sourceMappingURL=canonicalization-D_iHy7iE.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalization-D_iHy7iE.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"}
|
package/dist/{canonicalization-path-match-b2jFuEso.mjs → canonicalization-path-match-Czn4Vds5.mjs}
RENAMED
|
@@ -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-
|
|
25
|
+
//# sourceMappingURL=canonicalization-path-match-Czn4Vds5.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalization-path-match-
|
|
1
|
+
{"version":3,"file":"canonicalization-path-match-Czn4Vds5.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 {
|
|
1
|
+
import { l as ContractModelBase, p as ContractValueObject, t as ApplicationDomain, x as CrossReference } from "./domain-envelope-BFYbgufo.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
|
|
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
|
|
68
|
-
* `
|
|
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
|
|
259
|
+
readonly defaultControlPolicy?: ControlPolicy;
|
|
245
260
|
}
|
|
246
|
-
|
|
247
|
-
type
|
|
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
|
|
252
|
-
type
|
|
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 {
|
|
255
|
-
//# sourceMappingURL=contract-types-
|
|
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-D5lcjipq.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-types-D5lcjipq.d.mts","names":[],"sources":["../src/control-policy.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
|
package/dist/{contract-validation-error-T5LH4DW-.d.mts → contract-validation-error-B8UtbPEl.d.mts}
RENAMED
|
@@ -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-
|
|
13
|
+
//# sourceMappingURL=contract-validation-error-B8UtbPEl.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-validation-error-
|
|
1
|
+
{"version":3,"file":"contract-validation-error-B8UtbPEl.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-
|
|
1
|
+
import { n as ContractValidationPhase, r as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-B8UtbPEl.mjs";
|
|
2
2
|
export { ContractValidationError, type ContractValidationPhase, DomainNamespaceResolutionError };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { n as DomainNamespaceResolutionError } from "./contract-validation-error-ClZaKqMW.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-Bhu0oN8U.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-namespace-Bhu0oN8U.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,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-CWdFpoc_.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-namespace-CWdFpoc_.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"}
|
|
@@ -79,7 +79,6 @@ type EmbedRelationKeys<TModels extends Record<string, {
|
|
|
79
79
|
}>, ModelName extends string & keyof TModels> = { [K in keyof TModels[ModelName]['relations']]: TModels[ModelName]['relations'][K] extends ContractReferenceRelation ? never : K }[keyof TModels[ModelName]['relations']];
|
|
80
80
|
//#endregion
|
|
81
81
|
//#region src/domain-envelope.d.ts
|
|
82
|
-
declare const UNBOUND_DOMAIN_NAMESPACE_ID: "__unbound__";
|
|
83
82
|
/**
|
|
84
83
|
* One namespace's application-domain entities — models and optional value
|
|
85
84
|
* objects keyed by entity name within that namespace coordinate.
|
|
@@ -98,13 +97,6 @@ interface ApplicationDomain<TModels extends Record<string, ContractModelBase> =
|
|
|
98
97
|
type ContractWithDomain = {
|
|
99
98
|
readonly domain: ApplicationDomain;
|
|
100
99
|
};
|
|
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
100
|
//#endregion
|
|
109
|
-
export {
|
|
110
|
-
//# sourceMappingURL=domain-envelope-
|
|
101
|
+
export { crossRef as C, CrossReferenceSchema as S, asNamespaceId as T, ReferenceRelationKeys as _, ContractEmbedRelation as a, ValueObjectFieldType as b, ContractModel as c, ContractRelation as d, ContractRelationOn as f, ModelStorageBase as g, EmbedRelationKeys as h, ContractDiscriminator as i, ContractModelBase as l, ContractVariantEntry as m, ApplicationDomainNamespace as n, ContractField as o, ContractValueObject as p, ContractWithDomain as r, ContractFieldType as s, ApplicationDomain as t, ContractReferenceRelation as u, ScalarFieldType as v, NamespaceId as w, CrossReference as x, UnionFieldType as y };
|
|
102
|
+
//# sourceMappingURL=domain-envelope-BFYbgufo.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-envelope-
|
|
1
|
+
{"version":3,"file":"domain-envelope-BFYbgufo.d.mts","names":[],"sources":["../src/namespace-id.ts","../src/cross-reference.ts","../src/domain-types.ts","../src/domain-envelope.ts"],"mappings":"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"}
|
package/dist/hashing-utils.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as StorageSort, n as PreserveEmptyPredicate } from "./canonicalization-
|
|
1
|
+
import { i as StorageSort, n as PreserveEmptyPredicate } from "./canonicalization-D_iHy7iE.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,
|
|
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"}
|
package/dist/hashing-utils.mjs
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { n as matchesPathPattern, t as createPreserveEmptyPredicate } from "./canonicalization-path-match-
|
|
1
|
+
import { n as matchesPathPattern, t as createPreserveEmptyPredicate } from "./canonicalization-path-match-Czn4Vds5.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
|
-
|
|
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
|
|
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,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"}
|
package/dist/hashing.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as canonicalizeContract, i as StorageSort, n as PreserveEmptyPredicate, o as canonicalizeContractToObject, r as SerializeContract, t as CanonicalizeContractOptions } from "./canonicalization-
|
|
1
|
+
import { T as ProfileHashBase, k as StorageHashBase, p as ExecutionHashBase } from "./contract-types-D5lcjipq.mjs";
|
|
2
|
+
import { a as canonicalizeContract, i as StorageSort, n as PreserveEmptyPredicate, o as canonicalizeContractToObject, r as SerializeContract, t as CanonicalizeContractOptions } from "./canonicalization-D_iHy7iE.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/hashing.d.ts
|
|
5
5
|
type ComputeStorageHashArgs = {
|
package/dist/hashing.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/hashing.ts"],"mappings":";;;;
|
|
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-
|
|
1
|
+
import { n as matchesPathPattern } from "./canonicalization-path-match-Czn4Vds5.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
|
|
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 && !
|
|
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
|
-
|
|
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 };
|
package/dist/hashing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashing.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';\nimport { matchesPathPattern, type PathPattern } from './canonicalization-path-match';\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\n/**\n * Family-contributed predicate for the default-omission walk. Called when\n * a value at `path` is a default (empty object/array or `false`); if this\n * returns `true` the value is kept rather than stripped.\n *\n * The framework only calls the predicate inside the `isDefaultValue` branch,\n * so there is no need to guard against non-default values.\n */\nexport type PreserveEmptyPredicate = (path: readonly string[]) => boolean;\n\n/**\n * Family-contributed storage sort. Applied to the serialized `storage`\n * subtree after the default-omission walk; the result replaces the\n * `storage` field before the final key sort. Use to establish a\n * deterministic order for storage arrays (indexes, uniques) that the\n * family-agnostic `sortObjectKeys` pass cannot handle.\n */\nexport type StorageSort = (storage: unknown) => unknown;\n\nconst DOMAIN_NAMESPACE_SLOT_PATTERN = ['domain', 'namespaces', '*'] as const satisfies PathPattern;\nconst DOMAIN_MODELS_CONTAINER_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n] as const satisfies PathPattern;\nconst DOMAIN_MODEL_RELATIONS_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n '*',\n 'relations',\n] as const satisfies PathPattern;\nconst DOMAIN_MODEL_STORAGE_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n '*',\n 'storage',\n] as const satisfies PathPattern;\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\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(\n obj: unknown,\n path: readonly string[],\n shouldPreserveEmpty: PreserveEmptyPredicate | undefined,\n): 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, shouldPreserveEmpty));\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 isRequiredDomainNamespaces = isArrayEqual(currentPath, ['domain', 'namespaces']);\n const isDomainNamespaceSlot = matchesPathPattern(currentPath, DOMAIN_NAMESPACE_SLOT_PATTERN);\n const isRequiredDomainModels = matchesPathPattern(\n currentPath,\n DOMAIN_MODELS_CONTAINER_PATTERN,\n );\n const isRequiredStorageNamespaces = isArrayEqual(currentPath, ['storage', 'namespaces']);\n const isStorageNamespaceSlot =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'namespaces']);\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 = matchesPathPattern(currentPath, DOMAIN_MODEL_RELATIONS_PATTERN);\n const isModelStorage = matchesPathPattern(currentPath, DOMAIN_MODEL_STORAGE_PATTERN);\n\n const isNullableField = key === 'nullable';\n\n const isFamilyPreserved = shouldPreserveEmpty?.(currentPath) ?? false;\n\n if (\n !isRequiredDomainNamespaces &&\n !isDomainNamespaceSlot &&\n !isRequiredDomainModels &&\n !isRequiredStorageNamespaces &&\n !isStorageNamespaceSlot &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isNullableField &&\n !isFamilyPreserved\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath, shouldPreserveEmpty);\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\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 * Family-contributed preserve-empty predicate. When the walk encounters a\n * default value (empty object/array or `false`) at `path`, calling this\n * with the full path allows the family to veto the omission. If absent,\n * only the framework's family-agnostic required-slot rules apply.\n */\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n /**\n * Family-contributed storage sort. Applied to the serialized `storage`\n * subtree after the default-omission walk, before the final key sort.\n * SQL family uses this to impose a deterministic order on `indexes` and\n * `uniques` arrays within each namespace table. Families that require no\n * special storage ordering omit this hook.\n */\n readonly sortStorage?: StorageSort;\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 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, [], options.shouldPreserveEmpty) as Record<\n string,\n unknown\n >;\n const withSortedStorage = options.sortStorage\n ? { ...withDefaultsOmitted, storage: options.sortStorage(withDefaultsOmitted['storage']) }\n : withDefaultsOmitted;\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 { ifDefined } from '@prisma-next/utils/defined';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport {\n canonicalizeContract,\n type PreserveEmptyPredicate,\n type StorageSort,\n} 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\ntype HashContractSection = Record<string, unknown> & {\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n readonly sortStorage?: StorageSort;\n};\n\nfunction hashContract(section: HashContractSection): string {\n const { shouldPreserveEmpty, sortStorage, ...sectionData } = section;\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: sectionData['targetFamily'],\n target: sectionData['target'],\n roots: {},\n domain: { namespaces: {} },\n storage: sectionData['storage'] ?? {},\n execution: sectionData['execution'],\n extensionPacks: {},\n capabilities: sectionData['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...sectionData,\n } as unknown as Contract;\n return canonicalizeContract(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: (c) => JSON.parse(JSON.stringify(c)) as JsonObject,\n ...ifDefined('shouldPreserveEmpty', shouldPreserveEmpty),\n ...ifDefined('sortStorage', sortStorage),\n });\n}\n\nexport type ComputeStorageHashArgs = {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n readonly sortStorage?: StorageSort;\n};\n\nexport function computeStorageHash(args: ComputeStorageHashArgs): 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
|
+
{"version":3,"file":"hashing.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';\nimport { matchesPathPattern, type PathPattern } from './canonicalization-path-match';\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\n/**\n * Family-contributed predicate for the default-omission walk. Called when\n * a value at `path` is a default (empty object/array or `false`); if this\n * returns `true` the value is kept rather than stripped.\n *\n * The framework only calls the predicate inside the `isDefaultValue` branch,\n * so there is no need to guard against non-default values.\n */\nexport type PreserveEmptyPredicate = (path: readonly string[]) => boolean;\n\n/**\n * Family-contributed storage sort. Applied to the serialized `storage`\n * subtree after the default-omission walk; the result replaces the\n * `storage` field before the final key sort. Use to establish a\n * deterministic order for storage arrays (indexes, uniques) that the\n * family-agnostic `sortObjectKeys` pass cannot handle.\n */\nexport type StorageSort = (storage: unknown) => unknown;\n\nconst DOMAIN_NAMESPACE_SLOT_PATTERN = ['domain', 'namespaces', '*'] as const satisfies PathPattern;\nconst DOMAIN_MODELS_CONTAINER_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n] as const satisfies PathPattern;\nconst DOMAIN_MODEL_RELATIONS_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n '*',\n 'relations',\n] as const satisfies PathPattern;\nconst DOMAIN_MODEL_STORAGE_PATTERN = [\n 'domain',\n 'namespaces',\n '*',\n 'models',\n '*',\n 'storage',\n] as const satisfies PathPattern;\nconst STORAGE_NAMESPACE_ENTRIES_PATTERN = [\n 'storage',\n 'namespaces',\n '*',\n 'entries',\n] as const satisfies PathPattern;\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'domain',\n 'storage',\n 'execution',\n 'capabilities',\n 'extensionPacks',\n 'defaultControlPolicy',\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(\n obj: unknown,\n path: readonly string[],\n shouldPreserveEmpty: PreserveEmptyPredicate | undefined,\n): 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, shouldPreserveEmpty));\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 isRequiredDomainNamespaces = isArrayEqual(currentPath, ['domain', 'namespaces']);\n const isDomainNamespaceSlot = matchesPathPattern(currentPath, DOMAIN_NAMESPACE_SLOT_PATTERN);\n const isRequiredDomainModels = matchesPathPattern(\n currentPath,\n DOMAIN_MODELS_CONTAINER_PATTERN,\n );\n const isRequiredStorageNamespaces = isArrayEqual(currentPath, ['storage', 'namespaces']);\n const isStorageNamespaceEntries = matchesPathPattern(\n currentPath,\n STORAGE_NAMESPACE_ENTRIES_PATTERN,\n );\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 = matchesPathPattern(currentPath, DOMAIN_MODEL_RELATIONS_PATTERN);\n const isModelStorage = matchesPathPattern(currentPath, DOMAIN_MODEL_STORAGE_PATTERN);\n\n const isNullableField = key === 'nullable';\n\n const isFamilyPreserved = shouldPreserveEmpty?.(currentPath) ?? false;\n\n if (\n !isRequiredDomainNamespaces &&\n !isDomainNamespaceSlot &&\n !isRequiredDomainModels &&\n !isRequiredStorageNamespaces &&\n !isStorageNamespaceEntries &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isNullableField &&\n !isFamilyPreserved\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath, shouldPreserveEmpty);\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\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 * Family-contributed preserve-empty predicate. When the walk encounters a\n * default value (empty object/array or `false`) at `path`, calling this\n * with the full path allows the family to veto the omission. If absent,\n * only the framework's family-agnostic required-slot rules apply.\n */\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n /**\n * Family-contributed storage sort. Applied to the serialized `storage`\n * subtree after the default-omission walk, before the final key sort.\n * SQL family uses this to impose a deterministic order on `indexes` and\n * `uniques` arrays within each namespace table. Families that require no\n * special storage ordering omit this hook.\n */\n readonly sortStorage?: StorageSort;\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 domain: serialized['domain'],\n storage: serialized['storage'],\n ...ifDefined('execution', serialized['execution']),\n extensionPacks: serialized['extensionPacks'],\n capabilities: serialized['capabilities'],\n ...ifDefined('defaultControlPolicy', serialized['defaultControlPolicy']),\n meta: serialized['meta'],\n };\n const withDefaultsOmitted = omitDefaults(normalized, [], options.shouldPreserveEmpty) as Record<\n string,\n unknown\n >;\n const withSortedStorage = options.sortStorage\n ? { ...withDefaultsOmitted, storage: options.sortStorage(withDefaultsOmitted['storage']) }\n : withDefaultsOmitted;\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 { blindCast, castAs } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport {\n canonicalizeContract,\n type PreserveEmptyPredicate,\n type StorageSort,\n} from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './types';\n\nconst SCHEMA_VERSION = '1';\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// Storage hashes fingerprint table/column layout, not which target pack emitted a\n// namespace. Persisted contract.json carries namespace `kind` discriminators;\n// authoring-time hashes never included them (IR `kind` is non-enumerable).\nfunction omitNamespaceKindsForHash(storage: unknown): unknown {\n if (!isPlainRecord(storage)) {\n return storage;\n }\n const namespaces = storage['namespaces'];\n if (!isPlainRecord(namespaces)) {\n return storage;\n }\n const stripped: Record<string, unknown> = {};\n for (const [nsId, ns] of Object.entries(namespaces)) {\n if (isPlainRecord(ns)) {\n const { kind: _kind, ...rest } = ns;\n stripped[nsId] = rest;\n } else {\n stripped[nsId] = ns;\n }\n }\n return { ...storage, namespaces: stripped };\n}\n\nfunction sha256(content: string): string {\n const hash = createHash('sha256');\n hash.update(content);\n return `sha256:${hash.digest('hex')}`;\n}\n\ntype HashContractSection = Record<string, unknown> & {\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n readonly sortStorage?: StorageSort;\n};\n\nfunction hashContract(section: HashContractSection): string {\n const { shouldPreserveEmpty, sortStorage, ...sectionData } = section;\n const storageForHash = omitNamespaceKindsForHash(sectionData['storage'] ?? {});\n const contract = blindCast<Contract, 'hash-only partial contract for canonicalizeContract'>({\n targetFamily: sectionData['targetFamily'],\n target: sectionData['target'],\n roots: {},\n domain: { namespaces: {} },\n execution: sectionData['execution'],\n extensionPacks: {},\n capabilities: sectionData['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...sectionData,\n storage: storageForHash,\n });\n return canonicalizeContract(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: (c) => castAs<JsonObject>(JSON.parse(JSON.stringify(c))),\n ...ifDefined('shouldPreserveEmpty', shouldPreserveEmpty),\n ...ifDefined('sortStorage', sortStorage),\n });\n}\n\nexport type ComputeStorageHashArgs = {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n readonly shouldPreserveEmpty?: PreserveEmptyPredicate;\n readonly sortStorage?: StorageSort;\n};\n\nexport function computeStorageHash(args: ComputeStorageHashArgs): StorageHashBase<string> {\n return blindCast<StorageHashBase<string>, 'sha256 digest of canonicalized storage'>(\n sha256(hashContract(args)),\n );\n}\n\nexport function computeExecutionHash(args: {\n target: string;\n targetFamily: string;\n execution: Record<string, unknown>;\n}): ExecutionHashBase<string> {\n return blindCast<ExecutionHashBase<string>, 'sha256 digest of canonicalized execution'>(\n sha256(hashContract(args)),\n );\n}\n\nexport function computeProfileHash(args: {\n target: string;\n targetFamily: string;\n capabilities: Record<string, Record<string, boolean>>;\n}): ProfileHashBase<string> {\n return blindCast<ProfileHashBase<string>, 'sha256 digest of canonicalized profile'>(\n sha256(hashContract(args)),\n );\n}\n"],"mappings":";;;;;;AAmCA,MAAM,gCAAgC;CAAC;CAAU;CAAc;AAAG;AAClE,MAAM,kCAAkC;CACtC;CACA;CACA;CACA;AACF;AACA,MAAM,iCAAiC;CACrC;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACA;AACF;AACA,MAAM,oCAAoC;CACxC;CACA;CACA;CACA;AACF;AAEA,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,eAAe,OAAyB;CAC/C,IAAI,UAAU,OAAO,OAAO;CAC5B,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,OAAO;CACvD,IAAI,OAAO,UAAU,YAAY,UAAU,MAEzC,OADa,OAAO,KAAK,KACf,EAAE,WAAW;CAEzB,OAAO;AACT;AAEA,SAAS,aACP,KACA,MACA,qBACS;CACT,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UACjC,OAAO;CAGT,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,SAAS,aAAa,MAAM,MAAM,mBAAmB,CAAC;CAGxE,MAAM,SAAkC,CAAC;CAEzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;EAC9C,MAAM,cAAc,CAAC,GAAG,MAAM,GAAG;EAEjC,IAAI,QAAQ,cACV;EAGF,IAAI,QAAQ,eAAe,UAAU,OACnC;EAGF,KAAK,QAAQ,cAAc,QAAQ,eAAe,UAAU,YAC1D;EAGF,IAAI,eAAe,KAAK,GAAG;GACzB,MAAM,6BAA6B,aAAa,aAAa,CAAC,UAAU,YAAY,CAAC;GACrF,MAAM,wBAAwB,mBAAmB,aAAa,6BAA6B;GAC3F,MAAM,yBAAyB,mBAC7B,aACA,+BACF;GACA,MAAM,8BAA8B,aAAa,aAAa,CAAC,WAAW,YAAY,CAAC;GACvF,MAAM,4BAA4B,mBAChC,aACA,iCACF;GACA,MAAM,kBAAkB,aAAa,aAAa,CAAC,OAAO,CAAC;GAC3D,MAAM,2BAA2B,aAAa,aAAa,CAAC,gBAAgB,CAAC;GAC7E,MAAM,yBAAyB,aAAa,aAAa,CAAC,cAAc,CAAC;GACzE,MAAM,iBAAiB,aAAa,aAAa,CAAC,MAAM,CAAC;GACzD,MAAM,8BAA8B,aAAa,aAAa;IAC5D;IACA;IACA;GACF,CAAC;GACD,MAAM,uBAAuB,YAAY,WAAW,KAAK,YAAY,OAAO;GAC5E,MAAM,mBAAmB,mBAAmB,aAAa,8BAA8B;GACvF,MAAM,iBAAiB,mBAAmB,aAAa,4BAA4B;GAEnF,MAAM,kBAAkB,QAAQ;GAEhC,MAAM,oBAAoB,sBAAsB,WAAW,KAAK;GAEhE,IACE,CAAC,8BACD,CAAC,yBACD,CAAC,0BACD,CAAC,+BACD,CAAC,6BACD,CAAC,mBACD,CAAC,4BACD,CAAC,0BACD,CAAC,kBACD,CAAC,+BACD,CAAC,wBACD,CAAC,oBACD,CAAC,kBACD,CAAC,mBACD,CAAC,mBAED;EAEJ;EAEA,OAAO,OAAO,aAAa,OAAO,aAAa,mBAAmB;CACpE;CAEA,OAAO;AACT;AAEA,SAAS,eAAe,KAAuB;CAC7C,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UACjC,OAAO;CAGT,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,SAAS,eAAe,IAAI,CAAC;CAG/C,MAAM,SAAkC,CAAC;CACzC,MAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK;CACnC,KAAK,MAAM,OAAO,MAChB,OAAO,OAAO,eAAgB,IAAgC,IAAI;CAGpE,OAAO;AACT;AAEA,SAAgB,cAAc,KAAuD;CACnF,MAAM,UAAmC,CAAC;CAC1C,MAAM,YAAY,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC;CAE1C,KAAK,MAAM,OAAO,iBAChB,IAAI,UAAU,IAAI,GAAG,GAAG;EACtB,QAAQ,OAAO,IAAI;EACnB,UAAU,OAAO,GAAG;CACtB;CAGF,KAAK,MAAM,OAAO,MAAM,KAAK,SAAS,EAAE,KAAK,GAC3C,QAAQ,OAAO,IAAI;CAGrB,OAAO;AACT;;;;;;AAqCA,SAAgB,6BACd,UACA,SACyB;CACzB,MAAM,aAAa,QAAQ,kBAAkB,QAAQ;CAerD,MAAM,sBAAsB,aAAa;EAbvC,GAAG,UAAU,iBAAiB,QAAQ,aAAa;EACnD,cAAc,WAAW;EACzB,QAAQ,WAAW;EACnB,aAAa,WAAW;EACxB,OAAO,WAAW;EAClB,QAAQ,WAAW;EACnB,SAAS,WAAW;EACpB,GAAG,UAAU,aAAa,WAAW,YAAY;EACjD,gBAAgB,WAAW;EAC3B,cAAc,WAAW;EACzB,GAAG,UAAU,wBAAwB,WAAW,uBAAuB;EACvE,MAAM,WAAW;CAE+B,GAAG,CAAC,GAAG,QAAQ,mBAAmB;CAQpF,OAAO,cADgB,eAHG,QAAQ,cAC9B;EAAE,GAAG;EAAqB,SAAS,QAAQ,YAAY,oBAAoB,UAAU;CAAE,IACvF,mBAE8B,CAAC;AACrC;AAEA,SAAgB,qBACd,UACA,SACQ;CACR,OAAO,KAAK,UAAU,6BAA6B,UAAU,OAAO,GAAG,MAAM,CAAC;AAChF;;;AChRA,MAAM,iBAAiB;AAEvB,SAAS,cAAc,OAAkD;CACvE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAKA,SAAS,0BAA0B,SAA2B;CAC5D,IAAI,CAAC,cAAc,OAAO,GACxB,OAAO;CAET,MAAM,aAAa,QAAQ;CAC3B,IAAI,CAAC,cAAc,UAAU,GAC3B,OAAO;CAET,MAAM,WAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,UAAU,GAChD,IAAI,cAAc,EAAE,GAAG;EACrB,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;EACjC,SAAS,QAAQ;CACnB,OACE,SAAS,QAAQ;CAGrB,OAAO;EAAE,GAAG;EAAS,YAAY;CAAS;AAC5C;AAEA,SAAS,OAAO,SAAyB;CACvC,MAAM,OAAO,WAAW,QAAQ;CAChC,KAAK,OAAO,OAAO;CACnB,OAAO,UAAU,KAAK,OAAO,KAAK;AACpC;AAOA,SAAS,aAAa,SAAsC;CAC1D,MAAM,EAAE,qBAAqB,aAAa,GAAG,gBAAgB;CAC7D,MAAM,iBAAiB,0BAA0B,YAAY,cAAc,CAAC,CAAC;CAc7E,OAAO,qBAbU,UAA2E;EAC1F,cAAc,YAAY;EAC1B,QAAQ,YAAY;EACpB,OAAO,CAAC;EACR,QAAQ,EAAE,YAAY,CAAC,EAAE;EACzB,WAAW,YAAY;EACvB,gBAAgB,CAAC;EACjB,cAAc,YAAY,mBAAmB,CAAC;EAC9C,MAAM,CAAC;EACP,aAAa;EACb,GAAG;EACH,SAAS;CACX,CACmC,GAAG;EACpC,eAAe;EACf,oBAAoB,MAAM,OAAmB,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;EAC1E,GAAG,UAAU,uBAAuB,mBAAmB;EACvD,GAAG,UAAU,eAAe,WAAW;CACzC,CAAC;AACH;AAUA,SAAgB,mBAAmB,MAAuD;CACxF,OAAO,UACL,OAAO,aAAa,IAAI,CAAC,CAC3B;AACF;AAEA,SAAgB,qBAAqB,MAIP;CAC5B,OAAO,UACL,OAAO,aAAa,IAAI,CAAC,CAC3B;AACF;AAEA,SAAgB,mBAAmB,MAIP;CAC1B,OAAO,UACL,OAAO,aAAa,IAAI,CAAC,CAC3B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace-id-
|
|
1
|
+
{"version":3,"file":"namespace-id-BSCer2Vd.mjs","names":[],"sources":["../src/namespace-id.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"],"mappings":";;AAIA,SAAgB,cAAc,OAA4B;CACxD,OAAO,UAGL,KAAK;AACT"}
|