@prisma-next/contract 0.11.0-dev.68 → 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.
Files changed (56) hide show
  1. package/dist/{canonicalization-C3dTO0j1.d.mts → canonicalization-DFE0HJkI.d.mts} +2 -2
  2. package/dist/canonicalization-DFE0HJkI.d.mts.map +1 -0
  3. package/dist/canonicalization-path-match-b2jFuEso.mjs +25 -0
  4. package/dist/canonicalization-path-match-b2jFuEso.mjs.map +1 -0
  5. package/dist/{contract-types-CZPm4Ooy.d.mts → contract-types-xgwKtd7y.d.mts} +13 -74
  6. package/dist/contract-types-xgwKtd7y.d.mts.map +1 -0
  7. package/dist/contract-validation-error-ClZaKqMW.mjs +20 -0
  8. package/dist/contract-validation-error-ClZaKqMW.mjs.map +1 -0
  9. package/dist/contract-validation-error-T5LH4DW-.d.mts +13 -0
  10. package/dist/contract-validation-error-T5LH4DW-.d.mts.map +1 -0
  11. package/dist/contract-validation-error.d.mts +2 -10
  12. package/dist/contract-validation-error.mjs +2 -2
  13. package/dist/domain-envelope-4hyFtJ4_.d.mts +110 -0
  14. package/dist/domain-envelope-4hyFtJ4_.d.mts.map +1 -0
  15. package/dist/hashing-utils.d.mts +1 -1
  16. package/dist/hashing-utils.mjs +1 -22
  17. package/dist/hashing-utils.mjs.map +1 -1
  18. package/dist/hashing.d.mts +2 -2
  19. package/dist/hashing.mjs +175 -1
  20. package/dist/hashing.mjs.map +1 -0
  21. package/dist/namespace-id-CVpkSFUK.mjs +9 -0
  22. package/dist/namespace-id-CVpkSFUK.mjs.map +1 -0
  23. package/dist/types.d.mts +4 -3
  24. package/dist/types.mjs +73 -7
  25. package/dist/types.mjs.map +1 -1
  26. package/dist/validate-domain.d.mts +2 -6
  27. package/dist/validate-domain.d.mts.map +1 -1
  28. package/dist/validate-domain.mjs +98 -61
  29. package/dist/validate-domain.mjs.map +1 -1
  30. package/package.json +4 -6
  31. package/src/canonicalization.ts +41 -25
  32. package/src/contract-types.ts +31 -6
  33. package/src/contract-validation-error.ts +7 -0
  34. package/src/domain-envelope.ts +87 -0
  35. package/src/domain-types.ts +8 -12
  36. package/src/exports/contract-validation-error.ts +1 -0
  37. package/src/exports/types.ts +18 -1
  38. package/src/hashing.ts +1 -1
  39. package/src/validate-domain.ts +154 -93
  40. package/dist/canonicalization-C3dTO0j1.d.mts.map +0 -1
  41. package/dist/contract-types-CZPm4Ooy.d.mts.map +0 -1
  42. package/dist/contract-validation-error-Dp2vHZt5.mjs +0 -14
  43. package/dist/contract-validation-error-Dp2vHZt5.mjs.map +0 -1
  44. package/dist/contract-validation-error.d.mts.map +0 -1
  45. package/dist/cross-reference-t0TDbBTP.d.mts +0 -18
  46. package/dist/cross-reference-t0TDbBTP.d.mts.map +0 -1
  47. package/dist/hashing-C25nwocN.mjs +0 -151
  48. package/dist/hashing-C25nwocN.mjs.map +0 -1
  49. package/dist/testing.d.mts +0 -36
  50. package/dist/testing.d.mts.map +0 -1
  51. package/dist/testing.mjs +0 -65
  52. package/dist/testing.mjs.map +0 -1
  53. package/dist/types-CVGwkRLa.mjs +0 -46
  54. package/dist/types-CVGwkRLa.mjs.map +0 -1
  55. package/src/exports/testing.ts +0 -1
  56. package/src/testing-factories.ts +0 -121
