@palantir/pack.document-schema.type-gen 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js +85 -0
- package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js.map +1 -0
- package/build/esm/commands/asset/assetDeployHandler.js +36 -1
- package/build/esm/commands/asset/assetDeployHandler.js.map +1 -1
- package/build/esm/commands/asset/registerAssetCommands.js +1 -1
- package/build/esm/commands/asset/registerAssetCommands.js.map +1 -1
- package/build/esm/commands/ir/irGenTypesHandler.js +49 -0
- package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -0
- package/build/esm/commands/ir/registerIrCommands.js +2 -0
- package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js +2 -2
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaIrHandler.js +56 -0
- package/build/esm/commands/schema/schemaIrHandler.js.map +1 -0
- package/build/esm/index.js +0 -6
- package/build/esm/index.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +23 -0
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
- package/build/esm/utils/ir/irFieldHelpers.js +383 -0
- package/build/esm/utils/ir/irFieldHelpers.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js +13 -0
- package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/fixtures.js +76 -5
- package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +19 -7
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +7 -6
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +6 -5
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +19 -10
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +15 -10
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +6 -5
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/convertSchemaToSteps.js +6 -0
- package/build/esm/utils/schema/convertSchemaToSteps.js.map +1 -1
- package/build/esm/utils/schema/generateIndexFromSchema.js +15 -13
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateInternalFromSchema.js +68 -184
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +46 -69
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js +29 -33
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateTypesFromSchema.js +9 -1
- package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +61 -155
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +58 -94
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionsFromSchema.js +7 -5
- package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -1
- package/build/esm/utils/schema/loadSchemaModule.js +53 -0
- package/build/esm/utils/schema/loadSchemaModule.js.map +1 -0
- package/build/esm/utils/schema/resolveSchemaChain.js +59 -9
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
- package/build/esm/utils/schema/runtimeSchema.js +0 -27
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
- package/build/esm/utils/schema/writeAllSdkFiles.js +111 -0
- package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -0
- package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
- package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js +93 -1
- package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js.map +1 -1
- package/build/esm/utils/steps/convertStepsToIr.js +43 -35
- package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
- package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts +2 -0
- package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts.map +1 -0
- package/build/types/commands/asset/assetDeployHandler.d.ts +15 -0
- package/build/types/commands/asset/assetDeployHandler.d.ts.map +1 -1
- package/build/types/commands/asset/registerAssetCommands.d.ts.map +1 -1
- package/build/types/commands/ir/irGenTypesHandler.d.ts +8 -0
- package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -0
- package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
- package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
- package/build/types/commands/schema/schemaIrHandler.d.ts +19 -0
- package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -0
- package/build/types/index.d.ts +1 -6
- package/build/types/index.d.ts.map +1 -1
- package/build/types/utils/ir/irFieldHelpers.d.ts +36 -0
- package/build/types/utils/ir/irFieldHelpers.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts +10 -1
- package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
- package/build/types/utils/schema/convertSchemaToSteps.d.ts.map +1 -1
- package/build/types/utils/schema/generateIndexFromSchema.d.ts +2 -2
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateInternalFromSchema.d.ts +3 -6
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +3 -8
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateScopeFromSchema.d.ts +2 -2
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +4 -7
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +3 -7
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts +3 -3
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/loadSchemaModule.d.ts +14 -0
- package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -0
- package/build/types/utils/schema/resolveSchemaChain.d.ts +29 -8
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
- package/build/types/utils/schema/runtimeSchema.d.ts +0 -32
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
- package/build/types/utils/schema/writeAllSdkFiles.d.ts +8 -0
- package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -0
- package/build/types/utils/steps/convertStepsToIr.d.ts +3 -3
- package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
- package/package.json +3 -3
- package/build/esm/commands/schema/schemaGenTypesHandler.js +0 -147
- package/build/esm/commands/schema/schemaGenTypesHandler.js.map +0 -1
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts +0 -8
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts.map +0 -1
|
@@ -16,110 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import { formatVariantName } from "../formatVariantName.js";
|
|
18
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
const refTypes = new Set();
|
|
23
|
-
function scanField(field) {
|
|
24
|
-
switch (field.type) {
|
|
25
|
-
case TypeKind.ARRAY:
|
|
26
|
-
if (field.items) scanField(field.items);
|
|
27
|
-
break;
|
|
28
|
-
case TypeKind.DOC_REF:
|
|
29
|
-
refTypes.add("DocumentRef");
|
|
30
|
-
break;
|
|
31
|
-
case TypeKind.MEDIA_REF:
|
|
32
|
-
refTypes.add("MediaRef");
|
|
33
|
-
break;
|
|
34
|
-
case TypeKind.OBJECT_REF:
|
|
35
|
-
refTypes.add("ObjectRef");
|
|
36
|
-
break;
|
|
37
|
-
case TypeKind.OPTIONAL:
|
|
38
|
-
if (field.item) scanField(field.item);
|
|
39
|
-
break;
|
|
40
|
-
case TypeKind.USER_REF:
|
|
41
|
-
refTypes.add("UserRef");
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
for (const item of Object.values(schema)) {
|
|
46
|
-
if (isRecordSchema(item)) {
|
|
47
|
-
for (const f of Object.values(item.fields)) {
|
|
48
|
-
scanField(f);
|
|
49
|
-
}
|
|
50
|
-
} else if (isUnionSchema(item)) {
|
|
51
|
-
for (const v of Object.values(item.variants)) {
|
|
52
|
-
scanField(v);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return refTypes;
|
|
57
|
-
}
|
|
58
|
-
function collectReferencedTypes(fieldType, schema, version, out) {
|
|
59
|
-
switch (fieldType.type) {
|
|
60
|
-
case TypeKind.ARRAY:
|
|
61
|
-
if (fieldType.items) collectReferencedTypes(fieldType.items, schema, version, out);
|
|
62
|
-
break;
|
|
63
|
-
case TypeKind.OPTIONAL:
|
|
64
|
-
if (fieldType.item) collectReferencedTypes(fieldType.item, schema, version, out);
|
|
65
|
-
break;
|
|
66
|
-
case TypeKind.REF:
|
|
67
|
-
{
|
|
68
|
-
const name = fieldType.refType === "record" ? findRecordExportName(fieldType.name, schema) ?? fieldType.name : fieldType.name;
|
|
69
|
-
if (name == null) {
|
|
70
|
-
throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);
|
|
71
|
-
}
|
|
72
|
-
out.add(versionedTypeName(name, version));
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function convertTypeToTypeScript(fieldType, schema, version) {
|
|
78
|
-
switch (fieldType.type) {
|
|
79
|
-
case TypeKind.ANY:
|
|
80
|
-
return "any";
|
|
81
|
-
case TypeKind.ARRAY:
|
|
82
|
-
if (fieldType.items == null) {
|
|
83
|
-
throw new Error("Array field is missing items type");
|
|
84
|
-
}
|
|
85
|
-
return `readonly ${convertTypeToTypeScript(fieldType.items, schema, version)}[]`;
|
|
86
|
-
case TypeKind.BOOLEAN:
|
|
87
|
-
return "boolean";
|
|
88
|
-
case TypeKind.DOC_REF:
|
|
89
|
-
return "DocumentRef";
|
|
90
|
-
case TypeKind.DOUBLE:
|
|
91
|
-
return "number";
|
|
92
|
-
case TypeKind.MEDIA_REF:
|
|
93
|
-
return "MediaRef";
|
|
94
|
-
case TypeKind.OBJECT_REF:
|
|
95
|
-
return "ObjectRef";
|
|
96
|
-
case TypeKind.OPTIONAL:
|
|
97
|
-
if (fieldType.item == null) {
|
|
98
|
-
throw new Error("Optional field is missing inner type");
|
|
99
|
-
}
|
|
100
|
-
return convertTypeToTypeScript(fieldType.item, schema, version);
|
|
101
|
-
case TypeKind.REF:
|
|
102
|
-
{
|
|
103
|
-
const name = fieldType.refType === "record" && schema != null ? findRecordExportName(fieldType.name, schema) ?? fieldType.name : fieldType.name;
|
|
104
|
-
if (name == null) {
|
|
105
|
-
throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);
|
|
106
|
-
}
|
|
107
|
-
return version != null ? versionedTypeName(name, version) : name;
|
|
108
|
-
}
|
|
109
|
-
case TypeKind.STRING:
|
|
110
|
-
return "string";
|
|
111
|
-
case TypeKind.USER_REF:
|
|
112
|
-
return "UserRef";
|
|
113
|
-
default:
|
|
114
|
-
throw new Error(`Unknown schema field type: ${fieldType.type}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
19
|
+
import { collectReferencedTypes, convertFieldTypeToTypeScript, detectUsedRefTypes } from "../ir/irFieldHelpers.js";
|
|
20
|
+
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
+
import { typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
118
22
|
/**
|
|
119
23
|
* Generate read types for a specific schema version.
|
|
120
24
|
*/
|
|
121
|
-
function generateReadTypesForVersion(version,
|
|
122
|
-
const usedRefTypes = detectUsedRefTypes(
|
|
25
|
+
function generateReadTypesForVersion(version, ir) {
|
|
26
|
+
const usedRefTypes = detectUsedRefTypes(ir);
|
|
123
27
|
let output = GENERATED_FILE_HEADER;
|
|
124
28
|
if (usedRefTypes.size > 0) {
|
|
125
29
|
const refTypesList = Array.from(usedRefTypes).sort().join(", ");
|
|
@@ -128,42 +32,46 @@ function generateReadTypesForVersion(version, schema) {
|
|
|
128
32
|
output += "\n";
|
|
129
33
|
|
|
130
34
|
// Generate record interfaces
|
|
131
|
-
for (const [
|
|
132
|
-
if (
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
35
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
36
|
+
if (modelDef.type !== "record") continue;
|
|
37
|
+
const record = modelDef.record;
|
|
38
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
39
|
+
if (record.description) {
|
|
40
|
+
output += `/**\n * ${record.description}\n */\n`;
|
|
136
41
|
}
|
|
137
42
|
output += `export interface ${typeName} {\n`;
|
|
138
|
-
for (const
|
|
139
|
-
const tsType =
|
|
140
|
-
const optional =
|
|
141
|
-
output += ` readonly ${
|
|
43
|
+
for (const field of record.fields) {
|
|
44
|
+
const tsType = convertFieldTypeToTypeScript(field.fieldType, version);
|
|
45
|
+
const optional = field.isOptional ? "?" : "";
|
|
46
|
+
output += ` readonly ${field.key}${optional}: ${tsType};\n`;
|
|
142
47
|
}
|
|
143
48
|
output += "}\n\n";
|
|
144
49
|
}
|
|
145
50
|
|
|
146
51
|
// Generate union types
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const typeName = versionedTypeName(
|
|
151
|
-
const discriminantField =
|
|
52
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
53
|
+
if (modelDef.type !== "union") continue;
|
|
54
|
+
const union = modelDef.union;
|
|
55
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
56
|
+
const discriminantField = union.discriminant;
|
|
152
57
|
const variantInterfaces = [];
|
|
153
|
-
for (const [variantName,
|
|
58
|
+
for (const [variantName, variantModelKey] of Object.entries(union.variants)) {
|
|
154
59
|
const interfaceName = `${typeName}${formatVariantName(variantName)}`;
|
|
155
60
|
variantInterfaces.push({
|
|
156
61
|
name: interfaceName,
|
|
157
62
|
discriminatorValue: variantName
|
|
158
63
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
64
|
+
|
|
65
|
+
// Look up the variant's model to check if it's a record
|
|
66
|
+
const variantModel = ir.models[variantModelKey];
|
|
67
|
+
if (variantModel != null && variantModel.type === "record") {
|
|
68
|
+
const recordTypeName = versionedTypeName(variantModelKey, version);
|
|
162
69
|
output += `export interface ${interfaceName} extends ${recordTypeName} {\n`;
|
|
163
70
|
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
164
71
|
output += "}\n\n";
|
|
165
72
|
} else {
|
|
166
|
-
|
|
73
|
+
// Non-record variant (e.g. another union): emit a value field referencing the type
|
|
74
|
+
const tsType = versionedTypeName(variantModelKey, version);
|
|
167
75
|
output += `export interface ${interfaceName} {\n`;
|
|
168
76
|
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
169
77
|
output += ` readonly value: ${tsType};\n`;
|
|
@@ -184,15 +92,15 @@ function generateReadTypesForVersion(version, schema) {
|
|
|
184
92
|
* Generate write types for a specific schema version.
|
|
185
93
|
* All fields are optional in write types.
|
|
186
94
|
*/
|
|
187
|
-
function generateWriteTypesForVersion(version,
|
|
188
|
-
const usedRefTypes = detectUsedRefTypes(
|
|
95
|
+
function generateWriteTypesForVersion(version, ir) {
|
|
96
|
+
const usedRefTypes = detectUsedRefTypes(ir);
|
|
189
97
|
|
|
190
98
|
// Collect referenced schema-local types (refs to other records/unions)
|
|
191
99
|
const referencedLocalTypes = new Set();
|
|
192
|
-
for (const
|
|
193
|
-
if (
|
|
194
|
-
for (const
|
|
195
|
-
collectReferencedTypes(fieldType,
|
|
100
|
+
for (const modelDef of Object.values(ir.models)) {
|
|
101
|
+
if (modelDef.type !== "record") continue;
|
|
102
|
+
for (const field of modelDef.record.fields) {
|
|
103
|
+
collectReferencedTypes(field.fieldType, version, referencedLocalTypes);
|
|
196
104
|
}
|
|
197
105
|
}
|
|
198
106
|
let output = GENERATED_FILE_HEADER;
|
|
@@ -207,14 +115,14 @@ function generateWriteTypesForVersion(version, schema) {
|
|
|
207
115
|
output += "\n";
|
|
208
116
|
|
|
209
117
|
// Generate record write types
|
|
210
|
-
for (const [
|
|
211
|
-
if (
|
|
212
|
-
const typeName = versionedWriteTypeName(
|
|
118
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
119
|
+
if (modelDef.type !== "record") continue;
|
|
120
|
+
const typeName = versionedWriteTypeName(modelKey, version);
|
|
213
121
|
output += `export type ${typeName} = {\n`;
|
|
214
|
-
for (const
|
|
122
|
+
for (const field of modelDef.record.fields) {
|
|
215
123
|
// All fields are optional in write types
|
|
216
|
-
const tsType =
|
|
217
|
-
output += ` readonly ${
|
|
124
|
+
const tsType = convertFieldTypeToTypeScript(field.fieldType, version);
|
|
125
|
+
output += ` readonly ${field.key}?: ${tsType};\n`;
|
|
218
126
|
}
|
|
219
127
|
output += "};\n\n";
|
|
220
128
|
}
|
|
@@ -225,23 +133,23 @@ function generateWriteTypesForVersion(version, schema) {
|
|
|
225
133
|
* Generate the types.ts re-export file that maps unversioned names to the latest version.
|
|
226
134
|
*/
|
|
227
135
|
function generateTypesReExport({
|
|
228
|
-
|
|
136
|
+
ir,
|
|
229
137
|
version
|
|
230
138
|
}) {
|
|
231
139
|
const reExports = [];
|
|
232
|
-
for (const [
|
|
233
|
-
if (
|
|
234
|
-
const versioned = versionedTypeName(
|
|
235
|
-
reExports.push(`export type { ${versioned} as ${
|
|
236
|
-
} else if (
|
|
237
|
-
const versioned = versionedTypeName(
|
|
238
|
-
reExports.push(`export type { ${versioned} as ${
|
|
140
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
141
|
+
if (modelDef.type === "record") {
|
|
142
|
+
const versioned = versionedTypeName(modelKey, version);
|
|
143
|
+
reExports.push(`export type { ${versioned} as ${modelKey} } from "${typesFilePath(version)}";`);
|
|
144
|
+
} else if (modelDef.type === "union") {
|
|
145
|
+
const versioned = versionedTypeName(modelKey, version);
|
|
146
|
+
reExports.push(`export type { ${versioned} as ${modelKey} } from "${typesFilePath(version)}";`);
|
|
239
147
|
|
|
240
148
|
// Also re-export union variant types
|
|
241
|
-
for (const variantName of Object.keys(
|
|
149
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
242
150
|
const formattedVariant = formatVariantName(variantName);
|
|
243
|
-
const versionedVariant = `${versionedTypeName(
|
|
244
|
-
reExports.push(`export type { ${versionedVariant} as ${`${
|
|
151
|
+
const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
152
|
+
reExports.push(`export type { ${versionedVariant} as ${`${modelKey}${formattedVariant}`} } from "${typesFilePath(version)}";`);
|
|
245
153
|
}
|
|
246
154
|
}
|
|
247
155
|
}
|
|
@@ -249,27 +157,25 @@ function generateTypesReExport({
|
|
|
249
157
|
}
|
|
250
158
|
|
|
251
159
|
/**
|
|
252
|
-
* Generate per-version public types and write types from
|
|
253
|
-
*
|
|
254
|
-
* @param schema - The schema, initial or versioned
|
|
255
|
-
* @param minSupportedVersion - Minimum version to generate types for (defaults to latest)
|
|
256
|
-
* @returns Object containing generated code for each output file
|
|
160
|
+
* Generate per-version public types and write types from an already-resolved
|
|
161
|
+
* versioned IR chain.
|
|
257
162
|
*/
|
|
258
|
-
export function
|
|
163
|
+
export function generateVersionedTypesFromChain(resolved, minSupportedVersion) {
|
|
164
|
+
const {
|
|
165
|
+
chain
|
|
166
|
+
} = resolved;
|
|
259
167
|
const {
|
|
260
|
-
chain,
|
|
261
|
-
latestVersion,
|
|
262
168
|
minVersion
|
|
263
|
-
} =
|
|
169
|
+
} = resolveMinVersion(chain, minSupportedVersion);
|
|
264
170
|
const readTypes = new Map();
|
|
265
171
|
const writeTypes = new Map();
|
|
266
172
|
for (const {
|
|
267
173
|
version,
|
|
268
|
-
|
|
174
|
+
ir
|
|
269
175
|
} of chain) {
|
|
270
176
|
if (version < minVersion) continue;
|
|
271
|
-
readTypes.set(version, generateReadTypesForVersion(version,
|
|
272
|
-
writeTypes.set(version, generateWriteTypesForVersion(version,
|
|
177
|
+
readTypes.set(version, generateReadTypesForVersion(version, ir));
|
|
178
|
+
writeTypes.set(version, generateWriteTypesForVersion(version, ir));
|
|
273
179
|
}
|
|
274
180
|
const typesReExport = generateTypesReExport(chain[chain.length - 1]);
|
|
275
181
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveSchemaChain","findRecordExportName","isRecordSchema","isUnionSchema","TypeKind","typesFilePath","versionedTypeName","versionedWriteTypeName","detectUsedRefTypes","schema","refTypes","Set","scanField","field","type","ARRAY","items","DOC_REF","add","MEDIA_REF","OBJECT_REF","OPTIONAL","item","USER_REF","Object","values","f","fields","v","variants","collectReferencedTypes","fieldType","version","out","REF","name","refType","Error","convertTypeToTypeScript","ANY","BOOLEAN","DOUBLE","STRING","generateReadTypesForVersion","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","typeName","docs","fieldName","tsType","optional","unionEntries","filter","_","discriminantField","discriminant","variantInterfaces","variantName","variantType","interfaceName","push","discriminatorValue","recordExport","recordTypeName","map","variant","generateWriteTypesForVersion","referencedLocalTypes","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromSchema","minSupportedVersion","chain","latestVersion","minVersion","readTypes","Map","writeTypes","versionSchema","set","typesReExport","length"],"sources":["generateVersionedTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { VersionedSchemaEntry } from \"./resolveSchemaChain.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport type { RuntimeSchema, SchemaField } from \"./runtimeSchema.js\";\nimport {\n findRecordExportName,\n isRecordSchema,\n isUnionSchema,\n TypeKind,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\nfunction detectUsedRefTypes(schema: RuntimeSchema): Set<string> {\n const refTypes = new Set<string>();\n\n function scanField(field: SchemaField): void {\n switch (field.type) {\n case TypeKind.ARRAY:\n if (field.items) scanField(field.items);\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentRef\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaRef\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectRef\");\n break;\n case TypeKind.OPTIONAL:\n if (field.item) scanField(field.item);\n break;\n case TypeKind.USER_REF:\n refTypes.add(\"UserRef\");\n break;\n }\n }\n\n for (const item of Object.values(schema)) {\n if (isRecordSchema(item)) {\n for (const f of Object.values(item.fields)) {\n scanField(f);\n }\n } else if (isUnionSchema(item)) {\n for (const v of Object.values(item.variants)) {\n scanField(v);\n }\n }\n }\n\n return refTypes;\n}\n\nfunction collectReferencedTypes(\n fieldType: SchemaField,\n schema: RuntimeSchema,\n version: number,\n out: Set<string>,\n): void {\n switch (fieldType.type) {\n case TypeKind.ARRAY:\n if (fieldType.items) collectReferencedTypes(fieldType.items, schema, version, out);\n break;\n case TypeKind.OPTIONAL:\n if (fieldType.item) collectReferencedTypes(fieldType.item, schema, version, out);\n break;\n case TypeKind.REF: {\n const name = fieldType.refType === \"record\"\n ? findRecordExportName(fieldType.name!, schema) ?? fieldType.name\n : fieldType.name;\n if (name == null) {\n throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);\n }\n out.add(versionedTypeName(name, version));\n break;\n }\n }\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n version?: number,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema, version)}[]`;\n case TypeKind.BOOLEAN:\n return \"boolean\";\n case TypeKind.DOC_REF:\n return \"DocumentRef\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaRef\";\n case TypeKind.OBJECT_REF:\n return \"ObjectRef\";\n case TypeKind.OPTIONAL:\n if (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return convertTypeToTypeScript(fieldType.item, schema, version);\n case TypeKind.REF: {\n const name = fieldType.refType === \"record\" && schema != null\n ? findRecordExportName(fieldType.name!, schema) ?? fieldType.name\n : fieldType.name;\n if (name == null) {\n throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);\n }\n return version != null ? versionedTypeName(name, version) : name;\n }\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default:\n throw new Error(`Unknown schema field type: ${fieldType.type}`);\n }\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n schema: RuntimeSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(schema);\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record interfaces\n for (const [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n const typeName = versionedTypeName(exportName, version);\n\n if (item.docs) {\n output += `/**\\n * ${item.docs}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema, version);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n const unionEntries = Object.entries(schema).filter(\n ([_, item]) => isUnionSchema(item),\n );\n\n for (const [exportName, item] of unionEntries) {\n if (!isUnionSchema(item)) continue;\n\n const typeName = versionedTypeName(exportName, version);\n const discriminantField = item.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantType] of Object.entries(item.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n const recordExport = findRecordExportName(variantType.name!, schema);\n const recordTypeName = recordExport\n ? versionedTypeName(recordExport, version)\n : variantType.name!;\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n const tsType = convertTypeToTypeScript(variantType, schema, version);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n for (const variant of variantInterfaces) {\n output +=\n `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n schema: RuntimeSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(schema);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const item of Object.values(schema)) {\n if (!isRecordSchema(item)) continue;\n for (const fieldType of Object.values(item.fields)) {\n collectReferencedTypes(fieldType, schema, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n const typeName = versionedWriteTypeName(exportName, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n // All fields are optional in write types\n const tsType = convertTypeToTypeScript(fieldType, schema, version);\n output += ` readonly ${fieldName}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ schema, version }: VersionedSchemaEntry): string {\n const reExports: string[] = [];\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item)) {\n const versioned = versionedTypeName(exportName, version);\n reExports.push(\n `export type { ${versioned} as ${exportName} } from \"${typesFilePath(version)}\";`,\n );\n } else if (isUnionSchema(item)) {\n const versioned = versionedTypeName(exportName, version);\n reExports.push(\n `export type { ${versioned} as ${exportName} } from \"${typesFilePath(version)}\";`,\n );\n\n // Also re-export union variant types\n for (const variantName of Object.keys(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(exportName, version)}${formattedVariant}`;\n const unversionedVariant = `${exportName}${formattedVariant}`;\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from a schema with version chain.\n *\n * @param schema - The schema, initial or versioned\n * @param minSupportedVersion - Minimum version to generate types for (defaults to latest)\n * @returns Object containing generated code for each output file\n */\nexport function generateVersionedTypesFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, schema: versionSchema } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, versionSchema));\n writeTypes.set(version, generateWriteTypesForVersion(version, versionSchema));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","resolveMinVersion","typesFilePath","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","Object","entries","models","type","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","map","v","variant","generateWriteTypesForVersion","referencedLocalTypes","Set","values","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport","length"],"sources":["generateVersionedTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n collectReferencedTypes,\n convertFieldTypeToTypeScript,\n detectUsedRefTypes,\n} from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport { typesFilePath, versionedTypeName, versionedWriteTypeName } from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record interfaces\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const record = modelDef.record;\n const typeName = versionedTypeName(modelKey, version);\n\n if (record.description) {\n output += `/**\\n * ${record.description}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const field of record.fields) {\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n const optional = field.isOptional ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const typeName = versionedTypeName(modelKey, version);\n const discriminantField = union.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n // Look up the variant's model to check if it's a record\n const variantModel = ir.models[variantModelKey];\n if (variantModel != null && variantModel.type === \"record\") {\n const recordTypeName = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the type\n const tsType = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n for (const variant of variantInterfaces) {\n output +=\n `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const modelDef of Object.values(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n for (const field of modelDef.record.fields) {\n collectReferencedTypes(field.fieldType, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const typeName = versionedWriteTypeName(modelKey, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const field of modelDef.record.fields) {\n // All fields are optional in write types\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n output += ` readonly ${field.key}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ ir, version }: VersionedIrEntry): string {\n const reExports: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n\n // Also re-export union variant types\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n const unversionedVariant = `${modelKey}${formattedVariant}`;\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from an already-resolved\n * versioned IR chain.\n */\nexport function generateVersionedTypesFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, ir));\n writeTypes.set(version, generateWriteTypesForVersion(version, ir));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,67 +16,25 @@
|
|
|
16
16
|
|
|
17
17
|
import { formatVariantName } from "../formatVariantName.js";
|
|
18
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
switch (fieldType.type) {
|
|
23
|
-
case TypeKind.ANY:
|
|
24
|
-
return "z.unknown()";
|
|
25
|
-
case TypeKind.ARRAY:
|
|
26
|
-
if (fieldType.items == null) {
|
|
27
|
-
throw new Error("Array field is missing items type");
|
|
28
|
-
}
|
|
29
|
-
return `z.array(${convertFieldTypeToZodSchema(fieldType.items, schema, version)})`;
|
|
30
|
-
case TypeKind.BOOLEAN:
|
|
31
|
-
return "z.boolean()";
|
|
32
|
-
case TypeKind.DOC_REF:
|
|
33
|
-
return "z.string()";
|
|
34
|
-
case TypeKind.DOUBLE:
|
|
35
|
-
return "z.number()";
|
|
36
|
-
case TypeKind.MEDIA_REF:
|
|
37
|
-
return "z.string()";
|
|
38
|
-
case TypeKind.OBJECT_REF:
|
|
39
|
-
return "z.string()";
|
|
40
|
-
case TypeKind.OPTIONAL:
|
|
41
|
-
if (fieldType.item == null) {
|
|
42
|
-
throw new Error("Optional field is missing inner type");
|
|
43
|
-
}
|
|
44
|
-
return `${convertFieldTypeToZodSchema(fieldType.item, schema, version)}.optional()`;
|
|
45
|
-
case TypeKind.REF:
|
|
46
|
-
{
|
|
47
|
-
if (fieldType.name == null) {
|
|
48
|
-
throw new Error("Ref field is missing a name");
|
|
49
|
-
}
|
|
50
|
-
const exportName = fieldType.refType === "record" && schema ? findRecordExportName(fieldType.name, schema) ?? fieldType.name : fieldType.name;
|
|
51
|
-
const refSchemaName = version != null ? versionedSchemaName(exportName, version) : `${exportName}Schema`;
|
|
52
|
-
const refTypeName = version != null ? versionedTypeName(exportName, version) : exportName;
|
|
53
|
-
return `z.lazy((): ZodType<${refTypeName}> => ${refSchemaName})`;
|
|
54
|
-
}
|
|
55
|
-
case TypeKind.STRING:
|
|
56
|
-
return "z.string()";
|
|
57
|
-
case TypeKind.USER_REF:
|
|
58
|
-
return "z.string()";
|
|
59
|
-
default:
|
|
60
|
-
throw new Error(`Unknown schema field type: ${fieldType.type}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
19
|
+
import { convertFieldTypeToZodSchema } from "../ir/irFieldHelpers.js";
|
|
20
|
+
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
+
import { typesFilePath, versionedSchemaName, versionedTypeName } from "./runtimeSchema.js";
|
|
64
22
|
/**
|
|
65
23
|
* Generate Zod schemas for a specific schema version.
|
|
66
24
|
* Uses `.passthrough()` to preserve unknown fields.
|
|
67
25
|
*/
|
|
68
|
-
function generateZodSchemasForVersion(version,
|
|
26
|
+
function generateZodSchemasForVersion(version, ir) {
|
|
69
27
|
let output = GENERATED_FILE_HEADER;
|
|
70
28
|
|
|
71
29
|
// Collect type names for import
|
|
72
30
|
const typeNames = [];
|
|
73
|
-
for (const [
|
|
74
|
-
if (
|
|
75
|
-
typeNames.push(versionedTypeName(
|
|
76
|
-
} else if (
|
|
77
|
-
typeNames.push(versionedTypeName(
|
|
78
|
-
for (const variantName of Object.keys(
|
|
79
|
-
typeNames.push(`${versionedTypeName(
|
|
31
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
32
|
+
if (modelDef.type === "record") {
|
|
33
|
+
typeNames.push(versionedTypeName(modelKey, version));
|
|
34
|
+
} else if (modelDef.type === "union") {
|
|
35
|
+
typeNames.push(versionedTypeName(modelKey, version));
|
|
36
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
37
|
+
typeNames.push(`${versionedTypeName(modelKey, version)}${formatVariantName(variantName)}`);
|
|
80
38
|
}
|
|
81
39
|
}
|
|
82
40
|
}
|
|
@@ -88,44 +46,52 @@ function generateZodSchemasForVersion(version, schema) {
|
|
|
88
46
|
output += "\n";
|
|
89
47
|
|
|
90
48
|
// Generate record schemas first (unions may depend on them)
|
|
91
|
-
for (const [
|
|
92
|
-
if (
|
|
93
|
-
const zodSchemaName = versionedSchemaName(
|
|
94
|
-
const typeName = versionedTypeName(
|
|
49
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
50
|
+
if (modelDef.type !== "record") continue;
|
|
51
|
+
const zodSchemaName = versionedSchemaName(modelKey, version);
|
|
52
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
95
53
|
const fieldLines = [];
|
|
96
|
-
for (const
|
|
97
|
-
|
|
98
|
-
|
|
54
|
+
for (const field of modelDef.record.fields) {
|
|
55
|
+
let zodType = convertFieldTypeToZodSchema(field.fieldType, version);
|
|
56
|
+
if (field.isOptional) {
|
|
57
|
+
zodType = `${zodType}.optional()`;
|
|
58
|
+
}
|
|
59
|
+
fieldLines.push(` ${field.key}: ${zodType}`);
|
|
99
60
|
}
|
|
100
61
|
output += `export const ${zodSchemaName} = z.object({\n${fieldLines.join(",\n")}\n}).passthrough() satisfies ZodType<${typeName}>;\n\n`;
|
|
101
62
|
}
|
|
102
63
|
|
|
103
64
|
// Generate union schemas
|
|
104
|
-
for (const [
|
|
105
|
-
if (
|
|
106
|
-
const
|
|
65
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
66
|
+
if (modelDef.type !== "union") continue;
|
|
67
|
+
const union = modelDef.union;
|
|
68
|
+
const discriminantField = union.discriminant;
|
|
107
69
|
const variantSchemaNames = [];
|
|
108
|
-
for (const [variantName,
|
|
70
|
+
for (const [variantName, variantModelKey] of Object.entries(union.variants)) {
|
|
109
71
|
const formattedVariant = formatVariantName(variantName);
|
|
110
|
-
const variantZodSchemaName = `${versionedSchemaName(
|
|
111
|
-
const variantTypeName = `${versionedTypeName(
|
|
72
|
+
const variantZodSchemaName = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;
|
|
73
|
+
const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
112
74
|
variantSchemaNames.push(variantZodSchemaName);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
75
|
+
|
|
76
|
+
// Look up the variant's model to check if it's a record
|
|
77
|
+
const variantModel = ir.models[variantModelKey];
|
|
78
|
+
if (variantModel != null && variantModel.type === "record") {
|
|
79
|
+
const recordZodSchemaName = versionedSchemaName(variantModelKey, version);
|
|
116
80
|
output += `export const ${variantZodSchemaName} = ${recordZodSchemaName}.extend({\n`;
|
|
117
81
|
output += ` ${discriminantField}: z.literal("${variantName}")\n`;
|
|
118
82
|
output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
|
|
119
83
|
} else {
|
|
120
|
-
|
|
84
|
+
// Non-record variant (e.g. another union): emit a value field referencing the schema
|
|
85
|
+
const refZodSchemaName = versionedSchemaName(variantModelKey, version);
|
|
86
|
+
const refTypeName = versionedTypeName(variantModelKey, version);
|
|
121
87
|
output += `export const ${variantZodSchemaName} = z.object({\n`;
|
|
122
88
|
output += ` ${discriminantField}: z.literal("${variantName}"),\n`;
|
|
123
|
-
output += ` value: ${
|
|
89
|
+
output += ` value: z.lazy((): ZodType<${refTypeName}> => ${refZodSchemaName})\n`;
|
|
124
90
|
output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
|
|
125
91
|
}
|
|
126
92
|
}
|
|
127
|
-
const unionZodSchemaName = versionedSchemaName(
|
|
128
|
-
const typeName = versionedTypeName(
|
|
93
|
+
const unionZodSchemaName = versionedSchemaName(modelKey, version);
|
|
94
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
129
95
|
output += `export const ${unionZodSchemaName} = z.discriminatedUnion("${discriminantField}", [\n ${variantSchemaNames.join(",\n ")}\n]) satisfies ZodType<${typeName}>;\n\n`;
|
|
130
96
|
}
|
|
131
97
|
return output;
|
|
@@ -135,24 +101,24 @@ function generateZodSchemasForVersion(version, schema) {
|
|
|
135
101
|
* Generate the schema.ts re-export file mapping unversioned names to latest version.
|
|
136
102
|
*/
|
|
137
103
|
function generateSchemaReExport({
|
|
138
|
-
|
|
104
|
+
ir,
|
|
139
105
|
version
|
|
140
106
|
}) {
|
|
141
107
|
let output = GENERATED_FILE_HEADER;
|
|
142
108
|
const reExports = [];
|
|
143
|
-
for (const [
|
|
144
|
-
if (
|
|
145
|
-
const versioned = versionedSchemaName(
|
|
146
|
-
reExports.push(`export { ${versioned} as ${
|
|
147
|
-
} else if (
|
|
148
|
-
const versioned = versionedSchemaName(
|
|
149
|
-
reExports.push(`export { ${versioned} as ${
|
|
109
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
110
|
+
if (modelDef.type === "record") {
|
|
111
|
+
const versioned = versionedSchemaName(modelKey, version);
|
|
112
|
+
reExports.push(`export { ${versioned} as ${modelKey}Schema } from "./schema_v${version}.js";`);
|
|
113
|
+
} else if (modelDef.type === "union") {
|
|
114
|
+
const versioned = versionedSchemaName(modelKey, version);
|
|
115
|
+
reExports.push(`export { ${versioned} as ${modelKey}Schema } from "./schema_v${version}.js";`);
|
|
150
116
|
|
|
151
117
|
// Also re-export union variant schemas
|
|
152
|
-
for (const variantName of Object.keys(
|
|
118
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
153
119
|
const formattedVariant = formatVariantName(variantName);
|
|
154
|
-
const versionedVariant = `${versionedSchemaName(
|
|
155
|
-
reExports.push(`export { ${versionedVariant} as ${`${
|
|
120
|
+
const versionedVariant = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;
|
|
121
|
+
reExports.push(`export { ${versionedVariant} as ${`${modelKey}${formattedVariant}Schema`} } from "./schema_v${version}.js";`);
|
|
156
122
|
}
|
|
157
123
|
}
|
|
158
124
|
}
|
|
@@ -161,24 +127,22 @@ function generateSchemaReExport({
|
|
|
161
127
|
}
|
|
162
128
|
|
|
163
129
|
/**
|
|
164
|
-
* Generate per-version Zod schemas from
|
|
165
|
-
*
|
|
166
|
-
* @param schema - The schema definition (initial or versioned)
|
|
167
|
-
* @param minSupportedVersion - Minimum version to generate schemas for (defaults to latest)
|
|
168
|
-
* @returns Object containing generated Zod schema code for each output file
|
|
130
|
+
* Generate per-version Zod schemas from an already-resolved versioned IR chain.
|
|
169
131
|
*/
|
|
170
|
-
export function
|
|
132
|
+
export function generateVersionedZodFromChain(resolved, minSupportedVersion) {
|
|
133
|
+
const {
|
|
134
|
+
chain
|
|
135
|
+
} = resolved;
|
|
171
136
|
const {
|
|
172
|
-
chain,
|
|
173
137
|
minVersion
|
|
174
|
-
} =
|
|
138
|
+
} = resolveMinVersion(chain, minSupportedVersion);
|
|
175
139
|
const zodSchemas = new Map();
|
|
176
140
|
for (const {
|
|
177
141
|
version,
|
|
178
|
-
|
|
142
|
+
ir
|
|
179
143
|
} of chain) {
|
|
180
144
|
if (version < minVersion) continue;
|
|
181
|
-
zodSchemas.set(version, generateZodSchemasForVersion(version,
|
|
145
|
+
zodSchemas.set(version, generateZodSchemasForVersion(version, ir));
|
|
182
146
|
}
|
|
183
147
|
const schemaReExport = generateSchemaReExport(chain[chain.length - 1]);
|
|
184
148
|
return {
|