@prisma-next/contract 0.5.0-dev.65 → 0.5.0-dev.67
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/{contract-types-Bjujh4Fu.d.mts → contract-types-Kl86EaEa.d.mts} +1 -1
- package/dist/contract-types-Kl86EaEa.d.mts.map +1 -0
- package/dist/{hashing-CyaA_Qvf.mjs → hashing-Ctk7VHud.mjs} +2 -4
- package/dist/hashing-Ctk7VHud.mjs.map +1 -0
- package/dist/hashing.d.mts +1 -1
- package/dist/hashing.d.mts.map +1 -1
- package/dist/hashing.mjs +2 -3
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +3 -4
- package/dist/testing.mjs.map +1 -1
- package/dist/{types-BfYvmUes.mjs → types-CVGwkRLa.mjs} +2 -2
- package/dist/{types-BfYvmUes.mjs.map → types-CVGwkRLa.mjs.map} +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.mjs +2 -3
- package/dist/validate-contract.d.mts +1 -1
- package/dist/validate-contract.d.mts.map +1 -1
- package/dist/validate-contract.mjs +2 -3
- package/dist/{validate-domain-CpCcTlqJ.mjs → validate-domain-WtPdBLia.mjs} +7 -9
- package/dist/validate-domain-WtPdBLia.mjs.map +1 -0
- package/dist/validate-domain.d.mts.map +1 -1
- package/dist/validate-domain.mjs +2 -3
- package/package.json +4 -4
- package/dist/contract-types-Bjujh4Fu.d.mts.map +0 -1
- package/dist/hashing-CyaA_Qvf.mjs.map +0 -1
- package/dist/validate-domain-CpCcTlqJ.mjs.map +0 -1
|
@@ -264,4 +264,4 @@ interface Contract<TStorage extends StorageBase = StorageBase, TModels extends R
|
|
|
264
264
|
}
|
|
265
265
|
//#endregion
|
|
266
266
|
export { isExecutionMutationDefaultValue as A, ContractRelationOn as B, Source as C, executionHash as D, coreHash as E, ContractFieldType as F, ReferenceRelationKeys as G, ContractVariantEntry as H, ContractModel as I, ValueObjectFieldType as J, ScalarFieldType as K, ContractModelBase as L, ContractDiscriminator as M, ContractEmbedRelation as N, isColumnDefault as O, ContractField as P, ContractReferenceRelation as R, ProfileHashBase as S, StorageHashBase as T, EmbedRelationKeys as U, ContractValueObject as V, ModelStorageBase as W, FieldType as _, ColumnDefault as a, JsonValue as b, ContractMarkerRecord as c, ExecutionHashBase as d, ExecutionMutationDefault as f, Expr as g, ExecutionSection as h, Brand as i, profileHash as j, isColumnDefaultLiteralInputValue as k, DocCollection as l, ExecutionMutationDefaultValue as m, ContractExecutionSection as n, ColumnDefaultLiteralInputValue as o, ExecutionMutationDefaultPhases as p, UnionFieldType as q, $ as r, ColumnDefaultLiteralValue as s, Contract as t, DocIndex as u, GeneratedValueSpec as v, StorageBase as w, PlanMeta as x, JsonPrimitive as y, ContractRelation as z };
|
|
267
|
-
//# sourceMappingURL=contract-types-
|
|
267
|
+
//# sourceMappingURL=contract-types-Kl86EaEa.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-types-Kl86EaEa.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { isArrayEqual } from "@prisma-next/utils/array-equal";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
|
-
|
|
5
4
|
//#region src/canonicalization.ts
|
|
6
5
|
const TOP_LEVEL_ORDER = [
|
|
7
6
|
"schemaVersion",
|
|
@@ -157,7 +156,6 @@ function canonicalizeContractToObject(contract, options) {
|
|
|
157
156
|
function canonicalizeContract(contract, options) {
|
|
158
157
|
return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);
|
|
159
158
|
}
|
|
160
|
-
|
|
161
159
|
//#endregion
|
|
162
160
|
//#region src/hashing.ts
|
|
163
161
|
const SCHEMA_VERSION = "1";
|
|
@@ -190,7 +188,7 @@ function computeExecutionHash(args) {
|
|
|
190
188
|
function computeProfileHash(args) {
|
|
191
189
|
return sha256(hashContract(args));
|
|
192
190
|
}
|
|
193
|
-
|
|
194
191
|
//#endregion
|
|
195
192
|
export { canonicalizeContractToObject as a, canonicalizeContract as i, computeProfileHash as n, computeStorageHash as r, computeExecutionHash as t };
|
|
196
|
-
|
|
193
|
+
|
|
194
|
+
//# sourceMappingURL=hashing-Ctk7VHud.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing-Ctk7VHud.mjs","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nimport type { Contract } from './contract-types';\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'valueObjects',\n 'storage',\n 'execution',\n 'capabilities',\n 'extensionPacks',\n 'meta',\n] as const;\n\nfunction isDefaultValue(value: unknown): boolean {\n if (value === false) return true;\n if (value === null) return false;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n return keys.length === 0;\n }\n return false;\n}\n\nfunction omitDefaults(obj: unknown, path: readonly string[]): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => omitDefaults(item, path));\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n\n if (key === '_generated') {\n continue;\n }\n\n if (key === 'generated' && value === false) {\n continue;\n }\n\n if ((key === 'onDelete' || key === 'onUpdate') && value === 'noAction') {\n continue;\n }\n\n if (isDefaultValue(value)) {\n const isRequiredModels = isArrayEqual(currentPath, ['models']);\n const isRequiredTables = isArrayEqual(currentPath, ['storage', 'tables']);\n const isRequiredCollections = isArrayEqual(currentPath, ['storage', 'collections']);\n const isCollectionEntry =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'collections']);\n const isRequiredRoots = isArrayEqual(currentPath, ['roots']);\n const isRequiredExtensionPacks = isArrayEqual(currentPath, ['extensionPacks']);\n const isRequiredCapabilities = isArrayEqual(currentPath, ['capabilities']);\n const isRequiredMeta = isArrayEqual(currentPath, ['meta']);\n const isRequiredExecutionDefaults = isArrayEqual(currentPath, [\n 'execution',\n 'mutations',\n 'defaults',\n ]);\n const isExtensionNamespace = currentPath.length === 2 && currentPath[0] === 'extensionPacks';\n const isModelRelations =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'relations']);\n const isModelStorage =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'storage']);\n const isTableUniques =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'uniques'],\n );\n const isTableIndexes =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'indexes'],\n );\n const isTableForeignKeys =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'foreignKeys'],\n );\n\n const isFkBooleanField =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'tables' &&\n currentPath[3] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredTables &&\n !isRequiredCollections &&\n !isCollectionEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isTableUniques &&\n !isTableIndexes &&\n !isTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath);\n }\n\n return result;\n}\n\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sortObjectKeys(item));\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\ntype StorageObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortIndexesAndUniques(storage: unknown): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const storageObj = storage as StorageObject;\n if (!storageObj.tables || typeof storageObj.tables !== 'object') {\n return storage;\n }\n\n const tables = storageObj.tables;\n const result: StorageObject = { ...storageObj };\n\n result.tables = {};\n const sortedTableNames = Object.keys(tables).sort();\n for (const tableName of sortedTableNames) {\n const table = tables[tableName];\n if (!table || typeof table !== 'object') {\n result.tables[tableName] = table;\n continue;\n }\n\n const tableObj = table as TableObject;\n const sortedTable: TableObject = { ...tableObj };\n\n if (Array.isArray(tableObj.indexes)) {\n sortedTable.indexes = [...tableObj.indexes].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n if (Array.isArray(tableObj.uniques)) {\n sortedTable.uniques = [...tableObj.uniques].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n result.tables[tableName] = sortedTable;\n }\n\n return result;\n}\n\nexport function orderTopLevel(obj: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n const remaining = new Set(Object.keys(obj));\n\n for (const key of TOP_LEVEL_ORDER) {\n if (remaining.has(key)) {\n ordered[key] = obj[key];\n remaining.delete(key);\n }\n }\n\n for (const key of Array.from(remaining).sort()) {\n ordered[key] = obj[key];\n }\n\n return ordered;\n}\n\nexport function canonicalizeContractToObject(\n contract: Contract,\n options?: { schemaVersion?: string },\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options?.schemaVersion),\n targetFamily: contract.targetFamily,\n target: contract.target,\n profileHash: contract.profileHash,\n roots: contract.roots,\n models: contract.models,\n ...ifDefined('valueObjects', contract.valueObjects),\n storage: contract.storage,\n ...ifDefined('execution', contract.execution),\n extensionPacks: contract.extensionPacks,\n capabilities: contract.capabilities,\n meta: contract.meta,\n };\n const withDefaultsOmitted = omitDefaults(normalized, []) as Record<string, unknown>;\n const withSortedIndexes = sortIndexesAndUniques(withDefaultsOmitted['storage']);\n const withSortedStorage = { ...withDefaultsOmitted, storage: withSortedIndexes };\n const withSortedKeys = sortObjectKeys(withSortedStorage) as Record<string, unknown>;\n return orderTopLevel(withSortedKeys);\n}\n\nexport function canonicalizeContract(\n contract: Contract,\n options?: { schemaVersion?: string },\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalizeContract } from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './types';\n\nconst SCHEMA_VERSION = '1';\n\nfunction sha256(content: string): string {\n const hash = createHash('sha256');\n hash.update(content);\n return `sha256:${hash.digest('hex')}`;\n}\n\nfunction hashContract(section: Record<string, unknown>): string {\n const contract = {\n targetFamily: section['targetFamily'],\n target: section['target'],\n roots: {},\n models: {},\n storage: section['storage'] ?? {},\n execution: section['execution'],\n extensionPacks: {},\n capabilities: section['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...section,\n } as Contract;\n return canonicalizeContract(contract, { schemaVersion: SCHEMA_VERSION });\n}\n\nexport function computeStorageHash(args: {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n}): StorageHashBase<string> {\n return sha256(hashContract(args)) as StorageHashBase<string>;\n}\n\nexport function computeExecutionHash(args: {\n target: string;\n targetFamily: string;\n execution: Record<string, unknown>;\n}): ExecutionHashBase<string> {\n return sha256(hashContract(args)) as ExecutionHashBase<string>;\n}\n\nexport function computeProfileHash(args: {\n target: string;\n targetFamily: string;\n capabilities: Record<string, Record<string, boolean>>;\n}): ProfileHashBase<string> {\n return sha256(hashContract(args)) as ProfileHashBase<string>;\n}\n"],"mappings":"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"}
|
package/dist/hashing.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as ProfileHashBase, T as StorageHashBase, d as ExecutionHashBase, t as Contract } from "./contract-types-
|
|
1
|
+
import { S as ProfileHashBase, T as StorageHashBase, d as ExecutionHashBase, t as Contract } from "./contract-types-Kl86EaEa.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/canonicalization.d.ts
|
|
4
4
|
declare function canonicalizeContractToObject(contract: Contract, options?: {
|
package/dist/hashing.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"
|
|
1
|
+
{"version":3,"file":"hashing.d.mts","names":[],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"mappings":";;;iBAwOgB,4BAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA;EAAY,aAAA;AAAA,IACX,MAAA;AAAA,iBAsBa,oBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA;EAAY,aAAA;AAAA;;;iBCrOE,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,OAAA,EAAS,MAAA;AAAA,IACP,eAAA;AAAA,iBAIY,oBAAA,CAAqB,IAAA;EACnC,MAAA;EACA,YAAA;EACA,SAAA,EAAW,MAAA;AAAA,IACT,iBAAA;AAAA,iBAIY,kBAAA,CAAmB,IAAA;EACjC,MAAA;EACA,YAAA;EACA,YAAA,EAAc,MAAA,SAAe,MAAA;AAAA,IAC3B,eAAA"}
|
package/dist/hashing.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-
|
|
2
|
-
|
|
3
|
-
export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };
|
|
1
|
+
import { a as canonicalizeContractToObject, i as canonicalizeContract, n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-Ctk7VHud.mjs";
|
|
2
|
+
export { canonicalizeContract, canonicalizeContractToObject, computeExecutionHash, computeProfileHash, computeStorageHash };
|
package/dist/testing.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { I as ContractModel, L as ContractModelBase, S as ProfileHashBase, T as StorageHashBase, V as ContractValueObject, W as ModelStorageBase, h as ExecutionSection, t as Contract, w as StorageBase } from "./contract-types-
|
|
1
|
+
import { I as ContractModel, L as ContractModelBase, S as ProfileHashBase, T as StorageHashBase, V as ContractValueObject, W as ModelStorageBase, h as ExecutionSection, t as Contract, w as StorageBase } from "./contract-types-Kl86EaEa.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/testing-factories.d.ts
|
|
4
4
|
type ContractOverrides<TStorage extends StorageBase = StorageBase, TModels extends Record<string, ContractModelBase> = Record<string, ContractModel>> = {
|
package/dist/testing.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"
|
|
1
|
+
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing-factories.ts"],"mappings":";;;KAYK,iBAAA,kBACc,WAAA,GAAc,WAAA,kBACf,MAAA,SAAe,iBAAA,IAAqB,MAAA,SAAe,aAAA;EAEnE,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA;EACR,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;AAAA;AAAA,cAGH,UAAA,EAAoC,eAAA;AAAA,iBAE1B,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,KAgDvE,cAAA,GAAiB,WAAA;EAAA,SACX,MAAA,EAAQ,MAAA;EAAA,SACR,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
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { t as coreHash } from "./types-
|
|
2
|
-
import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-
|
|
1
|
+
import { t as coreHash } from "./types-CVGwkRLa.mjs";
|
|
2
|
+
import { n as computeProfileHash, r as computeStorageHash, t as computeExecutionHash } from "./hashing-Ctk7VHud.mjs";
|
|
3
3
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
|
-
|
|
5
4
|
//#region src/testing-factories.ts
|
|
6
5
|
const DUMMY_HASH = coreHash("sha256:test");
|
|
7
6
|
function createContract(overrides = {}) {
|
|
@@ -52,7 +51,7 @@ function createSqlContract(overrides = {}) {
|
|
|
52
51
|
...overrides
|
|
53
52
|
});
|
|
54
53
|
}
|
|
55
|
-
|
|
56
54
|
//#endregion
|
|
57
55
|
export { DUMMY_HASH, createContract, createSqlContract };
|
|
56
|
+
|
|
58
57
|
//# sourceMappingURL=testing.mjs.map
|
package/dist/testing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { Contract } from './contract-types';\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, string>;\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};\n\nconst DUMMY_HASH = coreHash('sha256:test');\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 =\n overrides.storage ?? ({ tables: {} } as unknown as Omit<TStorage, 'storageHash'>);\n\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: rawStorage as Record<string, unknown>,\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 tables: Record<string, unknown>;\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 target: 'postgres',\n targetFamily: 'sql',\n storage: overrides.storage ?? { tables: {} },\n ...overrides,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing-factories.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { Contract } from './contract-types';\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, string>;\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};\n\nconst DUMMY_HASH = coreHash('sha256:test');\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 =\n overrides.storage ?? ({ tables: {} } as unknown as Omit<TStorage, 'storageHash'>);\n\n const storageHash = computeStorageHash({\n target,\n targetFamily,\n storage: rawStorage as Record<string, unknown>,\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 tables: Record<string, unknown>;\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 target: 'postgres',\n targetFamily: 'sql',\n storage: overrides.storage ?? { tables: {} },\n ...overrides,\n });\n}\n\nexport { DUMMY_HASH };\n"],"mappings":";;;;AA6BA,MAAM,aAAa,SAAS,cAAc;AAE1C,SAAgB,eAGd,YAAkD,EAAE,EAA+B;CACnF,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,EAAE;CAEjD,MAAM,aACJ,UAAU,WAAY,EAAE,QAAQ,EAAE,EAAE;CAEtC,MAAM,cAAc,mBAAmB;EACrC;EACA;EACA,SAAS;EACV,CAAC;CAEF,MAAM,UAAU;EACd,GAAG;EACH;EACD;CAED,MAAM,sBACJ,UAAU,eAAe,mBAAmB;EAAE;EAAQ;EAAc;EAAc,CAAC;CAErF,OAAO;EACL;EACA;EACA,OAAO,UAAU,SAAS,EAAE;EAC5B,QAAS,UAAU,UAAU,EAAE;EAC/B,GAAG,UAAU,gBAAgB,UAAU,aAAa;EACpD;EACA;EACA,gBAAgB,UAAU,kBAAkB,EAAE;EAC9C,GAAI,UAAU,cAAc,KAAA,IACxB,EACE,WAAW;GACT,GAAG,UAAU;GACb,eAAe,qBAAqB;IAClC;IACA;IACA,WAAW,UAAU;IACtB,CAAC;GACH,EACF,GACD,EAAE;EACN,aAAa;EACb,MAAM,UAAU,QAAQ,EAAE;EAC3B;;AAUH,SAAgB,kBACd,YAA6E,EAAE,EACvB;CACxD,OAAO,eAA6D;EAClE,QAAQ;EACR,cAAc;EACd,SAAS,UAAU,WAAW,EAAE,QAAQ,EAAE,EAAE;EAC5C,GAAG;EACJ,CAAC"}
|
|
@@ -40,7 +40,7 @@ function isExecutionMutationDefaultValue(value) {
|
|
|
40
40
|
if (candidate.params !== void 0 && (typeof candidate.params !== "object" || candidate.params === null || Array.isArray(candidate.params))) return false;
|
|
41
41
|
return true;
|
|
42
42
|
}
|
|
43
|
-
|
|
44
43
|
//#endregion
|
|
45
44
|
export { isExecutionMutationDefaultValue as a, isColumnDefaultLiteralInputValue as i, executionHash as n, profileHash as o, isColumnDefault as r, coreHash as t };
|
|
46
|
-
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=types-CVGwkRLa.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
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 * 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 */\nexport interface StorageBase<THash extends string = string> {\n readonly storageHash: StorageHashBase<THash>;\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;;AAGT,SAAgB,SAAiC,OAA8B;CAC7E,OAAO;;AAUT,SAAgB,YAAoC,OAA8B;CAChF,OAAO;;;;;;;;;;AA2CT,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,MAAM,EAAE,OAAO,MAAM,MAAM,iCAAiC;CAC9E,IAAI,MAAM,YAAY,OAAO,eAAe,MAAM,KAAK,OAAO,WAC5D,OAAO,OAAO,OAAO,MAAiC,CAAC,MAAM,iCAAiC;CAEhG,OAAO;;AAUT,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;;AAST,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,OAAO,GAEjC,OAAO;CAET,OAAO"}
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as isExecutionMutationDefaultValue, B as ContractRelationOn, C as Source, D as executionHash, E as coreHash, F as ContractFieldType, G as ReferenceRelationKeys, H as ContractVariantEntry, I as ContractModel, J as ValueObjectFieldType, K as ScalarFieldType, L as ContractModelBase, M as ContractDiscriminator, N as ContractEmbedRelation, O as isColumnDefault, P as ContractField, R as ContractReferenceRelation, S as ProfileHashBase, T as StorageHashBase, U as EmbedRelationKeys, V as ContractValueObject, W as ModelStorageBase, _ as FieldType, a as ColumnDefault, b as JsonValue, c as ContractMarkerRecord, d as ExecutionHashBase, f as ExecutionMutationDefault, g as Expr, h as ExecutionSection, i as Brand, j as profileHash, k as isColumnDefaultLiteralInputValue, l as DocCollection, m as ExecutionMutationDefaultValue, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultPhases, q as UnionFieldType, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as StorageBase, x as PlanMeta, y as JsonPrimitive, z as ContractRelation } from "./contract-types-
|
|
1
|
+
import { A as isExecutionMutationDefaultValue, B as ContractRelationOn, C as Source, D as executionHash, E as coreHash, F as ContractFieldType, G as ReferenceRelationKeys, H as ContractVariantEntry, I as ContractModel, J as ValueObjectFieldType, K as ScalarFieldType, L as ContractModelBase, M as ContractDiscriminator, N as ContractEmbedRelation, O as isColumnDefault, P as ContractField, R as ContractReferenceRelation, S as ProfileHashBase, T as StorageHashBase, U as EmbedRelationKeys, V as ContractValueObject, W as ModelStorageBase, _ as FieldType, a as ColumnDefault, b as JsonValue, c as ContractMarkerRecord, d as ExecutionHashBase, f as ExecutionMutationDefault, g as Expr, h as ExecutionSection, i as Brand, j as profileHash, k as isColumnDefaultLiteralInputValue, l as DocCollection, m as ExecutionMutationDefaultValue, n as ContractExecutionSection, o as ColumnDefaultLiteralInputValue, p as ExecutionMutationDefaultPhases, q as UnionFieldType, r as $, s as ColumnDefaultLiteralValue, t as Contract, u as DocIndex, v as GeneratedValueSpec, w as StorageBase, x as PlanMeta, y as JsonPrimitive, z as ContractRelation } from "./contract-types-Kl86EaEa.mjs";
|
|
2
2
|
export { type $, type Brand, type ColumnDefault, type ColumnDefaultLiteralInputValue, type ColumnDefaultLiteralValue, type Contract, type ContractDiscriminator, type ContractEmbedRelation, type ContractExecutionSection, type ContractField, type ContractFieldType, type ContractMarkerRecord, type ContractModel, type ContractModelBase, type ContractReferenceRelation, type ContractRelation, type ContractRelationOn, type ContractValueObject, type ContractVariantEntry, type DocCollection, type DocIndex, type EmbedRelationKeys, type ExecutionHashBase, type ExecutionMutationDefault, type ExecutionMutationDefaultPhases, type ExecutionMutationDefaultValue, type ExecutionSection, type Expr, type FieldType, type GeneratedValueSpec, type JsonPrimitive, type JsonValue, type ModelStorageBase, type PlanMeta, type ProfileHashBase, type ReferenceRelationKeys, type ScalarFieldType, type Source, type StorageBase, type StorageHashBase, type UnionFieldType, type ValueObjectFieldType, coreHash, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
|
package/dist/types.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { a as isExecutionMutationDefaultValue, i as isColumnDefaultLiteralInputValue, n as executionHash, o as profileHash, r as isColumnDefault, t as coreHash } from "./types-
|
|
2
|
-
|
|
3
|
-
export { coreHash, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
|
|
1
|
+
import { a as isExecutionMutationDefaultValue, i as isColumnDefaultLiteralInputValue, n as executionHash, o as profileHash, r as isColumnDefault, t as coreHash } from "./types-CVGwkRLa.mjs";
|
|
2
|
+
export { coreHash, executionHash, isColumnDefault, isColumnDefaultLiteralInputValue, isExecutionMutationDefaultValue, profileHash };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-contract.d.mts","names":[],"sources":["../src/validate-contract.ts"],"
|
|
1
|
+
{"version":3,"file":"validate-contract.d.mts","names":[],"sources":["../src/validate-contract.ts"],"mappings":";;;KAKY,uBAAA;AAAA,cAEC,uBAAA,SAAgC,KAAA;EAAA,SAClC,IAAA;EAAA,SACA,KAAA,EAAO,uBAAA;cAEJ,OAAA,UAAiB,KAAA,EAAO,uBAAA;AAAA;;AAJtC;;;KAeY,gBAAA,IAAoB,QAAA,EAAU,QAAA;;;;;;;;;;;;;;;AAA1C;;;;;iBAqDgB,gBAAA,mBAAmC,QAAA,CAAA,CACjD,KAAA,WACA,gBAAA,EAAkB,gBAAA,GACjB,SAAA"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { n as ContractValidationError, r as validateContract } from "./validate-domain-
|
|
2
|
-
|
|
3
|
-
export { ContractValidationError, validateContract };
|
|
1
|
+
import { n as ContractValidationError, r as validateContract } from "./validate-domain-WtPdBLia.mjs";
|
|
2
|
+
export { ContractValidationError, validateContract };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type } from "arktype";
|
|
2
|
-
|
|
3
2
|
//#region src/validate-contract.ts
|
|
4
3
|
var ContractValidationError = class extends Error {
|
|
5
4
|
code = "CONTRACT.VALIDATION_FAILED";
|
|
@@ -65,7 +64,6 @@ function validateContract(value, storageValidator) {
|
|
|
65
64
|
storageValidator(contract);
|
|
66
65
|
return contract;
|
|
67
66
|
}
|
|
68
|
-
|
|
69
67
|
//#endregion
|
|
70
68
|
//#region src/validate-domain.ts
|
|
71
69
|
function validateContractDomain(contract) {
|
|
@@ -141,13 +139,13 @@ function forEachContractField(contract, callback) {
|
|
|
141
139
|
}
|
|
142
140
|
function validateValueObjectReferences(contract, errors) {
|
|
143
141
|
const voNames = new Set(Object.keys(contract.valueObjects ?? {}));
|
|
144
|
-
function checkType(type
|
|
145
|
-
if (!type
|
|
146
|
-
if (type
|
|
147
|
-
errors.push(`${location} references value object "${type
|
|
142
|
+
function checkType(type, location) {
|
|
143
|
+
if (!type) return;
|
|
144
|
+
if (type.kind === "valueObject" && type.name && !voNames.has(type.name)) {
|
|
145
|
+
errors.push(`${location} references value object "${type.name}" which does not exist in valueObjects`);
|
|
148
146
|
return;
|
|
149
147
|
}
|
|
150
|
-
if (type
|
|
148
|
+
if (type.kind === "union") for (const member of type.members ?? []) checkType(member, location);
|
|
151
149
|
}
|
|
152
150
|
forEachContractField(contract, (field, location) => {
|
|
153
151
|
checkType(field?.type, location);
|
|
@@ -159,7 +157,7 @@ function validateFieldModifiers(contract, errors) {
|
|
|
159
157
|
if (f?.many && f?.dict) errors.push(`${location} cannot have both "many" and "dict" modifiers`);
|
|
160
158
|
});
|
|
161
159
|
}
|
|
162
|
-
|
|
163
160
|
//#endregion
|
|
164
161
|
export { ContractValidationError as n, validateContract as r, validateContractDomain as t };
|
|
165
|
-
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=validate-domain-WtPdBLia.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-domain-WtPdBLia.mjs","names":["f"],"sources":["../src/validate-contract.ts","../src/validate-domain.ts"],"sourcesContent":["import { type } from 'arktype';\nimport type { Contract } from './contract-types';\nimport type { DomainContractShape } from './validate-domain';\nimport { validateContractDomain } from './validate-domain';\n\nexport type ContractValidationPhase = 'structural' | 'domain' | 'storage';\n\nexport class ContractValidationError extends Error {\n readonly code = 'CONTRACT.VALIDATION_FAILED';\n readonly phase: ContractValidationPhase;\n\n constructor(message: string, phase: ContractValidationPhase) {\n super(message);\n this.name = 'ContractValidationError';\n this.phase = phase;\n }\n}\n\n/**\n * Family-provided storage validator.\n * SQL validates tables/columns/FKs; Mongo validates collections/embedding.\n */\nexport type StorageValidator = (contract: Contract) => void;\n\nconst ContractSchema = type({\n target: 'string',\n targetFamily: 'string',\n roots: 'Record<string, string>',\n models: 'Record<string, unknown>',\n 'valueObjects?': 'Record<string, unknown>',\n storage: 'Record<string, unknown>',\n capabilities: 'Record<string, Record<string, boolean>>',\n extensionPacks: 'Record<string, unknown>',\n meta: 'Record<string, unknown>',\n 'execution?': {\n 'executionHash?': 'string',\n mutations: {\n defaults: 'unknown[]',\n },\n },\n profileHash: 'string',\n});\n\nfunction stripPersistenceFields(raw: Record<string, unknown>): Record<string, unknown> {\n const { schemaVersion: _, _generated: _g, ...rest } = raw;\n return rest;\n}\n\nfunction extractDomainShape(contract: Contract): DomainContractShape {\n return {\n roots: contract.roots,\n models: contract.models,\n ...(contract.valueObjects ? { valueObjects: contract.valueObjects } : {}),\n };\n}\n\n/**\n * Framework-level contract validation (ADR 182).\n *\n * Three-pass validation:\n * 1. **Structural validation** (arktype): verifies required fields exist with\n * correct base types.\n * 2. **Domain validation** (framework-owned): roots, relation targets,\n * variant/base consistency, discriminators, ownership, orphans.\n * 3. **Storage validation** (family-provided): SQL validates tables/columns/FKs;\n * Mongo validates collections/embedding.\n *\n * JSON persistence fields (`schemaVersion`, `_generated`) are stripped before\n * validation — they are not part of the in-memory contract representation.\n *\n * @template TContract The fully-typed contract type (preserves literal types).\n * @param value Raw contract value (e.g. parsed from JSON).\n * @param storageValidator Family-specific storage validation function.\n * @returns The validated contract with full literal types.\n */\nexport function validateContract<TContract extends Contract>(\n value: unknown,\n storageValidator: StorageValidator,\n): TContract {\n if (typeof value !== 'object' || value === null) {\n throw new ContractValidationError('Contract must be a non-null object', 'structural');\n }\n\n const stripped = stripPersistenceFields(value as Record<string, unknown>);\n\n const parsed = ContractSchema(stripped);\n if (parsed instanceof type.errors) {\n throw new ContractValidationError(\n `Invalid contract structure: ${parsed.summary}`,\n 'structural',\n );\n }\n\n const contract = parsed as unknown as Contract;\n\n validateContractDomain(extractDomainShape(contract));\n\n storageValidator(contract);\n\n return contract as unknown as TContract;\n}\n","import { ContractValidationError } from './validate-contract';\n\nexport interface DomainModelShape {\n readonly fields: Record<string, unknown>;\n readonly relations?: Record<string, { readonly to: string }>;\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, unknown>;\n readonly base?: string;\n readonly owner?: string;\n}\n\nexport interface DomainContractShape {\n readonly roots: Record<string, string>;\n readonly models: Record<string, DomainModelShape>;\n readonly valueObjects?: Record<string, { readonly fields: Record<string, unknown> }>;\n}\n\nexport function validateContractDomain(contract: DomainContractShape): void {\n const errors: string[] = [];\n const modelNames = new Set(Object.keys(contract.models));\n\n validateRoots(contract, modelNames, errors);\n validateVariantsAndBases(contract, modelNames, errors);\n validateRelationTargets(contract, modelNames, errors);\n validateDiscriminators(contract, errors);\n validateOwnership(contract, modelNames, errors);\n validateValueObjectReferences(contract, errors);\n validateFieldModifiers(contract, errors);\n\n if (errors.length > 0) {\n throw new ContractValidationError(\n `Contract domain validation failed:\\n- ${errors.join('\\n- ')}`,\n 'domain',\n );\n }\n}\n\nfunction validateRoots(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const seenValues = new Set<string>();\n for (const [rootKey, modelName] of Object.entries(contract.roots)) {\n if (seenValues.has(modelName)) {\n errors.push(`Duplicate root value: \"${modelName}\" is mapped by multiple root keys`);\n }\n seenValues.add(modelName);\n\n if (!modelNames.has(modelName)) {\n errors.push(\n `Root \"${rootKey}\" references model \"${modelName}\" which does not exist in models`,\n );\n }\n }\n}\n\nfunction validateVariantsAndBases(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const models = new Map(Object.entries(contract.models));\n\n for (const [modelName, model] of models) {\n if (model.variants) {\n for (const variantName of Object.keys(model.variants)) {\n if (!modelNames.has(variantName)) {\n errors.push(\n `Model \"${modelName}\" lists variant \"${variantName}\" which does not exist in models`,\n );\n continue;\n }\n const variantModel = models.get(variantName);\n if (!variantModel) continue;\n if (variantModel.base !== modelName) {\n errors.push(\n `Variant \"${variantName}\" has base \"${variantModel.base ?? '(none)'}\" but expected \"${modelName}\"`,\n );\n }\n }\n }\n\n if (model.base) {\n if (!modelNames.has(model.base)) {\n errors.push(`Model \"${modelName}\" has base \"${model.base}\" which does not exist in models`);\n continue;\n }\n const baseModel = models.get(model.base);\n if (!baseModel) continue;\n if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${model.base}\" which does not list it as a variant`,\n );\n }\n }\n }\n}\n\nfunction validateRelationTargets(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n if (!modelNames.has(relation.to)) {\n errors.push(\n `Relation \"${relName}\" on model \"${modelName}\" targets \"${relation.to}\" which does not exist in models`,\n );\n }\n }\n }\n}\n\nfunction validateDiscriminators(contract: DomainContractShape, errors: string[]): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.discriminator) {\n if (!model.variants || Object.keys(model.variants).length === 0) {\n errors.push(`Model \"${modelName}\" has discriminator but no variants`);\n }\n if (!Object.hasOwn(model.fields, model.discriminator.field)) {\n errors.push(\n `Discriminator field \"${model.discriminator.field}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (model.variants && Object.keys(model.variants).length > 0 && !model.discriminator) {\n errors.push(`Model \"${modelName}\" has variants but no discriminator`);\n }\n\n if (model.base) {\n if (model.discriminator) {\n errors.push(`Model \"${modelName}\" has base and must not have discriminator`);\n }\n if (model.variants && Object.keys(model.variants).length > 0) {\n errors.push(`Model \"${modelName}\" has base and must not have variants`);\n }\n }\n }\n}\n\nfunction validateOwnership(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (!model.owner) continue;\n\n if (model.owner === modelName) {\n errors.push(`Model \"${modelName}\" cannot own itself`);\n }\n\n if (!modelNames.has(model.owner)) {\n errors.push(`Model \"${modelName}\" has owner \"${model.owner}\" which does not exist in models`);\n }\n\n for (const [rootKey, rootModel] of Object.entries(contract.roots)) {\n if (rootModel === modelName) {\n errors.push(\n `Owned model \"${modelName}\" must not appear in roots (found as root \"${rootKey}\")`,\n );\n }\n }\n }\n}\n\ninterface FieldTypeLike {\n readonly kind?: string;\n readonly name?: string;\n readonly members?: readonly FieldTypeLike[];\n}\n\ninterface FieldLike {\n readonly type?: FieldTypeLike;\n readonly many?: boolean;\n readonly dict?: boolean;\n}\n\nfunction forEachContractField(\n contract: DomainContractShape,\n callback: (field: unknown, location: string) => void,\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [fieldName, field] of Object.entries(model.fields)) {\n callback(field, `Model \"${modelName}\" field \"${fieldName}\"`);\n }\n }\n for (const [voName, vo] of Object.entries(contract.valueObjects ?? {})) {\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n callback(field, `Value object \"${voName}\" field \"${fieldName}\"`);\n }\n }\n}\n\nfunction validateValueObjectReferences(contract: DomainContractShape, errors: string[]): void {\n const voNames = new Set(Object.keys(contract.valueObjects ?? {}));\n\n function checkType(type: FieldTypeLike | undefined, location: string): void {\n if (!type) return;\n if (type.kind === 'valueObject' && type.name && !voNames.has(type.name)) {\n errors.push(\n `${location} references value object \"${type.name}\" which does not exist in valueObjects`,\n );\n return;\n }\n if (type.kind === 'union') {\n for (const member of type.members ?? []) checkType(member, location);\n }\n }\n\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n checkType(f?.type, location);\n });\n}\n\nfunction validateFieldModifiers(contract: DomainContractShape, errors: string[]): void {\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n if (f?.many && f?.dict) {\n errors.push(`${location} cannot have both \"many\" and \"dict\" modifiers`);\n }\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"
|
|
1
|
+
{"version":3,"file":"validate-domain.d.mts","names":[],"sources":["../src/validate-domain.ts"],"mappings":";UAEiB,gBAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,SAAA,GAAY,MAAA;IAAA,SAA0B,EAAA;EAAA;EAAA,SACtC,aAAA;IAAA,SAA2B,KAAA;EAAA;EAAA,SAC3B,QAAA,GAAW,MAAA;EAAA,SACX,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,UAGM,mBAAA;EAAA,SACN,KAAA,EAAO,MAAA;EAAA,SACP,MAAA,EAAQ,MAAA,SAAe,gBAAA;EAAA,SACvB,YAAA,GAAe,MAAA;IAAA,SAA0B,MAAA,EAAQ,MAAA;EAAA;AAAA;AAAA,iBAG5C,sBAAA,CAAuB,QAAA,EAAU,mBAAA"}
|
package/dist/validate-domain.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { t as validateContractDomain } from "./validate-domain-
|
|
2
|
-
|
|
3
|
-
export { validateContractDomain };
|
|
1
|
+
import { t as validateContractDomain } from "./validate-domain-WtPdBLia.mjs";
|
|
2
|
+
export { validateContractDomain };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/contract",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.67",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@standard-schema/spec": "^1.1.0",
|
|
10
10
|
"arktype": "^2.1.29",
|
|
11
|
-
"@prisma-next/utils": "0.5.0-dev.
|
|
11
|
+
"@prisma-next/utils": "0.5.0-dev.67"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"tsdown": "0.
|
|
14
|
+
"tsdown": "0.22.0",
|
|
15
15
|
"typescript": "5.9.3",
|
|
16
|
-
"vitest": "4.
|
|
16
|
+
"vitest": "4.1.5",
|
|
17
17
|
"@prisma-next/test-utils": "0.0.1",
|
|
18
18
|
"@prisma-next/tsconfig": "0.0.0",
|
|
19
19
|
"@prisma-next/tsdown": "0.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract-types-Bjujh4Fu.d.mts","names":[],"sources":["../src/domain-types.ts","../src/types.ts","../src/contract-types.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hashing-CyaA_Qvf.mjs","names":["result: Record<string, unknown>","sorted: Record<string, unknown>","result: StorageObject","sortedTable: TableObject","ordered: Record<string, unknown>"],"sources":["../src/canonicalization.ts","../src/hashing.ts"],"sourcesContent":["import { isArrayEqual } from '@prisma-next/utils/array-equal';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nimport type { Contract } from './contract-types';\n\nconst TOP_LEVEL_ORDER = [\n 'schemaVersion',\n 'canonicalVersion',\n 'targetFamily',\n 'target',\n 'profileHash',\n 'roots',\n 'models',\n 'valueObjects',\n 'storage',\n 'execution',\n 'capabilities',\n 'extensionPacks',\n 'meta',\n] as const;\n\nfunction isDefaultValue(value: unknown): boolean {\n if (value === false) return true;\n if (value === null) return false;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && value !== null) {\n const keys = Object.keys(value);\n return keys.length === 0;\n }\n return false;\n}\n\nfunction omitDefaults(obj: unknown, path: readonly string[]): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => omitDefaults(item, path));\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n\n if (key === '_generated') {\n continue;\n }\n\n if (key === 'generated' && value === false) {\n continue;\n }\n\n if ((key === 'onDelete' || key === 'onUpdate') && value === 'noAction') {\n continue;\n }\n\n if (isDefaultValue(value)) {\n const isRequiredModels = isArrayEqual(currentPath, ['models']);\n const isRequiredTables = isArrayEqual(currentPath, ['storage', 'tables']);\n const isRequiredCollections = isArrayEqual(currentPath, ['storage', 'collections']);\n const isCollectionEntry =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[1]], ['storage', 'collections']);\n const isRequiredRoots = isArrayEqual(currentPath, ['roots']);\n const isRequiredExtensionPacks = isArrayEqual(currentPath, ['extensionPacks']);\n const isRequiredCapabilities = isArrayEqual(currentPath, ['capabilities']);\n const isRequiredMeta = isArrayEqual(currentPath, ['meta']);\n const isRequiredExecutionDefaults = isArrayEqual(currentPath, [\n 'execution',\n 'mutations',\n 'defaults',\n ]);\n const isExtensionNamespace = currentPath.length === 2 && currentPath[0] === 'extensionPacks';\n const isModelRelations =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'relations']);\n const isModelStorage =\n currentPath.length === 3 &&\n isArrayEqual([currentPath[0], currentPath[2]], ['models', 'storage']);\n const isTableUniques =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'uniques'],\n );\n const isTableIndexes =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'indexes'],\n );\n const isTableForeignKeys =\n currentPath.length === 4 &&\n isArrayEqual(\n [currentPath[0], currentPath[1], currentPath[3]],\n ['storage', 'tables', 'foreignKeys'],\n );\n\n const isFkBooleanField =\n currentPath.length === 5 &&\n currentPath[0] === 'storage' &&\n currentPath[1] === 'tables' &&\n currentPath[3] === 'foreignKeys' &&\n (key === 'constraint' || key === 'index');\n\n const isNullableField = key === 'nullable';\n\n if (\n !isRequiredModels &&\n !isRequiredTables &&\n !isRequiredCollections &&\n !isCollectionEntry &&\n !isRequiredRoots &&\n !isRequiredExtensionPacks &&\n !isRequiredCapabilities &&\n !isRequiredMeta &&\n !isRequiredExecutionDefaults &&\n !isExtensionNamespace &&\n !isModelRelations &&\n !isModelStorage &&\n !isTableUniques &&\n !isTableIndexes &&\n !isTableForeignKeys &&\n !isFkBooleanField &&\n !isNullableField\n ) {\n continue;\n }\n }\n\n result[key] = omitDefaults(value, currentPath);\n }\n\n return result;\n}\n\nfunction sortObjectKeys(obj: unknown): unknown {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => sortObjectKeys(item));\n }\n\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(obj).sort();\n for (const key of keys) {\n sorted[key] = sortObjectKeys((obj as Record<string, unknown>)[key]);\n }\n\n return sorted;\n}\n\ntype StorageObject = {\n tables?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype TableObject = {\n indexes?: unknown[];\n uniques?: unknown[];\n [key: string]: unknown;\n};\n\nfunction sortIndexesAndUniques(storage: unknown): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const storageObj = storage as StorageObject;\n if (!storageObj.tables || typeof storageObj.tables !== 'object') {\n return storage;\n }\n\n const tables = storageObj.tables;\n const result: StorageObject = { ...storageObj };\n\n result.tables = {};\n const sortedTableNames = Object.keys(tables).sort();\n for (const tableName of sortedTableNames) {\n const table = tables[tableName];\n if (!table || typeof table !== 'object') {\n result.tables[tableName] = table;\n continue;\n }\n\n const tableObj = table as TableObject;\n const sortedTable: TableObject = { ...tableObj };\n\n if (Array.isArray(tableObj.indexes)) {\n sortedTable.indexes = [...tableObj.indexes].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n if (Array.isArray(tableObj.uniques)) {\n sortedTable.uniques = [...tableObj.uniques].sort((a, b) => {\n const nameA = (a as { name?: string })?.name || '';\n const nameB = (b as { name?: string })?.name || '';\n return nameA.localeCompare(nameB);\n });\n }\n\n result.tables[tableName] = sortedTable;\n }\n\n return result;\n}\n\nexport function orderTopLevel(obj: Record<string, unknown>): Record<string, unknown> {\n const ordered: Record<string, unknown> = {};\n const remaining = new Set(Object.keys(obj));\n\n for (const key of TOP_LEVEL_ORDER) {\n if (remaining.has(key)) {\n ordered[key] = obj[key];\n remaining.delete(key);\n }\n }\n\n for (const key of Array.from(remaining).sort()) {\n ordered[key] = obj[key];\n }\n\n return ordered;\n}\n\nexport function canonicalizeContractToObject(\n contract: Contract,\n options?: { schemaVersion?: string },\n): Record<string, unknown> {\n const normalized: Record<string, unknown> = {\n ...ifDefined('schemaVersion', options?.schemaVersion),\n targetFamily: contract.targetFamily,\n target: contract.target,\n profileHash: contract.profileHash,\n roots: contract.roots,\n models: contract.models,\n ...ifDefined('valueObjects', contract.valueObjects),\n storage: contract.storage,\n ...ifDefined('execution', contract.execution),\n extensionPacks: contract.extensionPacks,\n capabilities: contract.capabilities,\n meta: contract.meta,\n };\n const withDefaultsOmitted = omitDefaults(normalized, []) as Record<string, unknown>;\n const withSortedIndexes = sortIndexesAndUniques(withDefaultsOmitted['storage']);\n const withSortedStorage = { ...withDefaultsOmitted, storage: withSortedIndexes };\n const withSortedKeys = sortObjectKeys(withSortedStorage) as Record<string, unknown>;\n return orderTopLevel(withSortedKeys);\n}\n\nexport function canonicalizeContract(\n contract: Contract,\n options?: { schemaVersion?: string },\n): string {\n return JSON.stringify(canonicalizeContractToObject(contract, options), null, 2);\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalizeContract } from './canonicalization';\nimport type { Contract } from './contract-types';\nimport type { ExecutionHashBase, ProfileHashBase, StorageHashBase } from './types';\n\nconst SCHEMA_VERSION = '1';\n\nfunction sha256(content: string): string {\n const hash = createHash('sha256');\n hash.update(content);\n return `sha256:${hash.digest('hex')}`;\n}\n\nfunction hashContract(section: Record<string, unknown>): string {\n const contract = {\n targetFamily: section['targetFamily'],\n target: section['target'],\n roots: {},\n models: {},\n storage: section['storage'] ?? {},\n execution: section['execution'],\n extensionPacks: {},\n capabilities: section['capabilities'] ?? {},\n meta: {},\n profileHash: '',\n ...section,\n } as Contract;\n return canonicalizeContract(contract, { schemaVersion: SCHEMA_VERSION });\n}\n\nexport function computeStorageHash(args: {\n target: string;\n targetFamily: string;\n storage: Record<string, unknown>;\n}): StorageHashBase<string> {\n return sha256(hashContract(args)) as StorageHashBase<string>;\n}\n\nexport function computeExecutionHash(args: {\n target: string;\n targetFamily: string;\n execution: Record<string, unknown>;\n}): ExecutionHashBase<string> {\n return sha256(hashContract(args)) as ExecutionHashBase<string>;\n}\n\nexport function computeProfileHash(args: {\n target: string;\n targetFamily: string;\n capabilities: Record<string, Record<string, boolean>>;\n}): ProfileHashBase<string> {\n return sha256(hashContract(args)) as ProfileHashBase<string>;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-domain-CpCcTlqJ.mjs","names":["errors: string[]","type"],"sources":["../src/validate-contract.ts","../src/validate-domain.ts"],"sourcesContent":["import { type } from 'arktype';\nimport type { Contract } from './contract-types';\nimport type { DomainContractShape } from './validate-domain';\nimport { validateContractDomain } from './validate-domain';\n\nexport type ContractValidationPhase = 'structural' | 'domain' | 'storage';\n\nexport class ContractValidationError extends Error {\n readonly code = 'CONTRACT.VALIDATION_FAILED';\n readonly phase: ContractValidationPhase;\n\n constructor(message: string, phase: ContractValidationPhase) {\n super(message);\n this.name = 'ContractValidationError';\n this.phase = phase;\n }\n}\n\n/**\n * Family-provided storage validator.\n * SQL validates tables/columns/FKs; Mongo validates collections/embedding.\n */\nexport type StorageValidator = (contract: Contract) => void;\n\nconst ContractSchema = type({\n target: 'string',\n targetFamily: 'string',\n roots: 'Record<string, string>',\n models: 'Record<string, unknown>',\n 'valueObjects?': 'Record<string, unknown>',\n storage: 'Record<string, unknown>',\n capabilities: 'Record<string, Record<string, boolean>>',\n extensionPacks: 'Record<string, unknown>',\n meta: 'Record<string, unknown>',\n 'execution?': {\n 'executionHash?': 'string',\n mutations: {\n defaults: 'unknown[]',\n },\n },\n profileHash: 'string',\n});\n\nfunction stripPersistenceFields(raw: Record<string, unknown>): Record<string, unknown> {\n const { schemaVersion: _, _generated: _g, ...rest } = raw;\n return rest;\n}\n\nfunction extractDomainShape(contract: Contract): DomainContractShape {\n return {\n roots: contract.roots,\n models: contract.models,\n ...(contract.valueObjects ? { valueObjects: contract.valueObjects } : {}),\n };\n}\n\n/**\n * Framework-level contract validation (ADR 182).\n *\n * Three-pass validation:\n * 1. **Structural validation** (arktype): verifies required fields exist with\n * correct base types.\n * 2. **Domain validation** (framework-owned): roots, relation targets,\n * variant/base consistency, discriminators, ownership, orphans.\n * 3. **Storage validation** (family-provided): SQL validates tables/columns/FKs;\n * Mongo validates collections/embedding.\n *\n * JSON persistence fields (`schemaVersion`, `_generated`) are stripped before\n * validation — they are not part of the in-memory contract representation.\n *\n * @template TContract The fully-typed contract type (preserves literal types).\n * @param value Raw contract value (e.g. parsed from JSON).\n * @param storageValidator Family-specific storage validation function.\n * @returns The validated contract with full literal types.\n */\nexport function validateContract<TContract extends Contract>(\n value: unknown,\n storageValidator: StorageValidator,\n): TContract {\n if (typeof value !== 'object' || value === null) {\n throw new ContractValidationError('Contract must be a non-null object', 'structural');\n }\n\n const stripped = stripPersistenceFields(value as Record<string, unknown>);\n\n const parsed = ContractSchema(stripped);\n if (parsed instanceof type.errors) {\n throw new ContractValidationError(\n `Invalid contract structure: ${parsed.summary}`,\n 'structural',\n );\n }\n\n const contract = parsed as unknown as Contract;\n\n validateContractDomain(extractDomainShape(contract));\n\n storageValidator(contract);\n\n return contract as unknown as TContract;\n}\n","import { ContractValidationError } from './validate-contract';\n\nexport interface DomainModelShape {\n readonly fields: Record<string, unknown>;\n readonly relations?: Record<string, { readonly to: string }>;\n readonly discriminator?: { readonly field: string };\n readonly variants?: Record<string, unknown>;\n readonly base?: string;\n readonly owner?: string;\n}\n\nexport interface DomainContractShape {\n readonly roots: Record<string, string>;\n readonly models: Record<string, DomainModelShape>;\n readonly valueObjects?: Record<string, { readonly fields: Record<string, unknown> }>;\n}\n\nexport function validateContractDomain(contract: DomainContractShape): void {\n const errors: string[] = [];\n const modelNames = new Set(Object.keys(contract.models));\n\n validateRoots(contract, modelNames, errors);\n validateVariantsAndBases(contract, modelNames, errors);\n validateRelationTargets(contract, modelNames, errors);\n validateDiscriminators(contract, errors);\n validateOwnership(contract, modelNames, errors);\n validateValueObjectReferences(contract, errors);\n validateFieldModifiers(contract, errors);\n\n if (errors.length > 0) {\n throw new ContractValidationError(\n `Contract domain validation failed:\\n- ${errors.join('\\n- ')}`,\n 'domain',\n );\n }\n}\n\nfunction validateRoots(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const seenValues = new Set<string>();\n for (const [rootKey, modelName] of Object.entries(contract.roots)) {\n if (seenValues.has(modelName)) {\n errors.push(`Duplicate root value: \"${modelName}\" is mapped by multiple root keys`);\n }\n seenValues.add(modelName);\n\n if (!modelNames.has(modelName)) {\n errors.push(\n `Root \"${rootKey}\" references model \"${modelName}\" which does not exist in models`,\n );\n }\n }\n}\n\nfunction validateVariantsAndBases(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n const models = new Map(Object.entries(contract.models));\n\n for (const [modelName, model] of models) {\n if (model.variants) {\n for (const variantName of Object.keys(model.variants)) {\n if (!modelNames.has(variantName)) {\n errors.push(\n `Model \"${modelName}\" lists variant \"${variantName}\" which does not exist in models`,\n );\n continue;\n }\n const variantModel = models.get(variantName);\n if (!variantModel) continue;\n if (variantModel.base !== modelName) {\n errors.push(\n `Variant \"${variantName}\" has base \"${variantModel.base ?? '(none)'}\" but expected \"${modelName}\"`,\n );\n }\n }\n }\n\n if (model.base) {\n if (!modelNames.has(model.base)) {\n errors.push(`Model \"${modelName}\" has base \"${model.base}\" which does not exist in models`);\n continue;\n }\n const baseModel = models.get(model.base);\n if (!baseModel) continue;\n if (!baseModel.variants || !Object.hasOwn(baseModel.variants, modelName)) {\n errors.push(\n `Model \"${modelName}\" has base \"${model.base}\" which does not list it as a variant`,\n );\n }\n }\n }\n}\n\nfunction validateRelationTargets(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n if (!modelNames.has(relation.to)) {\n errors.push(\n `Relation \"${relName}\" on model \"${modelName}\" targets \"${relation.to}\" which does not exist in models`,\n );\n }\n }\n }\n}\n\nfunction validateDiscriminators(contract: DomainContractShape, errors: string[]): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.discriminator) {\n if (!model.variants || Object.keys(model.variants).length === 0) {\n errors.push(`Model \"${modelName}\" has discriminator but no variants`);\n }\n if (!Object.hasOwn(model.fields, model.discriminator.field)) {\n errors.push(\n `Discriminator field \"${model.discriminator.field}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (model.variants && Object.keys(model.variants).length > 0 && !model.discriminator) {\n errors.push(`Model \"${modelName}\" has variants but no discriminator`);\n }\n\n if (model.base) {\n if (model.discriminator) {\n errors.push(`Model \"${modelName}\" has base and must not have discriminator`);\n }\n if (model.variants && Object.keys(model.variants).length > 0) {\n errors.push(`Model \"${modelName}\" has base and must not have variants`);\n }\n }\n }\n}\n\nfunction validateOwnership(\n contract: DomainContractShape,\n modelNames: Set<string>,\n errors: string[],\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (!model.owner) continue;\n\n if (model.owner === modelName) {\n errors.push(`Model \"${modelName}\" cannot own itself`);\n }\n\n if (!modelNames.has(model.owner)) {\n errors.push(`Model \"${modelName}\" has owner \"${model.owner}\" which does not exist in models`);\n }\n\n for (const [rootKey, rootModel] of Object.entries(contract.roots)) {\n if (rootModel === modelName) {\n errors.push(\n `Owned model \"${modelName}\" must not appear in roots (found as root \"${rootKey}\")`,\n );\n }\n }\n }\n}\n\ninterface FieldTypeLike {\n readonly kind?: string;\n readonly name?: string;\n readonly members?: readonly FieldTypeLike[];\n}\n\ninterface FieldLike {\n readonly type?: FieldTypeLike;\n readonly many?: boolean;\n readonly dict?: boolean;\n}\n\nfunction forEachContractField(\n contract: DomainContractShape,\n callback: (field: unknown, location: string) => void,\n): void {\n for (const [modelName, model] of Object.entries(contract.models)) {\n for (const [fieldName, field] of Object.entries(model.fields)) {\n callback(field, `Model \"${modelName}\" field \"${fieldName}\"`);\n }\n }\n for (const [voName, vo] of Object.entries(contract.valueObjects ?? {})) {\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n callback(field, `Value object \"${voName}\" field \"${fieldName}\"`);\n }\n }\n}\n\nfunction validateValueObjectReferences(contract: DomainContractShape, errors: string[]): void {\n const voNames = new Set(Object.keys(contract.valueObjects ?? {}));\n\n function checkType(type: FieldTypeLike | undefined, location: string): void {\n if (!type) return;\n if (type.kind === 'valueObject' && type.name && !voNames.has(type.name)) {\n errors.push(\n `${location} references value object \"${type.name}\" which does not exist in valueObjects`,\n );\n return;\n }\n if (type.kind === 'union') {\n for (const member of type.members ?? []) checkType(member, location);\n }\n }\n\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n checkType(f?.type, location);\n });\n}\n\nfunction validateFieldModifiers(contract: DomainContractShape, errors: string[]): void {\n forEachContractField(contract, (field, location) => {\n const f = field as FieldLike | undefined;\n if (f?.many && f?.dict) {\n errors.push(`${location} cannot have both \"many\" and \"dict\" modifiers`);\n }\n });\n}\n"],"mappings":"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"}
|