@prisma-next/emitter 0.12.0-dev.50 → 0.12.0-dev.52
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/exports/index.mjs +1 -1
- package/dist/{exports-CH1MNRIw.mjs → exports-TIvyYtr2.mjs} +22 -25
- package/dist/exports-TIvyYtr2.mjs.map +1 -0
- package/dist/index-I5F4dZMR.d.mts.map +1 -1
- package/dist/test/utils.mjs +1 -1
- package/package.json +9 -9
- package/src/generate-contract-dts.ts +76 -13
- package/dist/exports-CH1MNRIw.mjs.map +0 -1
- package/src/assert-single-domain-namespace-for-emission.ts +0 -20
package/dist/exports/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-
|
|
1
|
+
import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-TIvyYtr2.mjs";
|
|
2
2
|
import { deduplicateImports, generateCodecTypeIntersection, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, serializeObjectKey, serializeValue } from "../domain-type-generation.mjs";
|
|
3
3
|
export { deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateHashTypeAliases, generateImportLines, generateModelsType, generateRootsType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, serializeExecutionType, serializeValue } from "./domain-type-generation.mjs";
|
|
2
|
+
import { blindCast } from "@prisma-next/utils/casts";
|
|
2
3
|
import { canonicalizeContractToObject } from "@prisma-next/contract/hashing";
|
|
3
4
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
5
|
import { format } from "prettier";
|
|
@@ -13,21 +14,6 @@ function getEmittedArtifactPaths(outputJsonPath) {
|
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
//#endregion
|
|
16
|
-
//#region src/assert-single-domain-namespace-for-emission.ts
|
|
17
|
-
/**
|
|
18
|
-
* Contract.d.ts emission supports a single domain namespace only (TML-2550).
|
|
19
|
-
* Multi-namespace contracts must fail loudly rather than silently dropping namespaces.
|
|
20
|
-
*/
|
|
21
|
-
function assertSingleDomainNamespaceForEmission(domain) {
|
|
22
|
-
const [soleNamespaceId, ...rest] = Object.keys(domain.namespaces);
|
|
23
|
-
if (soleNamespaceId === void 0) throw new DomainNamespaceResolutionError("domain has no namespaces");
|
|
24
|
-
if (rest.length > 0) {
|
|
25
|
-
const all = [soleNamespaceId, ...rest];
|
|
26
|
-
throw new DomainNamespaceResolutionError(`expected exactly one domain namespace for contract.d.ts emission, found ${all.length} (${all.join(", ")})`);
|
|
27
|
-
}
|
|
28
|
-
return soleNamespaceId;
|
|
29
|
-
}
|
|
30
|
-
//#endregion
|
|
31
17
|
//#region src/generate-contract-dts.ts
|
|
32
18
|
function generateContractDts(contract, emitter, codecTypeImports, hashes, options, codecLookup) {
|
|
33
19
|
const allImports = [...codecTypeImports];
|
|
@@ -39,15 +25,29 @@ function generateContractDts(contract, emitter, codecTypeImports, hashes, option
|
|
|
39
25
|
const familyTypeAliases = emitter.getFamilyTypeAliases(options);
|
|
40
26
|
const typeMapsExpr = emitter.getTypeMapsExpression();
|
|
41
27
|
const storageType = emitter.generateStorageType(contract, "StorageHash");
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
if (
|
|
45
|
-
const modelsRecord =
|
|
28
|
+
const namespaceEntries = Object.entries(contract.domain.namespaces);
|
|
29
|
+
if (namespaceEntries.length === 0) throw new DomainNamespaceResolutionError("domain has no namespaces");
|
|
30
|
+
for (const [nsId, ns] of namespaceEntries) if (ns === void 0) throw new Error(`domain namespace "${nsId}" is not present on the contract`);
|
|
31
|
+
const modelsRecord = {};
|
|
32
|
+
for (const [, ns] of namespaceEntries) for (const [modelName, model] of Object.entries(blindCast(ns.models))) if (!(modelName in modelsRecord)) modelsRecord[modelName] = model;
|
|
46
33
|
const modelsType = generateModelsType(modelsRecord, (name, model) => emitter.generateModelStorageType(name, model));
|
|
47
34
|
const rootsType = generateRootsType(contract.roots);
|
|
48
|
-
const
|
|
35
|
+
const flatValueObjects = {};
|
|
36
|
+
for (const [, ns] of namespaceEntries) for (const [voName, vo] of Object.entries(blindCast(ns.valueObjects ?? {}))) if (!(voName in flatValueObjects)) flatValueObjects[voName] = vo;
|
|
37
|
+
const valueObjects = Object.keys(flatValueObjects).length > 0 ? flatValueObjects : void 0;
|
|
49
38
|
const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
|
|
50
39
|
const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
|
|
40
|
+
const domainNamespacesType = namespaceEntries.map(([nsId, ns]) => {
|
|
41
|
+
const nsModelsType = generateModelsType(blindCast(ns.models), (name, model) => emitter.generateModelStorageType(name, model));
|
|
42
|
+
const nsValueObjects = blindCast(ns.valueObjects);
|
|
43
|
+
return [
|
|
44
|
+
nsId,
|
|
45
|
+
nsModelsType,
|
|
46
|
+
nsValueObjects !== void 0 && Object.keys(nsValueObjects).length > 0 ? generateValueObjectsDescriptorType(nsValueObjects) : void 0
|
|
47
|
+
];
|
|
48
|
+
}).map(([nsId, nsModelsType, nsValueObjectsDescriptor]) => {
|
|
49
|
+
return ` readonly ${nsId}: {\n readonly models: ${nsModelsType};${nsValueObjectsDescriptor !== void 0 ? `\n readonly valueObjects: ${nsValueObjectsDescriptor};` : ""}\n }`;
|
|
50
|
+
}).join(";\n");
|
|
51
51
|
const executionClause = contract.execution !== void 0 ? `\n readonly execution: ${serializeExecutionType(contract.execution)};` : "";
|
|
52
52
|
const fieldTypesMaps = generateBothFieldTypesMaps(modelsRecord, codecLookup, emitter.resolveFieldTypeParams ? (modelName, fieldName, model) => emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract) : void 0);
|
|
53
53
|
const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
|
|
@@ -87,10 +87,7 @@ ${modelsType}
|
|
|
87
87
|
readonly roots: ${rootsType};
|
|
88
88
|
readonly domain: {
|
|
89
89
|
readonly namespaces: {
|
|
90
|
-
|
|
91
|
-
readonly models: ${modelsType};
|
|
92
|
-
${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ""}
|
|
93
|
-
};
|
|
90
|
+
${domainNamespacesType};
|
|
94
91
|
};
|
|
95
92
|
};
|
|
96
93
|
readonly capabilities: ${serializeValue(contract.capabilities)};
|
|
@@ -150,4 +147,4 @@ async function emit(contract, stack, targetFamily, options) {
|
|
|
150
147
|
//#endregion
|
|
151
148
|
export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
|
|
152
149
|
|
|
153
|
-
//# sourceMappingURL=exports-
|
|
150
|
+
//# sourceMappingURL=exports-TIvyYtr2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports-TIvyYtr2.mjs","names":[],"sources":["../src/artifact-paths.ts","../src/generate-contract-dts.ts","../src/emit.ts"],"sourcesContent":["const JSON_EXTENSION = '.json';\n\nexport interface EmittedArtifactPaths {\n readonly jsonPath: string;\n readonly dtsPath: string;\n}\n\nexport function getEmittedArtifactPaths(outputJsonPath: string): EmittedArtifactPaths {\n if (!outputJsonPath.endsWith(JSON_EXTENSION)) {\n throw new Error('Contract output path must end with .json');\n }\n\n return {\n jsonPath: outputJsonPath,\n dtsPath: `${outputJsonPath.slice(0, -JSON_EXTENSION.length)}.d.ts`,\n };\n}\n","import type { Contract, ContractModel, ContractValueObject } from '@prisma-next/contract/types';\nimport { DomainNamespaceResolutionError } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n EmissionSpi,\n GenerateContractTypesOptions,\n TypesImportSpec,\n} from '@prisma-next/framework-components/emission';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport {\n deduplicateImports,\n generateBothFieldTypesMaps,\n generateCodecTypeIntersection,\n generateHashTypeAliases,\n generateImportLines,\n generateModelsType,\n generateRootsType,\n generateValueObjectsDescriptorType,\n generateValueObjectTypeAliases,\n serializeExecutionType,\n serializeValue,\n} from './domain-type-generation';\n\nexport function generateContractDts(\n contract: Contract,\n emitter: EmissionSpi,\n codecTypeImports: ReadonlyArray<TypesImportSpec>,\n hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n },\n options?: GenerateContractTypesOptions,\n codecLookup?: CodecLookup,\n): string {\n const allImports: TypesImportSpec[] = [...codecTypeImports];\n if (options?.queryOperationTypeImports) {\n allImports.push(...options.queryOperationTypeImports);\n }\n const uniqueImports = deduplicateImports(allImports);\n const importLines = generateImportLines(uniqueImports);\n\n const familyImportLines = emitter.getFamilyImports();\n\n const hashAliases = generateHashTypeAliases(hashes);\n\n const codecTypes = generateCodecTypeIntersection(codecTypeImports, 'CodecTypes');\n\n const familyTypeAliases = emitter.getFamilyTypeAliases(options);\n\n const typeMapsExpr = emitter.getTypeMapsExpression();\n\n const storageType = emitter.generateStorageType(contract, 'StorageHash');\n\n const namespaceEntries = Object.entries(contract.domain.namespaces);\n if (namespaceEntries.length === 0) {\n throw new DomainNamespaceResolutionError('domain has no namespaces');\n }\n\n // Validate all namespace entries are present.\n for (const [nsId, ns] of namespaceEntries) {\n if (ns === undefined) {\n throw new Error(`domain namespace \"${nsId}\" is not present on the contract`);\n }\n }\n\n // Flatten all namespace models into one record — first-name-wins on bare-name collision.\n // This is the documented ORM flatten behaviour; the proper per-namespace .d.ts redesign\n // is explicit-namespace-dsl's job (not this interim unblock).\n const modelsRecord: Record<string, ContractModel> = {};\n for (const [, ns] of namespaceEntries) {\n for (const [modelName, model] of Object.entries(\n blindCast<\n Record<string, ContractModel>,\n 'ns.models is a ContractModel record in the emitted IR'\n >(ns.models),\n )) {\n if (!(modelName in modelsRecord)) {\n modelsRecord[modelName] = model;\n }\n }\n }\n const modelsType = generateModelsType(modelsRecord, (name, model) =>\n emitter.generateModelStorageType(name, model),\n );\n\n const rootsType = generateRootsType(contract.roots);\n\n // Flatten value objects across all namespaces — first-name-wins on collision.\n const flatValueObjects: Record<string, ContractValueObject> = {};\n for (const [, ns] of namespaceEntries) {\n for (const [voName, vo] of Object.entries(\n blindCast<\n Record<string, ContractValueObject>,\n 'ns.valueObjects is a ContractValueObject record in the emitted IR (default to {} when absent)'\n >(ns.valueObjects ?? {}),\n )) {\n if (!(voName in flatValueObjects)) {\n flatValueObjects[voName] = vo;\n }\n }\n }\n const valueObjects = Object.keys(flatValueObjects).length > 0 ? flatValueObjects : undefined;\n const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);\n const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);\n\n // Per-namespace models and value objects types for the domain.namespaces section of ContractBase.\n const perNamespaceTypes: Array<readonly [string, string, string | undefined]> =\n namespaceEntries.map(([nsId, ns]) => {\n const nsModels = blindCast<\n Record<string, ContractModel>,\n 'ns.models is a ContractModel record in the emitted IR'\n >(ns.models);\n const nsModelsType = generateModelsType(nsModels, (name, model) =>\n emitter.generateModelStorageType(name, model),\n );\n const nsValueObjects = blindCast<\n Record<string, ContractValueObject> | undefined,\n 'ns.valueObjects is an optional ContractValueObject record in the emitted IR'\n >(ns.valueObjects);\n const nsValueObjectsDescriptor =\n nsValueObjects !== undefined && Object.keys(nsValueObjects).length > 0\n ? generateValueObjectsDescriptorType(nsValueObjects)\n : undefined;\n return [nsId, nsModelsType, nsValueObjectsDescriptor] as const;\n });\n\n const domainNamespacesType = perNamespaceTypes\n .map(([nsId, nsModelsType, nsValueObjectsDescriptor]) => {\n const voLine =\n nsValueObjectsDescriptor !== undefined\n ? `\\n readonly valueObjects: ${nsValueObjectsDescriptor};`\n : '';\n return ` readonly ${nsId}: {\\n readonly models: ${nsModelsType};${voLine}\\n }`;\n })\n .join(';\\n');\n\n const executionClause =\n contract.execution !== undefined\n ? `\\n readonly execution: ${serializeExecutionType(contract.execution)};`\n : '';\n\n const resolveFieldTypeParams = emitter.resolveFieldTypeParams\n ? (modelName: string, fieldName: string, model: ContractModel) =>\n emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract)\n : undefined;\n\n const fieldTypesMaps = generateBothFieldTypesMaps(\n modelsRecord,\n codecLookup,\n resolveFieldTypeParams,\n );\n\n const contractWrapper = emitter.getContractWrapper('ContractBase', 'TypeMaps');\n\n return `// ⚠️ GENERATED FILE - DO NOT EDIT\n// This file is automatically generated by 'prisma-next contract emit'.\n// To regenerate, run: prisma-next contract emit\n${importLines.join('\\n')}\n\n${familyImportLines.join('\\n')}\nimport type {\n Contract as ContractType,\n ContractModelDefinitions,\n ExecutionHashBase,\n NamespaceId,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\n\n${hashAliases}\n\nexport type CodecTypes = ${codecTypes};\n${familyTypeAliases}\n${valueObjectTypeAliases}\nexport type FieldOutputTypes = ${fieldTypesMaps.output};\nexport type FieldInputTypes = ${fieldTypesMaps.input};\nexport type TypeMaps = ${typeMapsExpr};\n\ntype ContractBase = Omit<\n ContractType<\n${storageType},\n${modelsType}\n >,\n 'roots' | 'domain'\n> & {\n readonly target: ${serializeValue(contract.target)};\n readonly targetFamily: ${serializeValue(contract.targetFamily)};\n readonly roots: ${rootsType};\n readonly domain: {\n readonly namespaces: {\n${domainNamespacesType};\n };\n };\n readonly capabilities: ${serializeValue(contract.capabilities)};\n readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}\n readonly meta: ${serializeValue(contract.meta)};\n ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}\n readonly profileHash: ProfileHash;\n};\n\nexport type Models = ContractModelDefinitions<Contract>;\n\n${contractWrapper}\n`;\n}\n","import { canonicalizeContractToObject } from '@prisma-next/contract/hashing';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { format } from 'prettier';\nimport { getEmittedArtifactPaths } from './artifact-paths';\nimport type { EmitOptions, EmitResult, EmitStackInput } from './emit-types';\nimport { generateContractDts } from './generate-contract-dts';\n\nconst SCHEMA_VERSION = '1';\n\nexport async function emit(\n contract: Contract,\n stack: EmitStackInput,\n targetFamily: EmissionSpi,\n options: EmitOptions,\n): Promise<EmitResult> {\n if (options.outputJsonPath !== undefined) {\n getEmittedArtifactPaths(options.outputJsonPath);\n }\n\n const { codecTypeImports, queryOperationTypeImports } = stack;\n\n const { storageHash } = contract.storage;\n const executionHash = contract.execution?.executionHash;\n const { profileHash } = contract;\n\n const canonicalized = canonicalizeContractToObject(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: options.serializeContract,\n ...ifDefined('shouldPreserveEmpty', options.shouldPreserveEmpty),\n ...ifDefined('sortStorage', options.sortStorage),\n });\n const contractJsonString = JSON.stringify(\n {\n ...canonicalized,\n _generated: {\n warning: '⚠️ GENERATED FILE - DO NOT EDIT',\n message: 'This file is automatically generated by \"prisma-next contract emit\".',\n regenerate: 'To regenerate, run: prisma-next contract emit',\n },\n },\n null,\n 2,\n );\n\n const generateOptions = queryOperationTypeImports ? { queryOperationTypeImports } : undefined;\n\n const contractTypeHashes = {\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n const contractDtsRaw = generateContractDts(\n contract,\n targetFamily,\n codecTypeImports ?? [],\n contractTypeHashes,\n generateOptions,\n stack.codecLookup,\n );\n const contractDts = await format(contractDtsRaw, {\n parser: 'typescript',\n singleQuote: true,\n semi: true,\n printWidth: 100,\n });\n\n return {\n contractJson: contractJsonString,\n contractDts,\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-I5F4dZMR.d.mts","names":[],"sources":["../src/artifact-paths.ts","../src/emit-types.ts","../src/emit.ts","../src/generate-contract-dts.ts"],"mappings":";;;;;;UAEiB,oBAAA;EAAA,SACN,QAAA;EAAA,SACA,OAAO;AAAA;AAAA,iBAGF,uBAAA,CAAwB,cAAA,WAAyB,oBAAoB;;;;;;;AALrF;UCWiB,cAAA;EAAA,SACN,gBAAA,GAAmB,aAAA,CAAc,eAAA;EAAA,SACjC,yBAAA,GAA4B,aAAA,CAAc,eAAA;EAAA,SAC1C,YAAA,GAAe,aAAA;EAAA,SACf,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,WAAA;EAAA,SACN,cAAA;EDd0E;;;;ACMrF;;;;;EDNqF,SCwB1E,iBAAA,EAAmB,iBAAA;EAhBS;;;;EAAA,SAqB5B,mBAAA,GAAsB,sBAAA;EAtBtB;;;;EAAA,SA2BA,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,UAAA;EAAA,SACN,YAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;;;iBCtCW,IAAA,CACpB,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,YAAA,EAAc,WAAA,EACd,OAAA,EAAS,WAAA,GACR,OAAA,CAAQ,UAAA;;;
|
|
1
|
+
{"version":3,"file":"index-I5F4dZMR.d.mts","names":[],"sources":["../src/artifact-paths.ts","../src/emit-types.ts","../src/emit.ts","../src/generate-contract-dts.ts"],"mappings":";;;;;;UAEiB,oBAAA;EAAA,SACN,QAAA;EAAA,SACA,OAAO;AAAA;AAAA,iBAGF,uBAAA,CAAwB,cAAA,WAAyB,oBAAoB;;;;;;;AALrF;UCWiB,cAAA;EAAA,SACN,gBAAA,GAAmB,aAAA,CAAc,eAAA;EAAA,SACjC,yBAAA,GAA4B,aAAA,CAAc,eAAA;EAAA,SAC1C,YAAA,GAAe,aAAA;EAAA,SACf,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,WAAA;EAAA,SACN,cAAA;EDd0E;;;;ACMrF;;;;;EDNqF,SCwB1E,iBAAA,EAAmB,iBAAA;EAhBS;;;;EAAA,SAqB5B,mBAAA,GAAsB,sBAAA;EAtBtB;;;;EAAA,SA2BA,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,UAAA;EAAA,SACN,YAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;;;iBCtCW,IAAA,CACpB,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,YAAA,EAAc,WAAA,EACd,OAAA,EAAS,WAAA,GACR,OAAA,CAAQ,UAAA;;;iBCOK,mBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,WAAA,EACT,gBAAA,EAAkB,aAAA,CAAc,eAAA,GAChC,MAAA;EAAA,SACW,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA,GAEX,OAAA,GAAU,4BAAA,EACV,WAAA,GAAc,WAAA"}
|
package/dist/test/utils.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as emit$1 } from "../exports-
|
|
1
|
+
import { t as emit$1 } from "../exports-TIvyYtr2.mjs";
|
|
2
2
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
3
3
|
import { computeExecutionHash, computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
|
|
4
4
|
import { ifDefined } from "@prisma-next/utils/defined";
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/emitter",
|
|
3
|
-
"version": "0.12.0-dev.
|
|
3
|
+
"version": "0.12.0-dev.52",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.12.0-dev.
|
|
9
|
-
"@prisma-next/framework-components": "0.12.0-dev.
|
|
10
|
-
"@prisma-next/operations": "0.12.0-dev.
|
|
11
|
-
"@prisma-next/ts-render": "0.12.0-dev.
|
|
12
|
-
"@prisma-next/utils": "0.12.0-dev.
|
|
8
|
+
"@prisma-next/contract": "0.12.0-dev.52",
|
|
9
|
+
"@prisma-next/framework-components": "0.12.0-dev.52",
|
|
10
|
+
"@prisma-next/operations": "0.12.0-dev.52",
|
|
11
|
+
"@prisma-next/ts-render": "0.12.0-dev.52",
|
|
12
|
+
"@prisma-next/utils": "0.12.0-dev.52",
|
|
13
13
|
"arktype": "^2.2.0",
|
|
14
14
|
"prettier": "^3.8.3"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@prisma-next/test-utils": "0.12.0-dev.
|
|
18
|
-
"@prisma-next/tsconfig": "0.12.0-dev.
|
|
17
|
+
"@prisma-next/test-utils": "0.12.0-dev.52",
|
|
18
|
+
"@prisma-next/tsconfig": "0.12.0-dev.52",
|
|
19
19
|
"@types/node": "25.6.0",
|
|
20
|
-
"@prisma-next/tsdown": "0.12.0-dev.
|
|
20
|
+
"@prisma-next/tsdown": "0.12.0-dev.52",
|
|
21
21
|
"tsdown": "0.22.0",
|
|
22
22
|
"typescript": "5.9.3",
|
|
23
23
|
"vitest": "4.1.6"
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Contract, ContractModel, ContractValueObject } from '@prisma-next/contract/types';
|
|
2
|
+
import { DomainNamespaceResolutionError } from '@prisma-next/contract/types';
|
|
2
3
|
import type { CodecLookup } from '@prisma-next/framework-components/codec';
|
|
3
4
|
import type {
|
|
4
5
|
EmissionSpi,
|
|
5
6
|
GenerateContractTypesOptions,
|
|
6
7
|
TypesImportSpec,
|
|
7
8
|
} from '@prisma-next/framework-components/emission';
|
|
8
|
-
import {
|
|
9
|
+
import { blindCast } from '@prisma-next/utils/casts';
|
|
9
10
|
import {
|
|
10
11
|
deduplicateImports,
|
|
11
12
|
generateBothFieldTypesMaps,
|
|
@@ -51,24 +52,89 @@ export function generateContractDts(
|
|
|
51
52
|
|
|
52
53
|
const storageType = emitter.generateStorageType(contract, 'StorageHash');
|
|
53
54
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const namespaceEntries = Object.entries(contract.domain.namespaces);
|
|
56
|
+
if (namespaceEntries.length === 0) {
|
|
57
|
+
throw new DomainNamespaceResolutionError('domain has no namespaces');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Validate all namespace entries are present.
|
|
61
|
+
for (const [nsId, ns] of namespaceEntries) {
|
|
62
|
+
if (ns === undefined) {
|
|
63
|
+
throw new Error(`domain namespace "${nsId}" is not present on the contract`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Flatten all namespace models into one record — first-name-wins on bare-name collision.
|
|
68
|
+
// This is the documented ORM flatten behaviour; the proper per-namespace .d.ts redesign
|
|
69
|
+
// is explicit-namespace-dsl's job (not this interim unblock).
|
|
70
|
+
const modelsRecord: Record<string, ContractModel> = {};
|
|
71
|
+
for (const [, ns] of namespaceEntries) {
|
|
72
|
+
for (const [modelName, model] of Object.entries(
|
|
73
|
+
blindCast<
|
|
74
|
+
Record<string, ContractModel>,
|
|
75
|
+
'ns.models is a ContractModel record in the emitted IR'
|
|
76
|
+
>(ns.models),
|
|
77
|
+
)) {
|
|
78
|
+
if (!(modelName in modelsRecord)) {
|
|
79
|
+
modelsRecord[modelName] = model;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
58
82
|
}
|
|
59
|
-
const modelsRecord = domainNamespace.models as Record<string, ContractModel>;
|
|
60
83
|
const modelsType = generateModelsType(modelsRecord, (name, model) =>
|
|
61
84
|
emitter.generateModelStorageType(name, model),
|
|
62
85
|
);
|
|
63
86
|
|
|
64
87
|
const rootsType = generateRootsType(contract.roots);
|
|
65
88
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
// Flatten value objects across all namespaces — first-name-wins on collision.
|
|
90
|
+
const flatValueObjects: Record<string, ContractValueObject> = {};
|
|
91
|
+
for (const [, ns] of namespaceEntries) {
|
|
92
|
+
for (const [voName, vo] of Object.entries(
|
|
93
|
+
blindCast<
|
|
94
|
+
Record<string, ContractValueObject>,
|
|
95
|
+
'ns.valueObjects is a ContractValueObject record in the emitted IR (default to {} when absent)'
|
|
96
|
+
>(ns.valueObjects ?? {}),
|
|
97
|
+
)) {
|
|
98
|
+
if (!(voName in flatValueObjects)) {
|
|
99
|
+
flatValueObjects[voName] = vo;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const valueObjects = Object.keys(flatValueObjects).length > 0 ? flatValueObjects : undefined;
|
|
69
104
|
const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
|
|
70
105
|
const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
|
|
71
106
|
|
|
107
|
+
// Per-namespace models and value objects types for the domain.namespaces section of ContractBase.
|
|
108
|
+
const perNamespaceTypes: Array<readonly [string, string, string | undefined]> =
|
|
109
|
+
namespaceEntries.map(([nsId, ns]) => {
|
|
110
|
+
const nsModels = blindCast<
|
|
111
|
+
Record<string, ContractModel>,
|
|
112
|
+
'ns.models is a ContractModel record in the emitted IR'
|
|
113
|
+
>(ns.models);
|
|
114
|
+
const nsModelsType = generateModelsType(nsModels, (name, model) =>
|
|
115
|
+
emitter.generateModelStorageType(name, model),
|
|
116
|
+
);
|
|
117
|
+
const nsValueObjects = blindCast<
|
|
118
|
+
Record<string, ContractValueObject> | undefined,
|
|
119
|
+
'ns.valueObjects is an optional ContractValueObject record in the emitted IR'
|
|
120
|
+
>(ns.valueObjects);
|
|
121
|
+
const nsValueObjectsDescriptor =
|
|
122
|
+
nsValueObjects !== undefined && Object.keys(nsValueObjects).length > 0
|
|
123
|
+
? generateValueObjectsDescriptorType(nsValueObjects)
|
|
124
|
+
: undefined;
|
|
125
|
+
return [nsId, nsModelsType, nsValueObjectsDescriptor] as const;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const domainNamespacesType = perNamespaceTypes
|
|
129
|
+
.map(([nsId, nsModelsType, nsValueObjectsDescriptor]) => {
|
|
130
|
+
const voLine =
|
|
131
|
+
nsValueObjectsDescriptor !== undefined
|
|
132
|
+
? `\n readonly valueObjects: ${nsValueObjectsDescriptor};`
|
|
133
|
+
: '';
|
|
134
|
+
return ` readonly ${nsId}: {\n readonly models: ${nsModelsType};${voLine}\n }`;
|
|
135
|
+
})
|
|
136
|
+
.join(';\n');
|
|
137
|
+
|
|
72
138
|
const executionClause =
|
|
73
139
|
contract.execution !== undefined
|
|
74
140
|
? `\n readonly execution: ${serializeExecutionType(contract.execution)};`
|
|
@@ -123,10 +189,7 @@ ${modelsType}
|
|
|
123
189
|
readonly roots: ${rootsType};
|
|
124
190
|
readonly domain: {
|
|
125
191
|
readonly namespaces: {
|
|
126
|
-
|
|
127
|
-
readonly models: ${modelsType};
|
|
128
|
-
${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}
|
|
129
|
-
};
|
|
192
|
+
${domainNamespacesType};
|
|
130
193
|
};
|
|
131
194
|
};
|
|
132
195
|
readonly capabilities: ${serializeValue(contract.capabilities)};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exports-CH1MNRIw.mjs","names":[],"sources":["../src/artifact-paths.ts","../src/assert-single-domain-namespace-for-emission.ts","../src/generate-contract-dts.ts","../src/emit.ts"],"sourcesContent":["const JSON_EXTENSION = '.json';\n\nexport interface EmittedArtifactPaths {\n readonly jsonPath: string;\n readonly dtsPath: string;\n}\n\nexport function getEmittedArtifactPaths(outputJsonPath: string): EmittedArtifactPaths {\n if (!outputJsonPath.endsWith(JSON_EXTENSION)) {\n throw new Error('Contract output path must end with .json');\n }\n\n return {\n jsonPath: outputJsonPath,\n dtsPath: `${outputJsonPath.slice(0, -JSON_EXTENSION.length)}.d.ts`,\n };\n}\n","import type { ApplicationDomain } from '@prisma-next/contract/types';\nimport { DomainNamespaceResolutionError } from '@prisma-next/contract/types';\n\n/**\n * Contract.d.ts emission supports a single domain namespace only (TML-2550).\n * Multi-namespace contracts must fail loudly rather than silently dropping namespaces.\n */\nexport function assertSingleDomainNamespaceForEmission(domain: ApplicationDomain): string {\n const [soleNamespaceId, ...rest] = Object.keys(domain.namespaces);\n if (soleNamespaceId === undefined) {\n throw new DomainNamespaceResolutionError('domain has no namespaces');\n }\n if (rest.length > 0) {\n const all = [soleNamespaceId, ...rest];\n throw new DomainNamespaceResolutionError(\n `expected exactly one domain namespace for contract.d.ts emission, found ${all.length} (${all.join(', ')})`,\n );\n }\n return soleNamespaceId;\n}\n","import type { Contract, ContractModel, ContractValueObject } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n EmissionSpi,\n GenerateContractTypesOptions,\n TypesImportSpec,\n} from '@prisma-next/framework-components/emission';\nimport { assertSingleDomainNamespaceForEmission } from './assert-single-domain-namespace-for-emission';\nimport {\n deduplicateImports,\n generateBothFieldTypesMaps,\n generateCodecTypeIntersection,\n generateHashTypeAliases,\n generateImportLines,\n generateModelsType,\n generateRootsType,\n generateValueObjectsDescriptorType,\n generateValueObjectTypeAliases,\n serializeExecutionType,\n serializeValue,\n} from './domain-type-generation';\n\nexport function generateContractDts(\n contract: Contract,\n emitter: EmissionSpi,\n codecTypeImports: ReadonlyArray<TypesImportSpec>,\n hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n },\n options?: GenerateContractTypesOptions,\n codecLookup?: CodecLookup,\n): string {\n const allImports: TypesImportSpec[] = [...codecTypeImports];\n if (options?.queryOperationTypeImports) {\n allImports.push(...options.queryOperationTypeImports);\n }\n const uniqueImports = deduplicateImports(allImports);\n const importLines = generateImportLines(uniqueImports);\n\n const familyImportLines = emitter.getFamilyImports();\n\n const hashAliases = generateHashTypeAliases(hashes);\n\n const codecTypes = generateCodecTypeIntersection(codecTypeImports, 'CodecTypes');\n\n const familyTypeAliases = emitter.getFamilyTypeAliases(options);\n\n const typeMapsExpr = emitter.getTypeMapsExpression();\n\n const storageType = emitter.generateStorageType(contract, 'StorageHash');\n\n const domainNamespaceId = assertSingleDomainNamespaceForEmission(contract.domain);\n const domainNamespace = contract.domain.namespaces[domainNamespaceId];\n if (domainNamespace === undefined) {\n throw new Error(`domain namespace \"${domainNamespaceId}\" is not present on the contract`);\n }\n const modelsRecord = domainNamespace.models as Record<string, ContractModel>;\n const modelsType = generateModelsType(modelsRecord, (name, model) =>\n emitter.generateModelStorageType(name, model),\n );\n\n const rootsType = generateRootsType(contract.roots);\n\n const valueObjects = domainNamespace.valueObjects as\n | Record<string, ContractValueObject>\n | undefined;\n const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);\n const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);\n\n const executionClause =\n contract.execution !== undefined\n ? `\\n readonly execution: ${serializeExecutionType(contract.execution)};`\n : '';\n\n const resolveFieldTypeParams = emitter.resolveFieldTypeParams\n ? (modelName: string, fieldName: string, model: ContractModel) =>\n emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract)\n : undefined;\n\n const fieldTypesMaps = generateBothFieldTypesMaps(\n modelsRecord,\n codecLookup,\n resolveFieldTypeParams,\n );\n\n const contractWrapper = emitter.getContractWrapper('ContractBase', 'TypeMaps');\n\n return `// ⚠️ GENERATED FILE - DO NOT EDIT\n// This file is automatically generated by 'prisma-next contract emit'.\n// To regenerate, run: prisma-next contract emit\n${importLines.join('\\n')}\n\n${familyImportLines.join('\\n')}\nimport type {\n Contract as ContractType,\n ContractModelDefinitions,\n ExecutionHashBase,\n NamespaceId,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\n\n${hashAliases}\n\nexport type CodecTypes = ${codecTypes};\n${familyTypeAliases}\n${valueObjectTypeAliases}\nexport type FieldOutputTypes = ${fieldTypesMaps.output};\nexport type FieldInputTypes = ${fieldTypesMaps.input};\nexport type TypeMaps = ${typeMapsExpr};\n\ntype ContractBase = Omit<\n ContractType<\n${storageType},\n${modelsType}\n >,\n 'roots' | 'domain'\n> & {\n readonly target: ${serializeValue(contract.target)};\n readonly targetFamily: ${serializeValue(contract.targetFamily)};\n readonly roots: ${rootsType};\n readonly domain: {\n readonly namespaces: {\n readonly ${domainNamespaceId}: {\n readonly models: ${modelsType};\n ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}\n };\n };\n };\n readonly capabilities: ${serializeValue(contract.capabilities)};\n readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}\n readonly meta: ${serializeValue(contract.meta)};\n ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}\n readonly profileHash: ProfileHash;\n};\n\nexport type Models = ContractModelDefinitions<Contract>;\n\n${contractWrapper}\n`;\n}\n","import { canonicalizeContractToObject } from '@prisma-next/contract/hashing';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { format } from 'prettier';\nimport { getEmittedArtifactPaths } from './artifact-paths';\nimport type { EmitOptions, EmitResult, EmitStackInput } from './emit-types';\nimport { generateContractDts } from './generate-contract-dts';\n\nconst SCHEMA_VERSION = '1';\n\nexport async function emit(\n contract: Contract,\n stack: EmitStackInput,\n targetFamily: EmissionSpi,\n options: EmitOptions,\n): Promise<EmitResult> {\n if (options.outputJsonPath !== undefined) {\n getEmittedArtifactPaths(options.outputJsonPath);\n }\n\n const { codecTypeImports, queryOperationTypeImports } = stack;\n\n const { storageHash } = contract.storage;\n const executionHash = contract.execution?.executionHash;\n const { profileHash } = contract;\n\n const canonicalized = canonicalizeContractToObject(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: options.serializeContract,\n ...ifDefined('shouldPreserveEmpty', options.shouldPreserveEmpty),\n ...ifDefined('sortStorage', options.sortStorage),\n });\n const contractJsonString = JSON.stringify(\n {\n ...canonicalized,\n _generated: {\n warning: '⚠️ GENERATED FILE - DO NOT EDIT',\n message: 'This file is automatically generated by \"prisma-next contract emit\".',\n regenerate: 'To regenerate, run: prisma-next contract emit',\n },\n },\n null,\n 2,\n );\n\n const generateOptions = queryOperationTypeImports ? { queryOperationTypeImports } : undefined;\n\n const contractTypeHashes = {\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n const contractDtsRaw = generateContractDts(\n contract,\n targetFamily,\n codecTypeImports ?? [],\n contractTypeHashes,\n generateOptions,\n stack.codecLookup,\n );\n const contractDts = await format(contractDtsRaw, {\n parser: 'typescript',\n singleQuote: true,\n semi: true,\n printWidth: 100,\n });\n\n return {\n contractJson: contractJsonString,\n contractDts,\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { ApplicationDomain } from '@prisma-next/contract/types';
|
|
2
|
-
import { DomainNamespaceResolutionError } from '@prisma-next/contract/types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Contract.d.ts emission supports a single domain namespace only (TML-2550).
|
|
6
|
-
* Multi-namespace contracts must fail loudly rather than silently dropping namespaces.
|
|
7
|
-
*/
|
|
8
|
-
export function assertSingleDomainNamespaceForEmission(domain: ApplicationDomain): string {
|
|
9
|
-
const [soleNamespaceId, ...rest] = Object.keys(domain.namespaces);
|
|
10
|
-
if (soleNamespaceId === undefined) {
|
|
11
|
-
throw new DomainNamespaceResolutionError('domain has no namespaces');
|
|
12
|
-
}
|
|
13
|
-
if (rest.length > 0) {
|
|
14
|
-
const all = [soleNamespaceId, ...rest];
|
|
15
|
-
throw new DomainNamespaceResolutionError(
|
|
16
|
-
`expected exactly one domain namespace for contract.d.ts emission, found ${all.length} (${all.join(', ')})`,
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
return soleNamespaceId;
|
|
20
|
-
}
|