@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.
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-D_iHy7iE.d.mts} +2 -2
  6. package/dist/canonicalization-D_iHy7iE.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-D5lcjipq.d.mts} +27 -11
  10. package/dist/contract-types-D5lcjipq.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 +38 -11
  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 +13 -4
  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 +18 -2
  60. package/dist/canonicalization-CM6bJ8i8.d.mts.map +0 -1
  61. package/dist/contract-types-9BbapbkL.d.mts.map +0 -1
@@ -1,25 +1,25 @@
1
1
  export type {
2
2
  Contract,
3
3
  ContractExecutionSection,
4
- ContractModelsMap,
5
- ContractValueObjectsMap,
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 { effectiveControl } from '../control-policy';
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
- contractModels,
19
- contractValueObjects,
20
- resolveSingleDomainNamespaceId,
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
- // 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
@@ -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 zero or more entity-kind slot maps (`tables`,
61
- * `collections`, …). Foundation declares only this shape — no IR machinery.
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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"}