@prisma-next/contract 0.11.0-dev.67 → 0.11.0-dev.69
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/{canonicalization-C3dTO0j1.d.mts → canonicalization-DFE0HJkI.d.mts} +2 -2
- package/dist/canonicalization-DFE0HJkI.d.mts.map +1 -0
- package/dist/canonicalization-path-match-b2jFuEso.mjs +25 -0
- package/dist/canonicalization-path-match-b2jFuEso.mjs.map +1 -0
- package/dist/{contract-types-CZPm4Ooy.d.mts → contract-types-xgwKtd7y.d.mts} +13 -74
- package/dist/contract-types-xgwKtd7y.d.mts.map +1 -0
- package/dist/contract-validation-error-ClZaKqMW.mjs +20 -0
- package/dist/contract-validation-error-ClZaKqMW.mjs.map +1 -0
- package/dist/contract-validation-error-T5LH4DW-.d.mts +13 -0
- package/dist/contract-validation-error-T5LH4DW-.d.mts.map +1 -0
- package/dist/contract-validation-error.d.mts +2 -10
- package/dist/contract-validation-error.mjs +2 -2
- package/dist/domain-envelope-4hyFtJ4_.d.mts +110 -0
- package/dist/domain-envelope-4hyFtJ4_.d.mts.map +1 -0
- package/dist/hashing-utils.d.mts +1 -1
- package/dist/hashing-utils.mjs +1 -22
- package/dist/hashing-utils.mjs.map +1 -1
- package/dist/hashing.d.mts +2 -2
- package/dist/hashing.mjs +175 -1
- package/dist/hashing.mjs.map +1 -0
- package/dist/namespace-id-CVpkSFUK.mjs +9 -0
- package/dist/namespace-id-CVpkSFUK.mjs.map +1 -0
- package/dist/types.d.mts +4 -3
- package/dist/types.mjs +73 -7
- package/dist/types.mjs.map +1 -1
- package/dist/validate-domain.d.mts +2 -6
- package/dist/validate-domain.d.mts.map +1 -1
- package/dist/validate-domain.mjs +98 -61
- package/dist/validate-domain.mjs.map +1 -1
- package/package.json +4 -6
- package/src/canonicalization.ts +41 -25
- package/src/contract-types.ts +31 -6
- package/src/contract-validation-error.ts +7 -0
- package/src/domain-envelope.ts +87 -0
- package/src/domain-types.ts +8 -12
- package/src/exports/contract-validation-error.ts +1 -0
- package/src/exports/types.ts +18 -1
- package/src/hashing.ts +1 -1
- package/src/validate-domain.ts +154 -93
- package/dist/canonicalization-C3dTO0j1.d.mts.map +0 -1
- package/dist/contract-types-CZPm4Ooy.d.mts.map +0 -1
- package/dist/contract-validation-error-Dp2vHZt5.mjs +0 -14
- package/dist/contract-validation-error-Dp2vHZt5.mjs.map +0 -1
- package/dist/contract-validation-error.d.mts.map +0 -1
- package/dist/cross-reference-t0TDbBTP.d.mts +0 -18
- package/dist/cross-reference-t0TDbBTP.d.mts.map +0 -1
- package/dist/hashing-C25nwocN.mjs +0 -151
- package/dist/hashing-C25nwocN.mjs.map +0 -1
- package/dist/testing.d.mts +0 -36
- package/dist/testing.d.mts.map +0 -1
- package/dist/testing.mjs +0 -65
- package/dist/testing.mjs.map +0 -1
- package/dist/types-CVGwkRLa.mjs +0 -46
- package/dist/types-CVGwkRLa.mjs.map +0 -1
- package/src/exports/testing.ts +0 -1
- package/src/testing-factories.ts +0 -121
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Contract } from "./contract-types-
|
|
1
|
+
import { t as Contract } from "./contract-types-xgwKtd7y.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-DFE0HJkI.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalization-DFE0HJkI.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;AA6K3C;;;;KA7KY,WAAA,IAAe,OAAgB;AAAA,UA6K1B,2BAAA;EAAA,SACN,aAAA;EAAA;;;;;;;;AA0ByB;AAQpC;EAlCW,SAWA,iBAAA,EAAmB,iBAAA;;;;;;;WAOnB,mBAAA,GAAsB,sBAAA;EAiB/B;;;;;AAEO;AA0BT;EA5BE,SATS,WAAA,GAAc,WAAA;AAAA;;;;;;iBAQT,4BAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAAA,GACR,MAAA;AAAA,iBA0Ba,oBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,2BAA2B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//#region src/canonicalization-path-match.ts
|
|
2
|
+
function matchesPathPattern(path, pattern) {
|
|
3
|
+
if (path.length !== pattern.length) return false;
|
|
4
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
5
|
+
const segment = pattern[i];
|
|
6
|
+
const value = path[i];
|
|
7
|
+
if (segment === void 0 || value === void 0) return false;
|
|
8
|
+
if (segment === "*") continue;
|
|
9
|
+
if (typeof segment === "string") {
|
|
10
|
+
if (value !== segment) return false;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (Array.isArray(segment)) {
|
|
14
|
+
if (!segment.includes(value)) return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function createPreserveEmptyPredicate(patterns) {
|
|
20
|
+
return (path) => patterns.some((pattern) => matchesPathPattern(path, pattern));
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { matchesPathPattern as n, createPreserveEmptyPredicate as t };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=canonicalization-path-match-b2jFuEso.mjs.map
|
|
@@ -0,0 +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,70 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { T as CrossReference, _ as ContractValueObject, p as ContractModelBase, t as ApplicationDomain } from "./domain-envelope-4hyFtJ4_.mjs";
|
|
2
2
|
|
|
3
|
-
//#region src/domain-types.d.ts
|
|
4
|
-
type ScalarFieldType = {
|
|
5
|
-
readonly kind: 'scalar';
|
|
6
|
-
readonly codecId: string;
|
|
7
|
-
readonly typeParams?: Record<string, unknown>;
|
|
8
|
-
};
|
|
9
|
-
type ValueObjectFieldType = {
|
|
10
|
-
readonly kind: 'valueObject';
|
|
11
|
-
readonly name: string;
|
|
12
|
-
};
|
|
13
|
-
type UnionFieldType = {
|
|
14
|
-
readonly kind: 'union';
|
|
15
|
-
readonly members: ReadonlyArray<ScalarFieldType | ValueObjectFieldType>;
|
|
16
|
-
};
|
|
17
|
-
type ContractFieldType = ScalarFieldType | ValueObjectFieldType | UnionFieldType;
|
|
18
|
-
type ContractField = {
|
|
19
|
-
readonly nullable: boolean;
|
|
20
|
-
readonly type: ContractFieldType;
|
|
21
|
-
readonly many?: true;
|
|
22
|
-
readonly dict?: true;
|
|
23
|
-
};
|
|
24
|
-
type ContractRelationOn = {
|
|
25
|
-
readonly localFields: readonly string[];
|
|
26
|
-
readonly targetFields: readonly string[];
|
|
27
|
-
};
|
|
28
|
-
type ContractReferenceRelation = {
|
|
29
|
-
readonly to: CrossReference;
|
|
30
|
-
readonly cardinality: '1:1' | '1:N' | 'N:1';
|
|
31
|
-
readonly on: ContractRelationOn;
|
|
32
|
-
};
|
|
33
|
-
type ContractEmbedRelation = {
|
|
34
|
-
readonly to: CrossReference;
|
|
35
|
-
readonly cardinality: '1:1' | '1:N';
|
|
36
|
-
};
|
|
37
|
-
type ContractRelation = ContractReferenceRelation | ContractEmbedRelation;
|
|
38
|
-
type ContractDiscriminator = {
|
|
39
|
-
readonly field: string;
|
|
40
|
-
};
|
|
41
|
-
type ContractVariantEntry = {
|
|
42
|
-
readonly value: string;
|
|
43
|
-
};
|
|
44
|
-
type ContractValueObject = {
|
|
45
|
-
readonly fields: Record<string, ContractField>;
|
|
46
|
-
};
|
|
47
|
-
type ModelStorageBase = Readonly<Record<string, unknown>>;
|
|
48
|
-
interface ContractModelBase<TModelStorage extends ModelStorageBase = ModelStorageBase> {
|
|
49
|
-
readonly fields: Record<string, ContractField>;
|
|
50
|
-
readonly relations: Record<string, ContractRelation>;
|
|
51
|
-
readonly storage: TModelStorage;
|
|
52
|
-
readonly discriminator?: ContractDiscriminator;
|
|
53
|
-
readonly variants?: Record<string, ContractVariantEntry>;
|
|
54
|
-
readonly base?: CrossReference;
|
|
55
|
-
readonly owner?: string;
|
|
56
|
-
}
|
|
57
|
-
interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> extends ContractModelBase<TModelStorage> {
|
|
58
|
-
readonly fields: Record<string, ContractField>;
|
|
59
|
-
}
|
|
60
|
-
type HasModelsWithRelations = {
|
|
61
|
-
readonly models: Record<string, {
|
|
62
|
-
readonly relations: Record<string, ContractRelation>;
|
|
63
|
-
}>;
|
|
64
|
-
};
|
|
65
|
-
type ReferenceRelationKeys<TContract extends HasModelsWithRelations, ModelName extends string & keyof TContract['models']> = { [K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends ContractReferenceRelation ? K : never }[keyof TContract['models'][ModelName]['relations']];
|
|
66
|
-
type EmbedRelationKeys<TContract extends HasModelsWithRelations, ModelName extends string & keyof TContract['models']> = { [K in keyof TContract['models'][ModelName]['relations']]: TContract['models'][ModelName]['relations'][K] extends ContractReferenceRelation ? never : K }[keyof TContract['models'][ModelName]['relations']];
|
|
67
|
-
//#endregion
|
|
68
3
|
//#region src/types.d.ts
|
|
69
4
|
/**
|
|
70
5
|
* Unique symbol used as the key for branding types.
|
|
@@ -274,14 +209,11 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
|
|
|
274
209
|
readonly target: string;
|
|
275
210
|
readonly targetFamily: string;
|
|
276
211
|
readonly roots: Record<string, CrossReference>;
|
|
277
|
-
readonly models: TModels;
|
|
278
|
-
readonly valueObjects?: Record<string, ContractValueObject>;
|
|
279
212
|
/**
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
* omitted from the on-disk envelope so emitted contracts stay byte-stable.
|
|
213
|
+
* Application plane (ADR 221): `domain.namespaces.<nsId>.{ models, valueObjects }`.
|
|
214
|
+
* `TModels` types the union of model entries across namespaces for family DSL inference.
|
|
283
215
|
*/
|
|
284
|
-
readonly domain
|
|
216
|
+
readonly domain: ApplicationDomain<TModels>;
|
|
285
217
|
readonly storage: TStorage;
|
|
286
218
|
readonly capabilities: Record<string, Record<string, boolean>>;
|
|
287
219
|
readonly extensionPacks: Record<string, unknown>;
|
|
@@ -289,6 +221,13 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
|
|
|
289
221
|
readonly profileHash: ProfileHashBase<string>;
|
|
290
222
|
readonly meta: Record<string, unknown>;
|
|
291
223
|
}
|
|
224
|
+
type ContractModelsMap<TContract extends Contract> = TContract extends Contract<StorageBase, infer TModels> ? TModels : never;
|
|
225
|
+
type ExactlyOneKey<T extends Record<string, unknown>> = keyof T extends infer Only extends keyof T ? [keyof T] extends [Only] ? Only : never : never;
|
|
226
|
+
type NamespaceValueObjectsOf<TNamespace> = TNamespace extends {
|
|
227
|
+
readonly valueObjects?: infer VO;
|
|
228
|
+
} ? VO extends Record<string, ContractValueObject> ? VO : Record<never, never> : Record<never, never>;
|
|
229
|
+
/** Value-object map for the contract's sole domain namespace (type-level single-namespace projection). */
|
|
230
|
+
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>;
|
|
292
231
|
//#endregion
|
|
293
|
-
export {
|
|
294
|
-
//# sourceMappingURL=contract-types-
|
|
232
|
+
export { coreHash as A, PlanMeta as C, StorageEntitySlot as D, StorageBase as E, profileHash as F, 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 };
|
|
233
|
+
//# sourceMappingURL=contract-types-xgwKtd7y.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-types-xgwKtd7y.d.mts","names":[],"sources":["../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/contract-validation-error.ts
|
|
2
|
+
var ContractValidationError = class extends Error {
|
|
3
|
+
code = "CONTRACT.VALIDATION_FAILED";
|
|
4
|
+
phase;
|
|
5
|
+
constructor(message, phase) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "ContractValidationError";
|
|
8
|
+
this.phase = phase;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
var DomainNamespaceResolutionError = class extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "DomainNamespaceResolutionError";
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { DomainNamespaceResolutionError as n, ContractValidationError as t };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=contract-validation-error-ClZaKqMW.mjs.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/contract-validation-error.d.ts
|
|
2
|
+
type ContractValidationPhase = 'structural' | 'domain' | 'storage';
|
|
3
|
+
declare class ContractValidationError extends Error {
|
|
4
|
+
readonly code = "CONTRACT.VALIDATION_FAILED";
|
|
5
|
+
readonly phase: ContractValidationPhase;
|
|
6
|
+
constructor(message: string, phase: ContractValidationPhase);
|
|
7
|
+
}
|
|
8
|
+
declare class DomainNamespaceResolutionError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { ContractValidationPhase as n, DomainNamespaceResolutionError as r, ContractValidationError as t };
|
|
13
|
+
//# sourceMappingURL=contract-validation-error-T5LH4DW-.d.mts.map
|
|
@@ -0,0 +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,10 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare class ContractValidationError extends Error {
|
|
4
|
-
readonly code = "CONTRACT.VALIDATION_FAILED";
|
|
5
|
-
readonly phase: ContractValidationPhase;
|
|
6
|
-
constructor(message: string, phase: ContractValidationPhase);
|
|
7
|
-
}
|
|
8
|
-
//#endregion
|
|
9
|
-
export { ContractValidationError, type ContractValidationPhase };
|
|
10
|
-
//# sourceMappingURL=contract-validation-error.d.mts.map
|
|
1
|
+
import { n as ContractValidationPhase, r as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-T5LH4DW-.mjs";
|
|
2
|
+
export { ContractValidationError, type ContractValidationPhase, DomainNamespaceResolutionError };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as ContractValidationError } from "./contract-validation-error-
|
|
2
|
-
export { ContractValidationError };
|
|
1
|
+
import { n as DomainNamespaceResolutionError, t as ContractValidationError } from "./contract-validation-error-ClZaKqMW.mjs";
|
|
2
|
+
export { ContractValidationError, DomainNamespaceResolutionError };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
|
|
2
|
+
|
|
3
|
+
//#region src/namespace-id.d.ts
|
|
4
|
+
type NamespaceId = string & {
|
|
5
|
+
readonly __brand: 'NamespaceId';
|
|
6
|
+
};
|
|
7
|
+
declare function asNamespaceId(value: string): NamespaceId;
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/cross-reference.d.ts
|
|
10
|
+
interface CrossReference {
|
|
11
|
+
readonly namespace: NamespaceId;
|
|
12
|
+
readonly model: string;
|
|
13
|
+
}
|
|
14
|
+
declare const CrossReferenceSchema: _$arktype_internal_variants_object_ts0.ObjectType<CrossReference, {}>;
|
|
15
|
+
declare function crossRef(model: string, namespace?: string): CrossReference;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/domain-types.d.ts
|
|
18
|
+
type ScalarFieldType = {
|
|
19
|
+
readonly kind: 'scalar';
|
|
20
|
+
readonly codecId: string;
|
|
21
|
+
readonly typeParams?: Record<string, unknown>;
|
|
22
|
+
};
|
|
23
|
+
type ValueObjectFieldType = {
|
|
24
|
+
readonly kind: 'valueObject';
|
|
25
|
+
readonly name: string;
|
|
26
|
+
};
|
|
27
|
+
type UnionFieldType = {
|
|
28
|
+
readonly kind: 'union';
|
|
29
|
+
readonly members: ReadonlyArray<ScalarFieldType | ValueObjectFieldType>;
|
|
30
|
+
};
|
|
31
|
+
type ContractFieldType = ScalarFieldType | ValueObjectFieldType | UnionFieldType;
|
|
32
|
+
type ContractField = {
|
|
33
|
+
readonly nullable: boolean;
|
|
34
|
+
readonly type: ContractFieldType;
|
|
35
|
+
readonly many?: true;
|
|
36
|
+
readonly dict?: true;
|
|
37
|
+
};
|
|
38
|
+
type ContractRelationOn = {
|
|
39
|
+
readonly localFields: readonly string[];
|
|
40
|
+
readonly targetFields: readonly string[];
|
|
41
|
+
};
|
|
42
|
+
type ContractReferenceRelation = {
|
|
43
|
+
readonly to: CrossReference;
|
|
44
|
+
readonly cardinality: '1:1' | '1:N' | 'N:1';
|
|
45
|
+
readonly on: ContractRelationOn;
|
|
46
|
+
};
|
|
47
|
+
type ContractEmbedRelation = {
|
|
48
|
+
readonly to: CrossReference;
|
|
49
|
+
readonly cardinality: '1:1' | '1:N';
|
|
50
|
+
};
|
|
51
|
+
type ContractRelation = ContractReferenceRelation | ContractEmbedRelation;
|
|
52
|
+
type ContractDiscriminator = {
|
|
53
|
+
readonly field: string;
|
|
54
|
+
};
|
|
55
|
+
type ContractVariantEntry = {
|
|
56
|
+
readonly value: string;
|
|
57
|
+
};
|
|
58
|
+
type ContractValueObject = {
|
|
59
|
+
readonly fields: Record<string, ContractField>;
|
|
60
|
+
};
|
|
61
|
+
type ModelStorageBase = Readonly<Record<string, unknown>>;
|
|
62
|
+
interface ContractModelBase<TModelStorage extends ModelStorageBase = ModelStorageBase> {
|
|
63
|
+
readonly fields: Record<string, ContractField>;
|
|
64
|
+
readonly relations: Record<string, ContractRelation>;
|
|
65
|
+
readonly storage: TModelStorage;
|
|
66
|
+
readonly discriminator?: ContractDiscriminator;
|
|
67
|
+
readonly variants?: Record<string, ContractVariantEntry>;
|
|
68
|
+
readonly base?: CrossReference;
|
|
69
|
+
readonly owner?: string;
|
|
70
|
+
}
|
|
71
|
+
interface ContractModel<TModelStorage extends ModelStorageBase = ModelStorageBase> extends ContractModelBase<TModelStorage> {
|
|
72
|
+
readonly fields: Record<string, ContractField>;
|
|
73
|
+
}
|
|
74
|
+
type ReferenceRelationKeys<TModels extends Record<string, {
|
|
75
|
+
readonly relations: Record<string, ContractRelation>;
|
|
76
|
+
}>, ModelName extends string & keyof TModels> = { [K in keyof TModels[ModelName]['relations']]: TModels[ModelName]['relations'][K] extends ContractReferenceRelation ? K : never }[keyof TModels[ModelName]['relations']];
|
|
77
|
+
type EmbedRelationKeys<TModels extends Record<string, {
|
|
78
|
+
readonly relations: Record<string, ContractRelation>;
|
|
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
|
+
//#endregion
|
|
81
|
+
//#region src/domain-envelope.d.ts
|
|
82
|
+
declare const UNBOUND_DOMAIN_NAMESPACE_ID: "__unbound__";
|
|
83
|
+
/**
|
|
84
|
+
* One namespace's application-domain entities — models and optional value
|
|
85
|
+
* objects keyed by entity name within that namespace coordinate.
|
|
86
|
+
*/
|
|
87
|
+
interface ApplicationDomainNamespace<TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>> {
|
|
88
|
+
readonly models: TModels;
|
|
89
|
+
readonly valueObjects?: Record<string, ContractValueObject>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Application-domain envelope: entity content keyed by namespace id.
|
|
93
|
+
* Mirrors the storage plane's `namespaces` segment (ADR 221).
|
|
94
|
+
*/
|
|
95
|
+
interface ApplicationDomain<TModels extends Record<string, ContractModelBase> = Record<string, ContractModelBase>> {
|
|
96
|
+
readonly namespaces: Readonly<Record<string, ApplicationDomainNamespace<TModels>>>;
|
|
97
|
+
}
|
|
98
|
+
type ContractWithDomain = {
|
|
99
|
+
readonly domain: ApplicationDomain;
|
|
100
|
+
};
|
|
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
|
+
//#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-4hyFtJ4_.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-envelope-4hyFtJ4_.d.mts","names":[],"sources":["../src/namespace-id.ts","../src/cross-reference.ts","../src/domain-types.ts","../src/domain-envelope.ts"],"mappings":";;;KAEY,WAAA;EAAA,SAAkC,OAAO;AAAA;AAAA,iBAErC,aAAA,CAAc,KAAA,WAAgB,WAAW;;;UCAxC,cAAA;EAAA,SACN,SAAA,EAAW,WAAW;EAAA,SACtB,KAAA;AAAA;AAAA,cAGE,oBAAA,EAAoB,sCAAA,CAAA,UAAA,CAAA,cAAA;AAAA,iBAajB,QAAA,CACd,KAAA,UACA,SAAA,YACC,cAAc;;;KCvBL,eAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,MAAM;AAAA;AAAA,KAGlB,oBAAA;EAAA,SACD,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,KAGH,cAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA,EAAS,aAAA,CAAc,eAAA,GAAkB,oBAAA;AAAA;AAAA,KAGxC,iBAAA,GAAoB,eAAA,GAAkB,oBAAA,GAAuB,cAAA;AAAA,KAE7D,aAAA;EAAA,SACD,QAAA;EAAA,SACA,IAAA,EAAM,iBAAiB;EAAA,SACvB,IAAA;EAAA,SACA,IAAA;AAAA;AAAA,KAGC,kBAAA;EAAA,SACD,WAAA;EAAA,SACA,YAAY;AAAA;AAAA,KAGX,yBAAA;EAAA,SACD,EAAA,EAAI,cAAA;EAAA,SACJ,WAAA;EAAA,SACA,EAAA,EAAI,kBAAkB;AAAA;AAAA,KAGrB,qBAAA;EAAA,SACD,EAAA,EAAI,cAAc;EAAA,SAClB,WAAA;AAAA;AAAA,KAGC,gBAAA,GAAmB,yBAAA,GAA4B,qBAAqB;AAAA,KAEpE,qBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAGJ,oBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAGJ,mBAAA;EAAA,SACD,MAAA,EAAQ,MAAM,SAAS,aAAA;AAAA;AAAA,KAGtB,gBAAA,GAAmB,QAAQ,CAAC,MAAA;AAAA,UAEvB,iBAAA,uBAAwC,gBAAA,GAAmB,gBAAA;EAAA,SACjE,MAAA,EAAQ,MAAA,SAAe,aAAA;EAAA,SACvB,SAAA,EAAW,MAAA,SAAe,gBAAA;EAAA,SAC1B,OAAA,EAAS,aAAA;EAAA,SACT,aAAA,GAAgB,qBAAA;EAAA,SAChB,QAAA,GAAW,MAAA,SAAe,oBAAA;EAAA,SAC1B,IAAA,GAAO,cAAA;EAAA,SACP,KAAA;AAAA;AAAA,UAGM,aAAA,uBAAoC,gBAAA,GAAmB,gBAAA,UAC9D,iBAAA,CAAkB,aAAA;EAAA,SACjB,MAAA,EAAQ,MAAA,SAAe,aAAA;AAAA;AAAA,KAKtB,qBAAA,iBACM,MAAA;EAAA,SAA0B,SAAA,EAAW,MAAA,SAAe,gBAAA;AAAA,qCACnC,OAAA,kBAErB,OAAA,CAAQ,SAAA,iBAA0B,OAAA,CAAQ,SAAA,eAAwB,CAAA,UAAW,yBAAA,GACrF,CAAA,iBAEE,OAAA,CAAQ,SAAA;AAAA,KAEJ,iBAAA,iBACM,MAAA;EAAA,SAA0B,SAAA,EAAW,MAAA,SAAe,gBAAA;AAAA,qCACnC,OAAA,kBAErB,OAAA,CAAQ,SAAA,iBAA0B,OAAA,CAAQ,SAAA,eAAwB,CAAA,UAAW,yBAAA,WAErF,CAAA,SACE,OAAA,CAAQ,SAAA;;;cCzFH,2BAAA;;AHDb;;;UGOiB,0BAAA,iBACC,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,iBAAA;EAAA,SAE1D,MAAA,EAAQ,OAAA;EAAA,SACR,YAAA,GAAe,MAAA,SAAe,mBAAA;AAAA;;;AHTgB;;UGgBxC,iBAAA,iBACC,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,iBAAA;EAAA,SAE1D,UAAA,EAAY,QAAA,CAAS,MAAA,SAAe,0BAAA,CAA2B,OAAA;AAAA;AAAA,KAG9D,kBAAA;EAAA,SACD,MAAA,EAAQ,iBAAiB;AAAA;AAAA,iBAGpB,8BAAA,CACd,MAAA,EAAQ,iBAAiB,EACzB,WAAA;AAAA,iBA4Bc,cAAA,iBAA+B,MAAA,SAAe,iBAAA,EAAA,CAC5D,QAAA;EAAA,SAAqB,MAAA,EAAQ,iBAAA,CAAkB,OAAA;AAAA,GAC/C,WAAA,YACC,OAAA;AAAA,iBAWa,oBAAA,iBAAqC,MAAA,SAAe,iBAAA,EAAA,CAClE,QAAA;EAAA,SAAqB,MAAA,EAAQ,iBAAA,CAAkB,OAAA;AAAA,GAC/C,WAAA,YACC,MAAA,SAAe,mBAAA"}
|
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-DFE0HJkI.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/canonicalization-path-match.d.ts
|
|
4
4
|
type PathSegment = string | '*' | readonly string[];
|
package/dist/hashing-utils.mjs
CHANGED
|
@@ -1,25 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
function matchesPathPattern(path, pattern) {
|
|
3
|
-
if (path.length !== pattern.length) return false;
|
|
4
|
-
for (let i = 0; i < pattern.length; i++) {
|
|
5
|
-
const segment = pattern[i];
|
|
6
|
-
const value = path[i];
|
|
7
|
-
if (segment === void 0 || value === void 0) return false;
|
|
8
|
-
if (segment === "*") continue;
|
|
9
|
-
if (typeof segment === "string") {
|
|
10
|
-
if (value !== segment) return false;
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
if (Array.isArray(segment)) {
|
|
14
|
-
if (!segment.includes(value)) return false;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
function createPreserveEmptyPredicate(patterns) {
|
|
20
|
-
return (path) => patterns.some((pattern) => matchesPathPattern(path, pattern));
|
|
21
|
-
}
|
|
22
|
-
//#endregion
|
|
1
|
+
import { n as matchesPathPattern, t as createPreserveEmptyPredicate } from "./canonicalization-path-match-b2jFuEso.mjs";
|
|
23
2
|
//#region src/canonicalization-storage-sort.ts
|
|
24
3
|
function isPlainRecord(value) {
|
|
25
4
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashing-utils.mjs","names":[],"sources":["../src/canonicalization-
|
|
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"}
|
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 { O as StorageHashBase, p as ExecutionHashBase, w as ProfileHashBase } from "./contract-types-xgwKtd7y.mjs";
|
|
2
|
+
import { a as canonicalizeContract, i as StorageSort, n as PreserveEmptyPredicate, o as canonicalizeContractToObject, r as SerializeContract, t as CanonicalizeContractOptions } from "./canonicalization-DFE0HJkI.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/hashing.d.ts
|
|
5
5
|
type ComputeStorageHashArgs = {
|
package/dist/hashing.mjs
CHANGED
|
@@ -1,2 +1,176 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as matchesPathPattern } from "./canonicalization-path-match-b2jFuEso.mjs";
|
|
2
|
+
import { isArrayEqual } from "@prisma-next/utils/array-equal";
|
|
3
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
//#region src/canonicalization.ts
|
|
6
|
+
const DOMAIN_NAMESPACE_SLOT_PATTERN = [
|
|
7
|
+
"domain",
|
|
8
|
+
"namespaces",
|
|
9
|
+
"*"
|
|
10
|
+
];
|
|
11
|
+
const DOMAIN_MODELS_CONTAINER_PATTERN = [
|
|
12
|
+
"domain",
|
|
13
|
+
"namespaces",
|
|
14
|
+
"*",
|
|
15
|
+
"models"
|
|
16
|
+
];
|
|
17
|
+
const DOMAIN_MODEL_RELATIONS_PATTERN = [
|
|
18
|
+
"domain",
|
|
19
|
+
"namespaces",
|
|
20
|
+
"*",
|
|
21
|
+
"models",
|
|
22
|
+
"*",
|
|
23
|
+
"relations"
|
|
24
|
+
];
|
|
25
|
+
const DOMAIN_MODEL_STORAGE_PATTERN = [
|
|
26
|
+
"domain",
|
|
27
|
+
"namespaces",
|
|
28
|
+
"*",
|
|
29
|
+
"models",
|
|
30
|
+
"*",
|
|
31
|
+
"storage"
|
|
32
|
+
];
|
|
33
|
+
const TOP_LEVEL_ORDER = [
|
|
34
|
+
"schemaVersion",
|
|
35
|
+
"canonicalVersion",
|
|
36
|
+
"targetFamily",
|
|
37
|
+
"target",
|
|
38
|
+
"profileHash",
|
|
39
|
+
"roots",
|
|
40
|
+
"domain",
|
|
41
|
+
"storage",
|
|
42
|
+
"execution",
|
|
43
|
+
"capabilities",
|
|
44
|
+
"extensionPacks",
|
|
45
|
+
"meta"
|
|
46
|
+
];
|
|
47
|
+
function isDefaultValue(value) {
|
|
48
|
+
if (value === false) return true;
|
|
49
|
+
if (value === null) return false;
|
|
50
|
+
if (Array.isArray(value) && value.length === 0) return true;
|
|
51
|
+
if (typeof value === "object" && value !== null) return Object.keys(value).length === 0;
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
function omitDefaults(obj, path, shouldPreserveEmpty) {
|
|
55
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
56
|
+
if (Array.isArray(obj)) return obj.map((item) => omitDefaults(item, path, shouldPreserveEmpty));
|
|
57
|
+
const result = {};
|
|
58
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
59
|
+
const currentPath = [...path, key];
|
|
60
|
+
if (key === "_generated") continue;
|
|
61
|
+
if (key === "generated" && value === false) continue;
|
|
62
|
+
if ((key === "onDelete" || key === "onUpdate") && value === "noAction") continue;
|
|
63
|
+
if (isDefaultValue(value)) {
|
|
64
|
+
const isRequiredDomainNamespaces = isArrayEqual(currentPath, ["domain", "namespaces"]);
|
|
65
|
+
const isDomainNamespaceSlot = matchesPathPattern(currentPath, DOMAIN_NAMESPACE_SLOT_PATTERN);
|
|
66
|
+
const isRequiredDomainModels = matchesPathPattern(currentPath, DOMAIN_MODELS_CONTAINER_PATTERN);
|
|
67
|
+
const isRequiredStorageNamespaces = isArrayEqual(currentPath, ["storage", "namespaces"]);
|
|
68
|
+
const isStorageNamespaceSlot = currentPath.length === 3 && isArrayEqual([currentPath[0], currentPath[1]], ["storage", "namespaces"]);
|
|
69
|
+
const isRequiredRoots = isArrayEqual(currentPath, ["roots"]);
|
|
70
|
+
const isRequiredExtensionPacks = isArrayEqual(currentPath, ["extensionPacks"]);
|
|
71
|
+
const isRequiredCapabilities = isArrayEqual(currentPath, ["capabilities"]);
|
|
72
|
+
const isRequiredMeta = isArrayEqual(currentPath, ["meta"]);
|
|
73
|
+
const isRequiredExecutionDefaults = isArrayEqual(currentPath, [
|
|
74
|
+
"execution",
|
|
75
|
+
"mutations",
|
|
76
|
+
"defaults"
|
|
77
|
+
]);
|
|
78
|
+
const isExtensionNamespace = currentPath.length === 2 && currentPath[0] === "extensionPacks";
|
|
79
|
+
const isModelRelations = matchesPathPattern(currentPath, DOMAIN_MODEL_RELATIONS_PATTERN);
|
|
80
|
+
const isModelStorage = matchesPathPattern(currentPath, DOMAIN_MODEL_STORAGE_PATTERN);
|
|
81
|
+
const isNullableField = key === "nullable";
|
|
82
|
+
const isFamilyPreserved = shouldPreserveEmpty?.(currentPath) ?? false;
|
|
83
|
+
if (!isRequiredDomainNamespaces && !isDomainNamespaceSlot && !isRequiredDomainModels && !isRequiredStorageNamespaces && !isStorageNamespaceSlot && !isRequiredRoots && !isRequiredExtensionPacks && !isRequiredCapabilities && !isRequiredMeta && !isRequiredExecutionDefaults && !isExtensionNamespace && !isModelRelations && !isModelStorage && !isNullableField && !isFamilyPreserved) continue;
|
|
84
|
+
}
|
|
85
|
+
result[key] = omitDefaults(value, currentPath, shouldPreserveEmpty);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
function sortObjectKeys(obj) {
|
|
90
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
91
|
+
if (Array.isArray(obj)) return obj.map((item) => sortObjectKeys(item));
|
|
92
|
+
const sorted = {};
|
|
93
|
+
const keys = Object.keys(obj).sort();
|
|
94
|
+
for (const key of keys) sorted[key] = sortObjectKeys(obj[key]);
|
|
95
|
+
return sorted;
|
|
96
|
+
}
|
|
97
|
+
function orderTopLevel(obj) {
|
|
98
|
+
const ordered = {};
|
|
99
|
+
const remaining = new Set(Object.keys(obj));
|
|
100
|
+
for (const key of TOP_LEVEL_ORDER) if (remaining.has(key)) {
|
|
101
|
+
ordered[key] = obj[key];
|
|
102
|
+
remaining.delete(key);
|
|
103
|
+
}
|
|
104
|
+
for (const key of Array.from(remaining).sort()) ordered[key] = obj[key];
|
|
105
|
+
return ordered;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Object-form variant of {@link canonicalizeContract}. Exported because the
|
|
109
|
+
* emitter writes the canonical contract through a separate JSON-stringify
|
|
110
|
+
* pass and consumes the structured object directly.
|
|
111
|
+
*/
|
|
112
|
+
function canonicalizeContractToObject(contract, options) {
|
|
113
|
+
const serialized = options.serializeContract(contract);
|
|
114
|
+
const withDefaultsOmitted = omitDefaults({
|
|
115
|
+
...ifDefined("schemaVersion", options.schemaVersion),
|
|
116
|
+
targetFamily: serialized["targetFamily"],
|
|
117
|
+
target: serialized["target"],
|
|
118
|
+
profileHash: serialized["profileHash"],
|
|
119
|
+
roots: serialized["roots"],
|
|
120
|
+
domain: serialized["domain"],
|
|
121
|
+
storage: serialized["storage"],
|
|
122
|
+
...ifDefined("execution", serialized["execution"]),
|
|
123
|
+
extensionPacks: serialized["extensionPacks"],
|
|
124
|
+
capabilities: serialized["capabilities"],
|
|
125
|
+
meta: serialized["meta"]
|
|
126
|
+
}, [], options.shouldPreserveEmpty);
|
|
127
|
+
return orderTopLevel(sortObjectKeys(options.sortStorage ? {
|
|
128
|
+
...withDefaultsOmitted,
|
|
129
|
+
storage: options.sortStorage(withDefaultsOmitted["storage"])
|
|
130
|
+
} : withDefaultsOmitted));
|
|
131
|
+
}
|
|
132
|
+
function canonicalizeContract(contract, options) {
|
|
133
|
+
return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/hashing.ts
|
|
137
|
+
const SCHEMA_VERSION = "1";
|
|
138
|
+
function sha256(content) {
|
|
139
|
+
const hash = createHash("sha256");
|
|
140
|
+
hash.update(content);
|
|
141
|
+
return `sha256:${hash.digest("hex")}`;
|
|
142
|
+
}
|
|
143
|
+
function hashContract(section) {
|
|
144
|
+
const { shouldPreserveEmpty, sortStorage, ...sectionData } = section;
|
|
145
|
+
return canonicalizeContract({
|
|
146
|
+
targetFamily: sectionData["targetFamily"],
|
|
147
|
+
target: sectionData["target"],
|
|
148
|
+
roots: {},
|
|
149
|
+
domain: { namespaces: {} },
|
|
150
|
+
storage: sectionData["storage"] ?? {},
|
|
151
|
+
execution: sectionData["execution"],
|
|
152
|
+
extensionPacks: {},
|
|
153
|
+
capabilities: sectionData["capabilities"] ?? {},
|
|
154
|
+
meta: {},
|
|
155
|
+
profileHash: "",
|
|
156
|
+
...sectionData
|
|
157
|
+
}, {
|
|
158
|
+
schemaVersion: SCHEMA_VERSION,
|
|
159
|
+
serializeContract: (c) => JSON.parse(JSON.stringify(c)),
|
|
160
|
+
...ifDefined("shouldPreserveEmpty", shouldPreserveEmpty),
|
|
161
|
+
...ifDefined("sortStorage", sortStorage)
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function computeStorageHash(args) {
|
|
165
|
+
return sha256(hashContract(args));
|
|
166
|
+
}
|
|
167
|
+
function computeExecutionHash(args) {
|
|
168
|
+
return sha256(hashContract(args));
|
|
169
|
+
}
|
|
170
|
+
function computeProfileHash(args) {
|
|
171
|
+
return sha256(hashContract(args));
|
|
172
|
+
}
|
|
173
|
+
//#endregion
|
|
2
174
|
export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };
|
|
175
|
+
|
|
176
|
+
//# sourceMappingURL=hashing.mjs.map
|