@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.
Files changed (61) hide show
  1. package/dist/apply-specifier-default-control-policy.d.mts +7 -0
  2. package/dist/apply-specifier-default-control-policy.d.mts.map +1 -0
  3. package/dist/apply-specifier-default-control-policy.mjs +12 -0
  4. package/dist/apply-specifier-default-control-policy.mjs.map +1 -0
  5. package/dist/{canonicalization-CM6bJ8i8.d.mts → canonicalization-BjnwugYK.d.mts} +2 -2
  6. package/dist/canonicalization-BjnwugYK.d.mts.map +1 -0
  7. package/dist/{canonicalization-path-match-b2jFuEso.mjs → canonicalization-path-match-Czn4Vds5.mjs} +1 -1
  8. package/dist/{canonicalization-path-match-b2jFuEso.mjs.map → canonicalization-path-match-Czn4Vds5.mjs.map} +1 -1
  9. package/dist/{contract-types-9BbapbkL.d.mts → contract-types-D-Y9rfJT.d.mts} +23 -9
  10. package/dist/contract-types-D-Y9rfJT.d.mts.map +1 -0
  11. package/dist/{contract-validation-error-T5LH4DW-.d.mts → contract-validation-error-B8UtbPEl.d.mts} +1 -1
  12. package/dist/{contract-validation-error-T5LH4DW-.d.mts.map → contract-validation-error-B8UtbPEl.d.mts.map} +1 -1
  13. package/dist/contract-validation-error.d.mts +1 -1
  14. package/dist/default-namespace-Bhu0oN8U.mjs +33 -0
  15. package/dist/default-namespace-Bhu0oN8U.mjs.map +1 -0
  16. package/dist/default-namespace-CWdFpoc_.d.mts +25 -0
  17. package/dist/default-namespace-CWdFpoc_.d.mts.map +1 -0
  18. package/dist/default-namespace.d.mts +2 -0
  19. package/dist/default-namespace.mjs +2 -0
  20. package/dist/{domain-envelope-Cv5OTm8D.d.mts → domain-envelope-BFYbgufo.d.mts} +2 -10
  21. package/dist/{domain-envelope-Cv5OTm8D.d.mts.map → domain-envelope-BFYbgufo.d.mts.map} +1 -1
  22. package/dist/hashing-utils.d.mts +1 -1
  23. package/dist/hashing-utils.d.mts.map +1 -1
  24. package/dist/hashing-utils.mjs +5 -4
  25. package/dist/hashing-utils.mjs.map +1 -1
  26. package/dist/hashing.d.mts +2 -2
  27. package/dist/hashing.d.mts.map +1 -1
  28. package/dist/hashing.mjs +30 -9
  29. package/dist/hashing.mjs.map +1 -1
  30. package/dist/{namespace-id-CVpkSFUK.mjs → namespace-id-BSCer2Vd.mjs} +1 -1
  31. package/dist/{namespace-id-CVpkSFUK.mjs.map → namespace-id-BSCer2Vd.mjs.map} +1 -1
  32. package/dist/resolve-domain-model-DMXbLLjV.d.mts +17 -0
  33. package/dist/resolve-domain-model-DMXbLLjV.d.mts.map +1 -0
  34. package/dist/resolve-domain-model-R4txseVc.mjs +20 -0
  35. package/dist/resolve-domain-model-R4txseVc.mjs.map +1 -0
  36. package/dist/resolve-domain-model.d.mts +2 -0
  37. package/dist/resolve-domain-model.mjs +2 -0
  38. package/dist/types.d.mts +21 -4
  39. package/dist/types.d.mts.map +1 -0
  40. package/dist/types.mjs +22 -27
  41. package/dist/types.mjs.map +1 -1
  42. package/dist/validate-domain.d.mts +1 -1
  43. package/dist/validate-domain.mjs +1 -1
  44. package/package.json +7 -4
  45. package/src/apply-specifier-default-control-policy.ts +12 -0
  46. package/src/canonicalization-storage-sort.ts +8 -1
  47. package/src/canonicalization.ts +2 -0
  48. package/src/contract-types.ts +8 -6
  49. package/src/control-policy.ts +3 -3
  50. package/src/default-namespace.ts +36 -0
  51. package/src/domain-envelope.ts +1 -60
  52. package/src/domain-namespace-access.ts +32 -0
  53. package/src/exports/apply-specifier-default-control-policy.ts +1 -0
  54. package/src/exports/default-namespace.ts +1 -0
  55. package/src/exports/resolve-domain-model.ts +1 -0
  56. package/src/exports/types.ts +10 -8
  57. package/src/hashing.ts +42 -13
  58. package/src/resolve-domain-model.ts +27 -0
  59. package/src/types.ts +14 -0
  60. package/dist/canonicalization-CM6bJ8i8.d.mts.map +0 -1
  61. 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
- // Blind cast: the synthesised object is a hash-only stand-in
28
- // never returned to callers, never executed as a Contract.
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
- } as unknown as Contract;
67
+ storage: storageForHash,
68
+ });
46
69
  return canonicalizeContract(contract, {
47
70
  schemaVersion: SCHEMA_VERSION,
48
- serializeContract: (c) => JSON.parse(JSON.stringify(c)) as JsonObject,
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(hashContract(args)) as StorageHashBase<string>;
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(hashContract(args)) as ExecutionHashBase<string>;
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(hashContract(args)) as ProfileHashBase<string>;
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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"}