@prisma-next/emitter 0.8.0 → 0.9.0-dev.1

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.
@@ -0,0 +1,44 @@
1
+ import { ContractField, ContractModel, ContractValueObject } from "@prisma-next/contract/types";
2
+ import { CodecLookup } from "@prisma-next/framework-components/codec";
3
+ import { TypesImportSpec } from "@prisma-next/framework-components/emission";
4
+
5
+ //#region src/domain-type-generation.d.ts
6
+ declare function serializeValue(value: unknown): string;
7
+ declare function serializeObjectKey(key: string): string;
8
+ declare function generateRootsType(roots: Record<string, string> | undefined): string;
9
+ declare function generateModelFieldEntry(fieldName: string, field: ContractField): string;
10
+ declare function generateModelFieldsType(fields: Record<string, ContractField>): string;
11
+ declare function generateModelRelationsType(relations: Record<string, unknown>): string;
12
+ declare function generateModelsType(models: Record<string, ContractModel>, generateModelStorage: (modelName: string, model: ContractModel) => string): string;
13
+ declare function deduplicateImports(imports: TypesImportSpec[]): TypesImportSpec[];
14
+ declare function generateImportLines(imports: TypesImportSpec[]): string[];
15
+ declare function generateCodecTypeIntersection(imports: ReadonlyArray<TypesImportSpec>, named: string): string;
16
+ declare function serializeExecutionType(execution: Record<string, unknown>): string;
17
+ declare function generateHashTypeAliases(hashes: {
18
+ readonly storageHash: string;
19
+ readonly executionHash?: string;
20
+ readonly profileHash: string;
21
+ }): string;
22
+ type ResolvedFieldType = {
23
+ readonly input: string;
24
+ readonly output: string;
25
+ };
26
+ /**
27
+ * 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.
28
+ *
29
+ * 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).
30
+ */
31
+ type FieldTypeParamsResolver = (modelName: string, fieldName: string) => Record<string, unknown> | undefined;
32
+ declare function resolveFieldType(field: ContractField, codecLookup?: CodecLookup, resolvedTypeParams?: Record<string, unknown>): ResolvedFieldType;
33
+ declare function generateFieldResolvedType(field: ContractField, codecLookup?: CodecLookup, side?: 'input' | 'output'): string;
34
+ declare function generateBothFieldTypesMaps(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): ResolvedFieldType;
35
+ declare function generateFieldOutputTypesMap(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
36
+ declare function generateFieldInputTypesMap(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
37
+ declare function generateValueObjectType(_voName: string, vo: ContractValueObject, _valueObjects: Record<string, ContractValueObject>, side?: 'input' | 'output', codecLookup?: CodecLookup): string;
38
+ declare function resolveValueObjectType(_voName: string, vo: ContractValueObject, _valueObjects: Record<string, ContractValueObject>, codecLookup?: CodecLookup): ResolvedFieldType;
39
+ declare function generateContractFieldDescriptor(fieldName: string, field: ContractField): string;
40
+ declare function generateValueObjectsDescriptorType(valueObjects: Record<string, ContractValueObject> | undefined): string;
41
+ declare function generateValueObjectTypeAliases(valueObjects: Record<string, ContractValueObject> | undefined, codecLookup?: CodecLookup): string;
42
+ //#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
@@ -0,0 +1 @@
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,44 +1,2 @@
1
- import { ContractField, ContractModel, ContractValueObject } from "@prisma-next/contract/types";
2
- import { CodecLookup } from "@prisma-next/framework-components/codec";
3
- import { TypesImportSpec } from "@prisma-next/framework-components/emission";
4
-
5
- //#region src/domain-type-generation.d.ts
6
- declare function serializeValue(value: unknown): string;
7
- declare function serializeObjectKey(key: string): string;
8
- declare function generateRootsType(roots: Record<string, string> | undefined): string;
9
- declare function generateModelFieldEntry(fieldName: string, field: ContractField): string;
10
- declare function generateModelFieldsType(fields: Record<string, ContractField>): string;
11
- declare function generateModelRelationsType(relations: Record<string, unknown>): string;
12
- declare function generateModelsType(models: Record<string, ContractModel>, generateModelStorage: (modelName: string, model: ContractModel) => string): string;
13
- declare function deduplicateImports(imports: TypesImportSpec[]): TypesImportSpec[];
14
- declare function generateImportLines(imports: TypesImportSpec[]): string[];
15
- declare function generateCodecTypeIntersection(imports: ReadonlyArray<TypesImportSpec>, named: string): string;
16
- declare function serializeExecutionType(execution: Record<string, unknown>): string;
17
- declare function generateHashTypeAliases(hashes: {
18
- readonly storageHash: string;
19
- readonly executionHash?: string;
20
- readonly profileHash: string;
21
- }): string;
22
- type ResolvedFieldType = {
23
- readonly input: string;
24
- readonly output: string;
25
- };
26
- /**
27
- * 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.
28
- *
29
- * 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).
30
- */
31
- type FieldTypeParamsResolver = (modelName: string, fieldName: string) => Record<string, unknown> | undefined;
32
- declare function resolveFieldType(field: ContractField, codecLookup?: CodecLookup, resolvedTypeParams?: Record<string, unknown>): ResolvedFieldType;
33
- declare function generateFieldResolvedType(field: ContractField, codecLookup?: CodecLookup, side?: 'input' | 'output'): string;
34
- declare function generateBothFieldTypesMaps(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): ResolvedFieldType;
35
- declare function generateFieldOutputTypesMap(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
36
- declare function generateFieldInputTypesMap(models: Record<string, ContractModel> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
37
- declare function generateValueObjectType(_voName: string, vo: ContractValueObject, _valueObjects: Record<string, ContractValueObject>, side?: 'input' | 'output', codecLookup?: CodecLookup): string;
38
- declare function resolveValueObjectType(_voName: string, vo: ContractValueObject, _valueObjects: Record<string, ContractValueObject>, codecLookup?: CodecLookup): ResolvedFieldType;
39
- declare function generateContractFieldDescriptor(fieldName: string, field: ContractField): string;
40
- declare function generateValueObjectsDescriptorType(valueObjects: Record<string, ContractValueObject> | undefined): string;
41
- declare function generateValueObjectTypeAliases(valueObjects: Record<string, ContractValueObject> | undefined, codecLookup?: CodecLookup): string;
42
- //#endregion
43
- 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 };
44
- //# sourceMappingURL=domain-type-generation.d.mts.map
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,47 +1,3 @@
1
- import { deduplicateImports, generateCodecTypeIntersection, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, serializeObjectKey, serializeValue } from "../domain-type-generation.mjs";
2
- import { Contract } from "@prisma-next/contract/types";
3
- import { CodecLookup } from "@prisma-next/framework-components/codec";
4
- import { EmissionSpi, GenerateContractTypesOptions, TypesImportSpec } from "@prisma-next/framework-components/emission";
5
-
6
- //#region src/artifact-paths.d.ts
7
- interface EmittedArtifactPaths {
8
- readonly jsonPath: string;
9
- readonly dtsPath: string;
10
- }
11
- declare function getEmittedArtifactPaths(outputJsonPath: string): EmittedArtifactPaths;
12
- //#endregion
13
- //#region src/emit-types.d.ts
14
- /**
15
- * The subset of ControlStack that emit() reads.
16
- * All fields are optional so tests can pass minimal objects.
17
- * A full ControlStack satisfies this via structural typing.
18
- */
19
- interface EmitStackInput {
20
- readonly codecTypeImports?: ReadonlyArray<TypesImportSpec>;
21
- readonly queryOperationTypeImports?: ReadonlyArray<TypesImportSpec>;
22
- readonly extensionIds?: ReadonlyArray<string>;
23
- readonly codecLookup?: CodecLookup;
24
- }
25
- interface EmitOptions {
26
- readonly outputJsonPath?: string;
27
- }
28
- interface EmitResult {
29
- readonly contractJson: string;
30
- readonly contractDts: string;
31
- readonly storageHash: string;
32
- readonly executionHash?: string;
33
- readonly profileHash: string;
34
- }
35
- //#endregion
36
- //#region src/emit.d.ts
37
- declare function emit(contract: Contract, stack: EmitStackInput, targetFamily: EmissionSpi, options?: EmitOptions): Promise<EmitResult>;
38
- //#endregion
39
- //#region src/generate-contract-dts.d.ts
40
- declare function generateContractDts(contract: Contract, emitter: EmissionSpi, codecTypeImports: ReadonlyArray<TypesImportSpec>, hashes: {
41
- readonly storageHash: string;
42
- readonly executionHash?: string;
43
- readonly profileHash: string;
44
- }, options?: GenerateContractTypesOptions, codecLookup?: CodecLookup): string;
45
- //#endregion
46
- export { type EmitResult, type EmitStackInput, type EmittedArtifactPaths, deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
47
- //# sourceMappingURL=index.d.mts.map
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";
3
+ export { EmitOptions, EmitResult, EmitStackInput, EmittedArtifactPaths, deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
@@ -1,118 +1,3 @@
1
- import { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, serializeExecutionType, serializeObjectKey, serializeValue } from "../domain-type-generation.mjs";
2
- import { canonicalizeContractToObject } from "@prisma-next/contract/hashing";
3
- import { ifDefined } from "@prisma-next/utils/defined";
4
- import { format } from "prettier";
5
- //#region src/artifact-paths.ts
6
- const JSON_EXTENSION = ".json";
7
- function getEmittedArtifactPaths(outputJsonPath) {
8
- if (!outputJsonPath.endsWith(JSON_EXTENSION)) throw new Error("Contract output path must end with .json");
9
- return {
10
- jsonPath: outputJsonPath,
11
- dtsPath: `${outputJsonPath.slice(0, -5)}.d.ts`
12
- };
13
- }
14
- //#endregion
15
- //#region src/generate-contract-dts.ts
16
- function generateContractDts(contract, emitter, codecTypeImports, hashes, options, codecLookup) {
17
- const allImports = [...codecTypeImports];
18
- if (options?.queryOperationTypeImports) allImports.push(...options.queryOperationTypeImports);
19
- const importLines = generateImportLines(deduplicateImports(allImports));
20
- const familyImportLines = emitter.getFamilyImports();
21
- const hashAliases = generateHashTypeAliases(hashes);
22
- const codecTypes = generateCodecTypeIntersection(codecTypeImports, "CodecTypes");
23
- const familyTypeAliases = emitter.getFamilyTypeAliases(options);
24
- const typeMapsExpr = emitter.getTypeMapsExpression();
25
- const storageType = emitter.generateStorageType(contract, "StorageHash");
26
- const modelsType = generateModelsType(contract.models, (name, model) => emitter.generateModelStorageType(name, model));
27
- const rootsType = generateRootsType(contract.roots);
28
- const valueObjects = contract.valueObjects;
29
- const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
30
- const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
31
- 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];
34
- if (!model) return void 0;
35
- return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);
36
- } : void 0;
37
- const fieldTypesMaps = generateBothFieldTypesMaps(contract.models, codecLookup, resolveFieldTypeParams);
38
- const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
39
- return `// ⚠️ GENERATED FILE - DO NOT EDIT
40
- // This file is automatically generated by 'prisma-next contract emit'.
41
- // To regenerate, run: prisma-next contract emit
42
- ${importLines.join("\n")}
43
-
44
- ${familyImportLines.join("\n")}
45
- import type {
46
- Contract as ContractType,
47
- ExecutionHashBase,
48
- ProfileHashBase,
49
- StorageHashBase,
50
- } from '@prisma-next/contract/types';
51
-
52
- ${hashAliases}
53
-
54
- export type CodecTypes = ${codecTypes};
55
- ${familyTypeAliases}
56
- ${valueObjectTypeAliases}
57
- export type FieldOutputTypes = ${fieldTypesMaps.output};
58
- export type FieldInputTypes = ${fieldTypesMaps.input};
59
- export type TypeMaps = ${typeMapsExpr};
60
-
61
- type ContractBase = ContractType<
62
- ${storageType},
63
- ${modelsType}
64
- > & {
65
- readonly target: ${serializeValue(contract.target)};
66
- readonly targetFamily: ${serializeValue(contract.targetFamily)};
67
- readonly roots: ${rootsType};
68
- readonly capabilities: ${serializeValue(contract.capabilities)};
69
- readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
70
- readonly meta: ${serializeValue(contract.meta)};
71
- ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ""}
72
- readonly profileHash: ProfileHash;
73
- };
74
-
75
- ${contractWrapper}
76
- `;
77
- }
78
- //#endregion
79
- //#region src/emit.ts
80
- const SCHEMA_VERSION = "1";
81
- async function emit(contract, stack, targetFamily, options) {
82
- if (options?.outputJsonPath !== void 0) getEmittedArtifactPaths(options.outputJsonPath);
83
- const { codecTypeImports, queryOperationTypeImports } = stack;
84
- const { storageHash } = contract.storage;
85
- const executionHash = contract.execution?.executionHash;
86
- const { profileHash } = contract;
87
- const canonicalized = canonicalizeContractToObject(contract, { schemaVersion: SCHEMA_VERSION });
88
- const contractJsonString = JSON.stringify({
89
- ...canonicalized,
90
- _generated: {
91
- warning: "⚠️ GENERATED FILE - DO NOT EDIT",
92
- message: "This file is automatically generated by \"prisma-next contract emit\".",
93
- regenerate: "To regenerate, run: prisma-next contract emit"
94
- }
95
- }, null, 2);
96
- const generateOptions = queryOperationTypeImports ? { queryOperationTypeImports } : void 0;
97
- const contractTypeHashes = {
98
- storageHash,
99
- ...ifDefined("executionHash", executionHash),
100
- profileHash
101
- };
102
- return {
103
- contractJson: contractJsonString,
104
- contractDts: await format(generateContractDts(contract, targetFamily, codecTypeImports ?? [], contractTypeHashes, generateOptions, stack.codecLookup), {
105
- parser: "typescript",
106
- singleQuote: true,
107
- semi: true,
108
- printWidth: 100
109
- }),
110
- storageHash,
111
- ...ifDefined("executionHash", executionHash),
112
- profileHash
113
- };
114
- }
115
- //#endregion
1
+ import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-DF8AW-FF.mjs";
2
+ import { deduplicateImports, generateCodecTypeIntersection, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, serializeObjectKey, serializeValue } from "../domain-type-generation.mjs";
116
3
  export { deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
117
-
118
- //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,121 @@
1
+ import { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateHashTypeAliases, generateImportLines, generateModelsType, generateRootsType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, serializeExecutionType, serializeValue } from "./domain-type-generation.mjs";
2
+ import { canonicalizeContractToObject } from "@prisma-next/contract/hashing";
3
+ import { ifDefined } from "@prisma-next/utils/defined";
4
+ import { format } from "prettier";
5
+ //#region src/artifact-paths.ts
6
+ const JSON_EXTENSION = ".json";
7
+ function getEmittedArtifactPaths(outputJsonPath) {
8
+ if (!outputJsonPath.endsWith(JSON_EXTENSION)) throw new Error("Contract output path must end with .json");
9
+ return {
10
+ jsonPath: outputJsonPath,
11
+ dtsPath: `${outputJsonPath.slice(0, -5)}.d.ts`
12
+ };
13
+ }
14
+ //#endregion
15
+ //#region src/generate-contract-dts.ts
16
+ function generateContractDts(contract, emitter, codecTypeImports, hashes, options, codecLookup) {
17
+ const allImports = [...codecTypeImports];
18
+ if (options?.queryOperationTypeImports) allImports.push(...options.queryOperationTypeImports);
19
+ const importLines = generateImportLines(deduplicateImports(allImports));
20
+ const familyImportLines = emitter.getFamilyImports();
21
+ const hashAliases = generateHashTypeAliases(hashes);
22
+ const codecTypes = generateCodecTypeIntersection(codecTypeImports, "CodecTypes");
23
+ const familyTypeAliases = emitter.getFamilyTypeAliases(options);
24
+ const typeMapsExpr = emitter.getTypeMapsExpression();
25
+ const storageType = emitter.generateStorageType(contract, "StorageHash");
26
+ const modelsType = generateModelsType(contract.models, (name, model) => emitter.generateModelStorageType(name, model));
27
+ const rootsType = generateRootsType(contract.roots);
28
+ const valueObjects = contract.valueObjects;
29
+ const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);
30
+ const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);
31
+ 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];
34
+ if (!model) return void 0;
35
+ return emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract);
36
+ } : void 0;
37
+ const fieldTypesMaps = generateBothFieldTypesMaps(contract.models, codecLookup, resolveFieldTypeParams);
38
+ const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
39
+ return `// ⚠️ GENERATED FILE - DO NOT EDIT
40
+ // This file is automatically generated by 'prisma-next contract emit'.
41
+ // To regenerate, run: prisma-next contract emit
42
+ ${importLines.join("\n")}
43
+
44
+ ${familyImportLines.join("\n")}
45
+ import type {
46
+ Contract as ContractType,
47
+ ExecutionHashBase,
48
+ ProfileHashBase,
49
+ StorageHashBase,
50
+ } from '@prisma-next/contract/types';
51
+
52
+ ${hashAliases}
53
+
54
+ export type CodecTypes = ${codecTypes};
55
+ ${familyTypeAliases}
56
+ ${valueObjectTypeAliases}
57
+ export type FieldOutputTypes = ${fieldTypesMaps.output};
58
+ export type FieldInputTypes = ${fieldTypesMaps.input};
59
+ export type TypeMaps = ${typeMapsExpr};
60
+
61
+ type ContractBase = ContractType<
62
+ ${storageType},
63
+ ${modelsType}
64
+ > & {
65
+ readonly target: ${serializeValue(contract.target)};
66
+ readonly targetFamily: ${serializeValue(contract.targetFamily)};
67
+ readonly roots: ${rootsType};
68
+ readonly capabilities: ${serializeValue(contract.capabilities)};
69
+ readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}
70
+ readonly meta: ${serializeValue(contract.meta)};
71
+ ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ""}
72
+ readonly profileHash: ProfileHash;
73
+ };
74
+
75
+ ${contractWrapper}
76
+ `;
77
+ }
78
+ //#endregion
79
+ //#region src/emit.ts
80
+ const SCHEMA_VERSION = "1";
81
+ async function emit(contract, stack, targetFamily, options) {
82
+ if (options.outputJsonPath !== void 0) getEmittedArtifactPaths(options.outputJsonPath);
83
+ const { codecTypeImports, queryOperationTypeImports } = stack;
84
+ const { storageHash } = contract.storage;
85
+ const executionHash = contract.execution?.executionHash;
86
+ const { profileHash } = contract;
87
+ const canonicalized = canonicalizeContractToObject(contract, {
88
+ schemaVersion: SCHEMA_VERSION,
89
+ serializeContract: options.serializeContract
90
+ });
91
+ const contractJsonString = JSON.stringify({
92
+ ...canonicalized,
93
+ _generated: {
94
+ warning: "⚠️ GENERATED FILE - DO NOT EDIT",
95
+ message: "This file is automatically generated by \"prisma-next contract emit\".",
96
+ regenerate: "To regenerate, run: prisma-next contract emit"
97
+ }
98
+ }, null, 2);
99
+ const generateOptions = queryOperationTypeImports ? { queryOperationTypeImports } : void 0;
100
+ const contractTypeHashes = {
101
+ storageHash,
102
+ ...ifDefined("executionHash", executionHash),
103
+ profileHash
104
+ };
105
+ return {
106
+ contractJson: contractJsonString,
107
+ contractDts: await format(generateContractDts(contract, targetFamily, codecTypeImports ?? [], contractTypeHashes, generateOptions, stack.codecLookup), {
108
+ parser: "typescript",
109
+ singleQuote: true,
110
+ semi: true,
111
+ printWidth: 100
112
+ }),
113
+ storageHash,
114
+ ...ifDefined("executionHash", executionHash),
115
+ profileHash
116
+ };
117
+ }
118
+ //#endregion
119
+ export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
120
+
121
+ //# sourceMappingURL=exports-DF8AW-FF.mjs.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,57 @@
1
+ import { SerializeContract } from "@prisma-next/contract/hashing";
2
+ import { Contract } from "@prisma-next/contract/types";
3
+ import { CodecLookup } from "@prisma-next/framework-components/codec";
4
+ import { EmissionSpi, GenerateContractTypesOptions, TypesImportSpec } from "@prisma-next/framework-components/emission";
5
+
6
+ //#region src/artifact-paths.d.ts
7
+ interface EmittedArtifactPaths {
8
+ readonly jsonPath: string;
9
+ readonly dtsPath: string;
10
+ }
11
+ declare function getEmittedArtifactPaths(outputJsonPath: string): EmittedArtifactPaths;
12
+ //#endregion
13
+ //#region src/emit-types.d.ts
14
+ /**
15
+ * The subset of ControlStack that emit() reads.
16
+ * All fields are optional so tests can pass minimal objects.
17
+ * A full ControlStack satisfies this via structural typing.
18
+ */
19
+ interface EmitStackInput {
20
+ readonly codecTypeImports?: ReadonlyArray<TypesImportSpec>;
21
+ readonly queryOperationTypeImports?: ReadonlyArray<TypesImportSpec>;
22
+ readonly extensionIds?: ReadonlyArray<string>;
23
+ readonly codecLookup?: CodecLookup;
24
+ }
25
+ interface EmitOptions {
26
+ readonly outputJsonPath?: string;
27
+ /**
28
+ * Per-target serializer that converts the in-memory contract into its
29
+ * canonical on-disk JsonObject shape before the framework's
30
+ * key-ordering / default-omission walk runs. Threaded from the
31
+ * descriptor (`descriptor.contractSerializer.serializeContract`) at
32
+ * the CLI / control-API call site so target classes decide what
33
+ * appears in the JSON envelope rather than the framework guessing
34
+ * via property enumerability.
35
+ */
36
+ readonly serializeContract: SerializeContract;
37
+ }
38
+ interface EmitResult {
39
+ readonly contractJson: string;
40
+ readonly contractDts: string;
41
+ readonly storageHash: string;
42
+ readonly executionHash?: string;
43
+ readonly profileHash: string;
44
+ }
45
+ //#endregion
46
+ //#region src/emit.d.ts
47
+ declare function emit(contract: Contract, stack: EmitStackInput, targetFamily: EmissionSpi, options: EmitOptions): Promise<EmitResult>;
48
+ //#endregion
49
+ //#region src/generate-contract-dts.d.ts
50
+ declare function generateContractDts(contract: Contract, emitter: EmissionSpi, codecTypeImports: ReadonlyArray<TypesImportSpec>, hashes: {
51
+ readonly storageHash: string;
52
+ readonly executionHash?: string;
53
+ readonly profileHash: string;
54
+ }, options?: GenerateContractTypesOptions, codecLookup?: CodecLookup): string;
55
+ //#endregion
56
+ 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
@@ -0,0 +1 @@
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"}
@@ -1,6 +1,14 @@
1
+ import { a as EmitStackInput, i as EmitResult, r as EmitOptions } from "../index-BPiSzH-y.mjs";
1
2
  import { Contract } from "@prisma-next/contract/types";
