@prisma-next/emitter 0.11.0 → 0.12.0

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,11 +1,13 @@
1
- import { ContractField, ContractModel, ContractValueObject } from "@prisma-next/contract/types";
1
+ import { ContractField, ContractModel, ContractValueObject, CrossReference } from "@prisma-next/contract/types";
2
2
  import { CodecLookup } from "@prisma-next/framework-components/codec";
3
3
  import { TypesImportSpec } from "@prisma-next/framework-components/emission";
4
4
 
5
5
  //#region src/domain-type-generation.d.ts
6
6
  declare function serializeValue(value: unknown): string;
7
7
  declare function serializeObjectKey(key: string): string;
8
- declare function generateRootsType(roots: Record<string, string> | undefined): string;
8
+ declare function serializeNamespaceId(value: string): string;
9
+ declare function serializeCrossReference(ref: CrossReference): string;
10
+ declare function generateRootsType(roots: Record<string, CrossReference> | undefined): string;
9
11
  declare function generateModelFieldEntry(fieldName: string, field: ContractField): string;
10
12
  declare function generateModelFieldsType(fields: Record<string, ContractField>): string;
11
13
  declare function generateModelRelationsType(relations: Record<string, unknown>): string;
@@ -40,5 +42,5 @@ declare function generateContractFieldDescriptor(fieldName: string, field: Contr
40
42
  declare function generateValueObjectsDescriptorType(valueObjects: Record<string, ContractValueObject> | undefined): string;
41
43
  declare function generateValueObjectTypeAliases(valueObjects: Record<string, ContractValueObject> | undefined, codecLookup?: CodecLookup): string;
42
44
  //#endregion
43
- export { serializeObjectKey as C, serializeExecutionType as S, generateValueObjectType as _, generateCodecTypeIntersection as a, resolveFieldType as b, generateFieldOutputTypesMap as c, generateImportLines as d, generateModelFieldEntry as f, generateRootsType as g, generateModelsType as h, generateBothFieldTypesMaps as i, generateFieldResolvedType as l, generateModelRelationsType as m, ResolvedFieldType as n, generateContractFieldDescriptor as o, generateModelFieldsType as p, deduplicateImports as r, generateFieldInputTypesMap as s, FieldTypeParamsResolver as t, generateHashTypeAliases as u, generateValueObjectTypeAliases as v, serializeValue as w, resolveValueObjectType as x, generateValueObjectsDescriptorType as y };
44
- //# sourceMappingURL=domain-type-generation-DNECvEA1.d.mts.map
45
+ export { serializeExecutionType as C, serializeValue as E, serializeCrossReference as S, serializeObjectKey as T, generateValueObjectType as _, generateCodecTypeIntersection as a, resolveFieldType as b, generateFieldOutputTypesMap as c, generateImportLines as d, generateModelFieldEntry as f, generateRootsType as g, generateModelsType as h, generateBothFieldTypesMaps as i, generateFieldResolvedType as l, generateModelRelationsType as m, ResolvedFieldType as n, generateContractFieldDescriptor as o, generateModelFieldsType as p, deduplicateImports as r, generateFieldInputTypesMap as s, FieldTypeParamsResolver as t, generateHashTypeAliases as u, generateValueObjectTypeAliases as v, serializeNamespaceId as w, resolveValueObjectType as x, generateValueObjectsDescriptorType as y };
46
+ //# sourceMappingURL=domain-type-generation-By4D1JcL.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-type-generation-By4D1JcL.d.mts","names":[],"sources":["../src/domain-type-generation.ts"],"mappings":";;;;;iBAYgB,cAAA,CAAe,KAAc;AAAA,iBA+B7B,kBAAA,CAAmB,GAAW;AAAA,iBAO9B,oBAAA,CAAqB,KAAa;AAAA,iBAIlC,uBAAA,CAAwB,GAAmB,EAAd,cAAc;AAAA,iBAM3C,iBAAA,CAAkB,KAAA,EAAO,MAAM,SAAS,cAAA;AAAA,iBAgBxC,uBAAA,CAAwB,SAAA,UAAmB,KAAA,EAAO,aAAa;AAAA,iBAgB/D,uBAAA,CAAwB,MAAA,EAAQ,MAAM,SAAS,aAAA;AAAA,iBAQ/C,0BAAA,CAA2B,SAAkC,EAAvB,MAAM;AAAA,iBAyC5C,kBAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,GACvB,oBAAA,GAAuB,SAAA,UAAmB,KAAA,EAAO,aAAA;AAAA,iBAqCnC,kBAAA,CAAmB,OAAA,EAAS,eAAA,KAAoB,eAAe;AAAA,iBAa/D,mBAAA,CAAoB,OAA0B,EAAjB,eAAe;AAAA,iBAW5C,6BAAA,CACd,OAAA,EAAS,aAAa,CAAC,eAAA,GACvB,KAAA;AAAA,iBAMc,sBAAA,CAAuB,SAAkC,EAAvB,MAAM;AAAA,iBASxC,uBAAA,CAAwB,MAAA;EAAA,SAC7B,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;AAAA,KAaC,iBAAA;EAAA,SAA+B,KAAA;EAAA,SAAwB,MAAM;AAAA;AAjLzE;;;;;AAAA,KAgMY,uBAAA,IACV,SAAA,UACA,SAAA,aACG,MAAM;AAAA,iBAEK,gBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAA,EACd,kBAAA,GAAqB,MAAA,oBACpB,iBAAA;AAAA,iBAkDa,yBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAW,EACzB,IAAA;AAAA,iBAKc,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA,GACxB,iBAAA;AAAA,iBA2Ca,2BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA;AAAA,iBAKX,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA;AAAA,iBAKX,uBAAA,CACd,OAAA,UACA,EAAA,EAAI,mBAAA,EACJ,aAAA,EAAe,MAAA,SAAe,mBAAA,GAC9B,IAAA,uBACA,WAAA,GAAc,WAAA;AAAA,iBAKA,sBAAA,CACd,OAAA,UACA,EAAA,EAAI,mBAAA,EACJ,aAAA,EAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,GACb,iBAAA;AAAA,iBAgBa,+BAAA,CAAgC,SAAA,UAAmB,KAAA,EAAO,aAAa;AAAA,iBAoBvE,kCAAA,CACd,YAAA,EAAc,MAAM,SAAS,mBAAA;AAAA,iBAoBf,8BAAA,CACd,YAAA,EAAc,MAAA,SAAe,mBAAA,eAC7B,WAAA,GAAc,WAAA"}
@@ -1,2 +1,2 @@
1
- import { C as serializeObjectKey, S as serializeExecutionType, _ as generateValueObjectType, a as generateCodecTypeIntersection, b as resolveFieldType, c as generateFieldOutputTypesMap, d as generateImportLines, f as generateModelFieldEntry, g as generateRootsType, h as generateModelsType, i as generateBothFieldTypesMaps, l as generateFieldResolvedType, m as generateModelRelationsType, n as ResolvedFieldType, o as generateContractFieldDescriptor, p as generateModelFieldsType, r as deduplicateImports, s as generateFieldInputTypesMap, t as FieldTypeParamsResolver, u as generateHashTypeAliases, v as generateValueObjectTypeAliases, w as serializeValue, x as resolveValueObjectType, y as generateValueObjectsDescriptorType } from "./domain-type-generation-DNECvEA1.mjs";
2
- export { FieldTypeParamsResolver, ResolvedFieldType, deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, resolveFieldType, resolveValueObjectType, serializeExecutionType, serializeObjectKey, serializeValue };
1
+ import { C as serializeExecutionType, E as serializeValue, S as serializeCrossReference, T as serializeObjectKey, _ as generateValueObjectType, a as generateCodecTypeIntersection, b as resolveFieldType, c as generateFieldOutputTypesMap, d as generateImportLines, f as generateModelFieldEntry, g as generateRootsType, h as generateModelsType, i as generateBothFieldTypesMaps, l as generateFieldResolvedType, m as generateModelRelationsType, n as ResolvedFieldType, o as generateContractFieldDescriptor, p as generateModelFieldsType, r as deduplicateImports, s as generateFieldInputTypesMap, t as FieldTypeParamsResolver, u as generateHashTypeAliases, v as generateValueObjectTypeAliases, w as serializeNamespaceId, x as resolveValueObjectType, y as generateValueObjectsDescriptorType } from "./domain-type-generation-By4D1JcL.mjs";
2
+ export { FieldTypeParamsResolver, ResolvedFieldType, deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, resolveFieldType, resolveValueObjectType, serializeCrossReference, serializeExecutionType, serializeNamespaceId, serializeObjectKey, serializeValue };
@@ -1,4 +1,6 @@
1
1
  import { isSafeTypeExpression } from "./type-expression-safety.mjs";
2
+ import { renderImports } from "@prisma-next/ts-render";
3
+ import { blindCast } from "@prisma-next/utils/casts";
2
4
  //#region src/domain-type-generation.ts
3
5
  function serializeValue(value) {
4
6
  if (value === null) return "null";
@@ -18,9 +20,15 @@ function serializeObjectKey(key) {
18
20
  if (/^[$A-Z_a-z][$\w]*$/.test(key)) return key;
19
21
  return serializeValue(key);
20
22
  }
23
+ function serializeNamespaceId(value) {
24
+ return `${serializeValue(value)} & NamespaceId`;
25
+ }
26
+ function serializeCrossReference(ref) {
27
+ return `{ readonly namespace: ${serializeNamespaceId(String(ref.namespace))}; readonly model: ${serializeValue(ref.model)} }`;
28
+ }
21
29
  function generateRootsType(roots) {
22
- if (!roots || Object.keys(roots).length === 0) return "Record<string, string>";
23
- return `{ ${Object.entries(roots).map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`).join("; ")} }`;
30
+ if (!roots || Object.keys(roots).length === 0) return "Record<string, never>";
31
+ return `{ ${Object.entries(roots).map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeCrossReference(value)}`).join("; ")} }`;
24
32
  }
