@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
package/src/exports/types.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
export type {
|
|
2
2
|
Contract,
|
|
3
3
|
ContractExecutionSection,
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
ContractModelDefinitions,
|
|
5
|
+
ContractValueObjectDefinitions,
|
|
6
6
|
} from '../contract-types';
|
|
7
7
|
export { DomainNamespaceResolutionError } from '../contract-validation-error';
|
|
8
8
|
export type { ControlPolicy } from '../control-policy';
|
|
9
|
-
export {
|
|
9
|
+
export { effectiveControlPolicy } from '../control-policy';
|
|
10
10
|
export type { CrossReference } from '../cross-reference';
|
|
11
11
|
export { CrossReferenceSchema, crossRef } from '../cross-reference';
|
|
12
|
+
export { soleDomainNamespaceId } from '../default-namespace';
|
|
12
13
|
export type {
|
|
13
14
|
ApplicationDomain,
|
|
14
15
|
ApplicationDomainNamespace,
|
|
15
16
|
ContractWithDomain,
|
|
16
17
|
} from '../domain-envelope';
|
|
18
|
+
export { UNBOUND_DOMAIN_NAMESPACE_ID } from '../domain-envelope';
|
|
17
19
|
export {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
UNBOUND_DOMAIN_NAMESPACE_ID,
|
|
22
|
-
} from '../domain-envelope';
|
|
20
|
+
domainModelsAtDefaultNamespace,
|
|
21
|
+
domainValueObjectsAtDefaultNamespace,
|
|
22
|
+
} from '../domain-namespace-access';
|
|
23
23
|
export type {
|
|
24
24
|
ContractDiscriminator,
|
|
25
25
|
ContractEmbedRelation,
|
|
@@ -41,6 +41,7 @@ export type {
|
|
|
41
41
|
} from '../domain-types';
|
|
42
42
|
export type { NamespaceId } from '../namespace-id';
|
|
43
43
|
export { asNamespaceId } from '../namespace-id';
|
|
44
|
+
export { type ResolvedDomainModel, resolveDomainModel } from '../resolve-domain-model';
|
|
44
45
|
export type {
|
|
45
46
|
$,
|
|
46
47
|
Brand,
|
|
@@ -60,6 +61,7 @@ export type {
|
|
|
60
61
|
GeneratedValueSpec,
|
|
61
62
|
JsonPrimitive,
|
|
62
63
|
JsonValue,
|
|
64
|
+
LedgerEntryRecord,
|
|
63
65
|
PlanMeta,
|
|
64
66
|
ProfileHashBase,
|
|
65
67
|
Source,
|
package/src/hashing.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
+
import { blindCast, castAs } from '@prisma-next/utils/casts';
|
|
2
3
|
import { ifDefined } from '@prisma-next/utils/defined';
|
|
3
4
|
import type { JsonObject } from '@prisma-next/utils/json';
|
|
4
5
|
import {
|
|
@@ -11,6 +12,33 @@ import type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './type
|
|
|
11
12
|
|
|
12
13
|
const SCHEMA_VERSION = '1';
|
|
13
14
|
|
|
15
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
16
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Storage hashes fingerprint table/column layout, not which target pack emitted a
|
|
20
|
+
// namespace. Persisted contract.json carries namespace `kind` discriminators;
|
|
21
|
+
// authoring-time hashes never included them (IR `kind` is non-enumerable).
|
|
22
|
+
function omitNamespaceKindsForHash(storage: unknown): unknown {
|
|
23
|
+
if (!isPlainRecord(storage)) {
|
|
24
|
+
return storage;
|
|
25
|
+
}
|
|
26
|
+
const namespaces = storage['namespaces'];
|
|
27
|
+
if (!isPlainRecord(namespaces)) {
|
|
28
|
+
return storage;
|
|
29
|
+
}
|
|
30
|
+
const stripped: Record<string, unknown> = {};
|
|
31
|
+
for (const [nsId, ns] of Object.entries(namespaces)) {
|
|
32
|
+
if (isPlainRecord(ns)) {
|
|
33
|
+
const { kind: _kind, ...rest } = ns;
|
|
34
|
+
stripped[nsId] = rest;
|
|
35
|
+
} else {
|
|
36
|
+
stripped[nsId] = ns;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { ...storage, namespaces: stripped };
|
|
40
|
+
}
|
|
41
|
+
|
|
14
42
|
function sha256(content: string): string {
|
|
15
43
|
const hash = createHash('sha256');
|
|
16
44
|
hash.update(content);
|
|
@@ -24,28 +52,23 @@ type HashContractSection = Record<string, unknown> & {
|
|
|
24
52
|
|
|
25
53
|
function hashContract(section: HashContractSection): string {
|
|
26
54
|
const { shouldPreserveEmpty, sortStorage, ...sectionData } = section;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// `canonicalizeContract` only walks the storage / execution /
|
|
30
|
-
// capabilities slices, all of which are populated above, so the
|
|
31
|
-
// missing precise Contract typing on the other slots is
|
|
32
|
-
// immaterial for the hash result.
|
|
33
|
-
const contract = {
|
|
55
|
+
const storageForHash = omitNamespaceKindsForHash(sectionData['storage'] ?? {});
|
|
56
|
+
const contract = blindCast<Contract, 'hash-only partial contract for canonicalizeContract'>({
|
|
34
57
|
targetFamily: sectionData['targetFamily'],
|
|
35
58
|
target: sectionData['target'],
|
|
36
59
|
roots: {},
|
|
37
60
|
domain: { namespaces: {} },
|
|
38
|
-
storage: sectionData['storage'] ?? {},
|
|
39
61
|
execution: sectionData['execution'],
|
|
40
62
|
extensionPacks: {},
|
|
41
63
|
capabilities: sectionData['capabilities'] ?? {},
|
|
42
64
|
meta: {},
|
|
43
65
|
profileHash: '',
|
|
44
66
|
...sectionData,
|
|
45
|
-
|
|
67
|
+
storage: storageForHash,
|
|
68
|
+
});
|
|
46
69
|
return canonicalizeContract(contract, {
|
|
47
70
|
schemaVersion: SCHEMA_VERSION,
|
|
48
|
-
serializeContract: (c) => JSON.parse(JSON.stringify(c))
|
|
71
|
+
serializeContract: (c) => castAs<JsonObject>(JSON.parse(JSON.stringify(c))),
|
|
49
72
|
...ifDefined('shouldPreserveEmpty', shouldPreserveEmpty),
|
|
50
73
|
...ifDefined('sortStorage', sortStorage),
|
|
51
74
|
});
|
|
@@ -60,7 +83,9 @@ export type ComputeStorageHashArgs = {
|
|
|
60
83
|
};
|
|
61
84
|
|
|
62
85
|
export function computeStorageHash(args: ComputeStorageHashArgs): StorageHashBase<string> {
|
|
63
|
-
return sha256
|
|
86
|
+
return blindCast<StorageHashBase<string>, 'sha256 digest of canonicalized storage'>(
|
|
87
|
+
sha256(hashContract(args)),
|
|
88
|
+
);
|
|
64
89
|
}
|
|
65
90
|
|
|
66
91
|
export function computeExecutionHash(args: {
|
|
@@ -68,7 +93,9 @@ export function computeExecutionHash(args: {
|
|
|
68
93
|
targetFamily: string;
|
|
69
94
|
execution: Record<string, unknown>;
|
|
70
95
|
}): ExecutionHashBase<string> {
|
|
71
|
-
return sha256
|
|
96
|
+
return blindCast<ExecutionHashBase<string>, 'sha256 digest of canonicalized execution'>(
|
|
97
|
+
sha256(hashContract(args)),
|
|
98
|
+
);
|
|
72
99
|
}
|
|
73
100
|
|
|
74
101
|
export function computeProfileHash(args: {
|
|
@@ -76,5 +103,7 @@ export function computeProfileHash(args: {
|
|
|
76
103
|
targetFamily: string;
|
|
77
104
|
capabilities: Record<string, Record<string, boolean>>;
|
|
78
105
|
}): ProfileHashBase<string> {
|
|
79
|
-
return sha256
|
|
106
|
+
return blindCast<ProfileHashBase<string>, 'sha256 digest of canonicalized profile'>(
|
|
107
|
+
sha256(hashContract(args)),
|
|
108
|
+
);
|
|
80
109
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ApplicationDomain } from './domain-envelope';
|
|
2
|
+
import type { ContractModelBase } from './domain-types';
|
|
3
|
+
|
|
4
|
+
export interface ResolvedDomainModel {
|
|
5
|
+
readonly namespaceId: string;
|
|
6
|
+
readonly model: ContractModelBase;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a bare domain model name to its namespace coordinate and model IR by
|
|
11
|
+
* scanning the contract's namespaces. For the single-namespace contracts in
|
|
12
|
+
* scope the scan is exact; cross-namespace bare-name collisions are selected
|
|
13
|
+
* explicitly (TML-2550).
|
|
14
|
+
*/
|
|
15
|
+
export function resolveDomainModel(
|
|
16
|
+
domain: ApplicationDomain,
|
|
17
|
+
modelName: string,
|
|
18
|
+
): ResolvedDomainModel | undefined {
|
|
19
|
+
for (const namespaceId of Object.keys(domain.namespaces)) {
|
|
20
|
+
const model = domain.namespaces[namespaceId]?.models[modelName];
|
|
21
|
+
if (model !== undefined) {
|
|
22
|
+
return { namespaceId, model };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -57,11 +57,13 @@ export type StorageEntitySlot = Readonly<Record<string, unknown>>;
|
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Plain-data namespace entry in a storage block. Every hydrated contract
|
|
60
|
-
* carries at least `id` plus
|
|
61
|
-
* `
|
|
60
|
+
* carries at least `id` plus entity-kind slot maps under `entries`
|
|
61
|
+
* (`table`, `collection`, …). Foundation declares only this shape — no IR
|
|
62
|
+
* machinery.
|
|
62
63
|
*/
|
|
63
64
|
export interface StorageNamespace {
|
|
64
65
|
readonly id: string;
|
|
66
|
+
readonly entries: Readonly<Record<string, StorageEntitySlot>>;
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
/**
|
|
@@ -243,3 +245,17 @@ export interface ContractMarkerRecord {
|
|
|
243
245
|
readonly meta: Record<string, unknown>;
|
|
244
246
|
readonly invariants: readonly string[];
|
|
245
247
|
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* One applied migration edge from the per-space ledger journal.
|
|
251
|
+
* Returned by `readLedger` in append (apply) order.
|
|
252
|
+
*/
|
|
253
|
+
export interface LedgerEntryRecord {
|
|
254
|
+
readonly space: string;
|
|
255
|
+
readonly migrationName: string;
|
|
256
|
+
readonly migrationHash: string;
|
|
257
|
+
readonly from: string | null;
|
|
258
|
+
readonly to: string;
|
|
259
|
+
readonly appliedAt: Date;
|
|
260
|
+
readonly operationCount: number;
|
|
261
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalization-CM6bJ8i8.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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract-types-9BbapbkL.d.mts","names":[],"sources":["../src/control-policy.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
|