@prisma-next/contract 0.12.0-dev.4 → 0.12.0-dev.40
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-BjnwugYK.d.mts} +2 -2
- package/dist/canonicalization-BjnwugYK.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-D-Y9rfJT.d.mts} +23 -9
- package/dist/contract-types-D-Y9rfJT.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 +30 -9
- 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 +2 -0
- 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 +14 -0
- package/dist/canonicalization-CM6bJ8i8.d.mts.map +0 -1
- package/dist/contract-types-9BbapbkL.d.mts.map +0 -1
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
|
@@ -243,3 +243,17 @@ export interface ContractMarkerRecord {
|
|
|
243
243
|
readonly meta: Record<string, unknown>;
|
|
244
244
|
readonly invariants: readonly string[];
|
|
245
245
|
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* One applied migration edge from the per-space ledger journal.
|
|
249
|
+
* Returned by `readLedger` in append (apply) order.
|
|
250
|
+
*/
|
|
251
|
+
export interface LedgerEntryRecord {
|
|
252
|
+
readonly space: string;
|
|
253
|
+
readonly migrationName: string;
|
|
254
|
+
readonly migrationHash: string;
|
|
255
|
+
readonly from: string | null;
|
|
256
|
+
readonly to: string;
|
|
257
|
+
readonly appliedAt: Date;
|
|
258
|
+
readonly operationCount: number;
|
|
259
|
+
}
|
|
@@ -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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"}
|