@prisma-next/emitter 0.13.0-dev.15 → 0.13.0-dev.17

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.
@@ -1,3 +1,3 @@
1
- import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-lo90ks1p.mjs";
1
+ import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-D8GW2QDx.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 };
@@ -50,7 +50,7 @@ function generateContractDts(contract, emitter, codecTypeImports, hashes, option
50
50
  }).join(";\n");
51
51
  const executionClause = contract.execution !== void 0 ? `\n readonly execution: ${serializeExecutionType(contract.execution)};` : "";
52
52
  const resolveFieldTypeParams = emitter.resolveFieldTypeParams ? (modelName, fieldName, model) => emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract) : void 0;
53
- const resolveEnumValues = (ref) => ref.entityKind === "enum" ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.name]?.members.map((m) => m.value) : void 0;
53
+ const resolveEnumValues = (ref) => ref.entityKind === "enum" ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.entityName]?.members.map((m) => m.value) : void 0;
54
54
  const fieldTypesMaps = generateBothFieldTypesMaps(modelsRecord, codecLookup, resolveFieldTypeParams, resolveEnumValues);
55
55
  const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
56
56
  return `// ⚠️ GENERATED FILE - DO NOT EDIT
@@ -149,4 +149,4 @@ async function emit(contract, stack, targetFamily, options) {
149
149
  //#endregion
150
150
  export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
151
151
 
152
- //# sourceMappingURL=exports-lo90ks1p.mjs.map
152
+ //# sourceMappingURL=exports-D8GW2QDx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-D8GW2QDx.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 type EnumValuesResolver,\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 resolveEnumValues: EnumValuesResolver = (ref) =>\n ref.entityKind === 'enum'\n ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.entityName]?.members.map(\n (m) => m.value,\n )\n : undefined;\n\n const fieldTypesMaps = generateBothFieldTypesMaps(\n modelsRecord,\n codecLookup,\n resolveFieldTypeParams,\n resolveEnumValues,\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,4 +1,4 @@
1
- import { t as emit$1 } from "../exports-lo90ks1p.mjs";
1
+ import { t as emit$1 } from "../exports-D8GW2QDx.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.13.0-dev.15",
3
+ "version": "0.13.0-dev.17",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "dependencies": {
8
- "@prisma-next/contract": "0.13.0-dev.15",
9
- "@prisma-next/framework-components": "0.13.0-dev.15",
10
- "@prisma-next/operations": "0.13.0-dev.15",
11
- "@prisma-next/ts-render": "0.13.0-dev.15",
12
- "@prisma-next/utils": "0.13.0-dev.15",
8
+ "@prisma-next/contract": "0.13.0-dev.17",
9
+ "@prisma-next/framework-components": "0.13.0-dev.17",
10
+ "@prisma-next/operations": "0.13.0-dev.17",
11
+ "@prisma-next/ts-render": "0.13.0-dev.17",
12
+ "@prisma-next/utils": "0.13.0-dev.17",
13
13
  "arktype": "^2.2.0",
14
14
  "prettier": "^3.8.3"
15
15
  },
16
16
  "devDependencies": {
17
- "@prisma-next/test-utils": "0.13.0-dev.15",
18
- "@prisma-next/tsconfig": "0.13.0-dev.15",
17
+ "@prisma-next/test-utils": "0.13.0-dev.17",
18
+ "@prisma-next/tsconfig": "0.13.0-dev.17",
19
19
  "@types/node": "25.9.1",
20
- "@prisma-next/tsdown": "0.13.0-dev.15",
20
+ "@prisma-next/tsdown": "0.13.0-dev.17",
21
21
  "tsdown": "0.22.1",
22
22
  "typescript": "5.9.3",
23
23
  "vitest": "4.1.8"
@@ -148,7 +148,9 @@ export function generateContractDts(
148
148
 
149
149
  const resolveEnumValues: EnumValuesResolver = (ref) =>
150
150
  ref.entityKind === 'enum'
151
- ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.name]?.members.map((m) => m.value)
151
+ ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.entityName]?.members.map(
152
+ (m) => m.value,
153
+ )
152
154
  : undefined;
153
155
 
154
156
  const fieldTypesMaps = generateBothFieldTypesMaps(
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports-lo90ks1p.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 type EnumValuesResolver,\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 resolveEnumValues: EnumValuesResolver = (ref) =>\n ref.entityKind === 'enum'\n ? contract.domain.namespaces[ref.namespaceId]?.enum?.[ref.name]?.members.map((m) => m.value)\n : undefined;\n\n const fieldTypesMaps = generateBothFieldTypesMaps(\n modelsRecord,\n codecLookup,\n resolveFieldTypeParams,\n resolveEnumValues,\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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"}