25
33
  function contractFieldModifierSuffix(field) {
26
34
  return (field.many === true ? "; readonly many: true" : "") + (field.dict === true ? "; readonly dict: true" : "");
@@ -46,7 +54,7 @@ function generateModelRelationsType(relations) {
46
54
  if (typeof rel !== "object" || rel === null) continue;
47
55
  const relObj = rel;
48
56
  const parts = [];
49
- if (relObj["to"]) parts.push(`readonly to: ${serializeValue(relObj["to"])}`);
57
+ if (relObj["to"]) parts.push(`readonly to: ${serializeCrossReference(blindCast(relObj["to"]))}`);
50
58
  if (relObj["cardinality"]) parts.push(`readonly cardinality: ${serializeValue(relObj["cardinality"])}`);
51
59
  const on = relObj["on"];
52
60
  if (on && (!on.localFields || !on.targetFields)) throw new Error(`Relation "${relName}" has an "on" block but is missing localFields or targetFields`);
@@ -75,7 +83,7 @@ function generateModelsType(models, generateModelStorage) {
75
83
  if (model.owner) modelParts.push(`readonly owner: ${serializeValue(model.owner)}`);
76
84
  if (model.discriminator) modelParts.push(`readonly discriminator: ${serializeValue(model.discriminator)}`);
77
85
  if (model.variants) modelParts.push(`readonly variants: ${serializeValue(model.variants)}`);
78
- if (model.base) modelParts.push(`readonly base: ${serializeValue(model.base)}`);
86
+ if (model.base) modelParts.push(`readonly base: ${serializeCrossReference(model.base)}`);
79
87
  modelTypes.push(`readonly ${modelName}: { ${modelParts.join("; ")} }`);
80
88
  }
81
89
  return `{ ${modelTypes.join("; ")} }`;
@@ -93,9 +101,13 @@ function deduplicateImports(imports) {
93
101
  return result;
94
102
  }
95
103
  function generateImportLines(imports) {
96
- return imports.map((imp) => {
97
- return `import type { ${imp.named === imp.alias ? imp.named : `${imp.named} as ${imp.alias}`} } from '${imp.package}';`;
98
- });
104
+ const rendered = renderImports(imports.map((imp) => ({
105
+ moduleSpecifier: imp.package,
106
+ symbol: imp.named,
107
+ alias: imp.alias,
108
+ typeOnly: true
109
+ })));
110
+ return rendered === "" ? [] : rendered.split("\n");
99
111
  }
100
112
  function generateCodecTypeIntersection(imports, named) {
101
113
  return imports.filter((imp) => imp.named === named).map((imp) => imp.alias).join(" & ") || "Record<string, never>";
@@ -247,6 +259,6 @@ function generateValueObjectTypeAliases(valueObjects, codecLookup) {
247
259
  return aliases.join("\n");
248
260
  }
249
261
  //#endregion
250
- export { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, resolveFieldType, resolveValueObjectType, serializeExecutionType, serializeObjectKey, serializeValue };
262
+ export { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, resolveFieldType, resolveValueObjectType, serializeCrossReference, serializeExecutionType, serializeNamespaceId, serializeObjectKey, serializeValue };
251
263
 
252
264
  //# sourceMappingURL=domain-type-generation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-type-generation.mjs","names":[],"sources":["../src/domain-type-generation.ts"],"sourcesContent":["import type {\n ContractField,\n ContractModel,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport { isSafeTypeExpression } from './type-expression-safety';\n\nexport function serializeValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (typeof value === 'string') {\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n return `'${escaped}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (typeof value === 'bigint') {\n return `${value}n`;\n }\n if (Array.isArray(value)) {\n const items = value.map((v) => serializeValue(v)).join(', ');\n return `readonly [${items}]`;\n }\n if (typeof value === 'object') {\n const entries: string[] = [];\n for (const [k, v] of Object.entries(value)) {\n entries.push(`readonly ${serializeObjectKey(k)}: ${serializeValue(v)}`);\n }\n return `{ ${entries.join('; ')} }`;\n }\n return 'unknown';\n}\n\nexport function serializeObjectKey(key: string): string {\n if (/^[$A-Z_a-z][$\\w]*$/.test(key)) {\n return key;\n }\n return serializeValue(key);\n}\n\nexport function generateRootsType(roots: Record<string, string> | undefined): string {\n if (!roots || Object.keys(roots).length === 0) {\n return 'Record<string, string>';\n }\n const entries = Object.entries(roots)\n .map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`)\n .join('; ');\n return `{ ${entries} }`;\n}\n\nfunction contractFieldModifierSuffix(field: ContractField): string {\n const many = field.many === true ? '; readonly many: true' : '';\n const dict = field.dict === true ? '; readonly dict: true' : '';\n return many + dict;\n}\n\nexport function generateModelFieldEntry(fieldName: string, field: ContractField): string {\n const mods = contractFieldModifierSuffix(field);\n const { nullable, type } = field;\n if (type.kind === 'scalar') {\n const typeParamsSpec =\n type.typeParams && Object.keys(type.typeParams).length > 0\n ? `; readonly typeParams: ${serializeValue(type.typeParams)}`\n : '';\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: { readonly kind: 'scalar'; readonly codecId: ${serializeValue(type.codecId)}${typeParamsSpec} }${mods} }`;\n }\n if (type.kind === 'valueObject') {\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: { readonly kind: 'valueObject'; readonly name: ${serializeValue(type.name)} }${mods} }`;\n }\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: ${serializeValue(type)}${mods} }`;\n}\n\nexport function generateModelFieldsType(fields: Record<string, ContractField>): string {\n const fieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(fields)) {\n fieldEntries.push(generateModelFieldEntry(fieldName, field));\n }\n return fieldEntries.length > 0 ? `{ ${fieldEntries.join('; ')} }` : 'Record<string, never>';\n}\n\nexport function generateModelRelationsType(relations: Record<string, unknown>): string {\n const relationEntries: string[] = [];\n\n for (const [relName, rel] of Object.entries(relations)) {\n if (typeof rel !== 'object' || rel === null) continue;\n const relObj = rel as Record<string, unknown>;\n const parts: string[] = [];\n\n if (relObj['to']) parts.push(`readonly to: ${serializeValue(relObj['to'])}`);\n if (relObj['cardinality'])\n parts.push(`readonly cardinality: ${serializeValue(relObj['cardinality'])}`);\n\n const on = relObj['on'] as { localFields?: string[]; targetFields?: string[] } | undefined;\n if (on && (!on.localFields || !on.targetFields)) {\n throw new Error(\n `Relation \"${relName}\" has an \"on\" block but is missing localFields or targetFields`,\n );\n }\n if (on?.localFields && on.targetFields) {\n const localFields = on.localFields.map((f) => serializeValue(f)).join(', ');\n const targetFields = on.targetFields.map((f) => serializeValue(f)).join(', ');\n parts.push(\n `readonly on: { readonly localFields: readonly [${localFields}]; readonly targetFields: readonly [${targetFields}] }`,\n );\n }\n\n if (parts.length > 0) {\n relationEntries.push(`readonly ${relName}: { ${parts.join('; ')} }`);\n }\n }\n\n if (relationEntries.length === 0) {\n return 'Record<string, never>';\n }\n\n return `{ ${relationEntries.join('; ')} }`;\n}\n\nexport function generateModelsType(\n models: Record<string, ContractModel>,\n generateModelStorage: (modelName: string, model: ContractModel) => string,\n): string {\n if (!models || Object.keys(models).length === 0) {\n return 'Record<string, never>';\n }\n\n const modelTypes: string[] = [];\n for (const [modelName, model] of Object.entries(models).sort(([a], [b]) => a.localeCompare(b))) {\n const fieldsType = generateModelFieldsType(model.fields);\n const relationsType = generateModelRelationsType(model.relations);\n const storageType = generateModelStorage(modelName, model);\n\n const modelParts: string[] = [\n `readonly fields: ${fieldsType}`,\n `readonly relations: ${relationsType}`,\n `readonly storage: ${storageType}`,\n ];\n\n if (model.owner) {\n modelParts.push(`readonly owner: ${serializeValue(model.owner)}`);\n }\n if (model.discriminator) {\n modelParts.push(`readonly discriminator: ${serializeValue(model.discriminator)}`);\n }\n if (model.variants) {\n modelParts.push(`readonly variants: ${serializeValue(model.variants)}`);\n }\n if (model.base) {\n modelParts.push(`readonly base: ${serializeValue(model.base)}`);\n }\n\n modelTypes.push(`readonly ${modelName}: { ${modelParts.join('; ')} }`);\n }\n\n return `{ ${modelTypes.join('; ')} }`;\n}\n\nexport function deduplicateImports(imports: TypesImportSpec[]): TypesImportSpec[] {\n const seenKeys = new Set<string>();\n const result: TypesImportSpec[] = [];\n for (const imp of imports) {\n const key = `${imp.package}::${imp.named}`;\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n result.push(imp);\n }\n }\n return result;\n}\n\nexport function generateImportLines(imports: TypesImportSpec[]): string[] {\n return imports.map((imp) => {\n const importClause = imp.named === imp.alias ? imp.named : `${imp.named} as ${imp.alias}`;\n return `import type { ${importClause} } from '${imp.package}';`;\n });\n}\n\nexport function generateCodecTypeIntersection(\n imports: ReadonlyArray<TypesImportSpec>,\n named: string,\n): string {\n const aliases = imports.filter((imp) => imp.named === named).map((imp) => imp.alias);\n return aliases.join(' & ') || 'Record<string, never>';\n}\n\nexport function serializeExecutionType(execution: Record<string, unknown>): string {\n const parts: string[] = ['readonly executionHash: ExecutionHash'];\n for (const [key, value] of Object.entries(execution)) {\n if (key === 'executionHash') continue;\n parts.push(`readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`);\n }\n return `{ ${parts.join('; ')} }`;\n}\n\nexport function generateHashTypeAliases(hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n}): string {\n const executionHashType = hashes.executionHash\n ? `ExecutionHashBase<'${hashes.executionHash}'>`\n : 'ExecutionHashBase<string>';\n\n return [\n `export type StorageHash = StorageHashBase<'${hashes.storageHash}'>;`,\n `export type ExecutionHash = ${executionHashType};`,\n `export type ProfileHash = ProfileHashBase<'${hashes.profileHash}'>;`,\n ].join('\\n');\n}\n\nexport type ResolvedFieldType = { readonly input: string; readonly output: string };\n\nfunction applyModifiers(base: string, field: ContractField): string {\n let result = base;\n if (field.many === true) result = `ReadonlyArray<${result}>`;\n if (field.dict === true) result = `Readonly<Record<string, ${result}>>`;\n if (field.nullable) result = `${result} | null`;\n return result;\n}\n\n/**\n * Per-family resolver for typeParams that don't live inline on the framework-domain `ContractField`. SQL columns authored via a named `storage.types` entry carry their `typeRef` on the storage column (family-specific) rather than on the framework's domain field; the per-family emitter walks `storage.types[ref].typeParams` here so the framework emit path can render the parameterized output type.\n *\n * Returns `undefined` when the field has no resolvable typeParams (i.e. the column isn't parameterized, isn't a `typeRef`, or the family doesn't support named storage types).\n */\nexport type FieldTypeParamsResolver = (\n modelName: string,\n fieldName: string,\n) => Record<string, unknown> | undefined;\n\nexport function resolveFieldType(\n field: ContractField,\n codecLookup?: CodecLookup,\n resolvedTypeParams?: Record<string, unknown>,\n): ResolvedFieldType {\n const { type } = field;\n\n switch (type.kind) {\n case 'scalar': {\n let outputResolved: string | undefined;\n const inlineTypeParams =\n type.typeParams && Object.keys(type.typeParams).length > 0 ? type.typeParams : undefined;\n const effectiveTypeParams = inlineTypeParams ?? resolvedTypeParams;\n if (codecLookup && effectiveTypeParams && Object.keys(effectiveTypeParams).length > 0) {\n const rendered = codecLookup.renderOutputTypeFor(type.codecId, effectiveTypeParams);\n if (rendered && isSafeTypeExpression(rendered)) {\n outputResolved = rendered;\n }\n }\n const codecAccessor = `CodecTypes[${serializeValue(type.codecId)}]`;\n return {\n output: applyModifiers(outputResolved ?? `${codecAccessor}['output']`, field),\n input: applyModifiers(`${codecAccessor}['input']`, field),\n };\n }\n case 'valueObject':\n return {\n output: applyModifiers(`${type.name}Output`, field),\n input: applyModifiers(`${type.name}Input`, field),\n };\n case 'union': {\n const outputMembers = type.members.map((m) =>\n m.kind === 'scalar'\n ? `CodecTypes[${serializeValue(m.codecId)}]['output']`\n : `${m.name}Output`,\n );\n const inputMembers = type.members.map((m) =>\n m.kind === 'scalar'\n ? `CodecTypes[${serializeValue(m.codecId)}]['input']`\n : `${m.name}Input`,\n );\n return {\n output: applyModifiers(outputMembers.join(' | '), field),\n input: applyModifiers(inputMembers.join(' | '), field),\n };\n }\n default:\n return {\n output: applyModifiers('unknown', field),\n input: applyModifiers('unknown', field),\n };\n }\n}\n\nexport function generateFieldResolvedType(\n field: ContractField,\n codecLookup?: CodecLookup,\n side: 'input' | 'output' = 'output',\n): string {\n return resolveFieldType(field, codecLookup)[side];\n}\n\nexport function generateBothFieldTypesMaps(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): ResolvedFieldType {\n if (!models || Object.keys(models).length === 0) {\n return { output: 'Record<string, never>', input: 'Record<string, never>' };\n }\n\n const outputModelEntries: string[] = [];\n const inputModelEntries: string[] = [];\n for (const [modelName, model] of Object.entries(models).sort(([a], [b]) => a.localeCompare(b))) {\n if (!model) continue;\n const outputFieldEntries: string[] = [];\n const inputFieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(model.fields)) {\n const inlineTypeParams =\n field.type.kind === 'scalar' &&\n field.type.typeParams &&\n Object.keys(field.type.typeParams).length > 0\n ? field.type.typeParams\n : undefined;\n const resolvedTypeParams = inlineTypeParams ?? resolveFieldTypeParams?.(modelName, fieldName);\n const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams);\n const key = `readonly ${serializeObjectKey(fieldName)}`;\n outputFieldEntries.push(`${key}: ${resolved.output}`);\n inputFieldEntries.push(`${key}: ${resolved.input}`);\n }\n const outputFields =\n outputFieldEntries.length > 0\n ? `{ ${outputFieldEntries.join('; ')} }`\n : 'Record<string, never>';\n const inputFields =\n inputFieldEntries.length > 0\n ? `{ ${inputFieldEntries.join('; ')} }`\n : 'Record<string, never>';\n const modelKey = `readonly ${serializeObjectKey(modelName)}`;\n outputModelEntries.push(`${modelKey}: ${outputFields}`);\n inputModelEntries.push(`${modelKey}: ${inputFields}`);\n }\n\n return {\n output: `{ ${outputModelEntries.join('; ')} }`,\n input: `{ ${inputModelEntries.join('; ')} }`,\n };\n}\n\nexport function generateFieldOutputTypesMap(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): string {\n return generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams).output;\n}\n\nexport function generateFieldInputTypesMap(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): string {\n return generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams).input;\n}\n\nexport function generateValueObjectType(\n _voName: string,\n vo: ContractValueObject,\n _valueObjects: Record<string, ContractValueObject>,\n side: 'input' | 'output' = 'output',\n codecLookup?: CodecLookup,\n): string {\n return resolveValueObjectType(_voName, vo, _valueObjects, codecLookup)[side];\n}\n\nexport function resolveValueObjectType(\n _voName: string,\n vo: ContractValueObject,\n _valueObjects: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n): ResolvedFieldType {\n const outputEntries: string[] = [];\n const inputEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n const resolved = resolveFieldType(field, codecLookup);\n const key = `readonly ${serializeObjectKey(fieldName)}`;\n outputEntries.push(`${key}: ${resolved.output}`);\n inputEntries.push(`${key}: ${resolved.input}`);\n }\n const empty = 'Record<string, never>';\n return {\n output: outputEntries.length > 0 ? `{ ${outputEntries.join('; ')} }` : empty,\n input: inputEntries.length > 0 ? `{ ${inputEntries.join('; ')} }` : empty,\n };\n}\n\nexport function generateContractFieldDescriptor(fieldName: string, field: ContractField): string {\n const mods: string[] = [];\n if (field.many === true) mods.push('; readonly many: true');\n if (field.dict === true) mods.push('; readonly dict: true');\n const modStr = mods.join('');\n\n const { type } = field;\n if (type.kind === 'scalar') {\n const typeParamsSpec =\n type.typeParams && Object.keys(type.typeParams).length > 0\n ? `; readonly typeParams: ${serializeValue(type.typeParams)}`\n : '';\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: { readonly kind: 'scalar'; readonly codecId: ${serializeValue(type.codecId)}${typeParamsSpec} }${modStr} }`;\n }\n if (type.kind === 'valueObject') {\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: { readonly kind: 'valueObject'; readonly name: ${serializeValue(type.name)} }${modStr} }`;\n }\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: ${serializeValue(type)}${modStr} }`;\n}\n\nexport function generateValueObjectsDescriptorType(\n valueObjects: Record<string, ContractValueObject> | undefined,\n): string {\n if (!valueObjects || Object.keys(valueObjects).length === 0) {\n return 'Record<string, never>';\n }\n\n const voEntries: string[] = [];\n for (const [voName, vo] of Object.entries(valueObjects)) {\n const fieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n fieldEntries.push(generateContractFieldDescriptor(fieldName, field));\n }\n const fieldsType =\n fieldEntries.length > 0 ? `{ ${fieldEntries.join('; ')} }` : 'Record<string, never>';\n voEntries.push(`readonly ${serializeObjectKey(voName)}: { readonly fields: ${fieldsType} }`);\n }\n\n return `{ ${voEntries.join('; ')} }`;\n}\n\nexport function generateValueObjectTypeAliases(\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup?: CodecLookup,\n): string {\n if (!valueObjects || Object.keys(valueObjects).length === 0) {\n return '';\n }\n\n const aliases: string[] = [];\n for (const [voName, vo] of Object.entries(valueObjects)) {\n const resolved = resolveValueObjectType(voName, vo, valueObjects, codecLookup);\n aliases.push(`export type ${voName}Output = ${resolved.output};`);\n aliases.push(`export type ${voName}Input = ${resolved.input};`);\n }\n return aliases.join('\\n');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"domain-type-generation.mjs","names":[],"sources":["../src/domain-type-generation.ts"],"sourcesContent":["import type {\n ContractField,\n ContractModel,\n ContractValueObject,\n CrossReference,\n} from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport { type ImportRequirement, renderImports } from '@prisma-next/ts-render';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { isSafeTypeExpression } from './type-expression-safety';\n\nexport function serializeValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (typeof value === 'string') {\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n return `'${escaped}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (typeof value === 'bigint') {\n return `${value}n`;\n }\n if (Array.isArray(value)) {\n const items = value.map((v) => serializeValue(v)).join(', ');\n return `readonly [${items}]`;\n }\n if (typeof value === 'object') {\n const entries: string[] = [];\n for (const [k, v] of Object.entries(value)) {\n entries.push(`readonly ${serializeObjectKey(k)}: ${serializeValue(v)}`);\n }\n return `{ ${entries.join('; ')} }`;\n }\n return 'unknown';\n}\n\nexport function serializeObjectKey(key: string): string {\n if (/^[$A-Z_a-z][$\\w]*$/.test(key)) {\n return key;\n }\n return serializeValue(key);\n}\n\nexport function serializeNamespaceId(value: string): string {\n return `${serializeValue(value)} & NamespaceId`;\n}\n\nexport function serializeCrossReference(ref: CrossReference): string {\n const namespace = serializeNamespaceId(String(ref.namespace));\n const model = serializeValue(ref.model);\n return `{ readonly namespace: ${namespace}; readonly model: ${model} }`;\n}\n\nexport function generateRootsType(roots: Record<string, CrossReference> | undefined): string {\n if (!roots || Object.keys(roots).length === 0) {\n return 'Record<string, never>';\n }\n const entries = Object.entries(roots)\n .map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeCrossReference(value)}`)\n .join('; ');\n return `{ ${entries} }`;\n}\n\nfunction contractFieldModifierSuffix(field: ContractField): string {\n const many = field.many === true ? '; readonly many: true' : '';\n const dict = field.dict === true ? '; readonly dict: true' : '';\n return many + dict;\n}\n\nexport function generateModelFieldEntry(fieldName: string, field: ContractField): string {\n const mods = contractFieldModifierSuffix(field);\n const { nullable, type } = field;\n if (type.kind === 'scalar') {\n const typeParamsSpec =\n type.typeParams && Object.keys(type.typeParams).length > 0\n ? `; readonly typeParams: ${serializeValue(type.typeParams)}`\n : '';\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: { readonly kind: 'scalar'; readonly codecId: ${serializeValue(type.codecId)}${typeParamsSpec} }${mods} }`;\n }\n if (type.kind === 'valueObject') {\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: { readonly kind: 'valueObject'; readonly name: ${serializeValue(type.name)} }${mods} }`;\n }\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${nullable}; readonly type: ${serializeValue(type)}${mods} }`;\n}\n\nexport function generateModelFieldsType(fields: Record<string, ContractField>): string {\n const fieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(fields)) {\n fieldEntries.push(generateModelFieldEntry(fieldName, field));\n }\n return fieldEntries.length > 0 ? `{ ${fieldEntries.join('; ')} }` : 'Record<string, never>';\n}\n\nexport function generateModelRelationsType(relations: Record<string, unknown>): string {\n const relationEntries: string[] = [];\n\n for (const [relName, rel] of Object.entries(relations)) {\n if (typeof rel !== 'object' || rel === null) continue;\n const relObj = rel as Record<string, unknown>;\n const parts: string[] = [];\n\n if (relObj['to'])\n parts.push(\n `readonly to: ${serializeCrossReference(blindCast<CrossReference, 'contract JSON schema-validated before serialization; truthy check above confirms presence'>(relObj['to']))}`,\n );\n if (relObj['cardinality'])\n parts.push(`readonly cardinality: ${serializeValue(relObj['cardinality'])}`);\n\n const on = relObj['on'] as { localFields?: string[]; targetFields?: string[] } | undefined;\n if (on && (!on.localFields || !on.targetFields)) {\n throw new Error(\n `Relation \"${relName}\" has an \"on\" block but is missing localFields or targetFields`,\n );\n }\n if (on?.localFields && on.targetFields) {\n const localFields = on.localFields.map((f) => serializeValue(f)).join(', ');\n const targetFields = on.targetFields.map((f) => serializeValue(f)).join(', ');\n parts.push(\n `readonly on: { readonly localFields: readonly [${localFields}]; readonly targetFields: readonly [${targetFields}] }`,\n );\n }\n\n if (parts.length > 0) {\n relationEntries.push(`readonly ${relName}: { ${parts.join('; ')} }`);\n }\n }\n\n if (relationEntries.length === 0) {\n return 'Record<string, never>';\n }\n\n return `{ ${relationEntries.join('; ')} }`;\n}\n\nexport function generateModelsType(\n models: Record<string, ContractModel>,\n generateModelStorage: (modelName: string, model: ContractModel) => string,\n): string {\n if (!models || Object.keys(models).length === 0) {\n return 'Record<string, never>';\n }\n\n const modelTypes: string[] = [];\n for (const [modelName, model] of Object.entries(models).sort(([a], [b]) => a.localeCompare(b))) {\n const fieldsType = generateModelFieldsType(model.fields);\n const relationsType = generateModelRelationsType(model.relations);\n const storageType = generateModelStorage(modelName, model);\n\n const modelParts: string[] = [\n `readonly fields: ${fieldsType}`,\n `readonly relations: ${relationsType}`,\n `readonly storage: ${storageType}`,\n ];\n\n if (model.owner) {\n modelParts.push(`readonly owner: ${serializeValue(model.owner)}`);\n }\n if (model.discriminator) {\n modelParts.push(`readonly discriminator: ${serializeValue(model.discriminator)}`);\n }\n if (model.variants) {\n modelParts.push(`readonly variants: ${serializeValue(model.variants)}`);\n }\n if (model.base) {\n modelParts.push(`readonly base: ${serializeCrossReference(model.base)}`);\n }\n\n modelTypes.push(`readonly ${modelName}: { ${modelParts.join('; ')} }`);\n }\n\n return `{ ${modelTypes.join('; ')} }`;\n}\n\nexport function deduplicateImports(imports: TypesImportSpec[]): TypesImportSpec[] {\n const seenKeys = new Set<string>();\n const result: TypesImportSpec[] = [];\n for (const imp of imports) {\n const key = `${imp.package}::${imp.named}`;\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n result.push(imp);\n }\n }\n return result;\n}\n\nexport function generateImportLines(imports: TypesImportSpec[]): string[] {\n const requirements: ImportRequirement[] = imports.map((imp) => ({\n moduleSpecifier: imp.package,\n symbol: imp.named,\n alias: imp.alias,\n typeOnly: true,\n }));\n const rendered = renderImports(requirements);\n return rendered === '' ? [] : rendered.split('\\n');\n}\n\nexport function generateCodecTypeIntersection(\n imports: ReadonlyArray<TypesImportSpec>,\n named: string,\n): string {\n const aliases = imports.filter((imp) => imp.named === named).map((imp) => imp.alias);\n return aliases.join(' & ') || 'Record<string, never>';\n}\n\nexport function serializeExecutionType(execution: Record<string, unknown>): string {\n const parts: string[] = ['readonly executionHash: ExecutionHash'];\n for (const [key, value] of Object.entries(execution)) {\n if (key === 'executionHash') continue;\n parts.push(`readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`);\n }\n return `{ ${parts.join('; ')} }`;\n}\n\nexport function generateHashTypeAliases(hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n}): string {\n const executionHashType = hashes.executionHash\n ? `ExecutionHashBase<'${hashes.executionHash}'>`\n : 'ExecutionHashBase<string>';\n\n return [\n `export type StorageHash = StorageHashBase<'${hashes.storageHash}'>;`,\n `export type ExecutionHash = ${executionHashType};`,\n `export type ProfileHash = ProfileHashBase<'${hashes.profileHash}'>;`,\n ].join('\\n');\n}\n\nexport type ResolvedFieldType = { readonly input: string; readonly output: string };\n\nfunction applyModifiers(base: string, field: ContractField): string {\n let result = base;\n if (field.many === true) result = `ReadonlyArray<${result}>`;\n if (field.dict === true) result = `Readonly<Record<string, ${result}>>`;\n if (field.nullable) result = `${result} | null`;\n return result;\n}\n\n/**\n * Per-family resolver for typeParams that don't live inline on the framework-domain `ContractField`. SQL columns authored via a named `storage.types` entry carry their `typeRef` on the storage column (family-specific) rather than on the framework's domain field; the per-family emitter walks `storage.types[ref].typeParams` here so the framework emit path can render the parameterized output type.\n *\n * Returns `undefined` when the field has no resolvable typeParams (i.e. the column isn't parameterized, isn't a `typeRef`, or the family doesn't support named storage types).\n */\nexport type FieldTypeParamsResolver = (\n modelName: string,\n fieldName: string,\n) => Record<string, unknown> | undefined;\n\nexport function resolveFieldType(\n field: ContractField,\n codecLookup?: CodecLookup,\n resolvedTypeParams?: Record<string, unknown>,\n): ResolvedFieldType {\n const { type } = field;\n\n switch (type.kind) {\n case 'scalar': {\n let outputResolved: string | undefined;\n const inlineTypeParams =\n type.typeParams && Object.keys(type.typeParams).length > 0 ? type.typeParams : undefined;\n const effectiveTypeParams = inlineTypeParams ?? resolvedTypeParams;\n if (codecLookup && effectiveTypeParams && Object.keys(effectiveTypeParams).length > 0) {\n const rendered = codecLookup.renderOutputTypeFor(type.codecId, effectiveTypeParams);\n if (rendered && isSafeTypeExpression(rendered)) {\n outputResolved = rendered;\n }\n }\n const codecAccessor = `CodecTypes[${serializeValue(type.codecId)}]`;\n return {\n output: applyModifiers(outputResolved ?? `${codecAccessor}['output']`, field),\n input: applyModifiers(`${codecAccessor}['input']`, field),\n };\n }\n case 'valueObject':\n return {\n output: applyModifiers(`${type.name}Output`, field),\n input: applyModifiers(`${type.name}Input`, field),\n };\n case 'union': {\n const outputMembers = type.members.map((m) =>\n m.kind === 'scalar'\n ? `CodecTypes[${serializeValue(m.codecId)}]['output']`\n : `${m.name}Output`,\n );\n const inputMembers = type.members.map((m) =>\n m.kind === 'scalar'\n ? `CodecTypes[${serializeValue(m.codecId)}]['input']`\n : `${m.name}Input`,\n );\n return {\n output: applyModifiers(outputMembers.join(' | '), field),\n input: applyModifiers(inputMembers.join(' | '), field),\n };\n }\n default:\n return {\n output: applyModifiers('unknown', field),\n input: applyModifiers('unknown', field),\n };\n }\n}\n\nexport function generateFieldResolvedType(\n field: ContractField,\n codecLookup?: CodecLookup,\n side: 'input' | 'output' = 'output',\n): string {\n return resolveFieldType(field, codecLookup)[side];\n}\n\nexport function generateBothFieldTypesMaps(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): ResolvedFieldType {\n if (!models || Object.keys(models).length === 0) {\n return { output: 'Record<string, never>', input: 'Record<string, never>' };\n }\n\n const outputModelEntries: string[] = [];\n const inputModelEntries: string[] = [];\n for (const [modelName, model] of Object.entries(models).sort(([a], [b]) => a.localeCompare(b))) {\n if (!model) continue;\n const outputFieldEntries: string[] = [];\n const inputFieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(model.fields)) {\n const inlineTypeParams =\n field.type.kind === 'scalar' &&\n field.type.typeParams &&\n Object.keys(field.type.typeParams).length > 0\n ? field.type.typeParams\n : undefined;\n const resolvedTypeParams = inlineTypeParams ?? resolveFieldTypeParams?.(modelName, fieldName);\n const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams);\n const key = `readonly ${serializeObjectKey(fieldName)}`;\n outputFieldEntries.push(`${key}: ${resolved.output}`);\n inputFieldEntries.push(`${key}: ${resolved.input}`);\n }\n const outputFields =\n outputFieldEntries.length > 0\n ? `{ ${outputFieldEntries.join('; ')} }`\n : 'Record<string, never>';\n const inputFields =\n inputFieldEntries.length > 0\n ? `{ ${inputFieldEntries.join('; ')} }`\n : 'Record<string, never>';\n const modelKey = `readonly ${serializeObjectKey(modelName)}`;\n outputModelEntries.push(`${modelKey}: ${outputFields}`);\n inputModelEntries.push(`${modelKey}: ${inputFields}`);\n }\n\n return {\n output: `{ ${outputModelEntries.join('; ')} }`,\n input: `{ ${inputModelEntries.join('; ')} }`,\n };\n}\n\nexport function generateFieldOutputTypesMap(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): string {\n return generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams).output;\n}\n\nexport function generateFieldInputTypesMap(\n models: Record<string, ContractModel> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n): string {\n return generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams).input;\n}\n\nexport function generateValueObjectType(\n _voName: string,\n vo: ContractValueObject,\n _valueObjects: Record<string, ContractValueObject>,\n side: 'input' | 'output' = 'output',\n codecLookup?: CodecLookup,\n): string {\n return resolveValueObjectType(_voName, vo, _valueObjects, codecLookup)[side];\n}\n\nexport function resolveValueObjectType(\n _voName: string,\n vo: ContractValueObject,\n _valueObjects: Record<string, ContractValueObject>,\n codecLookup?: CodecLookup,\n): ResolvedFieldType {\n const outputEntries: string[] = [];\n const inputEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n const resolved = resolveFieldType(field, codecLookup);\n const key = `readonly ${serializeObjectKey(fieldName)}`;\n outputEntries.push(`${key}: ${resolved.output}`);\n inputEntries.push(`${key}: ${resolved.input}`);\n }\n const empty = 'Record<string, never>';\n return {\n output: outputEntries.length > 0 ? `{ ${outputEntries.join('; ')} }` : empty,\n input: inputEntries.length > 0 ? `{ ${inputEntries.join('; ')} }` : empty,\n };\n}\n\nexport function generateContractFieldDescriptor(fieldName: string, field: ContractField): string {\n const mods: string[] = [];\n if (field.many === true) mods.push('; readonly many: true');\n if (field.dict === true) mods.push('; readonly dict: true');\n const modStr = mods.join('');\n\n const { type } = field;\n if (type.kind === 'scalar') {\n const typeParamsSpec =\n type.typeParams && Object.keys(type.typeParams).length > 0\n ? `; readonly typeParams: ${serializeValue(type.typeParams)}`\n : '';\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: { readonly kind: 'scalar'; readonly codecId: ${serializeValue(type.codecId)}${typeParamsSpec} }${modStr} }`;\n }\n if (type.kind === 'valueObject') {\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: { readonly kind: 'valueObject'; readonly name: ${serializeValue(type.name)} }${modStr} }`;\n }\n return `readonly ${serializeObjectKey(fieldName)}: { readonly nullable: ${field.nullable}; readonly type: ${serializeValue(type)}${modStr} }`;\n}\n\nexport function generateValueObjectsDescriptorType(\n valueObjects: Record<string, ContractValueObject> | undefined,\n): string {\n if (!valueObjects || Object.keys(valueObjects).length === 0) {\n return 'Record<string, never>';\n }\n\n const voEntries: string[] = [];\n for (const [voName, vo] of Object.entries(valueObjects)) {\n const fieldEntries: string[] = [];\n for (const [fieldName, field] of Object.entries(vo.fields)) {\n fieldEntries.push(generateContractFieldDescriptor(fieldName, field));\n }\n const fieldsType =\n fieldEntries.length > 0 ? `{ ${fieldEntries.join('; ')} }` : 'Record<string, never>';\n voEntries.push(`readonly ${serializeObjectKey(voName)}: { readonly fields: ${fieldsType} }`);\n }\n\n return `{ ${voEntries.join('; ')} }`;\n}\n\nexport function generateValueObjectTypeAliases(\n valueObjects: Record<string, ContractValueObject> | undefined,\n codecLookup?: CodecLookup,\n): string {\n if (!valueObjects || Object.keys(valueObjects).length === 0) {\n return '';\n }\n\n const aliases: string[] = [];\n for (const [voName, vo] of Object.entries(valueObjects)) {\n const resolved = resolveValueObjectType(voName, vo, valueObjects, codecLookup);\n aliases.push(`export type ${voName}Output = ${resolved.output};`);\n aliases.push(`export type ${voName}Input = ${resolved.input};`);\n }\n return aliases.join('\\n');\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { C as serializeObjectKey, a as generateCodecTypeIntersection, c as generateFieldOutputTypesMap, d as generateImportLines, g as generateRootsType, m as generateModelRelationsType, r as deduplicateImports, u as generateHashTypeAliases, w as serializeValue } from "../domain-type-generation-DNECvEA1.mjs";
2
- import { a as EmitStackInput, i as EmitResult, n as emit, o as EmittedArtifactPaths, r as EmitOptions, s as getEmittedArtifactPaths, t as generateContractDts } from "../index-BPiSzH-y.mjs";
1
+ import { E as serializeValue, T as serializeObjectKey, a as generateCodecTypeIntersection, c as generateFieldOutputTypesMap, d as generateImportLines, g as generateRootsType, m as generateModelRelationsType, r as deduplicateImports, u as generateHashTypeAliases } from "../domain-type-generation-By4D1JcL.mjs";
2
+ import { a as EmitStackInput, i as EmitResult, n as emit, o as EmittedArtifactPaths, r as EmitOptions, s as getEmittedArtifactPaths, t as generateContractDts } from "../index-I5F4dZMR.mjs";
3
3
  export { EmitOptions, EmitResult, EmitStackInput, EmittedArtifactPaths, deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
@@ -1,3 +1,3 @@
1
- import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-DF8AW-FF.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,7 +46,9 @@ ${importLines.join("\n")}
44
46
  ${familyImportLines.join("\n")}
45
47
  import type {
46
48
  Contract as ContractType,
49
+ ContractModelsMap,
47
50
  ExecutionHashBase,
51
+ NamespaceId,
48
52
  ProfileHashBase,
49
53
  StorageHashBase,
50
54
  } from '@prisma-next/contract/types';
@@ -58,13 +62,24 @@ export type FieldOutputTypes = ${fieldTypesMaps.output};
58
62
  export type FieldInputTypes = ${fieldTypesMaps.input};
59
63
  export type TypeMaps = ${typeMapsExpr};
60
64
 
61
- type ContractBase = ContractType<
65
+ type ContractBase = Omit<
66
+ ContractType<
62
67
  ${storageType},
63
68
  ${modelsType}
69
+ >,
70
+ 'roots' | 'domain'
64
71
  > & {
65
72
  readonly target: ${serializeValue(contract.target)};
66
73
  readonly targetFamily: ${serializeValue(contract.targetFamily)};
67
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
+ };
68
83
  readonly capabilities: ${serializeValue(contract.capabilities)};
69
84
  readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
70
85
  readonly meta: ${serializeValue(contract.meta)};
@@ -86,7 +101,9 @@ async function emit(contract, stack, targetFamily, options) {
86
101
  const { profileHash } = contract;
87
102
  const canonicalized = canonicalizeContractToObject(contract, {
88
103
  schemaVersion: SCHEMA_VERSION,
89
- serializeContract: options.serializeContract
104
+ serializeContract: options.serializeContract,
105
+ ...ifDefined("shouldPreserveEmpty", options.shouldPreserveEmpty),
106
+ ...ifDefined("sortStorage", options.sortStorage)
90
107
  });
91
108
  const contractJsonString = JSON.stringify({
92
109
  ...canonicalized,
@@ -118,4 +135,4 @@ async function emit(contract, stack, targetFamily, options) {
118
135
  //#endregion
119
136
  export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
120
137
 
121
- //# sourceMappingURL=exports-DF8AW-FF.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,4 +1,4 @@
1
- import { SerializeContract } from "@prisma-next/contract/hashing";
1
+ import { PreserveEmptyPredicate, SerializeContract, StorageSort } from "@prisma-next/contract/hashing";
2
2
  import { Contract } from "@prisma-next/contract/types";
3
3
  import { CodecLookup } from "@prisma-next/framework-components/codec";
4
4
  import { EmissionSpi, GenerateContractTypesOptions, TypesImportSpec } from "@prisma-next/framework-components/emission";
@@ -34,6 +34,16 @@ interface EmitOptions {
34
34
  * via property enumerability.
35
35
  */
36
36
  readonly serializeContract: SerializeContract;
37
+ /**
38
+ * Optional family-contributed preserve-empty predicate. Threaded from
39
+ * `descriptor.contractSerializer.shouldPreserveEmpty` when present.
40
+ */
41
+ readonly shouldPreserveEmpty?: PreserveEmptyPredicate;
42
+ /**
43
+ * Optional family-contributed storage sort hook. Threaded from
44
+ * `descriptor.contractSerializer.sortStorage` when present.
45
+ */
46
+ readonly sortStorage?: StorageSort;
37
47
  }
38
48
  interface EmitResult {
39
49
  readonly contractJson: string;
@@ -54,4 +64,4 @@ declare function generateContractDts(contract: Contract, emitter: EmissionSpi, c
54
64
  }, options?: GenerateContractTypesOptions, codecLookup?: CodecLookup): string;
55
65
  //#endregion
56
66
  export { EmitStackInput as a, EmitResult as i, emit as n, EmittedArtifactPaths as o, EmitOptions as r, getEmittedArtifactPaths as s, generateContractDts as t };
57
- //# sourceMappingURL=index-BPiSzH-y.d.mts.map
67
+ //# sourceMappingURL=index-I5F4dZMR.d.mts.map
@@ -0,0 +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;;;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"}
@@ -1,5 +1,5 @@
1
- import { a as EmitStackInput, i as EmitResult, r as EmitOptions } from "../index-BPiSzH-y.mjs";
2
- import { Contract } from "@prisma-next/contract/types";
1
+ import { a as EmitStackInput, i as EmitResult, r as EmitOptions } from "../index-I5F4dZMR.mjs";
2
+ import { Contract, CrossReference } from "@prisma-next/contract/types";
3
3
  import { EmissionSpi } from "@prisma-next/framework-components/emission";
4
4
 
5
5
  //#region test/utils.d.ts
@@ -12,7 +12,7 @@ declare function emit(contract: Contract, stack: EmitStackInput, family: Emissio
12
12
  type TestContractOverrides = {
13
13
  target?: string;
14
14
  targetFamily?: string;
15
- roots?: Record<string, string>;
15
+ roots?: Record<string, CrossReference>;
16
16
  models?: Record<string, unknown>;
17
17
  storage?: Record<string, unknown>;
18
18
  capabilities?: Record<string, Record<string, boolean>>;
@@ -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":";;;;;;;AAcA;;;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,KAON,qBAAA;EACH,MAAA;EACA,YAAA;EACA,KAAA,GAAQ,MAAA;EACR,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,QAAA"}
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,7 +1,111 @@
1
- import { t as emit$1 } from "../exports-DF8AW-FF.mjs";
2
- import { createContract } from "@prisma-next/contract/testing";
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";
6
+ import { createPreserveEmptyPredicate, createStorageSort } from "@prisma-next/contract/hashing-utils";
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
3
54
  //#region test/utils.ts
4
55
  const identitySerialize = (c) => c;
56
+ const SQL_EMIT_HOOKS = {
57
+ shouldPreserveEmpty: createPreserveEmptyPredicate([
58
+ [
59
+ "storage",
60
+ "namespaces",
61
+ "*",
62
+ "tables"
63
+ ],
64
+ [
65
+ "storage",
66
+ "namespaces",
67
+ "*",
68
+ "tables",
69
+ "*"
70
+ ],
71
+ [
72
+ "storage",
73
+ "namespaces",
74
+ "*",
75
+ "tables",
76
+ "*",
77
+ [
78
+ "uniques",
79
+ "indexes",
80
+ "foreignKeys"
81
+ ]
82
+ ],
83
+ [
84
+ "storage",
85
+ "namespaces",
86
+ "*",
87
+ "tables",
88
+ "*",
89
+ "foreignKeys",
90
+ ["constraint", "index"]
91
+ ],
92
+ [
93
+ "storage",
94
+ "types",
95
+ "*",
96
+ "typeParams"
97
+ ]
98
+ ]),
99
+ sortStorage: createStorageSort([{
100
+ path: [
101
+ "namespaces",
102
+ "*",
103
+ "tables",
104
+ "*"
105
+ ],
106
+ arrayKeys: ["indexes", "uniques"]
107
+ }])
108
+ };
5
109
  /**
6
110
  * Tests author JSON-clean contracts directly, so the canonicalisation
7
111
  * hook trivially passes through. Production callers thread the target
@@ -9,10 +113,21 @@ const identitySerialize = (c) => c;
9
113
  */
10
114
  function emit(contract, stack, family, options) {
11
115
  return emit$1(contract, stack, family, {
116
+ ...SQL_EMIT_HOOKS,
12
117
  ...options,
13
118
  serializeContract: identitySerialize
14
119
  });
15
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
+ }
16
131
  function createTestContract(overrides = {}) {
17
132
  const { storageHash: _sh, schemaVersion: _sv, sources: _src, storage, ...rest } = overrides;
18
133
  const cleanStorage = storage ? (() => {
@@ -25,6 +140,6 @@ function createTestContract(overrides = {}) {
25
140
  });
26
141
  }
27
142
  //#endregion
28
- export { createTestContract, emit };
143
+ export { createTestContract, emit, modelsFromCanonicalContract };
29
144
 
30
145
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":["emitImpl"],"sources":["../../test/utils.ts"],"sourcesContent":["import { createContract } from '@prisma-next/contract/testing';\nimport type { Contract } 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\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 ...options,\n serializeContract: identitySerialize,\n });\n}\n\ntype TestContractOverrides = {\n target?: string;\n targetFamily?: string;\n roots?: Record<string, string>;\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":";;;AAOA,MAAM,qBAAqB,MAA4B;;;;;;AAOvD,SAAgB,KACd,UACA,OACA,QACA,SACqB;CACrB,OAAOA,OAAS,UAAU,OAAO,QAAQ;EACvC,GAAG;EACH,mBAAmB;EACpB,CAAC;;AAkBJ,SAAgB,mBAAmB,YAAmC,EAAE,EAAY;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;KACL,GACJ,KAAA;CACJ,OAAO,eAAe;EACpB,GAAG;EACH,GAAI,eAAe,EAAE,SAAS,cAAc,GAAG,EAAE;EAClD,CAAyC"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"type-expression-safety.d.mts","names":[],"sources":["../src/type-expression-safety.ts"],"mappings":";iBAAgB,oBAAA,CAAqB,IAAA"}
1
+ {"version":3,"file":"type-expression-safety.d.mts","names":[],"sources":["../src/type-expression-safety.ts"],"mappings":";iBAAgB,oBAAA,CAAqB,IAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"type-expression-safety.mjs","names":[],"sources":["../src/type-expression-safety.ts"],"sourcesContent":["export function isSafeTypeExpression(expr: string): boolean {\n return !/import\\s*\\(|require\\s*\\(|declare\\s|export\\s|eval\\s*\\(/.test(expr);\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,MAAuB;CAC1D,OAAO,CAAC,wDAAwD,KAAK,KAAK"}
1
+ {"version":3,"file":"type-expression-safety.mjs","names":[],"sources":["../src/type-expression-safety.ts"],"sourcesContent":["export function isSafeTypeExpression(expr: string): boolean {\n return !/import\\s*\\(|require\\s*\\(|declare\\s|export\\s|eval\\s*\\(/.test(expr);\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,MAAuB;CAC1D,OAAO,CAAC,wDAAwD,KAAK,IAAI;AAC3E"}
package/package.json CHANGED
@@ -1,30 +1,39 @@
1
1
  {
2
2
  "name": "@prisma-next/emitter",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
- "files": [
8
- "dist",
9
- "src"
10
- ],
11
7
  "dependencies": {
12
- "@prisma-next/contract": "0.11.0",
13
- "@prisma-next/framework-components": "0.11.0",
14
- "@prisma-next/operations": "0.11.0",
15
- "@prisma-next/utils": "0.11.0",
8
+ "@prisma-next/contract": "0.12.0",
9
+ "@prisma-next/framework-components": "0.12.0",
10
+ "@prisma-next/operations": "0.12.0",
11
+ "@prisma-next/ts-render": "0.12.0",
12
+ "@prisma-next/utils": "0.12.0",
16
13
  "arktype": "^2.2.0",
17
14
  "prettier": "^3.8.3"
18
15
  },
19
16
  "devDependencies": {
20
- "@prisma-next/test-utils": "0.11.0",
21
- "@prisma-next/tsconfig": "0.11.0",
22
- "@types/node": "24.10.4",
23
- "@prisma-next/tsdown": "0.11.0",
17
+ "@prisma-next/test-utils": "0.12.0",
18
+ "@prisma-next/tsconfig": "0.12.0",
19
+ "@types/node": "25.6.0",
20
+ "@prisma-next/tsdown": "0.12.0",
24
21
  "tsdown": "0.22.0",
25
22
  "typescript": "5.9.3",
26
23
  "vitest": "4.1.6"
27
24
  },
25
+ "peerDependencies": {
26
+ "typescript": ">=5.9"
27
+ },
28
+ "peerDependenciesMeta": {
29
+ "typescript": {
30
+ "optional": true
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "src"
36
+ ],
28
37
  "exports": {
29
38
  ".": {
30
39
  "types": "./dist/exports/index.d.mts",
@@ -43,6 +52,9 @@
43
52
  "import": "./dist/test/utils.mjs"
44
53
  }
45
54
  },
55
+ "engines": {
56
+ "node": ">=24"
57
+ },
46
58
  "repository": {
47
59
  "type": "git",
48
60
  "url": "https://github.com/prisma/prisma-next.git",
@@ -2,9 +2,12 @@ import type {
2
2
  ContractField,
3
3
  ContractModel,
4
4
  ContractValueObject,
5
+ CrossReference,
5
6
  } from '@prisma-next/contract/types';
6
7
  import type { CodecLookup } from '@prisma-next/framework-components/codec';
7
8
  import type { TypesImportSpec } from '@prisma-next/framework-components/emission';
9
+ import { type ImportRequirement, renderImports } from '@prisma-next/ts-render';
10
+ import { blindCast } from '@prisma-next/utils/casts';
8
11
  import { isSafeTypeExpression } from './type-expression-safety';
9
12
 
10
13
  export function serializeValue(value: unknown): string {
@@ -45,12 +48,22 @@ export function serializeObjectKey(key: string): string {
45
48
  return serializeValue(key);
46
49
  }
47
50
 
48
- export function generateRootsType(roots: Record<string, string> | undefined): string {
51
+ export function serializeNamespaceId(value: string): string {
52
+ return `${serializeValue(value)} & NamespaceId`;
53
+ }
54
+
55
+ export function serializeCrossReference(ref: CrossReference): string {
56
+ const namespace = serializeNamespaceId(String(ref.namespace));
57
+ const model = serializeValue(ref.model);
58
+ return `{ readonly namespace: ${namespace}; readonly model: ${model} }`;
59
+ }
60
+
61
+ export function generateRootsType(roots: Record<string, CrossReference> | undefined): string {
49
62
  if (!roots || Object.keys(roots).length === 0) {
50
- return 'Record<string, string>';
63
+ return 'Record<string, never>';
51
64
  }
52
65
  const entries = Object.entries(roots)
53
- .map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeValue(value)}`)
66
+ .map(([key, value]) => `readonly ${serializeObjectKey(key)}: ${serializeCrossReference(value)}`)
54
67
  .join('; ');
55
68
  return `{ ${entries} }`;
56
69
  }
@@ -93,7 +106,10 @@ export function generateModelRelationsType(relations: Record<string, unknown>):
93
106
  const relObj = rel as Record<string, unknown>;
94
107
  const parts: string[] = [];
95
108
 
96
- if (relObj['to']) parts.push(`readonly to: ${serializeValue(relObj['to'])}`);
109
+ if (relObj['to'])
110
+ parts.push(
111
+ `readonly to: ${serializeCrossReference(blindCast<CrossReference, 'contract JSON schema-validated before serialization; truthy check above confirms presence'>(relObj['to']))}`,
112
+ );
97
113
  if (relObj['cardinality'])
98
114
  parts.push(`readonly cardinality: ${serializeValue(relObj['cardinality'])}`);
99
115
 
@@ -153,7 +169,7 @@ export function generateModelsType(
153
169
  modelParts.push(`readonly variants: ${serializeValue(model.variants)}`);
154
170
  }
155
171
  if (model.base) {
156
- modelParts.push(`readonly base: ${serializeValue(model.base)}`);
172
+ modelParts.push(`readonly base: ${serializeCrossReference(model.base)}`);
157
173
  }
158
174
 
159
175
  modelTypes.push(`readonly ${modelName}: { ${modelParts.join('; ')} }`);
@@ -176,10 +192,14 @@ export function deduplicateImports(imports: TypesImportSpec[]): TypesImportSpec[
176
192
  }
177
193
 
178
194
  export function generateImportLines(imports: TypesImportSpec[]): string[] {
179
- return imports.map((imp) => {
180
- const importClause = imp.named === imp.alias ? imp.named : `${imp.named} as ${imp.alias}`;
181
- return `import type { ${importClause} } from '${imp.package}';`;
182
- });
195
+ const requirements: ImportRequirement[] = imports.map((imp) => ({
196
+ moduleSpecifier: imp.package,
197
+ symbol: imp.named,
198
+ alias: imp.alias,
199
+ typeOnly: true,
200
+ }));
201
+ const rendered = renderImports(requirements);
202
+ return rendered === '' ? [] : rendered.split('\n');
183
203
  }
184
204
 
185
205
  export function generateCodecTypeIntersection(
package/src/emit-types.ts CHANGED
@@ -1,4 +1,8 @@
1
- import type { SerializeContract } from '@prisma-next/contract/hashing';
1
+ import type {
2
+ PreserveEmptyPredicate,
3
+ SerializeContract,
4
+ StorageSort,
5
+ } from '@prisma-next/contract/hashing';
2
6
  import type { CodecLookup } from '@prisma-next/framework-components/codec';
3
7
  import type { TypesImportSpec } from '@prisma-next/framework-components/emission';
4
8
 
@@ -26,6 +30,16 @@ export interface EmitOptions {
26
30
  * via property enumerability.
27
31
  */
28
32
  readonly serializeContract: SerializeContract;
33
+ /**
34
+ * Optional family-contributed preserve-empty predicate. Threaded from
35
+ * `descriptor.contractSerializer.shouldPreserveEmpty` when present.
36
+ */
37
+ readonly shouldPreserveEmpty?: PreserveEmptyPredicate;
38
+ /**
39
+ * Optional family-contributed storage sort hook. Threaded from
40
+ * `descriptor.contractSerializer.sortStorage` when present.
41
+ */
42
+ readonly sortStorage?: StorageSort;
29
43
  }
30
44
 
31
45
  export interface EmitResult {
package/src/emit.ts CHANGED
@@ -28,6 +28,8 @@ export async function emit(
28
28
  const canonicalized = canonicalizeContractToObject(contract, {
29
29
  schemaVersion: SCHEMA_VERSION,
30
30
  serializeContract: options.serializeContract,
31
+ ...ifDefined('shouldPreserveEmpty', options.shouldPreserveEmpty),
32
+ ...ifDefined('sortStorage', options.sortStorage),
31
33
  });
32
34
  const contractJsonString = JSON.stringify(
33
35
  {
@@ -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,7 +100,9 @@ ${importLines.join('\n')}
90
100
  ${familyImportLines.join('\n')}
91
101
  import type {
92
102
  Contract as ContractType,
103
+ ContractModelsMap,
93
104
  ExecutionHashBase,
105
+ NamespaceId,
94
106
  ProfileHashBase,
95
107
  StorageHashBase,
96
108
  } from '@prisma-next/contract/types';
@@ -104,13 +116,24 @@ export type FieldOutputTypes = ${fieldTypesMaps.output};
104
116
  export type FieldInputTypes = ${fieldTypesMaps.input};
105
117
  export type TypeMaps = ${typeMapsExpr};
106
118
 
107
- type ContractBase = ContractType<
119
+ type ContractBase = Omit<
120
+ ContractType<
108
121
  ${storageType},
109
122
  ${modelsType}
123
+ >,
124
+ 'roots' | 'domain'
110
125
  > & {
111
126
  readonly target: ${serializeValue(contract.target)};
112
127
  readonly targetFamily: ${serializeValue(contract.targetFamily)};
113
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
+ };
114
137
  readonly capabilities: ${serializeValue(contract.capabilities)};
115
138
  readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
116
139
  readonly meta: ${serializeValue(contract.meta)};
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain-type-generation-DNECvEA1.d.mts","names":[],"sources":["../src/domain-type-generation.ts"],"mappings":";;;;;iBASgB,cAAA,CAAe,KAAA;AAAA,iBA+Bf,kBAAA,CAAmB,GAAA;AAAA,iBAOnB,iBAAA,CAAkB,KAAA,EAAO,MAAA;AAAA,iBAgBzB,uBAAA,CAAwB,SAAA,UAAmB,KAAA,EAAO,aAAA;AAAA,iBAgBlD,uBAAA,CAAwB,MAAA,EAAQ,MAAA,SAAe,aAAA;AAAA,iBAQ/C,0BAAA,CAA2B,SAAA,EAAW,MAAA;AAAA,iBAsCtC,kBAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,GACvB,oBAAA,GAAuB,SAAA,UAAmB,KAAA,EAAO,aAAA;AAAA,iBAqCnC,kBAAA,CAAmB,OAAA,EAAS,eAAA,KAAoB,eAAA;AAAA,iBAahD,mBAAA,CAAoB,OAAA,EAAS,eAAA;AAAA,iBAO7B,6BAAA,CACd,OAAA,EAAS,aAAA,CAAc,eAAA,GACvB,KAAA;AAAA,iBAMc,sBAAA,CAAuB,SAAA,EAAW,MAAA;AAAA,iBASlC,uBAAA,CAAwB,MAAA;EAAA,SAC7B,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;AAAA,KAaC,iBAAA;EAAA,SAA+B,KAAA;EAAA,SAAwB,MAAA;AAAA;;;;;;KAevD,uBAAA,IACV,SAAA,UACA,SAAA,aACG,MAAA;AAAA,iBAEW,gBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAA,EACd,kBAAA,GAAqB,MAAA,oBACpB,iBAAA;AAAA,iBAkDa,yBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAA,EACd,IAAA;AAAA,iBAKc,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA,GACxB,iBAAA;AAAA,iBA2Ca,2BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA;AAAA,iBAKX,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,aAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA;AAAA,iBAKX,uBAAA,CACd,OAAA,UACA,EAAA,EAAI,mBAAA,EACJ,aAAA,EAAe,MAAA,SAAe,mBAAA,GAC9B,IAAA,uBACA,WAAA,GAAc,WAAA;AAAA,iBAKA,sBAAA,CACd,OAAA,UACA,EAAA,EAAI,mBAAA,EACJ,aAAA,EAAe,MAAA,SAAe,mBAAA,GAC9B,WAAA,GAAc,WAAA,GACb,iBAAA;AAAA,iBAgBa,+BAAA,CAAgC,SAAA,UAAmB,KAAA,EAAO,aAAA;AAAA,iBAoB1D,kCAAA,CACd,YAAA,EAAc,MAAA,SAAe,mBAAA;AAAA,iBAoBf,8BAAA,CACd,YAAA,EAAc,MAAA,SAAe,mBAAA,eAC7B,WAAA,GAAc,WAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports-DF8AW-FF.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 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 = ContractType<\n${storageType},\n${modelsType}\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 });\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 +0,0 @@
1
- {"version":3,"file":"index-BPiSzH-y.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,OAAA;AAAA;AAAA,iBAGK,uBAAA,CAAwB,cAAA,WAAyB,oBAAA;;;;;;;AALjE;UCOiB,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;EDV0E;;;;ACErF;;;;;EDFqF,SCoB1E,iBAAA,EAAmB,iBAAA;AAAA;AAAA,UAGb,UAAA;EAAA,SACN,YAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;;;iBCxBW,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"}