@@ -1,36 +0,0 @@
1
- import { t as CrossReference } from "./cross-reference-t0TDbBTP.mjs";
2
- import { E as StorageHashBase, K as ModelStorageBase, R as ContractModel, S as ProfileHashBase, U as ContractValueObject, h as ExecutionSection, t as Contract, w as StorageBase, z as ContractModelBase } from "./contract-types-CZPm4Ooy.mjs";
3
- import { i as StorageSort, n as PreserveEmptyPredicate } from "./canonicalization-C3dTO0j1.mjs";
4
-
5
- //#region src/testing-factories.d.ts
6
- type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>> = {
7
- target?: string;
8
- targetFamily?: string;
9
- roots?: Record<string, CrossReference>;
10
- models?: TModels;
11
- storage?: Omit<TStorage, 'storageHash'>;
12
- valueObjects?: Record<string, ContractValueObject>;
13
- capabilities?: Record<string, Record<string, boolean>>;
14
- extensionPacks?: Record<string, unknown>;
15
- execution?: Omit<ExecutionSection, 'executionHash'>;
16
- profileHash?: ProfileHashBase<string>;
17
- meta?: Record<string, unknown>;
18
- shouldPreserveEmpty?: PreserveEmptyPredicate;
19
- sortStorage?: StorageSort;
20
- };
21
- declare const DUMMY_HASH: StorageHashBase<"sha256:test">;
22
- declare function createContract<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>>(overrides?: ContractOverrides<TStorage, TModels>): Contract<TStorage, TModels>;
23
- type SqlStorageLike = StorageBase & {
24
- readonly namespaces: Readonly<Record<string, {
25
- readonly id: string;
26
- readonly tables: Readonly<Record<string, unknown>>;
27
- }>>;
28
- readonly types?: Record<string, unknown>;
29
- };
30
- type SqlModelLike = ContractModel<ModelStorageBase & {
31
- table: string;
32
- }>;
33
- declare function createSqlContract(overrides?: ContractOverrides<SqlStorageLike, Record<string, SqlModelLike>>): Contract<SqlStorageLike, Record<string, SqlModelLike>>;
34
- //#endregion
35
- export { DUMMY_HASH, createContract, createSqlContract };
36
- //# sourceMappingURL=testing.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"mappings":";;;;;KAcK,iBAAA,kBACc,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA;EAEnE,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA,SAAe,cAAA;EACvB,MAAA,GAAS,OAAA;EACT,OAAA,GAAU,IAAA,CAAK,QAAA;EACf,YAAA,GAAe,MAAA,SAAe,mBAAA;EAC9B,YAAA,GAAe,MAAA,SAAe,MAAA;EAC9B,cAAA,GAAiB,MAAA;EACjB,SAAA,GAAY,IAAA,CAAK,gBAAA;EACjB,WAAA,GAAc,eAAA;EACd,IAAA,GAAO,MAAA;EACP,mBAAA,GAAsB,sBAAA;EACtB,WAAA,GAAc,WAAA;AAAA;AAAA,cAGV,UAAA,EAAoC,eAA1B;AAAA,iBAeA,cAAA,kBACG,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA,EAAA,CACnE,SAAA,GAAW,iBAAA,CAAkB,QAAA,EAAU,OAAA,IAAgB,QAAA,CAAS,QAAA,EAAU,OAAA;AAAA,KAiDvE,cAAA,GAAiB,WAAA;EAAA,SACX,UAAA,EAAY,QAAA,CACnB,MAAA;IAAA,SAA0B,EAAA;IAAA,SAAqB,MAAA,EAAQ,QAAA,CAAS,MAAA;EAAA;EAAA,SAEzD,KAAA,GAAQ,MAAA;AAAA;AAAA,KAGd,YAAA,GAAe,aAAa,CAAC,gBAAA;EAAqB,KAAA;AAAA;AAAA,iBAEvC,iBAAA,CACd,SAAA,GAAW,iBAAA,CAAkB,cAAA,EAAgB,MAAA,SAAe,YAAA,KAC3D,QAAA,CAAS,cAAA,EAAgB,MAAA,SAAe,YAAA"}
package/dist/testing.mjs DELETED
@@ -1,65 +0,0 @@
1
- import { t as coreHash } from "./types-CVGwkRLa.mjs";
2
- import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-C25nwocN.mjs";
3
- import { ifDefined } from "@prisma-next/utils/defined";
4
- //#region src/testing-factories.ts
5
- const DUMMY_HASH = coreHash("sha256:test");
6
- const DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} };
7
- const UNBOUND_NAMESPACE_ID = "__unbound__";
8
- const DEFAULT_SQL_STORAGE = { namespaces: { [UNBOUND_NAMESPACE_ID]: {
9
- id: UNBOUND_NAMESPACE_ID,
10
- tables: {}
11
- } } };
12
- function createContract(overrides = {}) {
13
- const target = overrides.target ?? "postgres";
14
- const targetFamily = overrides.targetFamily ?? "sql";
15
- const capabilities = overrides.capabilities ?? {};
16
- const rawStorage = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;
17
- const storageHash = computeStorageHash({
18
- target,
19
- targetFamily,
20
- storage: rawStorage,
21
- ...ifDefined("shouldPreserveEmpty", overrides.shouldPreserveEmpty),
22
- ...ifDefined("sortStorage", overrides.sortStorage)
23
- });
24
- const storage = {
25
- ...rawStorage,
26
- storageHash
27
- };
28
- const computedProfileHash = overrides.profileHash ?? computeProfileHash({
29
- target,
30
- targetFamily,
31
- capabilities
32
- });
33
- return {
34
- target,
35
- targetFamily,
36
- roots: overrides.roots ?? {},
37
- models: overrides.models ?? {},
38
- ...ifDefined("valueObjects", overrides.valueObjects),
39
- storage,
40
- capabilities,
41
- extensionPacks: overrides.extensionPacks ?? {},
42
- ...overrides.execution !== void 0 ? { execution: {
43
- ...overrides.execution,
44
- executionHash: computeExecutionHash({
45
- target,
46
- targetFamily,
47
- execution: overrides.execution
48
- })
49
- } } : {},
50
- profileHash: computedProfileHash,
51
- meta: overrides.meta ?? {}
52
- };
53
- }
54
- function createSqlContract(overrides = {}) {
55
- return createContract({
56
- ...overrides,
57
- target: overrides.target ?? "postgres",
58
- targetFamily: overrides.targetFamily ?? "sql",
59
- storage: overrides.storage ?? DEFAULT_SQL_STORAGE
60
- });
61
- }
62
- //#endregion
63
- export { DUMMY_HASH, createContract, createSqlContract };
64
-
65
- //# sourceMappingURL=testing.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { PreserveEmptyPredicate, StorageSort } from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { CrossReference } from './cross-reference';\nimport type {\n ContractModel,\n ContractModelBase,\n ContractValueObject,\n ModelStorageBase,\n} from './domain-types';\nimport { computeExecutionHash, computeProfileHash, computeStorageHash } from './hashing';\nimport type { ExecutionSection, ProfileHashBase, StorageBase } from './types';\nimport { coreHash } from './types';\n\ntype ContractOverrides<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,\n> = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, CrossReference>;\n models?: TModels;\n storage?: Omit<TStorage, 'storageHash'>;\n valueObjects?: Record<string, ContractValueObject>;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n execution?: Omit<ExecutionSection, 'executionHash'>;\n profileHash?: ProfileHashBase<string>;\n meta?: Record<string, unknown>;\n shouldPreserveEmpty?: PreserveEmptyPredicate;\n sortStorage?: StorageSort;\n};\n\nconst DUMMY_HASH = coreHash('sha256:test');\n\nconst DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} } as const;\n\nconst UNBOUND_NAMESPACE_ID = '__unbound__' as const;\n\nconst DEFAULT_SQL_STORAGE = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n tables: {},\n },\n },\n} as const;\n\nexport function createContract<\n TStorage extends StorageBase = StorageBase,\n TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,\n>(overrides: ContractOverrides<TStorage, TModels> = {}): Contract<TStorage, TModels> {\n const target = overrides.target ?? 'postgres';\n const targetFamily = overrides.targetFamily ?? 'sql';\n const capabilities = overrides.capabilities ?? {};\n\n const rawStorage = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;\n\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: rawStorage as Record<string, unknown>,\n ...ifDefined('shouldPreserveEmpty', overrides.shouldPreserveEmpty),\n ...ifDefined('sortStorage', overrides.sortStorage),\n });\n\n const storage = {\n ...rawStorage,\n storageHash,\n } as TStorage;\n\n const computedProfileHash =\n overrides.profileHash ?? computeProfileHash({ target, targetFamily, capabilities });\n\n return {\n target,\n targetFamily,\n roots: overrides.roots ?? {},\n models: (overrides.models ?? {}) as TModels,\n ...ifDefined('valueObjects', overrides.valueObjects),\n storage,\n capabilities,\n extensionPacks: overrides.extensionPacks ?? {},\n ...(overrides.execution !== undefined\n ? {\n execution: {\n ...overrides.execution,\n executionHash: computeExecutionHash({\n target,\n targetFamily,\n execution: overrides.execution,\n }),\n },\n }\n : {}),\n profileHash: computedProfileHash,\n meta: overrides.meta ?? {},\n };\n}\n\ntype SqlStorageLike = StorageBase & {\n readonly namespaces: Readonly<\n Record<string, { readonly id: string; readonly tables: Readonly<Record<string, unknown>> }>\n >;\n readonly types?: Record<string, unknown>;\n};\n\ntype SqlModelLike = ContractModel<ModelStorageBase & { table: string }>;\n\nexport function createSqlContract(\n overrides: ContractOverrides<SqlStorageLike, Record<string, SqlModelLike>> = {},\n): Contract<SqlStorageLike, Record<string, SqlModelLike>> {\n return createContract<SqlStorageLike, Record<string, SqlModelLike>>({\n ...overrides,\n target: overrides.target ?? 'postgres',\n targetFamily: overrides.targetFamily ?? 'sql',\n storage: overrides.storage ?? DEFAULT_SQL_STORAGE,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;AAiCA,MAAM,aAAa,SAAS,aAAa;AAEzC,MAAM,4BAA4B,EAAE,YAAY,CAAC,EAAE;AAEnD,MAAM,uBAAuB;AAE7B,MAAM,sBAAsB,EAC1B,YAAY,GACT,uBAAuB;CACtB,IAAI;CACJ,QAAQ,CAAC;AACX,EACF,EACF;AAEA,SAAgB,eAGd,YAAkD,CAAC,GAAgC;CACnF,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,CAAC;CAEhD,MAAM,aAAa,UAAU,WAAW;CAExC,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA,SAAS;EACT,GAAG,UAAU,uBAAuB,UAAU,mBAAmB;EACjE,GAAG,UAAU,eAAe,UAAU,WAAW;CACnD,CAAC;CAED,MAAM,UAAU;EACd,GAAG;EACH;CACF;CAEA,MAAM,sBACJ,UAAU,eAAe,mBAAmB;EAAE;EAAQ;EAAc;CAAa,CAAC;CAEpF,OAAO;EACL;EACA;EACA,OAAO,UAAU,SAAS,CAAC;EAC3B,QAAS,UAAU,UAAU,CAAC;EAC9B,GAAG,UAAU,gBAAgB,UAAU,YAAY;EACnD;EACA;EACA,gBAAgB,UAAU,kBAAkB,CAAC;EAC7C,GAAI,UAAU,cAAc,KAAA,IACxB,EACE,WAAW;GACT,GAAG,UAAU;GACb,eAAe,qBAAqB;IAClC;IACA;IACA,WAAW,UAAU;GACvB,CAAC;EACH,EACF,IACA,CAAC;EACL,aAAa;EACb,MAAM,UAAU,QAAQ,CAAC;CAC3B;AACF;AAWA,SAAgB,kBACd,YAA6E,CAAC,GACtB;CACxD,OAAO,eAA6D;EAClE,GAAG;EACH,QAAQ,UAAU,UAAU;EAC5B,cAAc,UAAU,gBAAgB;EACxC,SAAS,UAAU,WAAW;CAChC,CAAC;AACH"}
@@ -1,46 +0,0 @@
1
- //#region src/types.ts
2
- function executionHash(value) {
3
- return value;
4
- }
5
- function coreHash(value) {
6
- return value;
7
- }
8
- function profileHash(value) {
9
- return value;
10
- }
11
- /**
12
- * Runtime predicate for `ColumnDefaultLiteralInputValue`. Authoring layers
13
- * resolve template values from caller-supplied args (typed `unknown` at the
14
- * boundary) and need to validate before constructing a `ColumnDefault`.
15
- * Accepts JSON primitives, plain arrays/objects of JSON values, and `Date`
16
- * instances. Rejects functions, class instances (other than `Date`),
17
- * `undefined`, `bigint`, `symbol`, and arrays/objects containing those.
18
- */
19
- function isColumnDefaultLiteralInputValue(value) {
20
- if (value === null) return true;
21
- const t = typeof value;
22
- if (t === "string" || t === "number" || t === "boolean") return true;
23
- if (value instanceof Date) return true;
24
- if (Array.isArray(value)) return value.every(isColumnDefaultLiteralInputValue);
25
- if (t === "object" && Object.getPrototypeOf(value) === Object.prototype) return Object.values(value).every(isColumnDefaultLiteralInputValue);
26
- return false;
27
- }
28
- function isColumnDefault(value) {
29
- if (typeof value !== "object" || value === null) return false;
30
- const kind = value.kind;
31
- if (kind === "literal") return "value" in value;
32
- if (kind === "function") return typeof value.expression === "string";
33
- return false;
34
- }
35
- function isExecutionMutationDefaultValue(value) {
36
- if (typeof value !== "object" || value === null) return false;
37
- const candidate = value;
38
- if (candidate.kind !== "generator") return false;
39
- if (typeof candidate.id !== "string") return false;
40
- if (candidate.params !== void 0 && (typeof candidate.params !== "object" || candidate.params === null || Array.isArray(candidate.params))) return false;
41
- return true;
42
- }
43
- //#endregion
44
- export { isExecutionMutationDefaultValue as a, isColumnDefaultLiteralInputValue as i, executionHash as n, profileHash as o, isColumnDefault as r, coreHash as t };
45
-
46
- //# sourceMappingURL=types-CVGwkRLa.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CVGwkRLa.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["/**\n * Unique symbol used as the key for branding types.\n */\nexport const $: unique symbol = Symbol('__prisma_next_brand__');\n\n/**\n * A helper type to brand a given type with a unique identifier.\n *\n * @template TKey Text used as the brand key.\n * @template TValue Optional value associated with the brand key. Defaults to `true`.\n */\nexport type Brand<TKey extends string | number | symbol, TValue = true> = {\n [$]: {\n [K in TKey]: TValue;\n };\n};\n\n/**\n * Base type for storage contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type StorageHash = StorageHashBase<'sha256:abc123...'>`\n */\nexport type StorageHashBase<THash extends string> = THash & Brand<'StorageHash'>;\n\n/**\n * Base type for execution contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ExecutionHash = ExecutionHashBase<'sha256:def456...'>`\n */\nexport type ExecutionHashBase<THash extends string> = THash & Brand<'ExecutionHash'>;\n\nexport function executionHash<const T extends string>(value: T): ExecutionHashBase<T> {\n return value as ExecutionHashBase<T>;\n}\n\nexport function coreHash<const T extends string>(value: T): StorageHashBase<T> {\n return value as StorageHashBase<T>;\n}\n\n/**\n * Base type for profile contract hashes.\n * Emitted contract.d.ts files use this with the hash value as a type parameter:\n * `type ProfileHash = ProfileHashBase<'sha256:def456...'>`\n */\nexport type ProfileHashBase<THash extends string> = THash & Brand<'ProfileHash'>;\n\nexport function profileHash<const T extends string>(value: T): ProfileHashBase<T> {\n return value as ProfileHashBase<T>;\n}\n\n/**\n * One entity-kind slot in a namespace — a map of entity name to entry.\n * Values are opaque at the foundation layer; family and target concretions\n * refine them to typed IR classes.\n */\nexport type StorageEntitySlot = Readonly<Record<string, unknown>>;\n\n/**\n * Plain-data namespace entry in a storage block. Every hydrated contract\n * carries at least `id` plus zero or more entity-kind slot maps (`tables`,\n * `collections`, …). Foundation declares only this shape — no IR machinery.\n */\nexport interface StorageNamespace {\n readonly id: string;\n}\n\n/**\n * Base type for family-specific storage blocks.\n * Family storage types (SqlStorage, MongoStorage, etc.) extend this to carry the\n * storage hash alongside family-specific data (tables, collections, etc.).\n *\n * The `namespaces` map is carried by every hydrated storage block. Serialized\n * envelope shape is target-owned; this types the in-memory contract after\n * `deserializeContract`.\n */\nexport interface StorageBase<THash extends string = string> {\n readonly storageHash: StorageHashBase<THash>;\n readonly namespaces: Readonly<Record<string, StorageNamespace>>;\n}\n\nexport interface FieldType {\n readonly type: string;\n readonly nullable: boolean;\n readonly items?: FieldType;\n readonly properties?: Record<string, FieldType>;\n}\n\nexport type GeneratedValueSpec = {\n readonly id: string;\n readonly params?: Record<string, unknown>;\n};\n\nexport type JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue =\n | JsonPrimitive\n | { readonly [key: string]: JsonValue }\n | readonly JsonValue[];\n\nexport type ColumnDefaultLiteralValue = JsonValue;\n\nexport type ColumnDefaultLiteralInputValue = ColumnDefaultLiteralValue | Date;\n\n/**\n * Runtime predicate for `ColumnDefaultLiteralInputValue`. Authoring layers\n * resolve template values from caller-supplied args (typed `unknown` at the\n * boundary) and need to validate before constructing a `ColumnDefault`.\n * Accepts JSON primitives, plain arrays/objects of JSON values, and `Date`\n * instances. Rejects functions, class instances (other than `Date`),\n * `undefined`, `bigint`, `symbol`, and arrays/objects containing those.\n */\nexport function isColumnDefaultLiteralInputValue(\n value: unknown,\n): value is ColumnDefaultLiteralInputValue {\n if (value === null) return true;\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return true;\n if (value instanceof Date) return true;\n if (Array.isArray(value)) return value.every(isColumnDefaultLiteralInputValue);\n if (t === 'object' && Object.getPrototypeOf(value) === Object.prototype) {\n return Object.values(value as Record<string, unknown>).every(isColumnDefaultLiteralInputValue);\n }\n return false;\n}\n\nexport type ColumnDefault =\n | {\n readonly kind: 'literal';\n readonly value: ColumnDefaultLiteralInputValue;\n }\n | { readonly kind: 'function'; readonly expression: string };\n\nexport function isColumnDefault(value: unknown): value is ColumnDefault {\n if (typeof value !== 'object' || value === null) return false;\n const kind = (value as { kind?: unknown }).kind;\n if (kind === 'literal') {\n return 'value' in value;\n }\n if (kind === 'function') {\n return typeof (value as { expression?: unknown }).expression === 'string';\n }\n return false;\n}\n\nexport type ExecutionMutationDefaultValue = {\n readonly kind: 'generator';\n readonly id: GeneratedValueSpec['id'];\n readonly params?: Record<string, unknown>;\n};\n\nexport function isExecutionMutationDefaultValue(\n value: unknown,\n): value is ExecutionMutationDefaultValue {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as {\n kind?: unknown;\n id?: unknown;\n params?: unknown;\n };\n if (candidate.kind !== 'generator') return false;\n if (typeof candidate.id !== 'string') return false;\n if (\n candidate.params !== undefined &&\n (typeof candidate.params !== 'object' ||\n candidate.params === null ||\n Array.isArray(candidate.params))\n ) {\n return false;\n }\n return true;\n}\n\nexport type ExecutionMutationDefault = {\n readonly ref: { readonly table: string; readonly column: string };\n readonly onCreate?: ExecutionMutationDefaultValue;\n readonly onUpdate?: ExecutionMutationDefaultValue;\n};\n\n/**\n * `ExecutionMutationDefault` minus its `ref` — the per-field phases value\n * authoring layers attach to a column before the column ref is known.\n */\nexport type ExecutionMutationDefaultPhases = Omit<ExecutionMutationDefault, 'ref'>;\n\nexport type ExecutionSection<THash extends string = string> = {\n readonly executionHash: ExecutionHashBase<THash>;\n readonly mutations: {\n readonly defaults: ReadonlyArray<ExecutionMutationDefault>;\n };\n};\n\nexport interface Source {\n readonly readOnly: boolean;\n readonly projection: Record<string, FieldType>;\n readonly origin?: Record<string, unknown>;\n readonly capabilities?: Record<string, boolean>;\n}\n\n// Document family types\nexport interface DocIndex {\n readonly name: string;\n readonly keys: Record<string, 'asc' | 'desc'>;\n readonly unique?: boolean;\n readonly where?: Expr;\n}\n\nexport type Expr =\n | { readonly kind: 'eq'; readonly path: ReadonlyArray<string>; readonly value: unknown }\n | { readonly kind: 'exists'; readonly path: ReadonlyArray<string> };\n\nexport interface DocCollection {\n readonly name: string;\n readonly id?: {\n readonly strategy: 'auto' | 'client' | 'uuid' | 'objectId';\n };\n readonly fields: Record<string, FieldType>;\n readonly indexes?: ReadonlyArray<DocIndex>;\n readonly readOnly?: boolean;\n}\n\nexport interface PlanMeta {\n readonly target: string;\n readonly targetFamily?: string;\n readonly storageHash: string;\n readonly profileHash?: string;\n readonly lane: string;\n readonly annotations?: {\n readonly [key: string]: unknown;\n };\n}\n\n/**\n * Contract marker record stored in the database.\n * Represents the current contract identity for a database.\n */\nexport interface ContractMarkerRecord {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson: unknown | null;\n readonly canonicalVersion: number | null;\n readonly updatedAt: Date;\n readonly appTag: string | null;\n readonly meta: Record<string, unknown>;\n readonly invariants: readonly string[];\n}\n"],"mappings":";AA+BA,SAAgB,cAAsC,OAAgC;CACpF,OAAO;AACT;AAEA,SAAgB,SAAiC,OAA8B;CAC7E,OAAO;AACT;AASA,SAAgB,YAAoC,OAA8B;CAChF,OAAO;AACT;;;;;;;;;AA+DA,SAAgB,iCACd,OACyC;CACzC,IAAI,UAAU,MAAM,OAAO;CAC3B,MAAM,IAAI,OAAO;CACjB,IAAI,MAAM,YAAY,MAAM,YAAY,MAAM,WAAW,OAAO;CAChE,IAAI,iBAAiB,MAAM,OAAO;CAClC,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,gCAAgC;CAC7E,IAAI,MAAM,YAAY,OAAO,eAAe,KAAK,MAAM,OAAO,WAC5D,OAAO,OAAO,OAAO,KAAgC,EAAE,MAAM,gCAAgC;CAE/F,OAAO;AACT;AASA,SAAgB,gBAAgB,OAAwC;CACtE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,OAAQ,MAA6B;CAC3C,IAAI,SAAS,WACX,OAAO,WAAW;CAEpB,IAAI,SAAS,YACX,OAAO,OAAQ,MAAmC,eAAe;CAEnE,OAAO;AACT;AAQA,SAAgB,gCACd,OACwC;CACxC,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,YAAY;CAKlB,IAAI,UAAU,SAAS,aAAa,OAAO;CAC3C,IAAI,OAAO,UAAU,OAAO,UAAU,OAAO;CAC7C,IACE,UAAU,WAAW,KAAA,MACpB,OAAO,UAAU,WAAW,YAC3B,UAAU,WAAW,QACrB,MAAM,QAAQ,UAAU,MAAM,IAEhC,OAAO;CAET,OAAO;AACT"}
@@ -1 +0,0 @@
1
- export { createContract, createSqlContract, DUMMY_HASH } from '../testing-factories';
@@ -1,121 +0,0 @@
1
- import { ifDefined } from '@prisma-next/utils/defined';
2
- import type { PreserveEmptyPredicate, StorageSort } from './canonicalization';
3
- import type { Contract } from './contract-types';
4
- import type { CrossReference } from './cross-reference';
5
- import type {
6
- ContractModel,
7
- ContractModelBase,
8
- ContractValueObject,
9
- ModelStorageBase,
10
- } from './domain-types';
11
- import { computeExecutionHash, computeProfileHash, computeStorageHash } from './hashing';
12
- import type { ExecutionSection, ProfileHashBase, StorageBase } from './types';
13
- import { coreHash } from './types';
14
-
15
- type ContractOverrides<
16
- TStorage extends StorageBase = StorageBase,
17
- TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,
18
- > = {
19
- target?: string;
20
- targetFamily?: string;
21
- roots?: Record<string, CrossReference>;
22
- models?: TModels;
23
- storage?: Omit<TStorage, 'storageHash'>;
24
- valueObjects?: Record<string, ContractValueObject>;
25
- capabilities?: Record<string, Record<string, boolean>>;
26
- extensionPacks?: Record<string, unknown>;
27
- execution?: Omit<ExecutionSection, 'executionHash'>;
28
- profileHash?: ProfileHashBase<string>;
29
- meta?: Record<string, unknown>;
30
- shouldPreserveEmpty?: PreserveEmptyPredicate;
31
- sortStorage?: StorageSort;
32
- };
33
-
34
- const DUMMY_HASH = coreHash('sha256:test');
35
-
36
- const DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} } as const;
37
-
38
- const UNBOUND_NAMESPACE_ID = '__unbound__' as const;
39
-
40
- const DEFAULT_SQL_STORAGE = {
41
- namespaces: {
42
- [UNBOUND_NAMESPACE_ID]: {
43
- id: UNBOUND_NAMESPACE_ID,
44
- tables: {},
45
- },
46
- },
47
- } as const;
48
-
49
- export function createContract<
50
- TStorage extends StorageBase = StorageBase,
51
- TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>,
52
- >(overrides: ContractOverrides<TStorage, TModels> = {}): Contract<TStorage, TModels> {
53
- const target = overrides.target ?? 'postgres';
54
- const targetFamily = overrides.targetFamily ?? 'sql';
55
- const capabilities = overrides.capabilities ?? {};
56
-
57
- const rawStorage = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;
58
-
59
- const storageHash = computeStorageHash({
60
- target,
61
- targetFamily,
62
- storage: rawStorage as Record<string, unknown>,
63
- ...ifDefined('shouldPreserveEmpty', overrides.shouldPreserveEmpty),
64
- ...ifDefined('sortStorage', overrides.sortStorage),
65
- });
66
-
67
- const storage = {
68
- ...rawStorage,
69
- storageHash,
70
- } as TStorage;
71
-
72
- const computedProfileHash =
73
- overrides.profileHash ?? computeProfileHash({ target, targetFamily, capabilities });
74
-
75
- return {
76
- target,
77
- targetFamily,
78
- roots: overrides.roots ?? {},
79
- models: (overrides.models ?? {}) as TModels,
80
- ...ifDefined('valueObjects', overrides.valueObjects),
81
- storage,
82
- capabilities,
83
- extensionPacks: overrides.extensionPacks ?? {},
84
- ...(overrides.execution !== undefined
85
- ? {
86
- execution: {
87
- ...overrides.execution,
88
- executionHash: computeExecutionHash({
89
- target,
90
- targetFamily,
91
- execution: overrides.execution,
92
- }),
93
- },
94
- }
95
- : {}),
96
- profileHash: computedProfileHash,
97
- meta: overrides.meta ?? {},
98
- };
99
- }
100
-
101
- type SqlStorageLike = StorageBase & {
102
- readonly namespaces: Readonly<
103
- Record<string, { readonly id: string; readonly tables: Readonly<Record<string, unknown>> }>
104
- >;
105
- readonly types?: Record<string, unknown>;
106
- };
107
-
108
- type SqlModelLike = ContractModel<ModelStorageBase & { table: string }>;
109
-
110
- export function createSqlContract(
111
- overrides: ContractOverrides<SqlStorageLike, Record<string, SqlModelLike>> = {},
112
- ): Contract<SqlStorageLike, Record<string, SqlModelLike>> {
113
- return createContract<SqlStorageLike, Record<string, SqlModelLike>>({
114
- ...overrides,
115
- target: overrides.target ?? 'postgres',
116
- targetFamily: overrides.targetFamily ?? 'sql',
117
- storage: overrides.storage ?? DEFAULT_SQL_STORAGE,
118
- });
119
- }
120
-
121
- export { DUMMY_HASH };