3
+ import { EmissionSpi } from "@prisma-next/framework-components/emission";
2
4
 
3
5
  //#region test/utils.d.ts
6
+ /**
7
+ * Tests author JSON-clean contracts directly, so the canonicalisation
8
+ * hook trivially passes through. Production callers thread the target
9
+ * descriptor's `contractSerializer.serializeContract` instead.
10
+ */
11
+ declare function emit(contract: Contract, stack: EmitStackInput, family: EmissionSpi, options?: Omit<EmitOptions, 'serializeContract'>): Promise<EmitResult>;
4
12
  type TestContractOverrides = {
5
13
  target?: string;
6
14
  targetFamily?: string;
@@ -17,5 +25,5 @@ type TestContractOverrides = {
17
25
  };
18
26
  declare function createTestContract(overrides?: TestContractOverrides): Contract;
19
27
  //#endregion
20
- export { createTestContract };
28
+ export { createTestContract, emit };
21
29
  //# sourceMappingURL=utils.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../../test/utils.ts"],"mappings":";;;KAGK,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":";;;;;;;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,5 +1,18 @@
1
+ import { t as emit$1 } from "../exports-DF8AW-FF.mjs";
1
2
  import { createContract } from "@prisma-next/contract/testing";
2
3
  //#region test/utils.ts
4
+ const identitySerialize = (c) => c;
5
+ /**
6
+ * Tests author JSON-clean contracts directly, so the canonicalisation
7
+ * hook trivially passes through. Production callers thread the target
8
+ * descriptor's `contractSerializer.serializeContract` instead.
9
+ */
10
+ function emit(contract, stack, family, options) {
11
+ return emit$1(contract, stack, family, {
12
+ ...options,
13
+ serializeContract: identitySerialize
14
+ });
15
+ }
3
16
  function createTestContract(overrides = {}) {
4
17
  const { storageHash: _sh, schemaVersion: _sv, sources: _src, storage, ...rest } = overrides;
5
18
  const cleanStorage = storage ? (() => {
@@ -12,6 +25,6 @@ function createTestContract(overrides = {}) {
12
25
  });
13
26
  }
14
27
  //#endregion
15
- export { createTestContract };
28
+ export { createTestContract, emit };
16
29
 
17
30
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../test/utils.ts"],"sourcesContent":["import { createContract } from '@prisma-next/contract/testing';\nimport type { Contract } from '@prisma-next/contract/types';\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":";;AAkBA,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.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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/emitter",
3
- "version": "0.8.0",
3
+ "version": "0.9.0-dev.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -9,18 +9,18 @@
9
9
  "src"
10
10
  ],
11
11
  "dependencies": {
12
- "@prisma-next/contract": "0.8.0",
13
- "@prisma-next/framework-components": "0.8.0",
14
- "@prisma-next/operations": "0.8.0",
15
- "@prisma-next/utils": "0.8.0",
12
+ "@prisma-next/contract": "0.9.0-dev.1",
13
+ "@prisma-next/framework-components": "0.9.0-dev.1",
14
+ "@prisma-next/operations": "0.9.0-dev.1",
15
+ "@prisma-next/utils": "0.9.0-dev.1",
16
16
  "arktype": "^2.1.29",
17
17
  "prettier": "^3.8.3"
18
18
  },
19
19
  "devDependencies": {
20
- "@prisma-next/test-utils": "0.8.0",
21
- "@prisma-next/tsconfig": "0.8.0",
20
+ "@prisma-next/test-utils": "0.9.0-dev.1",
21
+ "@prisma-next/tsconfig": "0.9.0-dev.1",
22
22
  "@types/node": "24.10.4",
23
- "@prisma-next/tsdown": "0.8.0",
23
+ "@prisma-next/tsdown": "0.9.0-dev.1",
24
24
  "tsdown": "0.22.0",
25
25
  "typescript": "5.9.3",
26
26
  "vitest": "4.1.5"
package/src/emit-types.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { SerializeContract } from '@prisma-next/contract/hashing';
1
2
  import type { CodecLookup } from '@prisma-next/framework-components/codec';
2
3
  import type { TypesImportSpec } from '@prisma-next/framework-components/emission';
3
4
 
@@ -15,6 +16,16 @@ export interface EmitStackInput {
15
16
 
16
17
  export interface EmitOptions {
17
18
  readonly outputJsonPath?: string;
19
+ /**
20
+ * Per-target serializer that converts the in-memory contract into its
21
+ * canonical on-disk JsonObject shape before the framework's
22
+ * key-ordering / default-omission walk runs. Threaded from the
23
+ * descriptor (`descriptor.contractSerializer.serializeContract`) at
24
+ * the CLI / control-API call site so target classes decide what
25
+ * appears in the JSON envelope rather than the framework guessing
26
+ * via property enumerability.
27
+ */
28
+ readonly serializeContract: SerializeContract;
18
29
  }
19
30
 
20
31
  export interface EmitResult {
package/src/emit.ts CHANGED
@@ -13,9 +13,9 @@ export async function emit(
13
13
  contract: Contract,
14
14
  stack: EmitStackInput,
15
15
  targetFamily: EmissionSpi,
16
- options?: EmitOptions,
16
+ options: EmitOptions,
17
17
  ): Promise<EmitResult> {
18
- if (options?.outputJsonPath !== undefined) {
18
+ if (options.outputJsonPath !== undefined) {
19
19
  getEmittedArtifactPaths(options.outputJsonPath);
20
20
  }
21
21
 
@@ -27,6 +27,7 @@ export async function emit(
27
27
 
28
28
  const canonicalized = canonicalizeContractToObject(contract, {
29
29
  schemaVersion: SCHEMA_VERSION,
30
+ serializeContract: options.serializeContract,
30
31
  });
31
32
  const contractJsonString = JSON.stringify(
32
33
  {
@@ -12,5 +12,5 @@ export {
12
12
  serializeValue,
13
13
  } from '../domain-type-generation';
14
14
  export { emit } from '../emit';
15
- export type { EmitResult, EmitStackInput } from '../emit-types';
15
+ export type { EmitOptions, EmitResult, EmitStackInput } from '../emit-types';
16
16
  export { generateContractDts } from '../generate-contract-dts';
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain-type-generation.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":"index.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;UCMiB,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;AAAA;AAAA,UAGM,UAAA;EAAA,SACN,YAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;;;iBCbW,IAAA,CACpB,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,YAAA,EAAc,WAAA,EACd,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;;;iBCKK,mBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,WAAA,EACT,gBAAA,EAAkB,aAAA,CAAc,eAAA,GAChC,MAAA;EAAA,SACW,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA,GAEX,OAAA,GAAU,4BAAA,EACV,WAAA,GAAc,WAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.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 });\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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"}