@prisma-next/emitter 0.14.0-dev.29 → 0.14.0-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{domain-type-generation-DdX577fp.d.mts → domain-type-generation-BYr4LZNS.d.mts} +27 -7
- package/dist/domain-type-generation-BYr4LZNS.d.mts.map +1 -0
- package/dist/domain-type-generation.d.mts +2 -2
- package/dist/domain-type-generation.mjs +28 -20
- package/dist/domain-type-generation.mjs.map +1 -1
- package/dist/exports/index.d.mts +1 -1
- package/dist/exports/index.mjs +1 -1
- package/dist/{exports-CGeb57Cz.mjs → exports-Bsc1vgw7.mjs} +3 -8
- package/dist/exports-Bsc1vgw7.mjs.map +1 -0
- package/dist/index-Cjiwoga9.d.mts.map +1 -1
- package/dist/test/utils.mjs +1 -1
- package/package.json +9 -9
- package/src/domain-type-generation.ts +57 -27
- package/src/generate-contract-dts.ts +5 -13
- package/dist/domain-type-generation-DdX577fp.d.mts.map +0 -1
- package/dist/exports-CGeb57Cz.mjs.map +0 -1
package/dist/{domain-type-generation-DdX577fp.d.mts → domain-type-generation-BYr4LZNS.d.mts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ContractField, ContractModelBase, ContractValueObject, CrossReference, JsonValue } 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
|
|
|
@@ -26,11 +26,31 @@ type ResolvedFieldType = {
|
|
|
26
26
|
readonly output: string;
|
|
27
27
|
};
|
|
28
28
|
type FieldTypeParamsResolver = (modelName: string, fieldName: string, model: ContractModelBase) => Record<string, unknown> | undefined;
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
/**
|
|
30
|
+
* A field's permitted values (codec-encoded) plus the codec that types them, as supplied by the
|
|
31
|
+
* family-specific {@link EmissionSpi.resolveFieldValueSet}. The framework renders these into a TS
|
|
32
|
+
* literal union through the codec seam ({@link renderValueSetType}).
|
|
33
|
+
*/
|
|
34
|
+
type ResolvedFieldValueSet = {
|
|
35
|
+
readonly encodedValues: readonly JsonValue[];
|
|
36
|
+
readonly codecId: string;
|
|
37
|
+
};
|
|
38
|
+
type FieldValueSetResolver = (modelName: string, fieldName: string, model: ContractModelBase) => ResolvedFieldValueSet | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Renders a value set (a field/column's permitted values, codec-encoded) into a TS literal union by
|
|
41
|
+
* routing **each** value through the codec's `renderValueLiteral` — the seam owned by the codec, not
|
|
42
|
+
* a generic serializer. `side`: `output` = read type, `input` = create/update type.
|
|
43
|
+
*
|
|
44
|
+
* Returns `undefined` — signalling the caller to fall back to the codec's full output type — when
|
|
45
|
+
* the lookup is absent, has no `renderValueLiteralFor`, the value set is empty, or **any** value
|
|
46
|
+
* isn't literal-expressible. A caller that needs column and field types to agree shares this so both
|
|
47
|
+
* compute the union identically.
|
|
48
|
+
*/
|
|
49
|
+
declare function renderValueSetType(values: readonly JsonValue[], codecId: string, side: 'output' | 'input', codecLookup: CodecLookup | undefined): string | undefined;
|
|
50
|
+
declare function resolveFieldType(field: ContractField, codecLookup?: CodecLookup, resolvedTypeParams?: Record<string, unknown>, resolvedValueSet?: ResolvedFieldValueSet): ResolvedFieldType;
|
|
31
51
|
declare function generateFieldResolvedType(field: ContractField, codecLookup?: CodecLookup, side?: 'input' | 'output'): string;
|
|
32
|
-
declare function generateBothFieldTypesMaps(models: Record<string, ContractModelBase> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver,
|
|
33
|
-
declare function generateFieldTypesMapsByNamespace(namespaceModels: ReadonlyArray<readonly [string, Record<string, ContractModelBase>]>, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver,
|
|
52
|
+
declare function generateBothFieldTypesMaps(models: Record<string, ContractModelBase> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver, resolveFieldValueSet?: FieldValueSetResolver): ResolvedFieldType;
|
|
53
|
+
declare function generateFieldTypesMapsByNamespace(namespaceModels: ReadonlyArray<readonly [string, Record<string, ContractModelBase>]>, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver, resolveFieldValueSet?: FieldValueSetResolver): ResolvedFieldType;
|
|
34
54
|
declare function generateFieldOutputTypesMap(models: Record<string, ContractModelBase> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
|
|
35
55
|
declare function generateFieldInputTypesMap(models: Record<string, ContractModelBase> | undefined, codecLookup?: CodecLookup, resolveFieldTypeParams?: FieldTypeParamsResolver): string;
|
|
36
56
|
declare function generateValueObjectType(_voName: string, vo: ContractValueObject, _valueObjects: Record<string, ContractValueObject>, side?: 'input' | 'output', codecLookup?: CodecLookup): string;
|
|
@@ -39,5 +59,5 @@ declare function generateContractFieldDescriptor(fieldName: string, field: Contr
|
|
|
39
59
|
declare function generateValueObjectsDescriptorType(valueObjects: Record<string, ContractValueObject> | undefined): string;
|
|
40
60
|
declare function generateValueObjectTypeAliases(valueObjects: Record<string, ContractValueObject> | undefined, codecLookup?: CodecLookup): string;
|
|
41
61
|
//#endregion
|
|
42
|
-
export {
|
|
43
|
-
//# sourceMappingURL=domain-type-generation-
|
|
62
|
+
export { serializeValue as A, renderValueSetType as C, serializeExecutionType as D, serializeCrossReference as E, serializeNamespaceId as O, generateValueObjectsDescriptorType as S, resolveValueObjectType as T, generateModelRelationsType as _, deduplicateImports as a, generateValueObjectType as b, generateContractFieldDescriptor as c, generateFieldResolvedType as d, generateFieldTypesMapsByNamespace as f, generateModelFieldsType as g, generateModelFieldEntry as h, ResolvedFieldValueSet as i, serializeObjectKey as k, generateFieldInputTypesMap as l, generateImportLines as m, FieldValueSetResolver as n, generateBothFieldTypesMaps as o, generateHashTypeAliases as p, ResolvedFieldType as r, generateCodecTypeIntersection as s, FieldTypeParamsResolver as t, generateFieldOutputTypesMap as u, generateModelsType as v, resolveFieldType as w, generateValueObjectTypeAliases as x, generateRootsType as y };
|
|
63
|
+
//# sourceMappingURL=domain-type-generation-BYr4LZNS.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-type-generation-BYr4LZNS.d.mts","names":[],"sources":["../src/domain-type-generation.ts"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
export {
|
|
1
|
+
import { A as serializeValue, C as renderValueSetType, D as serializeExecutionType, E as serializeCrossReference, O as serializeNamespaceId, S as generateValueObjectsDescriptorType, T as resolveValueObjectType, _ as generateModelRelationsType, a as deduplicateImports, b as generateValueObjectType, c as generateContractFieldDescriptor, d as generateFieldResolvedType, f as generateFieldTypesMapsByNamespace, g as generateModelFieldsType, h as generateModelFieldEntry, i as ResolvedFieldValueSet, k as serializeObjectKey, l as generateFieldInputTypesMap, m as generateImportLines, n as FieldValueSetResolver, o as generateBothFieldTypesMaps, p as generateHashTypeAliases, r as ResolvedFieldType, s as generateCodecTypeIntersection, t as FieldTypeParamsResolver, u as generateFieldOutputTypesMap, v as generateModelsType, w as resolveFieldType, x as generateValueObjectTypeAliases, y as generateRootsType } from "./domain-type-generation-BYr4LZNS.mjs";
|
|
2
|
+
export { FieldTypeParamsResolver, FieldValueSetResolver, ResolvedFieldType, ResolvedFieldValueSet, deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateFieldTypesMapsByNamespace, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, renderValueSetType, resolveFieldType, resolveValueObjectType, serializeCrossReference, serializeExecutionType, serializeNamespaceId, serializeObjectKey, serializeValue };
|
|
@@ -149,30 +149,36 @@ function applyModifiers(base, field) {
|
|
|
149
149
|
if (field.nullable) result = `${result} | null`;
|
|
150
150
|
return result;
|
|
151
151
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Renders a value set (a field/column's permitted values, codec-encoded) into a TS literal union by
|
|
154
|
+
* routing **each** value through the codec's `renderValueLiteral` — the seam owned by the codec, not
|
|
155
|
+
* a generic serializer. `side`: `output` = read type, `input` = create/update type.
|
|
156
|
+
*
|
|
157
|
+
* Returns `undefined` — signalling the caller to fall back to the codec's full output type — when
|
|
158
|
+
* the lookup is absent, has no `renderValueLiteralFor`, the value set is empty, or **any** value
|
|
159
|
+
* isn't literal-expressible. A caller that needs column and field types to agree shares this so both
|
|
160
|
+
* compute the union identically.
|
|
161
|
+
*/
|
|
162
|
+
function renderValueSetType(values, codecId, side, codecLookup) {
|
|
163
|
+
if (values.length === 0 || codecLookup?.renderValueLiteralFor === void 0) return void 0;
|
|
158
164
|
const literals = [];
|
|
159
165
|
for (const value of values) {
|
|
160
|
-
const lit =
|
|
161
|
-
if (lit === void 0) return void 0;
|
|
166
|
+
const lit = codecLookup.renderValueLiteralFor(codecId, value, side);
|
|
167
|
+
if (lit === void 0 || !isSafeTypeExpression(lit)) return void 0;
|
|
162
168
|
literals.push(lit);
|
|
163
169
|
}
|
|
164
170
|
return literals.join(" | ");
|
|
165
171
|
}
|
|
166
|
-
function resolveFieldType(field, codecLookup, resolvedTypeParams,
|
|
172
|
+
function resolveFieldType(field, codecLookup, resolvedTypeParams, resolvedValueSet) {
|
|
167
173
|
const { type } = field;
|
|
168
174
|
switch (type.kind) {
|
|
169
175
|
case "scalar": {
|
|
170
|
-
if (
|
|
171
|
-
const
|
|
172
|
-
const
|
|
173
|
-
if (
|
|
174
|
-
output: applyModifiers(
|
|
175
|
-
input: applyModifiers(
|
|
176
|
+
if (resolvedValueSet) {
|
|
177
|
+
const output = renderValueSetType(resolvedValueSet.encodedValues, resolvedValueSet.codecId, "output", codecLookup);
|
|
178
|
+
const input = renderValueSetType(resolvedValueSet.encodedValues, resolvedValueSet.codecId, "input", codecLookup);
|
|
179
|
+
if (output !== void 0 && input !== void 0) return {
|
|
180
|
+
output: applyModifiers(output, field),
|
|
181
|
+
input: applyModifiers(input, field)
|
|
176
182
|
};
|
|
177
183
|
}
|
|
178
184
|
let outputResolved;
|
|
@@ -211,7 +217,7 @@ function resolveFieldType(field, codecLookup, resolvedTypeParams, domainEnumLook
|
|
|
211
217
|
function generateFieldResolvedType(field, codecLookup, side = "output") {
|
|
212
218
|
return resolveFieldType(field, codecLookup)[side];
|
|
213
219
|
}
|
|
214
|
-
function generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams,
|
|
220
|
+
function generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams, resolveFieldValueSet) {
|
|
215
221
|
if (!models || Object.keys(models).length === 0) return {
|
|
216
222
|
output: "Record<string, never>",
|
|
217
223
|
input: "Record<string, never>"
|
|
@@ -223,7 +229,9 @@ function generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams,
|
|
|
223
229
|
const outputFieldEntries = [];
|
|
224
230
|
const inputFieldEntries = [];
|
|
225
231
|
for (const [fieldName, field] of Object.entries(model.fields)) {
|
|
226
|
-
const
|
|
232
|
+
const resolvedTypeParams = (field.type.kind === "scalar" && field.type.typeParams && Object.keys(field.type.typeParams).length > 0 ? field.type.typeParams : void 0) ?? resolveFieldTypeParams?.(modelName, fieldName, model);
|
|
233
|
+
const resolvedValueSet = resolveFieldValueSet?.(modelName, fieldName, model);
|
|
234
|
+
const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams, resolvedValueSet);
|
|
227
235
|
const key = `readonly ${serializeObjectKey(fieldName)}`;
|
|
228
236
|
outputFieldEntries.push(`${key}: ${resolved.output}`);
|
|
229
237
|
inputFieldEntries.push(`${key}: ${resolved.input}`);
|
|
@@ -239,7 +247,7 @@ function generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams,
|
|
|
239
247
|
input: `{ ${inputModelEntries.join("; ")} }`
|
|
240
248
|
};
|
|
241
249
|
}
|
|
242
|
-
function generateFieldTypesMapsByNamespace(namespaceModels, codecLookup, resolveFieldTypeParams,
|
|
250
|
+
function generateFieldTypesMapsByNamespace(namespaceModels, codecLookup, resolveFieldTypeParams, resolveFieldValueSet) {
|
|
243
251
|
if (namespaceModels.length === 0) return {
|
|
244
252
|
output: "Record<string, never>",
|
|
245
253
|
input: "Record<string, never>"
|
|
@@ -247,7 +255,7 @@ function generateFieldTypesMapsByNamespace(namespaceModels, codecLookup, resolve
|
|
|
247
255
|
const outputNamespaceEntries = [];
|
|
248
256
|
const inputNamespaceEntries = [];
|
|
249
257
|
for (const [nsId, models] of namespaceModels) {
|
|
250
|
-
const inner = generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams,
|
|
258
|
+
const inner = generateBothFieldTypesMaps(models, codecLookup, resolveFieldTypeParams, resolveFieldValueSet);
|
|
251
259
|
const nsKey = `readonly ${serializeObjectKey(nsId)}`;
|
|
252
260
|
outputNamespaceEntries.push(`${nsKey}: ${inner.output}`);
|
|
253
261
|
inputNamespaceEntries.push(`${nsKey}: ${inner.input}`);
|
|
@@ -316,6 +324,6 @@ function generateValueObjectTypeAliases(valueObjects, codecLookup) {
|
|
|
316
324
|
return aliases.join("\n");
|
|
317
325
|
}
|
|
318
326
|
//#endregion
|
|
319
|
-
export { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateFieldTypesMapsByNamespace, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, resolveFieldType, resolveValueObjectType, serializeCrossReference, serializeExecutionType, serializeNamespaceId, serializeObjectKey, serializeValue };
|
|
327
|
+
export { deduplicateImports, generateBothFieldTypesMaps, generateCodecTypeIntersection, generateContractFieldDescriptor, generateFieldInputTypesMap, generateFieldOutputTypesMap, generateFieldResolvedType, generateFieldTypesMapsByNamespace, generateHashTypeAliases, generateImportLines, generateModelFieldEntry, generateModelFieldsType, generateModelRelationsType, generateModelsType, generateRootsType, generateValueObjectType, generateValueObjectTypeAliases, generateValueObjectsDescriptorType, renderValueSetType, resolveFieldType, resolveValueObjectType, serializeCrossReference, serializeExecutionType, serializeNamespaceId, serializeObjectKey, serializeValue };
|
|
320
328
|
|
|
321
329
|
//# 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 ContractEnum,\n ContractField,\n ContractManyToManyRelation,\n ContractModelBase,\n ContractValueObject,\n CrossReference,\n JsonValue,\n ValueSetRef,\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 const space = ref.space !== undefined ? `; readonly space: ${serializeValue(ref.space)}` : '';\n return `{ readonly namespace: ${namespace}; readonly model: ${model}${space} }`;\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\n // Option B: cross-space relations are declared but non-navigable.\n // A relation whose `to.space` is set lives in a foreign contract space;\n // emitting `never` for its entry makes `include` of it a compile error\n // while the relation is still present in the contract JSON for introspection.\n const toRef = relObj['to'];\n // Option B: cross-space relations are declared but non-navigable.\n // When the relation's `to` ref carries a `space` field the target lives\n // in a foreign contract space; emit `never` so `include` of it is a\n // compile error while the relation stays in the contract JSON.\n if (\n toRef !== null &&\n typeof toRef === 'object' &&\n 'space' in toRef &&\n toRef.space !== undefined\n ) {\n relationEntries.push(`readonly ${serializeObjectKey(relName)}: never`);\n continue;\n }\n\n const parts: string[] = [];\n\n if (toRef)\n parts.push(\n `readonly to: ${serializeCrossReference(blindCast<CrossReference, 'contract JSON schema-validated before serialization; truthy check above confirms presence'>(toRef))}`,\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 (relObj['cardinality'] === 'N:M') {\n const { through } = blindCast<\n ContractManyToManyRelation,\n 'contract JSON schema-validated before serialization; cardinality N:M check above confirms the junction variant carries through'\n >(relObj);\n const table = serializeValue(through.table);\n const namespaceId = serializeValue(through.namespaceId);\n const parentColumns = through.parentColumns.map((c) => serializeValue(c)).join(', ');\n const childColumns = through.childColumns.map((c) => serializeValue(c)).join(', ');\n const targetColumns = through.targetColumns.map((c) => serializeValue(c)).join(', ');\n parts.push(\n `readonly through: { readonly table: ${table}; readonly namespaceId: ${namespaceId}; readonly parentColumns: readonly [${parentColumns}]; readonly childColumns: readonly [${childColumns}]; readonly targetColumns: readonly [${targetColumns}] }`,\n );\n }\n\n if (parts.length > 0) {\n relationEntries.push(`readonly ${serializeObjectKey(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, ContractModelBase>,\n generateModelStorage: (modelName: string, model: ContractModelBase) => 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\nexport type FieldTypeParamsResolver = (\n modelName: string,\n fieldName: string,\n model: ContractModelBase,\n) => Record<string, unknown> | undefined;\n\nexport type DomainEnumLookup = (ref: ValueSetRef) => ContractEnum | undefined;\n\nfunction renderEnumMemberLiteral(value: JsonValue): string | undefined {\n if (typeof value === 'string') return serializeValue(value);\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return undefined;\n}\n\nfunction renderEnumValueUnion(values: readonly JsonValue[]): string | undefined {\n if (values.length === 0) return undefined;\n const literals: string[] = [];\n for (const value of values) {\n const lit = renderEnumMemberLiteral(value);\n if (lit === undefined) return undefined;\n literals.push(lit);\n }\n return literals.join(' | ');\n}\n\nexport function resolveFieldType(\n field: ContractField,\n codecLookup?: CodecLookup,\n resolvedTypeParams?: Record<string, unknown>,\n domainEnumLookup?: DomainEnumLookup,\n): ResolvedFieldType {\n const { type } = field;\n\n switch (type.kind) {\n case 'scalar': {\n if (field.valueSet?.entityKind === 'enum' && domainEnumLookup) {\n const domainEnum = domainEnumLookup(field.valueSet);\n const union = domainEnum\n ? renderEnumValueUnion(domainEnum.members.map((m) => m.value))\n : undefined;\n if (union !== undefined && isSafeTypeExpression(union)) {\n return {\n output: applyModifiers(union, field),\n input: applyModifiers(union, field),\n };\n }\n }\n let outputResolved: string | undefined;\n let inputResolved: 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 const renderedInput = codecLookup.renderInputTypeFor?.(type.codecId, effectiveTypeParams);\n if (renderedInput && isSafeTypeExpression(renderedInput)) {\n inputResolved = renderedInput;\n }\n }\n const codecAccessor = `CodecTypes[${serializeValue(type.codecId)}]`;\n return {\n output: applyModifiers(outputResolved ?? `${codecAccessor}['output']`, field),\n input: applyModifiers(inputResolved ?? `${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, ContractModelBase> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n domainEnumLookup?: DomainEnumLookup,\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 =\n inlineTypeParams ?? resolveFieldTypeParams?.(modelName, fieldName, model);\n const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams, domainEnumLookup);\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 generateFieldTypesMapsByNamespace(\n namespaceModels: ReadonlyArray<readonly [string, Record<string, ContractModelBase>]>,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n domainEnumLookup?: DomainEnumLookup,\n): ResolvedFieldType {\n if (namespaceModels.length === 0) {\n return { output: 'Record<string, never>', input: 'Record<string, never>' };\n }\n\n const outputNamespaceEntries: string[] = [];\n const inputNamespaceEntries: string[] = [];\n for (const [nsId, models] of namespaceModels) {\n const inner = generateBothFieldTypesMaps(\n models,\n codecLookup,\n resolveFieldTypeParams,\n domainEnumLookup,\n );\n const nsKey = `readonly ${serializeObjectKey(nsId)}`;\n outputNamespaceEntries.push(`${nsKey}: ${inner.output}`);\n inputNamespaceEntries.push(`${nsKey}: ${inner.input}`);\n }\n\n return {\n output: `{ ${outputNamespaceEntries.join('; ')} }`,\n input: `{ ${inputNamespaceEntries.join('; ')} }`,\n };\n}\n\nexport function generateFieldOutputTypesMap(\n models: Record<string, ContractModelBase> | 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, ContractModelBase> | 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 ContractManyToManyRelation,\n ContractModelBase,\n ContractValueObject,\n CrossReference,\n JsonValue,\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 const space = ref.space !== undefined ? `; readonly space: ${serializeValue(ref.space)}` : '';\n return `{ readonly namespace: ${namespace}; readonly model: ${model}${space} }`;\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\n // Option B: cross-space relations are declared but non-navigable.\n // A relation whose `to.space` is set lives in a foreign contract space;\n // emitting `never` for its entry makes `include` of it a compile error\n // while the relation is still present in the contract JSON for introspection.\n const toRef = relObj['to'];\n // Option B: cross-space relations are declared but non-navigable.\n // When the relation's `to` ref carries a `space` field the target lives\n // in a foreign contract space; emit `never` so `include` of it is a\n // compile error while the relation stays in the contract JSON.\n if (\n toRef !== null &&\n typeof toRef === 'object' &&\n 'space' in toRef &&\n toRef.space !== undefined\n ) {\n relationEntries.push(`readonly ${serializeObjectKey(relName)}: never`);\n continue;\n }\n\n const parts: string[] = [];\n\n if (toRef)\n parts.push(\n `readonly to: ${serializeCrossReference(blindCast<CrossReference, 'contract JSON schema-validated before serialization; truthy check above confirms presence'>(toRef))}`,\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 (relObj['cardinality'] === 'N:M') {\n const { through } = blindCast<\n ContractManyToManyRelation,\n 'contract JSON schema-validated before serialization; cardinality N:M check above confirms the junction variant carries through'\n >(relObj);\n const table = serializeValue(through.table);\n const namespaceId = serializeValue(through.namespaceId);\n const parentColumns = through.parentColumns.map((c) => serializeValue(c)).join(', ');\n const childColumns = through.childColumns.map((c) => serializeValue(c)).join(', ');\n const targetColumns = through.targetColumns.map((c) => serializeValue(c)).join(', ');\n parts.push(\n `readonly through: { readonly table: ${table}; readonly namespaceId: ${namespaceId}; readonly parentColumns: readonly [${parentColumns}]; readonly childColumns: readonly [${childColumns}]; readonly targetColumns: readonly [${targetColumns}] }`,\n );\n }\n\n if (parts.length > 0) {\n relationEntries.push(`readonly ${serializeObjectKey(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, ContractModelBase>,\n generateModelStorage: (modelName: string, model: ContractModelBase) => 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\nexport type FieldTypeParamsResolver = (\n modelName: string,\n fieldName: string,\n model: ContractModelBase,\n) => Record<string, unknown> | undefined;\n\n/**\n * A field's permitted values (codec-encoded) plus the codec that types them, as supplied by the\n * family-specific {@link EmissionSpi.resolveFieldValueSet}. The framework renders these into a TS\n * literal union through the codec seam ({@link renderValueSetType}).\n */\nexport type ResolvedFieldValueSet = {\n readonly encodedValues: readonly JsonValue[];\n readonly codecId: string;\n};\n\nexport type FieldValueSetResolver = (\n modelName: string,\n fieldName: string,\n model: ContractModelBase,\n) => ResolvedFieldValueSet | undefined;\n\n/**\n * Renders a value set (a field/column's permitted values, codec-encoded) into a TS literal union by\n * routing **each** value through the codec's `renderValueLiteral` — the seam owned by the codec, not\n * a generic serializer. `side`: `output` = read type, `input` = create/update type.\n *\n * Returns `undefined` — signalling the caller to fall back to the codec's full output type — when\n * the lookup is absent, has no `renderValueLiteralFor`, the value set is empty, or **any** value\n * isn't literal-expressible. A caller that needs column and field types to agree shares this so both\n * compute the union identically.\n */\nexport function renderValueSetType(\n values: readonly JsonValue[],\n codecId: string,\n side: 'output' | 'input',\n codecLookup: CodecLookup | undefined,\n): string | undefined {\n if (values.length === 0 || codecLookup?.renderValueLiteralFor === undefined) return undefined;\n const literals: string[] = [];\n for (const value of values) {\n const lit = codecLookup.renderValueLiteralFor(codecId, value, side);\n if (lit === undefined || !isSafeTypeExpression(lit)) return undefined;\n literals.push(lit);\n }\n return literals.join(' | ');\n}\n\nexport function resolveFieldType(\n field: ContractField,\n codecLookup?: CodecLookup,\n resolvedTypeParams?: Record<string, unknown>,\n resolvedValueSet?: ResolvedFieldValueSet,\n): ResolvedFieldType {\n const { type } = field;\n\n switch (type.kind) {\n case 'scalar': {\n if (resolvedValueSet) {\n const output = renderValueSetType(\n resolvedValueSet.encodedValues,\n resolvedValueSet.codecId,\n 'output',\n codecLookup,\n );\n const input = renderValueSetType(\n resolvedValueSet.encodedValues,\n resolvedValueSet.codecId,\n 'input',\n codecLookup,\n );\n if (output !== undefined && input !== undefined) {\n return {\n output: applyModifiers(output, field),\n input: applyModifiers(input, field),\n };\n }\n }\n let outputResolved: string | undefined;\n let inputResolved: 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 const renderedInput = codecLookup.renderInputTypeFor?.(type.codecId, effectiveTypeParams);\n if (renderedInput && isSafeTypeExpression(renderedInput)) {\n inputResolved = renderedInput;\n }\n }\n const codecAccessor = `CodecTypes[${serializeValue(type.codecId)}]`;\n return {\n output: applyModifiers(outputResolved ?? `${codecAccessor}['output']`, field),\n input: applyModifiers(inputResolved ?? `${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, ContractModelBase> | undefined,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n resolveFieldValueSet?: FieldValueSetResolver,\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 =\n inlineTypeParams ?? resolveFieldTypeParams?.(modelName, fieldName, model);\n const resolvedValueSet = resolveFieldValueSet?.(modelName, fieldName, model);\n const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams, resolvedValueSet);\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 generateFieldTypesMapsByNamespace(\n namespaceModels: ReadonlyArray<readonly [string, Record<string, ContractModelBase>]>,\n codecLookup?: CodecLookup,\n resolveFieldTypeParams?: FieldTypeParamsResolver,\n resolveFieldValueSet?: FieldValueSetResolver,\n): ResolvedFieldType {\n if (namespaceModels.length === 0) {\n return { output: 'Record<string, never>', input: 'Record<string, never>' };\n }\n\n const outputNamespaceEntries: string[] = [];\n const inputNamespaceEntries: string[] = [];\n for (const [nsId, models] of namespaceModels) {\n const inner = generateBothFieldTypesMaps(\n models,\n codecLookup,\n resolveFieldTypeParams,\n resolveFieldValueSet,\n );\n const nsKey = `readonly ${serializeObjectKey(nsId)}`;\n outputNamespaceEntries.push(`${nsKey}: ${inner.output}`);\n inputNamespaceEntries.push(`${nsKey}: ${inner.input}`);\n }\n\n return {\n output: `{ ${outputNamespaceEntries.join('; ')} }`,\n input: `{ ${inputNamespaceEntries.join('; ')} }`,\n };\n}\n\nexport function generateFieldOutputTypesMap(\n models: Record<string, ContractModelBase> | 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, ContractModelBase> | 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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"}
|
package/dist/exports/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as serializeValue, _ as generateModelRelationsType, a as deduplicateImports, k as serializeObjectKey, m as generateImportLines, p as generateHashTypeAliases, s as generateCodecTypeIntersection, u as generateFieldOutputTypesMap, y as generateRootsType } from "../domain-type-generation-BYr4LZNS.mjs";
|
|
2
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-Cjiwoga9.mjs";
|
|
3
3
|
export { type EmitOptions, type EmitResult, type EmitStackInput, type EmittedArtifactPaths, deduplicateImports, emit, generateCodecTypeIntersection, generateContractDts, generateFieldOutputTypesMap, generateHashTypeAliases, generateImportLines, generateModelRelationsType, generateRootsType, getEmittedArtifactPaths, serializeObjectKey, serializeValue };
|
package/dist/exports/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-
|
|
1
|
+
import { n as generateContractDts, r as getEmittedArtifactPaths, t as emit } from "../exports-Bsc1vgw7.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 };
|
|
@@ -57,13 +57,8 @@ function generateContractDts(contract, emitter, codecTypeImports, hashes, option
|
|
|
57
57
|
}).join(";\n");
|
|
58
58
|
const executionClause = contract.execution !== void 0 ? `\n readonly execution: ${serializeExecutionType(contract.execution)};` : "";
|
|
59
59
|
const resolveFieldTypeParams = emitter.resolveFieldTypeParams ? (modelName, fieldName, model) => emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract) : void 0;
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
const ns = contract.domain.namespaces[ref.namespaceId];
|
|
63
|
-
if (!ns) return void 0;
|
|
64
|
-
return blindCast(ns.enum)?.[ref.entityName];
|
|
65
|
-
};
|
|
66
|
-
const fieldTypesMaps = generateFieldTypesMapsByNamespace(namespaceEntries.map(([nsId, ns]) => [nsId, ns.models]), codecLookup, resolveFieldTypeParams, domainEnumLookup);
|
|
60
|
+
const resolveFieldValueSet = emitter.resolveFieldValueSet ? (modelName, fieldName, model) => emitter.resolveFieldValueSet?.(modelName, fieldName, model, contract) : void 0;
|
|
61
|
+
const fieldTypesMaps = generateFieldTypesMapsByNamespace(namespaceEntries.map(([nsId, ns]) => [nsId, ns.models]), codecLookup, resolveFieldTypeParams, resolveFieldValueSet);
|
|
67
62
|
const extraTypeExports = emitter.getStorageTypeExports?.(contract, codecLookup);
|
|
68
63
|
const contractWrapper = emitter.getContractWrapper("ContractBase", "TypeMaps");
|
|
69
64
|
return `// ⚠️ GENERATED FILE - DO NOT EDIT
|
|
@@ -156,4 +151,4 @@ async function emit(contract, stack, targetFamily, options) {
|
|
|
156
151
|
//#endregion
|
|
157
152
|
export { generateContractDts as n, getEmittedArtifactPaths as r, emit as t };
|
|
158
153
|
|
|
159
|
-
//# sourceMappingURL=exports-
|
|
154
|
+
//# sourceMappingURL=exports-Bsc1vgw7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports-Bsc1vgw7.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 {\n Contract,\n ContractEnum,\n ContractModelBase,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport { DomainNamespaceResolutionError } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n EmissionSpi,\n GenerateContractTypesOptions,\n TypesImportSpec,\n} from '@prisma-next/framework-components/emission';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport {\n deduplicateImports,\n generateCodecTypeIntersection,\n generateFieldTypesMapsByNamespace,\n generateHashTypeAliases,\n generateImportLines,\n generateModelsType,\n generateRootsType,\n generateValueObjectsDescriptorType,\n generateValueObjectTypeAliases,\n serializeExecutionType,\n serializeObjectKey,\n serializeValue,\n} from './domain-type-generation';\n\nfunction generateEnumBlockType(enums: Record<string, ContractEnum>): string {\n const entries = Object.entries(enums).map(([name, entry]) => {\n const memberTupleItems = entry.members.map(\n (m) =>\n `{ readonly name: ${serializeValue(m.name)}; readonly value: ${serializeValue(m.value)} }`,\n );\n const membersType = `readonly [${memberTupleItems.join(', ')}]`;\n return `readonly ${serializeObjectKey(name)}: { readonly codecId: ${serializeValue(entry.codecId)}; readonly members: ${membersType} }`;\n });\n return `{ ${entries.join('; ')} }`;\n}\n\nexport function generateContractDts(\n contract: Contract,\n emitter: EmissionSpi,\n codecTypeImports: ReadonlyArray<TypesImportSpec>,\n hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n },\n options?: GenerateContractTypesOptions,\n codecLookup?: CodecLookup,\n): string {\n const allImports: TypesImportSpec[] = [...codecTypeImports];\n if (options?.queryOperationTypeImports) {\n allImports.push(...options.queryOperationTypeImports);\n }\n const uniqueImports = deduplicateImports(allImports);\n const importLines = generateImportLines(uniqueImports);\n\n const familyImportLines = emitter.getFamilyImports();\n\n const hashAliases = generateHashTypeAliases(hashes);\n\n const codecTypes = generateCodecTypeIntersection(codecTypeImports, 'CodecTypes');\n\n const familyTypeAliases = emitter.getFamilyTypeAliases(options);\n\n const typeMapsExpr = emitter.getTypeMapsExpression();\n\n const storageType = emitter.generateStorageType(contract, 'StorageHash');\n\n const namespaceEntries = Object.entries(contract.domain.namespaces);\n if (namespaceEntries.length === 0) {\n throw new DomainNamespaceResolutionError('domain has no namespaces');\n }\n\n // Validate all namespace entries are present.\n for (const [nsId, ns] of namespaceEntries) {\n if (ns === undefined) {\n throw new Error(`domain namespace \"${nsId}\" is not present on the contract`);\n }\n }\n\n const rootsType = generateRootsType(contract.roots);\n\n // Flatten value objects across all namespaces — first-name-wins on collision.\n const flatValueObjects: Record<string, ContractValueObject> = {};\n for (const [, ns] of namespaceEntries) {\n for (const [voName, vo] of Object.entries(\n blindCast<\n Record<string, ContractValueObject>,\n 'ns.valueObjects is a ContractValueObject record in the emitted IR (default to {} when absent)'\n >(ns.valueObjects ?? {}),\n )) {\n if (!(voName in flatValueObjects)) {\n flatValueObjects[voName] = vo;\n }\n }\n }\n const valueObjects = Object.keys(flatValueObjects).length > 0 ? flatValueObjects : undefined;\n const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);\n const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);\n\n // Per-namespace models, value objects, and enum types for the domain.namespaces section.\n const perNamespaceTypes: Array<\n readonly [string, string, string | undefined, string | undefined]\n > = namespaceEntries.map(([nsId, ns]) => {\n const nsModels = ns.models;\n const nsModelsType = generateModelsType(nsModels, (name, model) =>\n emitter.generateModelStorageType(name, model),\n );\n const nsValueObjects = blindCast<\n Record<string, ContractValueObject> | undefined,\n 'ns.valueObjects is an optional ContractValueObject record in the emitted IR'\n >(ns.valueObjects);\n const nsValueObjectsDescriptor =\n nsValueObjects !== undefined && Object.keys(nsValueObjects).length > 0\n ? generateValueObjectsDescriptorType(nsValueObjects)\n : undefined;\n const nsEnums = blindCast<\n Record<string, ContractEnum> | undefined,\n 'ns.enum is an optional ContractEnum record in the emitted IR'\n >(ns.enum);\n const nsEnumBlock =\n nsEnums !== undefined && Object.keys(nsEnums).length > 0\n ? generateEnumBlockType(nsEnums)\n : undefined;\n return [nsId, nsModelsType, nsValueObjectsDescriptor, nsEnumBlock] as const;\n });\n\n const domainNamespacesType = perNamespaceTypes\n .map(([nsId, nsModelsType, nsValueObjectsDescriptor, nsEnumBlock]) => {\n const voLine =\n nsValueObjectsDescriptor !== undefined\n ? `\\n readonly valueObjects: ${nsValueObjectsDescriptor};`\n : '';\n const enumLine = nsEnumBlock !== undefined ? `\\n readonly enum: ${nsEnumBlock};` : '';\n return ` readonly ${nsId}: {\\n readonly models: ${nsModelsType};${voLine}${enumLine}\\n }`;\n })\n .join(';\\n');\n\n const executionClause =\n contract.execution !== undefined\n ? `\\n readonly execution: ${serializeExecutionType(contract.execution)};`\n : '';\n\n const resolveFieldTypeParams = emitter.resolveFieldTypeParams\n ? (modelName: string, fieldName: string, model: ContractModelBase) =>\n emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract)\n : undefined;\n\n const resolveFieldValueSet = emitter.resolveFieldValueSet\n ? (modelName: string, fieldName: string, model: ContractModelBase) =>\n emitter.resolveFieldValueSet?.(modelName, fieldName, model, contract)\n : undefined;\n\n const namespaceModelsForFieldTypes = namespaceEntries.map(\n ([nsId, ns]) => [nsId, ns.models] as const,\n );\n\n const fieldTypesMaps = generateFieldTypesMapsByNamespace(\n namespaceModelsForFieldTypes,\n codecLookup,\n resolveFieldTypeParams,\n resolveFieldValueSet,\n );\n\n const extraTypeExports = emitter.getStorageTypeExports?.(contract, codecLookup);\n\n const contractWrapper = emitter.getContractWrapper('ContractBase', 'TypeMaps');\n\n return `// ⚠️ GENERATED FILE - DO NOT EDIT\n// This file is automatically generated by 'prisma-next contract emit'.\n// To regenerate, run: prisma-next contract emit\n${importLines.join('\\n')}\n\n${familyImportLines.join('\\n')}\nimport type {\n Contract as ContractType,\n ExecutionHashBase,\n NamespaceId,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\n\n${hashAliases}\n\nexport type CodecTypes = ${codecTypes};\n${familyTypeAliases}\n${valueObjectTypeAliases}\nexport type FieldOutputTypes = ${fieldTypesMaps.output};\nexport type FieldInputTypes = ${fieldTypesMaps.input};\n${extraTypeExports ? `${extraTypeExports}\\n` : ''}export type TypeMaps = ${typeMapsExpr};\n\ntype ContractBase = Omit<\n ContractType<${storageType}>,\n 'roots' | 'domain'\n> & {\n readonly target: ${serializeValue(contract.target)};\n readonly targetFamily: ${serializeValue(contract.targetFamily)};\n readonly roots: ${rootsType};\n readonly domain: {\n readonly namespaces: {\n${domainNamespacesType};\n };\n };\n readonly capabilities: ${serializeValue(contract.capabilities)};\n readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}\n readonly meta: ${serializeValue(contract.meta)};\n ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}\n readonly profileHash: ProfileHash;\n};\n\n${contractWrapper}\n`;\n}\n","import { canonicalizeContractToObject } from '@prisma-next/contract/hashing';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { format } from 'prettier';\nimport { getEmittedArtifactPaths } from './artifact-paths';\nimport type { EmitOptions, EmitResult, EmitStackInput } from './emit-types';\nimport { generateContractDts } from './generate-contract-dts';\n\nconst SCHEMA_VERSION = '1';\n\nexport async function emit(\n contract: Contract,\n stack: EmitStackInput,\n targetFamily: EmissionSpi,\n options: EmitOptions,\n): Promise<EmitResult> {\n if (options.outputJsonPath !== undefined) {\n getEmittedArtifactPaths(options.outputJsonPath);\n }\n\n const { codecTypeImports, queryOperationTypeImports } = stack;\n\n const { storageHash } = contract.storage;\n const executionHash = contract.execution?.executionHash;\n const { profileHash } = contract;\n\n const canonicalized = canonicalizeContractToObject(contract, {\n schemaVersion: SCHEMA_VERSION,\n serializeContract: options.serializeContract,\n ...ifDefined('shouldPreserveEmpty', options.shouldPreserveEmpty),\n ...ifDefined('sortStorage', options.sortStorage),\n });\n const contractJsonString = JSON.stringify(\n {\n ...canonicalized,\n _generated: {\n warning: '⚠️ GENERATED FILE - DO NOT EDIT',\n message: 'This file is automatically generated by \"prisma-next contract emit\".',\n regenerate: 'To regenerate, run: prisma-next contract emit',\n },\n },\n null,\n 2,\n );\n\n const generateOptions = queryOperationTypeImports ? { queryOperationTypeImports } : undefined;\n\n const contractTypeHashes = {\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n const contractDtsRaw = generateContractDts(\n contract,\n targetFamily,\n codecTypeImports ?? [],\n contractTypeHashes,\n generateOptions,\n stack.codecLookup,\n );\n const contractDts = await format(contractDtsRaw, {\n parser: 'typescript',\n singleQuote: true,\n semi: true,\n printWidth: 100,\n });\n\n return {\n contractJson: contractJsonString,\n contractDts,\n storageHash,\n ...ifDefined('executionHash', executionHash),\n profileHash,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-Cjiwoga9.d.mts","names":[],"sources":["../src/artifact-paths.ts","../src/emit-types.ts","../src/emit.ts","../src/generate-contract-dts.ts"],"mappings":";;;;;;UAEiB,oBAAA;EAAA,SACN,QAAA;EAAA,SACA,OAAO;AAAA;AAAA,iBAGF,uBAAA,CAAwB,cAAA,WAAyB,oBAAoB;;;;;;;AALrF;UCWiB,cAAA;EAAA,SACN,gBAAA,GAAmB,aAAA,CAAc,eAAA;EAAA,SACjC,yBAAA,GAA4B,aAAA,CAAc,eAAA;EAAA,SAC1C,YAAA,GAAe,aAAA;EAAA,SACf,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,WAAA;EAAA,SACN,cAAA;EDd0E;;;;ACMrF;;;;;EDNqF,SCwB1E,iBAAA,EAAmB,iBAAA;EAhBS;;;;EAAA,SAqB5B,mBAAA,GAAsB,sBAAA;EAtBtB;;;;EAAA,SA2BA,WAAA,GAAc,WAAA;AAAA;AAAA,UAGR,UAAA;EAAA,SACN,YAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA;;;iBCtCW,IAAA,CACpB,QAAA,EAAU,QAAA,EACV,KAAA,EAAO,cAAA,EACP,YAAA,EAAc,WAAA,EACd,OAAA,EAAS,WAAA,GACR,OAAA,CAAQ,UAAA;;;
|
|
1
|
+
{"version":3,"file":"index-Cjiwoga9.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;;;iBCyBK,mBAAA,CACd,QAAA,EAAU,QAAA,EACV,OAAA,EAAS,WAAA,EACT,gBAAA,EAAkB,aAAA,CAAc,eAAA,GAChC,MAAA;EAAA,SACW,WAAA;EAAA,SACA,aAAA;EAAA,SACA,WAAA;AAAA,GAEX,OAAA,GAAU,4BAAA,EACV,WAAA,GAAc,WAAA"}
|
package/dist/test/utils.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as emit$1 } from "../exports-
|
|
1
|
+
import { t as emit$1 } from "../exports-Bsc1vgw7.mjs";
|
|
2
2
|
import { computeExecutionHash, computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
|
|
3
3
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
4
|
import { UNBOUND_DOMAIN_NAMESPACE_ID, coreHash } from "@prisma-next/contract/types";
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/emitter",
|
|
3
|
-
"version": "0.14.0-dev.
|
|
3
|
+
"version": "0.14.0-dev.30",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.14.0-dev.
|
|
9
|
-
"@prisma-next/framework-components": "0.14.0-dev.
|
|
10
|
-
"@prisma-next/operations": "0.14.0-dev.
|
|
11
|
-
"@prisma-next/ts-render": "0.14.0-dev.
|
|
12
|
-
"@prisma-next/utils": "0.14.0-dev.
|
|
8
|
+
"@prisma-next/contract": "0.14.0-dev.30",
|
|
9
|
+
"@prisma-next/framework-components": "0.14.0-dev.30",
|
|
10
|
+
"@prisma-next/operations": "0.14.0-dev.30",
|
|
11
|
+
"@prisma-next/ts-render": "0.14.0-dev.30",
|
|
12
|
+
"@prisma-next/utils": "0.14.0-dev.30",
|
|
13
13
|
"arktype": "^2.2.0",
|
|
14
14
|
"prettier": "^3.8.3"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@prisma-next/test-utils": "0.14.0-dev.
|
|
18
|
-
"@prisma-next/tsconfig": "0.14.0-dev.
|
|
17
|
+
"@prisma-next/test-utils": "0.14.0-dev.30",
|
|
18
|
+
"@prisma-next/tsconfig": "0.14.0-dev.30",
|
|
19
19
|
"@types/node": "25.9.1",
|
|
20
|
-
"@prisma-next/tsdown": "0.14.0-dev.
|
|
20
|
+
"@prisma-next/tsdown": "0.14.0-dev.30",
|
|
21
21
|
"tsdown": "0.22.1",
|
|
22
22
|
"typescript": "5.9.3",
|
|
23
23
|
"vitest": "4.1.8"
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
ContractEnum,
|
|
3
2
|
ContractField,
|
|
4
3
|
ContractManyToManyRelation,
|
|
5
4
|
ContractModelBase,
|
|
6
5
|
ContractValueObject,
|
|
7
6
|
CrossReference,
|
|
8
7
|
JsonValue,
|
|
9
|
-
ValueSetRef,
|
|
10
8
|
} from '@prisma-next/contract/types';
|
|
11
9
|
import type { CodecLookup } from '@prisma-next/framework-components/codec';
|
|
12
10
|
import type { TypesImportSpec } from '@prisma-next/framework-components/emission';
|
|
@@ -291,20 +289,43 @@ export type FieldTypeParamsResolver = (
|
|
|
291
289
|
model: ContractModelBase,
|
|
292
290
|
) => Record<string, unknown> | undefined;
|
|
293
291
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
292
|
+
/**
|
|
293
|
+
* A field's permitted values (codec-encoded) plus the codec that types them, as supplied by the
|
|
294
|
+
* family-specific {@link EmissionSpi.resolveFieldValueSet}. The framework renders these into a TS
|
|
295
|
+
* literal union through the codec seam ({@link renderValueSetType}).
|
|
296
|
+
*/
|
|
297
|
+
export type ResolvedFieldValueSet = {
|
|
298
|
+
readonly encodedValues: readonly JsonValue[];
|
|
299
|
+
readonly codecId: string;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
export type FieldValueSetResolver = (
|
|
303
|
+
modelName: string,
|
|
304
|
+
fieldName: string,
|
|
305
|
+
model: ContractModelBase,
|
|
306
|
+
) => ResolvedFieldValueSet | undefined;
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Renders a value set (a field/column's permitted values, codec-encoded) into a TS literal union by
|
|
310
|
+
* routing **each** value through the codec's `renderValueLiteral` — the seam owned by the codec, not
|
|
311
|
+
* a generic serializer. `side`: `output` = read type, `input` = create/update type.
|
|
312
|
+
*
|
|
313
|
+
* Returns `undefined` — signalling the caller to fall back to the codec's full output type — when
|
|
314
|
+
* the lookup is absent, has no `renderValueLiteralFor`, the value set is empty, or **any** value
|
|
315
|
+
* isn't literal-expressible. A caller that needs column and field types to agree shares this so both
|
|
316
|
+
* compute the union identically.
|
|
317
|
+
*/
|
|
318
|
+
export function renderValueSetType(
|
|
319
|
+
values: readonly JsonValue[],
|
|
320
|
+
codecId: string,
|
|
321
|
+
side: 'output' | 'input',
|
|
322
|
+
codecLookup: CodecLookup | undefined,
|
|
323
|
+
): string | undefined {
|
|
324
|
+
if (values.length === 0 || codecLookup?.renderValueLiteralFor === undefined) return undefined;
|
|
304
325
|
const literals: string[] = [];
|
|
305
326
|
for (const value of values) {
|
|
306
|
-
const lit =
|
|
307
|
-
if (lit === undefined) return undefined;
|
|
327
|
+
const lit = codecLookup.renderValueLiteralFor(codecId, value, side);
|
|
328
|
+
if (lit === undefined || !isSafeTypeExpression(lit)) return undefined;
|
|
308
329
|
literals.push(lit);
|
|
309
330
|
}
|
|
310
331
|
return literals.join(' | ');
|
|
@@ -314,21 +335,29 @@ export function resolveFieldType(
|
|
|
314
335
|
field: ContractField,
|
|
315
336
|
codecLookup?: CodecLookup,
|
|
316
337
|
resolvedTypeParams?: Record<string, unknown>,
|
|
317
|
-
|
|
338
|
+
resolvedValueSet?: ResolvedFieldValueSet,
|
|
318
339
|
): ResolvedFieldType {
|
|
319
340
|
const { type } = field;
|
|
320
341
|
|
|
321
342
|
switch (type.kind) {
|
|
322
343
|
case 'scalar': {
|
|
323
|
-
if (
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
344
|
+
if (resolvedValueSet) {
|
|
345
|
+
const output = renderValueSetType(
|
|
346
|
+
resolvedValueSet.encodedValues,
|
|
347
|
+
resolvedValueSet.codecId,
|
|
348
|
+
'output',
|
|
349
|
+
codecLookup,
|
|
350
|
+
);
|
|
351
|
+
const input = renderValueSetType(
|
|
352
|
+
resolvedValueSet.encodedValues,
|
|
353
|
+
resolvedValueSet.codecId,
|
|
354
|
+
'input',
|
|
355
|
+
codecLookup,
|
|
356
|
+
);
|
|
357
|
+
if (output !== undefined && input !== undefined) {
|
|
329
358
|
return {
|
|
330
|
-
output: applyModifiers(
|
|
331
|
-
input: applyModifiers(
|
|
359
|
+
output: applyModifiers(output, field),
|
|
360
|
+
input: applyModifiers(input, field),
|
|
332
361
|
};
|
|
333
362
|
}
|
|
334
363
|
}
|
|
@@ -394,7 +423,7 @@ export function generateBothFieldTypesMaps(
|
|
|
394
423
|
models: Record<string, ContractModelBase> | undefined,
|
|
395
424
|
codecLookup?: CodecLookup,
|
|
396
425
|
resolveFieldTypeParams?: FieldTypeParamsResolver,
|
|
397
|
-
|
|
426
|
+
resolveFieldValueSet?: FieldValueSetResolver,
|
|
398
427
|
): ResolvedFieldType {
|
|
399
428
|
if (!models || Object.keys(models).length === 0) {
|
|
400
429
|
return { output: 'Record<string, never>', input: 'Record<string, never>' };
|
|
@@ -415,7 +444,8 @@ export function generateBothFieldTypesMaps(
|
|
|
415
444
|
: undefined;
|
|
416
445
|
const resolvedTypeParams =
|
|
417
446
|
inlineTypeParams ?? resolveFieldTypeParams?.(modelName, fieldName, model);
|
|
418
|
-
const
|
|
447
|
+
const resolvedValueSet = resolveFieldValueSet?.(modelName, fieldName, model);
|
|
448
|
+
const resolved = resolveFieldType(field, codecLookup, resolvedTypeParams, resolvedValueSet);
|
|
419
449
|
const key = `readonly ${serializeObjectKey(fieldName)}`;
|
|
420
450
|
outputFieldEntries.push(`${key}: ${resolved.output}`);
|
|
421
451
|
inputFieldEntries.push(`${key}: ${resolved.input}`);
|
|
@@ -443,7 +473,7 @@ export function generateFieldTypesMapsByNamespace(
|
|
|
443
473
|
namespaceModels: ReadonlyArray<readonly [string, Record<string, ContractModelBase>]>,
|
|
444
474
|
codecLookup?: CodecLookup,
|
|
445
475
|
resolveFieldTypeParams?: FieldTypeParamsResolver,
|
|
446
|
-
|
|
476
|
+
resolveFieldValueSet?: FieldValueSetResolver,
|
|
447
477
|
): ResolvedFieldType {
|
|
448
478
|
if (namespaceModels.length === 0) {
|
|
449
479
|
return { output: 'Record<string, never>', input: 'Record<string, never>' };
|
|
@@ -456,7 +486,7 @@ export function generateFieldTypesMapsByNamespace(
|
|
|
456
486
|
models,
|
|
457
487
|
codecLookup,
|
|
458
488
|
resolveFieldTypeParams,
|
|
459
|
-
|
|
489
|
+
resolveFieldValueSet,
|
|
460
490
|
);
|
|
461
491
|
const nsKey = `readonly ${serializeObjectKey(nsId)}`;
|
|
462
492
|
outputNamespaceEntries.push(`${nsKey}: ${inner.output}`);
|
|
@@ -3,7 +3,6 @@ import type {
|
|
|
3
3
|
ContractEnum,
|
|
4
4
|
ContractModelBase,
|
|
5
5
|
ContractValueObject,
|
|
6
|
-
ValueSetRef,
|
|
7
6
|
} from '@prisma-next/contract/types';
|
|
8
7
|
import { DomainNamespaceResolutionError } from '@prisma-next/contract/types';
|
|
9
8
|
import type { CodecLookup } from '@prisma-next/framework-components/codec';
|
|
@@ -14,7 +13,6 @@ import type {
|
|
|
14
13
|
} from '@prisma-next/framework-components/emission';
|
|
15
14
|
import { blindCast } from '@prisma-next/utils/casts';
|
|
16
15
|
import {
|
|
17
|
-
type DomainEnumLookup,
|
|
18
16
|
deduplicateImports,
|
|
19
17
|
generateCodecTypeIntersection,
|
|
20
18
|
generateFieldTypesMapsByNamespace,
|
|
@@ -152,16 +150,10 @@ export function generateContractDts(
|
|
|
152
150
|
emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract)
|
|
153
151
|
: undefined;
|
|
154
152
|
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const enumBlock = blindCast<
|
|
160
|
-
Record<string, ContractEnum> | undefined,
|
|
161
|
-
'ns.enum is an optional ContractEnum record in the emitted IR'
|
|
162
|
-
>(ns.enum);
|
|
163
|
-
return enumBlock?.[ref.entityName];
|
|
164
|
-
};
|
|
153
|
+
const resolveFieldValueSet = emitter.resolveFieldValueSet
|
|
154
|
+
? (modelName: string, fieldName: string, model: ContractModelBase) =>
|
|
155
|
+
emitter.resolveFieldValueSet?.(modelName, fieldName, model, contract)
|
|
156
|
+
: undefined;
|
|
165
157
|
|
|
166
158
|
const namespaceModelsForFieldTypes = namespaceEntries.map(
|
|
167
159
|
([nsId, ns]) => [nsId, ns.models] as const,
|
|
@@ -171,7 +163,7 @@ export function generateContractDts(
|
|
|
171
163
|
namespaceModelsForFieldTypes,
|
|
172
164
|
codecLookup,
|
|
173
165
|
resolveFieldTypeParams,
|
|
174
|
-
|
|
166
|
+
resolveFieldValueSet,
|
|
175
167
|
);
|
|
176
168
|
|
|
177
169
|
const extraTypeExports = emitter.getStorageTypeExports?.(contract, codecLookup);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"domain-type-generation-DdX577fp.d.mts","names":[],"sources":["../src/domain-type-generation.ts"],"mappings":";;;;;iBAgBgB,cAAA,CAAe,KAAc;AAAA,iBA+B7B,kBAAA,CAAmB,GAAW;AAAA,iBAO9B,oBAAA,CAAqB,KAAa;AAAA,iBAIlC,uBAAA,CAAwB,GAAmB,EAAd,cAAc;AAAA,iBAO3C,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,iBA4E5C,kBAAA,CACd,MAAA,EAAQ,MAAA,SAAe,iBAAA,GACvB,oBAAA,GAAuB,SAAA,UAAmB,KAAA,EAAO,iBAAA;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;AAAA,KAU7D,uBAAA,IACV,SAAA,UACA,SAAA,UACA,KAAA,EAAO,iBAAA,KACJ,MAAM;AAAA,KAEC,gBAAA,IAAoB,GAAA,EAAK,WAAA,KAAgB,YAAY;AAAA,iBAmBjD,gBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAA,EACd,kBAAA,GAAqB,MAAA,mBACrB,gBAAA,GAAmB,gBAAA,GAClB,iBAAA;AAAA,iBAmEa,yBAAA,CACd,KAAA,EAAO,aAAA,EACP,WAAA,GAAc,WAAW,EACzB,IAAA;AAAA,iBAKc,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,iBAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA,EACzB,gBAAA,GAAmB,gBAAA,GAClB,iBAAA;AAAA,iBA4Ca,iCAAA,CACd,eAAA,EAAiB,aAAA,mBAAgC,MAAA,SAAe,iBAAA,KAChE,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA,EACzB,gBAAA,GAAmB,gBAAA,GAClB,iBAAA;AAAA,iBAyBa,2BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,iBAAA,eACvB,WAAA,GAAc,WAAA,EACd,sBAAA,GAAyB,uBAAA;AAAA,iBAKX,0BAAA,CACd,MAAA,EAAQ,MAAA,SAAe,iBAAA,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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exports-CGeb57Cz.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 {\n Contract,\n ContractEnum,\n ContractModelBase,\n ContractValueObject,\n ValueSetRef,\n} from '@prisma-next/contract/types';\nimport { DomainNamespaceResolutionError } from '@prisma-next/contract/types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n EmissionSpi,\n GenerateContractTypesOptions,\n TypesImportSpec,\n} from '@prisma-next/framework-components/emission';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport {\n type DomainEnumLookup,\n deduplicateImports,\n generateCodecTypeIntersection,\n generateFieldTypesMapsByNamespace,\n generateHashTypeAliases,\n generateImportLines,\n generateModelsType,\n generateRootsType,\n generateValueObjectsDescriptorType,\n generateValueObjectTypeAliases,\n serializeExecutionType,\n serializeObjectKey,\n serializeValue,\n} from './domain-type-generation';\n\nfunction generateEnumBlockType(enums: Record<string, ContractEnum>): string {\n const entries = Object.entries(enums).map(([name, entry]) => {\n const memberTupleItems = entry.members.map(\n (m) =>\n `{ readonly name: ${serializeValue(m.name)}; readonly value: ${serializeValue(m.value)} }`,\n );\n const membersType = `readonly [${memberTupleItems.join(', ')}]`;\n return `readonly ${serializeObjectKey(name)}: { readonly codecId: ${serializeValue(entry.codecId)}; readonly members: ${membersType} }`;\n });\n return `{ ${entries.join('; ')} }`;\n}\n\nexport function generateContractDts(\n contract: Contract,\n emitter: EmissionSpi,\n codecTypeImports: ReadonlyArray<TypesImportSpec>,\n hashes: {\n readonly storageHash: string;\n readonly executionHash?: string;\n readonly profileHash: string;\n },\n options?: GenerateContractTypesOptions,\n codecLookup?: CodecLookup,\n): string {\n const allImports: TypesImportSpec[] = [...codecTypeImports];\n if (options?.queryOperationTypeImports) {\n allImports.push(...options.queryOperationTypeImports);\n }\n const uniqueImports = deduplicateImports(allImports);\n const importLines = generateImportLines(uniqueImports);\n\n const familyImportLines = emitter.getFamilyImports();\n\n const hashAliases = generateHashTypeAliases(hashes);\n\n const codecTypes = generateCodecTypeIntersection(codecTypeImports, 'CodecTypes');\n\n const familyTypeAliases = emitter.getFamilyTypeAliases(options);\n\n const typeMapsExpr = emitter.getTypeMapsExpression();\n\n const storageType = emitter.generateStorageType(contract, 'StorageHash');\n\n const namespaceEntries = Object.entries(contract.domain.namespaces);\n if (namespaceEntries.length === 0) {\n throw new DomainNamespaceResolutionError('domain has no namespaces');\n }\n\n // Validate all namespace entries are present.\n for (const [nsId, ns] of namespaceEntries) {\n if (ns === undefined) {\n throw new Error(`domain namespace \"${nsId}\" is not present on the contract`);\n }\n }\n\n const rootsType = generateRootsType(contract.roots);\n\n // Flatten value objects across all namespaces — first-name-wins on collision.\n const flatValueObjects: Record<string, ContractValueObject> = {};\n for (const [, ns] of namespaceEntries) {\n for (const [voName, vo] of Object.entries(\n blindCast<\n Record<string, ContractValueObject>,\n 'ns.valueObjects is a ContractValueObject record in the emitted IR (default to {} when absent)'\n >(ns.valueObjects ?? {}),\n )) {\n if (!(voName in flatValueObjects)) {\n flatValueObjects[voName] = vo;\n }\n }\n }\n const valueObjects = Object.keys(flatValueObjects).length > 0 ? flatValueObjects : undefined;\n const valueObjectTypeAliases = generateValueObjectTypeAliases(valueObjects, codecLookup);\n const valueObjectsDescriptor = generateValueObjectsDescriptorType(valueObjects);\n\n // Per-namespace models, value objects, and enum types for the domain.namespaces section.\n const perNamespaceTypes: Array<\n readonly [string, string, string | undefined, string | undefined]\n > = namespaceEntries.map(([nsId, ns]) => {\n const nsModels = ns.models;\n const nsModelsType = generateModelsType(nsModels, (name, model) =>\n emitter.generateModelStorageType(name, model),\n );\n const nsValueObjects = blindCast<\n Record<string, ContractValueObject> | undefined,\n 'ns.valueObjects is an optional ContractValueObject record in the emitted IR'\n >(ns.valueObjects);\n const nsValueObjectsDescriptor =\n nsValueObjects !== undefined && Object.keys(nsValueObjects).length > 0\n ? generateValueObjectsDescriptorType(nsValueObjects)\n : undefined;\n const nsEnums = blindCast<\n Record<string, ContractEnum> | undefined,\n 'ns.enum is an optional ContractEnum record in the emitted IR'\n >(ns.enum);\n const nsEnumBlock =\n nsEnums !== undefined && Object.keys(nsEnums).length > 0\n ? generateEnumBlockType(nsEnums)\n : undefined;\n return [nsId, nsModelsType, nsValueObjectsDescriptor, nsEnumBlock] as const;\n });\n\n const domainNamespacesType = perNamespaceTypes\n .map(([nsId, nsModelsType, nsValueObjectsDescriptor, nsEnumBlock]) => {\n const voLine =\n nsValueObjectsDescriptor !== undefined\n ? `\\n readonly valueObjects: ${nsValueObjectsDescriptor};`\n : '';\n const enumLine = nsEnumBlock !== undefined ? `\\n readonly enum: ${nsEnumBlock};` : '';\n return ` readonly ${nsId}: {\\n readonly models: ${nsModelsType};${voLine}${enumLine}\\n }`;\n })\n .join(';\\n');\n\n const executionClause =\n contract.execution !== undefined\n ? `\\n readonly execution: ${serializeExecutionType(contract.execution)};`\n : '';\n\n const resolveFieldTypeParams = emitter.resolveFieldTypeParams\n ? (modelName: string, fieldName: string, model: ContractModelBase) =>\n emitter.resolveFieldTypeParams?.(modelName, fieldName, model, contract)\n : undefined;\n\n const domainEnumLookup: DomainEnumLookup = (ref: ValueSetRef) => {\n if (ref.entityKind !== 'enum') return undefined;\n const ns = contract.domain.namespaces[ref.namespaceId];\n if (!ns) return undefined;\n const enumBlock = blindCast<\n Record<string, ContractEnum> | undefined,\n 'ns.enum is an optional ContractEnum record in the emitted IR'\n >(ns.enum);\n return enumBlock?.[ref.entityName];\n };\n\n const namespaceModelsForFieldTypes = namespaceEntries.map(\n ([nsId, ns]) => [nsId, ns.models] as const,\n );\n\n const fieldTypesMaps = generateFieldTypesMapsByNamespace(\n namespaceModelsForFieldTypes,\n codecLookup,\n resolveFieldTypeParams,\n domainEnumLookup,\n );\n\n const extraTypeExports = emitter.getStorageTypeExports?.(contract, codecLookup);\n\n const contractWrapper = emitter.getContractWrapper('ContractBase', 'TypeMaps');\n\n return `// ⚠️ GENERATED FILE - DO NOT EDIT\n// This file is automatically generated by 'prisma-next contract emit'.\n// To regenerate, run: prisma-next contract emit\n${importLines.join('\\n')}\n\n${familyImportLines.join('\\n')}\nimport type {\n Contract as ContractType,\n ExecutionHashBase,\n NamespaceId,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\n\n${hashAliases}\n\nexport type CodecTypes = ${codecTypes};\n${familyTypeAliases}\n${valueObjectTypeAliases}\nexport type FieldOutputTypes = ${fieldTypesMaps.output};\nexport type FieldInputTypes = ${fieldTypesMaps.input};\n${extraTypeExports ? `${extraTypeExports}\\n` : ''}export type TypeMaps = ${typeMapsExpr};\n\ntype ContractBase = Omit<\n ContractType<${storageType}>,\n 'roots' | 'domain'\n> & {\n readonly target: ${serializeValue(contract.target)};\n readonly targetFamily: ${serializeValue(contract.targetFamily)};\n readonly roots: ${rootsType};\n readonly domain: {\n readonly namespaces: {\n${domainNamespacesType};\n };\n };\n readonly capabilities: ${serializeValue(contract.capabilities)};\n readonly extensionPacks: ${serializeValue(contract.extensionPacks)};${executionClause}\n readonly meta: ${serializeValue(contract.meta)};\n ${valueObjects ? `readonly valueObjects: ${valueObjectsDescriptor};` : ''}\n readonly profileHash: ProfileHash;\n};\n\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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"}
|