@prisma-next/emitter 0.11.0-dev.68 → 0.11.0-dev.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -176,7 +176,7 @@ const result = await emit(contract, {
176
176
 
177
177
  ## Test Utilities
178
178
 
179
- When writing tests that create `Contract` objects, use the factory helpers from `@prisma-next/contract/testing` or this package’s `test/utils` (`createTestContract`):
179
+ When writing tests that create `Contract` objects, use the factory helpers from `@prisma-next/test-utils` or this package’s `test/utils` (`createTestContract`):
180
180
 
181
181
  ```typescript
182
182
  import { createTestContract } from './test/utils';
@@ -1,3 +1,3 @@
1
- import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-D8MmZ9w8.mjs";
1
+ import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-kyH5YvAl.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 };
@@ -2,6 +2,7 @@ import { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeInters
2
2
  import { canonicalizeContractToObject } from "@prisma-next/contract/hashing";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  import { format } from "prettier";
5
+ import { contractModels, contractValueObjects, resolveSingleDomainNamespaceId } from "@prisma-next/contract/types";
5
6
  //#region src/artifact-paths.ts
6
7
  const JSON_EXTENSION = ".json";
7
8
  function getEmittedArtifactPaths(outputJsonPath) {
@@ -23,18 +24,19 @@ function generateContractDts(contract, emitter, codecTypeImports, hashes, option
23
24
  const familyTypeAliases = emitter.getFamilyTypeAliases(options);
24
25
  const typeMapsExpr = emitter.getTypeMapsExpression();
25
26
  const storageType = emitter.generateStorageType(contract, "StorageHash");
26
- const modelsType = generateModelsType(contract.models, (name, model) => emitter.generateModelStorageType(name, model));
27
+ const domainNamespaceId = resolveSingleDomainNamespaceId(contract.domain);
28
+ const modelsRecord = contractModels(contract, domainNamespaceId);
29
+ const modelsType = generateModelsType(modelsRecord, (name, model) => emitter.generateModelStorageType(name, model));
27
30
  const rootsType = generateRootsType(contract.roots);
28
- const valueObjects = contract.valueObjects;
31
+ const valueObjects = contractValueObjects(contract, domainNamespaceId);
29
32
  const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
30
33
  const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
31
34
  const executionClause = contract.execution !== void 0 ? `\n readonly execution: ${serializeExecutionType(contract.execution)};` : "";
32
- const resolveFieldTypeParams = emitter.resolveFieldTypeParams ? (modelName, fieldName) => {
33
- const model = contract.models?.[modelName];
35
+ const fieldTypesMaps = generateBothFieldTypesMaps(modelsRecord, codecLookup, emitter.resolveFieldTypeParams ? (modelName, fieldName) => {
36
+ const model = modelsRecord[modelName];
34
37
  if (!model) return void 0;
35
38
  return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);
36
- } : void 0;
37
- const fieldTypesMaps = generateBothFieldTypesMaps(contract.models, codecLookup, resolveFieldTypeParams);
39
+ } : void 0);
38
40
  const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
39
41
  return `// ⚠️ GENERATED FILE - DO NOT EDIT
40
42
  // This file is automatically generated by 'prisma-next contract emit'.
@@ -44,6 +46,7 @@ ${importLines.join("\n")}
44
46
  ${familyImportLines.join("\n")}
45
47
  import type {
46
48
  Contract as ContractType,
49
+ ContractModelsMap,
47
50
  ExecutionHashBase,
48
51
  NamespaceId,
49
52
  ProfileHashBase,
@@ -64,11 +67,19 @@ type ContractBase = Omit<
64
67
  ${storageType},
65
68
  ${modelsType}
66
69
  >,
67
- 'roots'
70
+ 'roots' | 'domain'
68
71
  > & {
69
72
  readonly target: ${serializeValue(contract.target)};
70
73
  readonly targetFamily: ${serializeValue(contract.targetFamily)};
71
74
  readonly roots: ${rootsType};
75
+ readonly domain: {
76
+ readonly namespaces: {
77
+ readonly ${domainNamespaceId}: {
78
+ readonly models: ${modelsType};
79
+ ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ""}
80
+ };
81
+ };
82
+ };
72
83
  readonly capabilities: ${serializeValue(contract.capabilities)};
73
84
  readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
74
85
  readonly meta: ${serializeValue(contract.meta)};
@@ -124,4 +135,4 @@ async function emit(contract, stack, targetFamily, options) {
124
135
  //#endregion
125
136
  export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
126
137
 
127
- //# sourceMappingURL=exports-D8MmZ9w8.mjs.map
138
+ //# sourceMappingURL=exports-kyH5YvAl.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-kyH5YvAl.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 {\n type Contract,\n type ContractModel,\n type ContractValueObject,\n contractModels,\n contractValueObjects,\n resolveSingleDomainNamespaceId,\n} 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 {\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 = resolveSingleDomainNamespaceId(contract.domain);\n const modelsRecord = contractModels(contract, domainNamespaceId) 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 = contractValueObjects(contract, domainNamespaceId) 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) => {\n const model = modelsRecord[modelName];\n if (!model) return undefined;\n return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);\n }\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 ContractModelsMap,\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\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;;;iBCKK,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"}
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;;;iBCYK,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"}
@@ -23,7 +23,9 @@ type TestContractOverrides = {
23
23
  schemaVersion?: string;
24
24
  sources?: Record<string, unknown>;
25
25
  };
26
+ /** Models map from canonical contract JSON (`domain.namespaces`, single namespace only). */
27
+ declare function modelsFromCanonicalContract(json: Record<string, unknown>): Record<string, unknown>;
26
28
  declare function createTestContract(overrides?: TestContractOverrides): Contract;
27
29
  //#endregion
28
- export { createTestContract, emit };
30
+ export { createTestContract, emit, modelsFromCanonicalContract };
29
31
  //# sourceMappingURL=utils.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../../test/utils.ts"],"mappings":";;;;;;;AA4CA;;;iBAAgB,IAAA,CACd,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,MAAA,EAAQ,WAAA,EACR,OAAA,GAAU,IAAA,CAAK,WAAA,yBACd,OAAA,CAAQ,UAAA;AAAA,KAQN,qBAAA;EACH,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA,SAAe,cAAA;EACvB,MAAA,GAAS,MAAA;EACT,OAAA,GAAU,MAAA;EACV,YAAA,GAAe,MAAA,SAAe,MAAA;EAC9B,cAAA,GAAiB,MAAA;EACjB,SAAA,GAAY,MAAA;EACZ,IAAA,GAAO,MAAA;EACP,WAAA;EACA,aAAA;EACA,OAAA,GAAU,MAAA;AAAA;AAAA,iBAGI,kBAAA,CAAmB,SAAA,GAAW,qBAAA,GAA6B,QAAQ"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../../test/utils.ts"],"mappings":";;;;;;;AA4CA;;;iBAAgB,IAAA,CACd,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,MAAA,EAAQ,WAAA,EACR,OAAA,GAAU,IAAA,CAAK,WAAA,yBACd,OAAA,CAAQ,UAAA;AAAA,KAQN,qBAAA;EACH,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA,SAAe,cAAA;EACvB,MAAA,GAAS,MAAA;EACT,OAAA,GAAU,MAAA;EACV,YAAA,GAAe,MAAA,SAAe,MAAA;EAC9B,cAAA,GAAiB,MAAA;EACjB,SAAA,GAAY,MAAA;EACZ,IAAA,GAAO,MAAA;EACP,WAAA;EACA,aAAA;EACA,OAAA,GAAU,MAAA;AAAA;;iBAII,2BAAA,CACd,IAAA,EAAM,MAAA,oBACL,MAAM;AAAA,iBAoBO,kBAAA,CAAmB,SAAA,GAAW,qBAAA,GAA6B,QAAQ"}
@@ -1,6 +1,56 @@
1
- import { t as emit$1 } from "../exports-D8MmZ9w8.mjs";
1
+ import { t as emit$1 } from "../exports-kyH5YvAl.mjs";
2
+ import { blindCast } from "@prisma-next/utils/casts";
3
+ import { computeExecutionHash, computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
4
+ import { ifDefined } from "@prisma-next/utils/defined";
5
+ import { UNBOUND_DOMAIN_NAMESPACE_ID, coreHash } from "@prisma-next/contract/types";
2
6
  import { createPreserveEmptyPredicate, createStorageSort } from "@prisma-next/contract/hashing-utils";
3
- import { createContract } from "@prisma-next/contract/testing";
7
+ coreHash("sha256:test");
8
+ const DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} };
9
+ function createContract(overrides = {}) {
10
+ const target = overrides.target ?? "postgres";
11
+ const targetFamily = overrides.targetFamily ?? "sql";
12
+ const capabilities = overrides.capabilities ?? {};
13
+ const rawStorage = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;
14
+ const storageHash = computeStorageHash({
15
+ target,
16
+ targetFamily,
17
+ storage: rawStorage,
18
+ ...ifDefined("shouldPreserveEmpty", overrides.shouldPreserveEmpty),
19
+ ...ifDefined("sortStorage", overrides.sortStorage)
20
+ });
21
+ const storage = {
22
+ ...rawStorage,
23
+ storageHash
24
+ };
25
+ const computedProfileHash = overrides.profileHash ?? computeProfileHash({
26
+ target,
27
+ targetFamily,
28
+ capabilities
29
+ });
30
+ return {
31
+ target,
32
+ targetFamily,
33
+ roots: overrides.roots ?? {},
34
+ domain: { namespaces: { [UNBOUND_DOMAIN_NAMESPACE_ID]: {
35
+ models: overrides.models ?? blindCast({}),
36
+ ...ifDefined("valueObjects", overrides.valueObjects)
37
+ } } },
38
+ storage,
39
+ capabilities,
40
+ extensionPacks: overrides.extensionPacks ?? {},
41
+ ...overrides.execution !== void 0 ? { execution: {
42
+ ...overrides.execution,
43
+ executionHash: computeExecutionHash({
44
+ target,
45
+ targetFamily,
46
+ execution: overrides.execution
47
+ })
48
+ } } : {},
49
+ profileHash: computedProfileHash,
50
+ meta: overrides.meta ?? {}
51
+ };
52
+ }
53
+ //#endregion
4
54
  //#region test/utils.ts
5
55
  const identitySerialize = (c) => c;
6
56
  const SQL_EMIT_HOOKS = {
@@ -68,6 +118,16 @@ function emit(contract, stack, family, options) {
68
118
  serializeContract: identitySerialize
69
119
  });
70
120
  }
121
+ /** Models map from canonical contract JSON (`domain.namespaces`, single namespace only). */
122
+ function modelsFromCanonicalContract(json) {
123
+ const namespaces = json["domain"]?.["namespaces"];
124
+ if (namespaces === void 0) return {};
125
+ const namespaceIds = Object.keys(namespaces);
126
+ if (namespaceIds.length !== 1) throw new Error(`expected exactly one domain namespace in canonical JSON, found ${namespaceIds.length}`);
127
+ const models = namespaces[namespaceIds[0]]?.["models"];
128
+ if (models !== void 0 && typeof models === "object" && models !== null) return models;
129
+ return {};
130
+ }
71
131
  function createTestContract(overrides = {}) {
72
132
  const { storageHash: _sh, schemaVersion: _sv, sources: _src, storage, ...rest } = overrides;
73
133
  const cleanStorage = storage ? (() => {
@@ -80,6 +140,6 @@ function createTestContract(overrides = {}) {
80
140
  });
81
141
  }
82
142
  //#endregion
83
- export { createTestContract, emit };
143
+ export { createTestContract, emit, modelsFromCanonicalContract };
84
144
 
85
145
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":["emitImpl"],"sources":["../../test/utils.ts"],"sourcesContent":["import type {\n CanonicalizeContractOptions,\n PreserveEmptyPredicate,\n} from '@prisma-next/contract/hashing';\nimport {\n createPreserveEmptyPredicate,\n createStorageSort,\n type NamedArraySortTarget,\n type PathPattern,\n} from '@prisma-next/contract/hashing-utils';\nimport { createContract } from '@prisma-next/contract/testing';\nimport type { Contract, CrossReference } from '@prisma-next/contract/types';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport type { EmitOptions, EmitResult, EmitStackInput } from '../src/exports';\nimport { emit as emitImpl } from '../src/exports';\n\nconst identitySerialize = (c: Contract): JsonObject => c as unknown as JsonObject;\n\nconst sqlPreserveEmptyPatterns = [\n ['storage', 'namespaces', '*', 'tables'],\n ['storage', 'namespaces', '*', 'tables', '*'],\n ['storage', 'namespaces', '*', 'tables', '*', ['uniques', 'indexes', 'foreignKeys']],\n ['storage', 'namespaces', '*', 'tables', '*', 'foreignKeys', ['constraint', 'index']],\n ['storage', 'types', '*', 'typeParams'],\n] as const satisfies readonly PathPattern[];\n\nconst sqlSortTargets = [\n { path: ['namespaces', '*', 'tables', '*'], arrayKeys: ['indexes', 'uniques'] },\n] as const satisfies readonly NamedArraySortTarget[];\n\nconst sqlPreserveEmpty = createPreserveEmptyPredicate(sqlPreserveEmptyPatterns);\nconst sqlSortStorage = createStorageSort(sqlSortTargets);\n\nconst SQL_EMIT_HOOKS = {\n shouldPreserveEmpty: sqlPreserveEmpty satisfies PreserveEmptyPredicate,\n sortStorage: sqlSortStorage,\n} satisfies Pick<CanonicalizeContractOptions, 'shouldPreserveEmpty' | 'sortStorage'>;\n\n/**\n * Tests author JSON-clean contracts directly, so the canonicalisation\n * hook trivially passes through. Production callers thread the target\n * descriptor's `contractSerializer.serializeContract` instead.\n */\nexport function emit(\n contract: Contract,\n stack: EmitStackInput,\n family: EmissionSpi,\n options?: Omit<EmitOptions, 'serializeContract'>,\n): Promise<EmitResult> {\n return emitImpl(contract, stack, family, {\n ...SQL_EMIT_HOOKS,\n ...options,\n serializeContract: identitySerialize,\n });\n}\n\ntype TestContractOverrides = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, CrossReference>;\n models?: Record<string, unknown>;\n storage?: Record<string, unknown>;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n execution?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n storageHash?: string;\n schemaVersion?: string;\n sources?: Record<string, unknown>;\n};\n\nexport function createTestContract(overrides: TestContractOverrides = {}): Contract {\n const { storageHash: _sh, schemaVersion: _sv, sources: _src, storage, ...rest } = overrides;\n const cleanStorage = storage\n ? (() => {\n const { storageHash: _innerSh, ...storageRest } = storage as Record<string, unknown>;\n return storageRest;\n })()\n : undefined;\n return createContract({\n ...rest,\n ...(cleanStorage ? { storage: cleanStorage } : {}),\n } as Parameters<typeof createContract>[0]);\n}\n"],"mappings":";;;;AAiBA,MAAM,qBAAqB,MAA4B;AAiBvD,MAAM,iBAAiB;CACrB,qBAJuB,6BAA6B;EAXpD;GAAC;GAAW;GAAc;GAAK;EAAQ;EACvC;GAAC;GAAW;GAAc;GAAK;GAAU;EAAG;EAC5C;GAAC;GAAW;GAAc;GAAK;GAAU;GAAK;IAAC;IAAW;IAAW;GAAa;EAAC;EACnF;GAAC;GAAW;GAAc;GAAK;GAAU;GAAK;GAAe,CAAC,cAAc,OAAO;EAAC;EACpF;GAAC;GAAW;GAAS;GAAK;EAAY;CAOqC,CAIvC;CACpC,aAJqB,kBAAkB,CAJvC;EAAE,MAAM;GAAC;GAAc;GAAK;GAAU;EAAG;EAAG,WAAW,CAAC,WAAW,SAAS;CAAE,CAI1B,CAI1B;AAC5B;;;;;;AAOA,SAAgB,KACd,UACA,OACA,QACA,SACqB;CACrB,OAAOA,OAAS,UAAU,OAAO,QAAQ;EACvC,GAAG;EACH,GAAG;EACH,mBAAmB;CACrB,CAAC;AACH;AAiBA,SAAgB,mBAAmB,YAAmC,CAAC,GAAa;CAClF,MAAM,EAAE,aAAa,KAAK,eAAe,KAAK,SAAS,MAAM,SAAS,GAAG,SAAS;CAClF,MAAM,eAAe,iBACV;EACL,MAAM,EAAE,aAAa,UAAU,GAAG,gBAAgB;EAClD,OAAO;CACT,GAAG,IACH,KAAA;CACJ,OAAO,eAAe;EACpB,GAAG;EACH,GAAI,eAAe,EAAE,SAAS,aAAa,IAAI,CAAC;CAClD,CAAyC;AAC3C"}
1
+ {"version":3,"file":"utils.mjs","names":["emitImpl"],"sources":["../../../../../../test/utils/dist/exports/contract-factories.mjs","../../test/utils.ts"],"sourcesContent":["import { UNBOUND_DOMAIN_NAMESPACE_ID, coreHash } from \"@prisma-next/contract/types\";\nimport { blindCast } from \"@prisma-next/utils/casts\";\nimport { computeExecutionHash, computeProfileHash, computeStorageHash } from \"@prisma-next/contract/hashing\";\nimport { ifDefined } from \"@prisma-next/utils/defined\";\n//#region src/contract-factories.ts\nconst DUMMY_HASH = coreHash(\"sha256:test\");\nconst DEFAULT_FRAMEWORK_STORAGE = { namespaces: {} };\nconst UNBOUND_NAMESPACE_ID = \"__unbound__\";\nconst DEFAULT_SQL_STORAGE = { namespaces: { [UNBOUND_NAMESPACE_ID]: {\n\tid: UNBOUND_NAMESPACE_ID,\n\ttables: {}\n} } };\nfunction createContract(overrides = {}) {\n\tconst target = overrides.target ?? \"postgres\";\n\tconst targetFamily = overrides.targetFamily ?? \"sql\";\n\tconst capabilities = overrides.capabilities ?? {};\n\tconst rawStorage = overrides.storage ?? DEFAULT_FRAMEWORK_STORAGE;\n\tconst storageHash = computeStorageHash({\n\t\ttarget,\n\t\ttargetFamily,\n\t\tstorage: rawStorage,\n\t\t...ifDefined(\"shouldPreserveEmpty\", overrides.shouldPreserveEmpty),\n\t\t...ifDefined(\"sortStorage\", overrides.sortStorage)\n\t});\n\tconst storage = {\n\t\t...rawStorage,\n\t\tstorageHash\n\t};\n\tconst computedProfileHash = overrides.profileHash ?? computeProfileHash({\n\t\ttarget,\n\t\ttargetFamily,\n\t\tcapabilities\n\t});\n\treturn {\n\t\ttarget,\n\t\ttargetFamily,\n\t\troots: overrides.roots ?? {},\n\t\tdomain: { namespaces: { [UNBOUND_DOMAIN_NAMESPACE_ID]: {\n\t\t\tmodels: overrides.models ?? blindCast({}),\n\t\t\t...ifDefined(\"valueObjects\", overrides.valueObjects)\n\t\t} } },\n\t\tstorage,\n\t\tcapabilities,\n\t\textensionPacks: overrides.extensionPacks ?? {},\n\t\t...overrides.execution !== void 0 ? { execution: {\n\t\t\t...overrides.execution,\n\t\t\texecutionHash: computeExecutionHash({\n\t\t\t\ttarget,\n\t\t\t\ttargetFamily,\n\t\t\t\texecution: overrides.execution\n\t\t\t})\n\t\t} } : {},\n\t\tprofileHash: computedProfileHash,\n\t\tmeta: overrides.meta ?? {}\n\t};\n}\nfunction createSqlContract(overrides = {}) {\n\treturn createContract({\n\t\t...overrides,\n\t\ttarget: overrides.target ?? \"postgres\",\n\t\ttargetFamily: overrides.targetFamily ?? \"sql\",\n\t\tstorage: overrides.storage ?? DEFAULT_SQL_STORAGE\n\t});\n}\n//#endregion\nexport { DUMMY_HASH, createContract, createSqlContract };\n\n//# sourceMappingURL=contract-factories.mjs.map","import type {\n CanonicalizeContractOptions,\n PreserveEmptyPredicate,\n} from '@prisma-next/contract/hashing';\nimport {\n createPreserveEmptyPredicate,\n createStorageSort,\n type NamedArraySortTarget,\n type PathPattern,\n} from '@prisma-next/contract/hashing-utils';\nimport type { Contract, CrossReference } from '@prisma-next/contract/types';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\nimport { createContract } from '@prisma-next/test-utils/contract-factories';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport type { EmitOptions, EmitResult, EmitStackInput } from '../src/exports';\nimport { emit as emitImpl } from '../src/exports';\n\nconst identitySerialize = (c: Contract): JsonObject => c as unknown as JsonObject;\n\nconst sqlPreserveEmptyPatterns = [\n ['storage', 'namespaces', '*', 'tables'],\n ['storage', 'namespaces', '*', 'tables', '*'],\n ['storage', 'namespaces', '*', 'tables', '*', ['uniques', 'indexes', 'foreignKeys']],\n ['storage', 'namespaces', '*', 'tables', '*', 'foreignKeys', ['constraint', 'index']],\n ['storage', 'types', '*', 'typeParams'],\n] as const satisfies readonly PathPattern[];\n\nconst sqlSortTargets = [\n { path: ['namespaces', '*', 'tables', '*'], arrayKeys: ['indexes', 'uniques'] },\n] as const satisfies readonly NamedArraySortTarget[];\n\nconst sqlPreserveEmpty = createPreserveEmptyPredicate(sqlPreserveEmptyPatterns);\nconst sqlSortStorage = createStorageSort(sqlSortTargets);\n\nconst SQL_EMIT_HOOKS = {\n shouldPreserveEmpty: sqlPreserveEmpty satisfies PreserveEmptyPredicate,\n sortStorage: sqlSortStorage,\n} satisfies Pick<CanonicalizeContractOptions, 'shouldPreserveEmpty' | 'sortStorage'>;\n\n/**\n * Tests author JSON-clean contracts directly, so the canonicalisation\n * hook trivially passes through. Production callers thread the target\n * descriptor's `contractSerializer.serializeContract` instead.\n */\nexport function emit(\n contract: Contract,\n stack: EmitStackInput,\n family: EmissionSpi,\n options?: Omit<EmitOptions, 'serializeContract'>,\n): Promise<EmitResult> {\n return emitImpl(contract, stack, family, {\n ...SQL_EMIT_HOOKS,\n ...options,\n serializeContract: identitySerialize,\n });\n}\n\ntype TestContractOverrides = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, CrossReference>;\n models?: Record<string, unknown>;\n storage?: Record<string, unknown>;\n capabilities?: Record<string, Record<string, boolean>>;\n extensionPacks?: Record<string, unknown>;\n execution?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n storageHash?: string;\n schemaVersion?: string;\n sources?: Record<string, unknown>;\n};\n\n/** Models map from canonical contract JSON (`domain.namespaces`, single namespace only). */\nexport function modelsFromCanonicalContract(\n json: Record<string, unknown>,\n): Record<string, unknown> {\n const domain = json['domain'] as Record<string, unknown> | undefined;\n const namespaces = domain?.['namespaces'] as Record<string, unknown> | undefined;\n if (namespaces === undefined) {\n return {};\n }\n const namespaceIds = Object.keys(namespaces);\n if (namespaceIds.length !== 1) {\n throw new Error(\n `expected exactly one domain namespace in canonical JSON, found ${namespaceIds.length}`,\n );\n }\n const slice = namespaces[namespaceIds[0]!] as Record<string, unknown> | undefined;\n const models = slice?.['models'];\n if (models !== undefined && typeof models === 'object' && models !== null) {\n return models as Record<string, unknown>;\n }\n return {};\n}\n\nexport function createTestContract(overrides: TestContractOverrides = {}): Contract {\n const { storageHash: _sh, schemaVersion: _sv, sources: _src, storage, ...rest } = overrides;\n const cleanStorage = storage\n ? (() => {\n const { storageHash: _innerSh, ...storageRest } = storage as Record<string, unknown>;\n return storageRest;\n })()\n : undefined;\n return createContract({\n ...rest,\n ...(cleanStorage ? { storage: cleanStorage } : {}),\n } as Parameters<typeof createContract>[0]);\n}\n"],"mappings":";;;;;;AAKmB,SAAS,aAAa;AACzC,MAAM,4BAA4B,EAAE,YAAY,CAAC,EAAE;AAMnD,SAAS,eAAe,YAAY,CAAC,GAAG;CACvC,MAAM,SAAS,UAAU,UAAU;CACnC,MAAM,eAAe,UAAU,gBAAgB;CAC/C,MAAM,eAAe,UAAU,gBAAgB,CAAC;CAChD,MAAM,aAAa,UAAU,WAAW;CACxC,MAAM,cAAc,mBAAmB;EACtC;EACA;EACA,SAAS;EACT,GAAG,UAAU,uBAAuB,UAAU,mBAAmB;EACjE,GAAG,UAAU,eAAe,UAAU,WAAW;CAClD,CAAC;CACD,MAAM,UAAU;EACf,GAAG;EACH;CACD;CACA,MAAM,sBAAsB,UAAU,eAAe,mBAAmB;EACvE;EACA;EACA;CACD,CAAC;CACD,OAAO;EACN;EACA;EACA,OAAO,UAAU,SAAS,CAAC;EAC3B,QAAQ,EAAE,YAAY,GAAG,8BAA8B;GACtD,QAAQ,UAAU,UAAU,UAAU,CAAC,CAAC;GACxC,GAAG,UAAU,gBAAgB,UAAU,YAAY;EACpD,EAAE,EAAE;EACJ;EACA;EACA,gBAAgB,UAAU,kBAAkB,CAAC;EAC7C,GAAG,UAAU,cAAc,KAAK,IAAI,EAAE,WAAW;GAChD,GAAG,UAAU;GACb,eAAe,qBAAqB;IACnC;IACA;IACA,WAAW,UAAU;GACtB,CAAC;EACF,EAAE,IAAI,CAAC;EACP,aAAa;EACb,MAAM,UAAU,QAAQ,CAAC;CAC1B;AACD;;;ACtCA,MAAM,qBAAqB,MAA4B;AAiBvD,MAAM,iBAAiB;CACrB,qBAJuB,6BAA6B;EAXpD;GAAC;GAAW;GAAc;GAAK;EAAQ;EACvC;GAAC;GAAW;GAAc;GAAK;GAAU;EAAG;EAC5C;GAAC;GAAW;GAAc;GAAK;GAAU;GAAK;IAAC;IAAW;IAAW;GAAa;EAAC;EACnF;GAAC;GAAW;GAAc;GAAK;GAAU;GAAK;GAAe,CAAC,cAAc,OAAO;EAAC;EACpF;GAAC;GAAW;GAAS;GAAK;EAAY;CAOqC,CAIvC;CACpC,aAJqB,kBAAkB,CAJvC;EAAE,MAAM;GAAC;GAAc;GAAK;GAAU;EAAG;EAAG,WAAW,CAAC,WAAW,SAAS;CAAE,CAI1B,CAI1B;AAC5B;;;;;;AAOA,SAAgB,KACd,UACA,OACA,QACA,SACqB;CACrB,OAAOA,OAAS,UAAU,OAAO,QAAQ;EACvC,GAAG;EACH,GAAG;EACH,mBAAmB;CACrB,CAAC;AACH;;AAkBA,SAAgB,4BACd,MACyB;CAEzB,MAAM,aADS,KAAK,YACQ;CAC5B,IAAI,eAAe,KAAA,GACjB,OAAO,CAAC;CAEV,MAAM,eAAe,OAAO,KAAK,UAAU;CAC3C,IAAI,aAAa,WAAW,GAC1B,MAAM,IAAI,MACR,kEAAkE,aAAa,QACjF;CAGF,MAAM,SADQ,WAAW,aAAa,MACf;CACvB,IAAI,WAAW,KAAA,KAAa,OAAO,WAAW,YAAY,WAAW,MACnE,OAAO;CAET,OAAO,CAAC;AACV;AAEA,SAAgB,mBAAmB,YAAmC,CAAC,GAAa;CAClF,MAAM,EAAE,aAAa,KAAK,eAAe,KAAK,SAAS,MAAM,SAAS,GAAG,SAAS;CAClF,MAAM,eAAe,iBACV;EACL,MAAM,EAAE,aAAa,UAAU,GAAG,gBAAgB;EAClD,OAAO;CACT,GAAG,IACH,KAAA;CACJ,OAAO,eAAe;EACpB,GAAG;EACH,GAAI,eAAe,EAAE,SAAS,aAAa,IAAI,CAAC;CAClD,CAAyC;AAC3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/emitter",
3
- "version": "0.11.0-dev.68",
3
+ "version": "0.11.0-dev.69",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -9,19 +9,19 @@
9
9
  "src"
10
10
  ],
11
11
  "dependencies": {
12
- "@prisma-next/contract": "0.11.0-dev.68",
13
- "@prisma-next/framework-components": "0.11.0-dev.68",
14
- "@prisma-next/operations": "0.11.0-dev.68",
15
- "@prisma-next/ts-render": "0.11.0-dev.68",
16
- "@prisma-next/utils": "0.11.0-dev.68",
12
+ "@prisma-next/contract": "0.11.0-dev.69",
13
+ "@prisma-next/framework-components": "0.11.0-dev.69",
14
+ "@prisma-next/operations": "0.11.0-dev.69",
15
+ "@prisma-next/ts-render": "0.11.0-dev.69",
16
+ "@prisma-next/utils": "0.11.0-dev.69",
17
17
  "arktype": "^2.2.0",
18
18
  "prettier": "^3.8.3"
19
19
  },
20
20
  "devDependencies": {
21
- "@prisma-next/test-utils": "0.11.0-dev.68",
22
- "@prisma-next/tsconfig": "0.11.0-dev.68",
21
+ "@prisma-next/test-utils": "0.11.0-dev.69",
22
+ "@prisma-next/tsconfig": "0.11.0-dev.69",
23
23
  "@types/node": "25.6.0",
24
- "@prisma-next/tsdown": "0.11.0-dev.68",
24
+ "@prisma-next/tsdown": "0.11.0-dev.69",
25
25
  "tsdown": "0.22.0",
26
26
  "typescript": "5.9.3",
27
27
  "vitest": "4.1.6"
@@ -1,4 +1,11 @@
1
- import type { Contract, ContractModel, ContractValueObject } from '@prisma-next/contract/types';
1
+ import {
2
+ type Contract,
3
+ type ContractModel,
4
+ type ContractValueObject,
5
+ contractModels,
6
+ contractValueObjects,
7
+ resolveSingleDomainNamespaceId,
8
+ } from '@prisma-next/contract/types';
2
9
  import type { CodecLookup } from '@prisma-next/framework-components/codec';
3
10
  import type {
4
11
  EmissionSpi,
@@ -50,14 +57,17 @@ export function generateContractDts(
50
57
 
51
58
  const storageType = emitter.generateStorageType(contract, 'StorageHash');
52
59
 
53
- const modelsType = generateModelsType(
54
- contract.models as Record<string, ContractModel>,
55
- (name, model) => emitter.generateModelStorageType(name, model),
60
+ const domainNamespaceId = resolveSingleDomainNamespaceId(contract.domain);
61
+ const modelsRecord = contractModels(contract, domainNamespaceId) as Record<string, ContractModel>;
62
+ const modelsType = generateModelsType(modelsRecord, (name, model) =>
63
+ emitter.generateModelStorageType(name, model),
56
64
  );
57
65
 
58
66
  const rootsType = generateRootsType(contract.roots);
59
67
 
60
- const valueObjects = contract.valueObjects as Record<string, ContractValueObject> | undefined;
68
+ const valueObjects = contractValueObjects(contract, domainNamespaceId) as
69
+ | Record<string, ContractValueObject>
70
+ | undefined;
61
71
  const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
62
72
  const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
63
73
 
@@ -68,14 +78,14 @@ export function generateContractDts(
68
78
 
69
79
  const resolveFieldTypeParams = emitter.resolveFieldTypeParams
70
80
  ? (modelName: string, fieldName: string) => {
71
- const model = (contract.models as Record<string, ContractModel> | undefined)?.[modelName];
81
+ const model = modelsRecord[modelName];
72
82
  if (!model) return undefined;
73
83
  return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);
74
84
  }
75
85
  : undefined;
76
86
 
77
87
  const fieldTypesMaps = generateBothFieldTypesMaps(
78
- contract.models as Record<string, ContractModel> | undefined,
88
+ modelsRecord,
79
89
  codecLookup,
80
90
  resolveFieldTypeParams,
81
91
  );
@@ -90,6 +100,7 @@ ${importLines.join('\n')}
90
100
  ${familyImportLines.join('\n')}
91
101
  import type {
92
102
  Contract as ContractType,
103
+ ContractModelsMap,
93
104
  ExecutionHashBase,
94
105
  NamespaceId,
95
106
  ProfileHashBase,
@@ -110,11 +121,19 @@ type ContractBase = Omit<
110
121
  ${storageType},
111
122
  ${modelsType}
112
123
  >,
113
- 'roots'
124
+ 'roots' | 'domain'
114
125
  > & {
115
126
  readonly target: ${serializeValue(contract.target)};
116
127
  readonly targetFamily: ${serializeValue(contract.targetFamily)};
117
128
  readonly roots: ${rootsType};
129
+ readonly domain: {
130
+ readonly namespaces: {
131
+ readonly ${domainNamespaceId}: {
132
+ readonly models: ${modelsType};
133
+ ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}
134
+ };
135
+ };
136
+ };
118
137
  readonly capabilities: ${serializeValue(contract.capabilities)};
119
138
  readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
120
139
  readonly meta: ${serializeValue(contract.meta)};
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports-D8MmZ9w8.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 type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n EmissionSpi,\n GenerateContractTypesOptions,\n TypesImportSpec,\n} from '@prisma-next/framework-components/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 modelsType = generateModelsType(\n contract.models as Record<string, ContractModel>,\n (name, model) => emitter.generateModelStorageType(name, model),\n );\n\n const rootsType = generateRootsType(contract.roots);\n\n const valueObjects = contract.valueObjects as Record<string, ContractValueObject> | 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) => {\n const model = (contract.models as Record<string, ContractModel> | undefined)?.[modelName];\n if (!model) return undefined;\n return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);\n }\n : undefined;\n\n const fieldTypesMaps = generateBothFieldTypesMaps(\n contract.models as Record<string, ContractModel> | undefined,\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 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'\n> & {\n readonly target: ${serializeValue(contract.target)};\n readonly targetFamily: ${serializeValue(contract.targetFamily)};\n readonly roots: ${rootsType};\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\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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"}