@palantir/pack.document-schema.type-gen 0.8.0 → 0.9.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/schema/registerSchemaCommands.js +2 -0
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaGenTypesHandler.js +147 -0
- package/build/esm/commands/schema/schemaGenTypesHandler.js.map +1 -0
- package/build/esm/index.js +6 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/pack-docschema-api/pack-docschema-ir/recordDef.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 +4 -16
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
- package/build/esm/utils/ir/__tests__/generateModelsFromIr.test.js +6 -24
- package/build/esm/utils/ir/__tests__/generateModelsFromIr.test.js.map +1 -1
- package/build/esm/utils/ir/__tests__/generateZodSchemasFromIr.test.js +10 -40
- package/build/esm/utils/ir/__tests__/generateZodSchemasFromIr.test.js.map +1 -1
- package/build/esm/utils/ir/convertIrToWireSchema.js +4 -2
- package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -0
- package/build/esm/utils/schema/__tests__/fixtures.js +207 -0
- package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +41 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +41 -0
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +37 -0
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +55 -0
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +55 -0
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +37 -0
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/snapshotUtils.js +106 -0
- package/build/esm/utils/schema/__tests__/snapshotUtils.js.map +1 -0
- package/build/esm/utils/schema/generateIndexFromSchema.js +72 -0
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateInternalFromSchema.js +380 -0
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +195 -0
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateScopeFromSchema.js +155 -0
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateTypesFromSchema.js +16 -30
- package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +281 -0
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +189 -0
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateVersionsFromSchema.js +50 -0
- package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -0
- package/build/esm/utils/schema/resolveSchemaChain.js +54 -0
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -0
- package/build/esm/utils/schema/runtimeSchema.js +96 -0
- package/build/esm/utils/schema/runtimeSchema.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/convertStepsToIr.js +2 -5
- package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
- package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts +8 -0
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts.map +1 -0
- package/build/types/index.d.ts +6 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/recordDef.d.ts +0 -2
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/recordDef.d.ts.map +1 -1
- package/build/types/utils/schema/__tests__/fixtures.d.ts +14 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateInternalFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateInternalFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateModelMetadataFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateModelMetadataFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateScopeFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateScopeFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionedTypesFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionedTypesFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionedZodFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionedZodFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionsFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionsFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts +47 -0
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts.map +1 -0
- package/build/types/utils/schema/generateIndexFromSchema.d.ts +14 -0
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateInternalFromSchema.d.ts +18 -0
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +15 -0
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateScopeFromSchema.d.ts +13 -0
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +18 -0
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +16 -0
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts +13 -0
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/resolveSchemaChain.d.ts +18 -0
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -0
- package/build/types/utils/schema/runtimeSchema.d.ts +59 -0
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -0
- package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { formatVariantName } from "../formatVariantName.js";
|
|
18
|
+
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
+
import { resolveSchemaChain } from "./resolveSchemaChain.js";
|
|
20
|
+
import { findRecordExportName, isRecordSchema, isUnionSchema, TypeKind, typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
21
|
+
function detectUsedRefTypes(schema) {
|
|
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
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Generate read types for a specific schema version.
|
|
120
|
+
*/
|
|
121
|
+
function generateReadTypesForVersion(version, schema) {
|
|
122
|
+
const usedRefTypes = detectUsedRefTypes(schema);
|
|
123
|
+
let output = GENERATED_FILE_HEADER;
|
|
124
|
+
if (usedRefTypes.size > 0) {
|
|
125
|
+
const refTypesList = Array.from(usedRefTypes).sort().join(", ");
|
|
126
|
+
output += `import type { ${refTypesList} } from "@palantir/pack.document-schema.model-types";\n`;
|
|
127
|
+
}
|
|
128
|
+
output += "\n";
|
|
129
|
+
|
|
130
|
+
// Generate record interfaces
|
|
131
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
132
|
+
if (!isRecordSchema(item)) continue;
|
|
133
|
+
const typeName = versionedTypeName(exportName, version);
|
|
134
|
+
if (item.docs) {
|
|
135
|
+
output += `/**\n * ${item.docs}\n */\n`;
|
|
136
|
+
}
|
|
137
|
+
output += `export interface ${typeName} {\n`;
|
|
138
|
+
for (const [fieldName, fieldType] of Object.entries(item.fields)) {
|
|
139
|
+
const tsType = convertTypeToTypeScript(fieldType, schema, version);
|
|
140
|
+
const optional = fieldType.type === TypeKind.OPTIONAL ? "?" : "";
|
|
141
|
+
output += ` readonly ${fieldName}${optional}: ${tsType};\n`;
|
|
142
|
+
}
|
|
143
|
+
output += "}\n\n";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Generate union types
|
|
147
|
+
const unionEntries = Object.entries(schema).filter(([_, item]) => isUnionSchema(item));
|
|
148
|
+
for (const [exportName, item] of unionEntries) {
|
|
149
|
+
if (!isUnionSchema(item)) continue;
|
|
150
|
+
const typeName = versionedTypeName(exportName, version);
|
|
151
|
+
const discriminantField = item.discriminant;
|
|
152
|
+
const variantInterfaces = [];
|
|
153
|
+
for (const [variantName, variantType] of Object.entries(item.variants)) {
|
|
154
|
+
const interfaceName = `${typeName}${formatVariantName(variantName)}`;
|
|
155
|
+
variantInterfaces.push({
|
|
156
|
+
name: interfaceName,
|
|
157
|
+
discriminatorValue: variantName
|
|
158
|
+
});
|
|
159
|
+
if (variantType.type === TypeKind.REF && variantType.refType === "record") {
|
|
160
|
+
const recordExport = findRecordExportName(variantType.name, schema);
|
|
161
|
+
const recordTypeName = recordExport ? versionedTypeName(recordExport, version) : variantType.name;
|
|
162
|
+
output += `export interface ${interfaceName} extends ${recordTypeName} {\n`;
|
|
163
|
+
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
164
|
+
output += "}\n\n";
|
|
165
|
+
} else {
|
|
166
|
+
const tsType = convertTypeToTypeScript(variantType, schema, version);
|
|
167
|
+
output += `export interface ${interfaceName} {\n`;
|
|
168
|
+
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
169
|
+
output += ` readonly value: ${tsType};\n`;
|
|
170
|
+
output += "}\n\n";
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(" | ")};\n\n`;
|
|
174
|
+
for (const variant of variantInterfaces) {
|
|
175
|
+
output += `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\n`;
|
|
176
|
+
output += ` return value.${discriminantField} === "${variant.discriminatorValue}";\n`;
|
|
177
|
+
output += "}\n\n";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return output;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Generate write types for a specific schema version.
|
|
185
|
+
* All fields are optional in write types.
|
|
186
|
+
*/
|
|
187
|
+
function generateWriteTypesForVersion(version, schema) {
|
|
188
|
+
const usedRefTypes = detectUsedRefTypes(schema);
|
|
189
|
+
|
|
190
|
+
// Collect referenced schema-local types (refs to other records/unions)
|
|
191
|
+
const referencedLocalTypes = new Set();
|
|
192
|
+
for (const item of Object.values(schema)) {
|
|
193
|
+
if (!isRecordSchema(item)) continue;
|
|
194
|
+
for (const fieldType of Object.values(item.fields)) {
|
|
195
|
+
collectReferencedTypes(fieldType, schema, version, referencedLocalTypes);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
let output = GENERATED_FILE_HEADER;
|
|
199
|
+
if (usedRefTypes.size > 0) {
|
|
200
|
+
const refTypesList = Array.from(usedRefTypes).sort().join(", ");
|
|
201
|
+
output += `import type { ${refTypesList} } from "@palantir/pack.document-schema.model-types";\n`;
|
|
202
|
+
}
|
|
203
|
+
if (referencedLocalTypes.size > 0) {
|
|
204
|
+
const localTypesList = Array.from(referencedLocalTypes).sort().join(", ");
|
|
205
|
+
output += `import type { ${localTypesList} } from "${typesFilePath(version)}";\n`;
|
|
206
|
+
}
|
|
207
|
+
output += "\n";
|
|
208
|
+
|
|
209
|
+
// Generate record write types
|
|
210
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
211
|
+
if (!isRecordSchema(item)) continue;
|
|
212
|
+
const typeName = versionedWriteTypeName(exportName, version);
|
|
213
|
+
output += `export type ${typeName} = {\n`;
|
|
214
|
+
for (const [fieldName, fieldType] of Object.entries(item.fields)) {
|
|
215
|
+
// All fields are optional in write types
|
|
216
|
+
const tsType = convertTypeToTypeScript(fieldType, schema, version);
|
|
217
|
+
output += ` readonly ${fieldName}?: ${tsType};\n`;
|
|
218
|
+
}
|
|
219
|
+
output += "};\n\n";
|
|
220
|
+
}
|
|
221
|
+
return output;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Generate the types.ts re-export file that maps unversioned names to the latest version.
|
|
226
|
+
*/
|
|
227
|
+
function generateTypesReExport({
|
|
228
|
+
schema,
|
|
229
|
+
version
|
|
230
|
+
}) {
|
|
231
|
+
const reExports = [];
|
|
232
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
233
|
+
if (isRecordSchema(item)) {
|
|
234
|
+
const versioned = versionedTypeName(exportName, version);
|
|
235
|
+
reExports.push(`export type { ${versioned} as ${exportName} } from "${typesFilePath(version)}";`);
|
|
236
|
+
} else if (isUnionSchema(item)) {
|
|
237
|
+
const versioned = versionedTypeName(exportName, version);
|
|
238
|
+
reExports.push(`export type { ${versioned} as ${exportName} } from "${typesFilePath(version)}";`);
|
|
239
|
+
|
|
240
|
+
// Also re-export union variant types
|
|
241
|
+
for (const variantName of Object.keys(item.variants)) {
|
|
242
|
+
const formattedVariant = formatVariantName(variantName);
|
|
243
|
+
const versionedVariant = `${versionedTypeName(exportName, version)}${formattedVariant}`;
|
|
244
|
+
reExports.push(`export type { ${versionedVariant} as ${`${exportName}${formattedVariant}`} } from "${typesFilePath(version)}";`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return GENERATED_FILE_HEADER + reExports.join("\n") + "\n";
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Generate per-version public types and write types from a schema with version chain.
|
|
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
|
|
257
|
+
*/
|
|
258
|
+
export function generateVersionedTypesFromSchema(schema, minSupportedVersion) {
|
|
259
|
+
const {
|
|
260
|
+
chain,
|
|
261
|
+
latestVersion,
|
|
262
|
+
minVersion
|
|
263
|
+
} = resolveSchemaChain(schema, minSupportedVersion);
|
|
264
|
+
const readTypes = new Map();
|
|
265
|
+
const writeTypes = new Map();
|
|
266
|
+
for (const {
|
|
267
|
+
version,
|
|
268
|
+
schema: versionSchema
|
|
269
|
+
} of chain) {
|
|
270
|
+
if (version < minVersion) continue;
|
|
271
|
+
readTypes.set(version, generateReadTypesForVersion(version, versionSchema));
|
|
272
|
+
writeTypes.set(version, generateWriteTypesForVersion(version, versionSchema));
|
|
273
|
+
}
|
|
274
|
+
const typesReExport = generateTypesReExport(chain[chain.length - 1]);
|
|
275
|
+
return {
|
|
276
|
+
readTypes,
|
|
277
|
+
writeTypes,
|
|
278
|
+
typesReExport
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=generateVersionedTypesFromSchema.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { formatVariantName } from "../formatVariantName.js";
|
|
18
|
+
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
+
import { resolveSchemaChain } from "./resolveSchemaChain.js";
|
|
20
|
+
import { findRecordExportName, isRecordSchema, isUnionSchema, schemaName, TypeKind, typesFilePath, versionedSchemaName, versionedTypeName } from "./runtimeSchema.js";
|
|
21
|
+
function convertFieldTypeToZodSchema(fieldType, schema, version) {
|
|
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
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Generate Zod schemas for a specific schema version.
|
|
66
|
+
* Uses `.passthrough()` to preserve unknown fields.
|
|
67
|
+
*/
|
|
68
|
+
function generateZodSchemasForVersion(version, schema) {
|
|
69
|
+
let output = GENERATED_FILE_HEADER;
|
|
70
|
+
|
|
71
|
+
// Collect type names for import
|
|
72
|
+
const typeNames = [];
|
|
73
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
74
|
+
if (isRecordSchema(item)) {
|
|
75
|
+
typeNames.push(versionedTypeName(exportName, version));
|
|
76
|
+
} else if (isUnionSchema(item)) {
|
|
77
|
+
typeNames.push(versionedTypeName(exportName, version));
|
|
78
|
+
for (const variantName of Object.keys(item.variants)) {
|
|
79
|
+
typeNames.push(`${versionedTypeName(exportName, version)}${formatVariantName(variantName)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
output += "import type { ZodType } from \"zod\";\n";
|
|
84
|
+
output += "import { z } from \"zod\";\n";
|
|
85
|
+
if (typeNames.length > 0) {
|
|
86
|
+
output += `import type { ${typeNames.sort().join(", ")} } from "${typesFilePath(version)}";\n`;
|
|
87
|
+
}
|
|
88
|
+
output += "\n";
|
|
89
|
+
|
|
90
|
+
// Generate record schemas first (unions may depend on them)
|
|
91
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
92
|
+
if (!isRecordSchema(item)) continue;
|
|
93
|
+
const zodSchemaName = versionedSchemaName(exportName, version);
|
|
94
|
+
const typeName = versionedTypeName(exportName, version);
|
|
95
|
+
const fieldLines = [];
|
|
96
|
+
for (const [fieldName, fieldType] of Object.entries(item.fields)) {
|
|
97
|
+
const zodType = convertFieldTypeToZodSchema(fieldType, schema, version);
|
|
98
|
+
fieldLines.push(` ${fieldName}: ${zodType}`);
|
|
99
|
+
}
|
|
100
|
+
output += `export const ${zodSchemaName} = z.object({\n${fieldLines.join(",\n")}\n}).passthrough() satisfies ZodType<${typeName}>;\n\n`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Generate union schemas
|
|
104
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
105
|
+
if (!isUnionSchema(item)) continue;
|
|
106
|
+
const discriminantField = item.discriminant;
|
|
107
|
+
const variantSchemaNames = [];
|
|
108
|
+
for (const [variantName, variantType] of Object.entries(item.variants)) {
|
|
109
|
+
const formattedVariant = formatVariantName(variantName);
|
|
110
|
+
const variantZodSchemaName = `${versionedSchemaName(exportName, version)}${formattedVariant}`;
|
|
111
|
+
const variantTypeName = `${versionedTypeName(exportName, version)}${formattedVariant}`;
|
|
112
|
+
variantSchemaNames.push(variantZodSchemaName);
|
|
113
|
+
if (variantType.type === TypeKind.REF && variantType.refType === "record") {
|
|
114
|
+
const recordExport = findRecordExportName(variantType.name, schema);
|
|
115
|
+
const recordZodSchemaName = recordExport ? versionedSchemaName(recordExport, version) : `${variantType.name}Schema`;
|
|
116
|
+
output += `export const ${variantZodSchemaName} = ${recordZodSchemaName}.extend({\n`;
|
|
117
|
+
output += ` ${discriminantField}: z.literal("${variantName}")\n`;
|
|
118
|
+
output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
|
|
119
|
+
} else {
|
|
120
|
+
const zodType = convertFieldTypeToZodSchema(variantType, schema, version);
|
|
121
|
+
output += `export const ${variantZodSchemaName} = z.object({\n`;
|
|
122
|
+
output += ` ${discriminantField}: z.literal("${variantName}"),\n`;
|
|
123
|
+
output += ` value: ${zodType}\n`;
|
|
124
|
+
output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const unionZodSchemaName = versionedSchemaName(exportName, version);
|
|
128
|
+
const typeName = versionedTypeName(exportName, version);
|
|
129
|
+
output += `export const ${unionZodSchemaName} = z.discriminatedUnion("${discriminantField}", [\n ${variantSchemaNames.join(",\n ")}\n]) satisfies ZodType<${typeName}>;\n\n`;
|
|
130
|
+
}
|
|
131
|
+
return output;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Generate the schema.ts re-export file mapping unversioned names to latest version.
|
|
136
|
+
*/
|
|
137
|
+
function generateSchemaReExport({
|
|
138
|
+
schema,
|
|
139
|
+
version
|
|
140
|
+
}) {
|
|
141
|
+
let output = GENERATED_FILE_HEADER;
|
|
142
|
+
const reExports = [];
|
|
143
|
+
for (const [exportName, item] of Object.entries(schema)) {
|
|
144
|
+
if (isRecordSchema(item)) {
|
|
145
|
+
const versioned = versionedSchemaName(exportName, version);
|
|
146
|
+
reExports.push(`export { ${versioned} as ${schemaName(exportName)} } from "./schema_v${version}.js";`);
|
|
147
|
+
} else if (isUnionSchema(item)) {
|
|
148
|
+
const versioned = versionedSchemaName(exportName, version);
|
|
149
|
+
reExports.push(`export { ${versioned} as ${schemaName(exportName)} } from "./schema_v${version}.js";`);
|
|
150
|
+
|
|
151
|
+
// Also re-export union variant schemas
|
|
152
|
+
for (const variantName of Object.keys(item.variants)) {
|
|
153
|
+
const formattedVariant = formatVariantName(variantName);
|
|
154
|
+
const versionedVariant = `${versionedSchemaName(exportName, version)}${formattedVariant}`;
|
|
155
|
+
reExports.push(`export { ${versionedVariant} as ${`${exportName}${formattedVariant}Schema`} } from "./schema_v${version}.js";`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
output += reExports.join("\n") + "\n";
|
|
160
|
+
return output;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Generate per-version Zod schemas from a schema definition with version chain.
|
|
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
|
|
169
|
+
*/
|
|
170
|
+
export function generateVersionedZodFromSchema(schema, minSupportedVersion) {
|
|
171
|
+
const {
|
|
172
|
+
chain,
|
|
173
|
+
minVersion
|
|
174
|
+
} = resolveSchemaChain(schema, minSupportedVersion);
|
|
175
|
+
const zodSchemas = new Map();
|
|
176
|
+
for (const {
|
|
177
|
+
version,
|
|
178
|
+
schema: versionSchema
|
|
179
|
+
} of chain) {
|
|
180
|
+
if (version < minVersion) continue;
|
|
181
|
+
zodSchemas.set(version, generateZodSchemasForVersion(version, versionSchema));
|
|
182
|
+
}
|
|
183
|
+
const schemaReExport = generateSchemaReExport(chain[chain.length - 1]);
|
|
184
|
+
return {
|
|
185
|
+
zodSchemas,
|
|
186
|
+
schemaReExport
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=generateVersionedZodFromSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateVersionedZodFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveSchemaChain","findRecordExportName","isRecordSchema","isUnionSchema","schemaName","TypeKind","typesFilePath","versionedSchemaName","versionedTypeName","convertFieldTypeToZodSchema","fieldType","schema","version","type","ANY","ARRAY","items","Error","BOOLEAN","DOC_REF","DOUBLE","MEDIA_REF","OBJECT_REF","OPTIONAL","item","REF","name","exportName","refType","refSchemaName","refTypeName","STRING","USER_REF","generateZodSchemasForVersion","output","typeNames","Object","entries","push","variantName","keys","variants","length","sort","join","zodSchemaName","typeName","fieldLines","fieldName","fields","zodType","discriminantField","discriminant","variantSchemaNames","variantType","formattedVariant","variantZodSchemaName","variantTypeName","recordExport","recordZodSchemaName","unionZodSchemaName","generateSchemaReExport","reExports","versioned","versionedVariant","generateVersionedZodFromSchema","minSupportedVersion","chain","minVersion","zodSchemas","Map","versionSchema","set","schemaReExport"],"sources":["generateVersionedZodFromSchema.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 schemaName,\n TypeKind,\n typesFilePath,\n versionedSchemaName,\n versionedTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedZodOutput {\n /** schema_vN.ts files keyed by version number */\n zodSchemas: Map<number, string>;\n /** schema.ts re-export of latest version schemas under unversioned names */\n schemaReExport: string;\n}\n\nfunction convertFieldTypeToZodSchema(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n version?: number,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"z.unknown()\";\n case TypeKind.ARRAY:\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n return `z.array(${convertFieldTypeToZodSchema(fieldType.items, schema, version)})`;\n case TypeKind.BOOLEAN:\n return \"z.boolean()\";\n case TypeKind.DOC_REF:\n return \"z.string()\";\n case TypeKind.DOUBLE:\n return \"z.number()\";\n case TypeKind.MEDIA_REF:\n return \"z.string()\";\n case TypeKind.OBJECT_REF:\n return \"z.string()\";\n case TypeKind.OPTIONAL:\n if (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return `${convertFieldTypeToZodSchema(fieldType.item, schema, version)}.optional()`;\n case TypeKind.REF: {\n if (fieldType.name == null) {\n throw new Error(\"Ref field is missing a name\");\n }\n const exportName = fieldType.refType === \"record\" && schema\n ? findRecordExportName(fieldType.name, schema) ?? fieldType.name\n : fieldType.name;\n const refSchemaName = version != null\n ? versionedSchemaName(exportName, version)\n : `${exportName}Schema`;\n const refTypeName = version != null ? versionedTypeName(exportName, version) : exportName;\n return `z.lazy((): ZodType<${refTypeName}> => ${refSchemaName})`;\n }\n case TypeKind.STRING:\n return \"z.string()\";\n case TypeKind.USER_REF:\n return \"z.string()\";\n default:\n throw new Error(`Unknown schema field type: ${fieldType.type}`);\n }\n}\n\n/**\n * Generate Zod schemas for a specific schema version.\n * Uses `.passthrough()` to preserve unknown fields.\n */\nfunction generateZodSchemasForVersion(\n version: number,\n schema: RuntimeSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n // Collect type names for import\n const typeNames: string[] = [];\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item)) {\n typeNames.push(versionedTypeName(exportName, version));\n } else if (isUnionSchema(item)) {\n typeNames.push(versionedTypeName(exportName, version));\n for (const variantName of Object.keys(item.variants)) {\n typeNames.push(\n `${versionedTypeName(exportName, version)}${formatVariantName(variantName)}`,\n );\n }\n }\n }\n\n output += \"import type { ZodType } from \\\"zod\\\";\\n\";\n output += \"import { z } from \\\"zod\\\";\\n\";\n\n if (typeNames.length > 0) {\n output += `import type { ${typeNames.sort().join(\", \")} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record schemas first (unions may depend on them)\n for (const [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n const zodSchemaName = versionedSchemaName(exportName, version);\n const typeName = versionedTypeName(exportName, version);\n const fieldLines: string[] = [];\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n const zodType = convertFieldTypeToZodSchema(fieldType, schema, version);\n fieldLines.push(` ${fieldName}: ${zodType}`);\n }\n\n output += `export const ${zodSchemaName} = z.object({\\n${\n fieldLines.join(\",\\n\")\n }\\n}).passthrough() satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n // Generate union schemas\n for (const [exportName, item] of Object.entries(schema)) {\n if (!isUnionSchema(item)) continue;\n\n const discriminantField = item.discriminant;\n const variantSchemaNames: string[] = [];\n\n for (const [variantName, variantType] of Object.entries(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantZodSchemaName = `${versionedSchemaName(exportName, version)}${formattedVariant}`;\n const variantTypeName = `${versionedTypeName(exportName, version)}${formattedVariant}`;\n variantSchemaNames.push(variantZodSchemaName);\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n const recordExport = findRecordExportName(variantType.name!, schema);\n const recordZodSchemaName = recordExport\n ? versionedSchemaName(recordExport, version)\n : `${variantType.name!}Schema`;\n output += `export const ${variantZodSchemaName} = ${recordZodSchemaName}.extend({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\")\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n } else {\n const zodType = convertFieldTypeToZodSchema(variantType, schema, version);\n output += `export const ${variantZodSchemaName} = z.object({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\"),\\n`;\n output += ` value: ${zodType}\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n }\n }\n\n const unionZodSchemaName = versionedSchemaName(exportName, version);\n const typeName = versionedTypeName(exportName, version);\n output +=\n `export const ${unionZodSchemaName} = z.discriminatedUnion(\"${discriminantField}\", [\\n ${\n variantSchemaNames.join(\",\\n \")\n }\\n]) satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate the schema.ts re-export file mapping unversioned names to latest version.\n */\nfunction generateSchemaReExport(\n { schema, version }: VersionedSchemaEntry,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const reExports: string[] = [];\n\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item)) {\n const versioned = versionedSchemaName(exportName, version);\n reExports.push(\n `export { ${versioned} as ${schemaName(exportName)} } from \"./schema_v${version}.js\";`,\n );\n } else if (isUnionSchema(item)) {\n const versioned = versionedSchemaName(exportName, version);\n reExports.push(\n `export { ${versioned} as ${schemaName(exportName)} } from \"./schema_v${version}.js\";`,\n );\n\n // Also re-export union variant schemas\n for (const variantName of Object.keys(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedSchemaName(exportName, version)}${formattedVariant}`;\n const unversionedVariant = `${exportName}${formattedVariant}Schema`;\n reExports.push(\n `export { ${versionedVariant} as ${unversionedVariant} } from \"./schema_v${version}.js\";`,\n );\n }\n }\n }\n\n output += reExports.join(\"\\n\") + \"\\n\";\n\n return output;\n}\n\n/**\n * Generate per-version Zod schemas from a schema definition with version chain.\n *\n * @param schema - The schema definition (initial or versioned)\n * @param minSupportedVersion - Minimum version to generate schemas for (defaults to latest)\n * @returns Object containing generated Zod schema code for each output file\n */\nexport function generateVersionedZodFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): VersionedZodOutput {\n const { chain, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n\n const zodSchemas = new Map<number, string>();\n\n for (const { version, schema: versionSchema } of chain) {\n if (version < minVersion) continue;\n\n zodSchemas.set(version, generateZodSchemasForVersion(version, versionSchema));\n }\n\n const schemaReExport = generateSchemaReExport(chain[chain.length - 1]!);\n\n return { zodSchemas, schemaReExport };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,qBAAqB,QAAQ,2BAA2B;AAEjE,SAASC,kBAAkB,QAAQ,yBAAyB;AAE5D,SACEC,oBAAoB,EACpBC,cAAc,EACdC,aAAa,EACbC,UAAU,EACVC,QAAQ,EACRC,aAAa,EACbC,mBAAmB,EACnBC,iBAAiB,QACZ,oBAAoB;AAS3B,SAASC,2BAA2BA,CAClCC,SAAsB,EACtBC,MAAsB,EACtBC,OAAgB,EACR;EACR,QAAQF,SAAS,CAACG,IAAI;IACpB,KAAKR,QAAQ,CAACS,GAAG;MACf,OAAO,aAAa;IACtB,KAAKT,QAAQ,CAACU,KAAK;MACjB,IAAIL,SAAS,CAACM,KAAK,IAAI,IAAI,EAAE;QAC3B,MAAM,IAAIC,KAAK,CAAC,mCAAmC,CAAC;MACtD;MACA,OAAO,WAAWR,2BAA2B,CAACC,SAAS,CAACM,KAAK,EAAEL,MAAM,EAAEC,OAAO,CAAC,GAAG;IACpF,KAAKP,QAAQ,CAACa,OAAO;MACnB,OAAO,aAAa;IACtB,KAAKb,QAAQ,CAACc,OAAO;MACnB,OAAO,YAAY;IACrB,KAAKd,QAAQ,CAACe,MAAM;MAClB,OAAO,YAAY;IACrB,KAAKf,QAAQ,CAACgB,SAAS;MACrB,OAAO,YAAY;IACrB,KAAKhB,QAAQ,CAACiB,UAAU;MACtB,OAAO,YAAY;IACrB,KAAKjB,QAAQ,CAACkB,QAAQ;MACpB,IAAIb,SAAS,CAACc,IAAI,IAAI,IAAI,EAAE;QAC1B,MAAM,IAAIP,KAAK,CAAC,sCAAsC,CAAC;MACzD;MACA,OAAO,GAAGR,2BAA2B,CAACC,SAAS,CAACc,IAAI,EAAEb,MAAM,EAAEC,OAAO,CAAC,aAAa;IACrF,KAAKP,QAAQ,CAACoB,GAAG;MAAE;QACjB,IAAIf,SAAS,CAACgB,IAAI,IAAI,IAAI,EAAE;UAC1B,MAAM,IAAIT,KAAK,CAAC,6BAA6B,CAAC;QAChD;QACA,MAAMU,UAAU,GAAGjB,SAAS,CAACkB,OAAO,KAAK,QAAQ,IAAIjB,MAAM,GACvDV,oBAAoB,CAACS,SAAS,CAACgB,IAAI,EAAEf,MAAM,CAAC,IAAID,SAAS,CAACgB,IAAI,GAC9DhB,SAAS,CAACgB,IAAI;QAClB,MAAMG,aAAa,GAAGjB,OAAO,IAAI,IAAI,GACjCL,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC,GACxC,GAAGe,UAAU,QAAQ;QACzB,MAAMG,WAAW,GAAGlB,OAAO,IAAI,IAAI,GAAGJ,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC,GAAGe,UAAU;QACzF,OAAO,sBAAsBG,WAAW,QAAQD,aAAa,GAAG;MAClE;IACA,KAAKxB,QAAQ,CAAC0B,MAAM;MAClB,OAAO,YAAY;IACrB,KAAK1B,QAAQ,CAAC2B,QAAQ;MACpB,OAAO,YAAY;IACrB;MACE,MAAM,IAAIf,KAAK,CAAC,8BAA8BP,SAAS,CAACG,IAAI,EAAE,CAAC;EACnE;AACF;;AAEA;AACA;AACA;AACA;AACA,SAASoB,4BAA4BA,CACnCrB,OAAe,EACfD,MAAqB,EACb;EACR,IAAIuB,MAAM,GAAGnC,qBAAqB;;EAElC;EACA,MAAMoC,SAAmB,GAAG,EAAE;EAC9B,KAAK,MAAM,CAACR,UAAU,EAAEH,IAAI,CAAC,IAAIY,MAAM,CAACC,OAAO,CAAC1B,MAAM,CAAC,EAAE;IACvD,IAAIT,cAAc,CAACsB,IAAI,CAAC,EAAE;MACxBW,SAAS,CAACG,IAAI,CAAC9B,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC,CAAC;IACxD,CAAC,MAAM,IAAIT,aAAa,CAACqB,IAAI,CAAC,EAAE;MAC9BW,SAAS,CAACG,IAAI,CAAC9B,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC,CAAC;MACtD,KAAK,MAAM2B,WAAW,IAAIH,MAAM,CAACI,IAAI,CAAChB,IAAI,CAACiB,QAAQ,CAAC,EAAE;QACpDN,SAAS,CAACG,IAAI,CACZ,GAAG9B,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC,GAAGd,iBAAiB,CAACyC,WAAW,CAAC,EAC5E,CAAC;MACH;IACF;EACF;EAEAL,MAAM,IAAI,yCAAyC;EACnDA,MAAM,IAAI,8BAA8B;EAExC,IAAIC,SAAS,CAACO,MAAM,GAAG,CAAC,EAAE;IACxBR,MAAM,IAAI,iBAAiBC,SAAS,CAACQ,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,YAAYtC,aAAa,CAACM,OAAO,CAAC,MAAM;EAChG;EAEAsB,MAAM,IAAI,IAAI;;EAEd;EACA,KAAK,MAAM,CAACP,UAAU,EAAEH,IAAI,CAAC,IAAIY,MAAM,CAACC,OAAO,CAAC1B,MAAM,CAAC,EAAE;IACvD,IAAI,CAACT,cAAc,CAACsB,IAAI,CAAC,EAAE;IAE3B,MAAMqB,aAAa,GAAGtC,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC;IAC9D,MAAMkC,QAAQ,GAAGtC,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC;IACvD,MAAMmC,UAAoB,GAAG,EAAE;IAE/B,KAAK,MAAM,CAACC,SAAS,EAAEtC,SAAS,CAAC,IAAI0B,MAAM,CAACC,OAAO,CAACb,IAAI,CAACyB,MAAM,CAAC,EAAE;MAChE,MAAMC,OAAO,GAAGzC,2BAA2B,CAACC,SAAS,EAAEC,MAAM,EAAEC,OAAO,CAAC;MACvEmC,UAAU,CAACT,IAAI,CAAC,KAAKU,SAAS,KAAKE,OAAO,EAAE,CAAC;IAC/C;IAEAhB,MAAM,IAAI,gBAAgBW,aAAa,kBACrCE,UAAU,CAACH,IAAI,CAAC,KAAK,CAAC,wCACgBE,QAAQ,QAAQ;EAC1D;;EAEA;EACA,KAAK,MAAM,CAACnB,UAAU,EAAEH,IAAI,CAAC,IAAIY,MAAM,CAACC,OAAO,CAAC1B,MAAM,CAAC,EAAE;IACvD,IAAI,CAACR,aAAa,CAACqB,IAAI,CAAC,EAAE;IAE1B,MAAM2B,iBAAiB,GAAG3B,IAAI,CAAC4B,YAAY;IAC3C,MAAMC,kBAA4B,GAAG,EAAE;IAEvC,KAAK,MAAM,CAACd,WAAW,EAAEe,WAAW,CAAC,IAAIlB,MAAM,CAACC,OAAO,CAACb,IAAI,CAACiB,QAAQ,CAAC,EAAE;MACtE,MAAMc,gBAAgB,GAAGzD,iBAAiB,CAACyC,WAAW,CAAC;MACvD,MAAMiB,oBAAoB,GAAG,GAAGjD,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC,GAAG2C,gBAAgB,EAAE;MAC7F,MAAME,eAAe,GAAG,GAAGjD,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC,GAAG2C,gBAAgB,EAAE;MACtFF,kBAAkB,CAACf,IAAI,CAACkB,oBAAoB,CAAC;MAE7C,IAAIF,WAAW,CAACzC,IAAI,KAAKR,QAAQ,CAACoB,GAAG,IAAI6B,WAAW,CAAC1B,OAAO,KAAK,QAAQ,EAAE;QACzE,MAAM8B,YAAY,GAAGzD,oBAAoB,CAACqD,WAAW,CAAC5B,IAAI,EAAGf,MAAM,CAAC;QACpE,MAAMgD,mBAAmB,GAAGD,YAAY,GACpCnD,mBAAmB,CAACmD,YAAY,EAAE9C,OAAO,CAAC,GAC1C,GAAG0C,WAAW,CAAC5B,IAAI,QAAS;QAChCQ,MAAM,IAAI,gBAAgBsB,oBAAoB,MAAMG,mBAAmB,aAAa;QACpFzB,MAAM,IAAI,KAAKiB,iBAAiB,gBAAgBZ,WAAW,MAAM;QACjEL,MAAM,IAAI,wBAAwBuB,eAAe,QAAQ;MAC3D,CAAC,MAAM;QACL,MAAMP,OAAO,GAAGzC,2BAA2B,CAAC6C,WAAW,EAAE3C,MAAM,EAAEC,OAAO,CAAC;QACzEsB,MAAM,IAAI,gBAAgBsB,oBAAoB,iBAAiB;QAC/DtB,MAAM,IAAI,KAAKiB,iBAAiB,gBAAgBZ,WAAW,OAAO;QAClEL,MAAM,IAAI,YAAYgB,OAAO,IAAI;QACjChB,MAAM,IAAI,wBAAwBuB,eAAe,QAAQ;MAC3D;IACF;IAEA,MAAMG,kBAAkB,GAAGrD,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC;IACnE,MAAMkC,QAAQ,GAAGtC,iBAAiB,CAACmB,UAAU,EAAEf,OAAO,CAAC;IACvDsB,MAAM,IACJ,gBAAgB0B,kBAAkB,4BAA4BT,iBAAiB,WAC7EE,kBAAkB,CAACT,IAAI,CAAC,OAAO,CAAC,0BACRE,QAAQ,QAAQ;EAC9C;EAEA,OAAOZ,MAAM;AACf;;AAEA;AACA;AACA;AACA,SAAS2B,sBAAsBA,CAC7B;EAAElD,MAAM;EAAEC;AAA8B,CAAC,EACjC;EACR,IAAIsB,MAAM,GAAGnC,qBAAqB;EAElC,MAAM+D,SAAmB,GAAG,EAAE;EAE9B,KAAK,MAAM,CAACnC,UAAU,EAAEH,IAAI,CAAC,IAAIY,MAAM,CAACC,OAAO,CAAC1B,MAAM,CAAC,EAAE;IACvD,IAAIT,cAAc,CAACsB,IAAI,CAAC,EAAE;MACxB,MAAMuC,SAAS,GAAGxD,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC;MAC1DkD,SAAS,CAACxB,IAAI,CACZ,YAAYyB,SAAS,OAAO3D,UAAU,CAACuB,UAAU,CAAC,sBAAsBf,OAAO,OACjF,CAAC;IACH,CAAC,MAAM,IAAIT,aAAa,CAACqB,IAAI,CAAC,EAAE;MAC9B,MAAMuC,SAAS,GAAGxD,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC;MAC1DkD,SAAS,CAACxB,IAAI,CACZ,YAAYyB,SAAS,OAAO3D,UAAU,CAACuB,UAAU,CAAC,sBAAsBf,OAAO,OACjF,CAAC;;MAED;MACA,KAAK,MAAM2B,WAAW,IAAIH,MAAM,CAACI,IAAI,CAAChB,IAAI,CAACiB,QAAQ,CAAC,EAAE;QACpD,MAAMc,gBAAgB,GAAGzD,iBAAiB,CAACyC,WAAW,CAAC;QACvD,MAAMyB,gBAAgB,GAAG,GAAGzD,mBAAmB,CAACoB,UAAU,EAAEf,OAAO,CAAC,GAAG2C,gBAAgB,EAAE;QAEzFO,SAAS,CAACxB,IAAI,CACZ,YAAY0B,gBAAgB,OAFH,GAAGrC,UAAU,GAAG4B,gBAAgB,QAAQ,sBAEU3C,OAAO,OACpF,CAAC;MACH;IACF;EACF;EAEAsB,MAAM,IAAI4B,SAAS,CAAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;EAErC,OAAOV,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS+B,8BAA8BA,CAC5CtD,MAAwB,EACxBuD,mBAA4B,EACR;EACpB,MAAM;IAAEC,KAAK;IAAEC;EAAW,CAAC,GAAGpE,kBAAkB,CAACW,MAAM,EAAEuD,mBAAmB,CAAC;EAE7E,MAAMG,UAAU,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAE5C,KAAK,MAAM;IAAE1D,OAAO;IAAED,MAAM,EAAE4D;EAAc,CAAC,IAAIJ,KAAK,EAAE;IACtD,IAAIvD,OAAO,GAAGwD,UAAU,EAAE;IAE1BC,UAAU,CAACG,GAAG,CAAC5D,OAAO,EAAEqB,4BAA4B,CAACrB,OAAO,EAAE2D,aAAa,CAAC,CAAC;EAC/E;EAEA,MAAME,cAAc,GAAGZ,sBAAsB,CAACM,KAAK,CAACA,KAAK,CAACzB,MAAM,GAAG,CAAC,CAAE,CAAC;EAEvE,OAAO;IAAE2B,UAAU;IAAEI;EAAe,CAAC;AACvC","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
18
|
+
import { resolveSchemaChain } from "./resolveSchemaChain.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generate versions.ts from a versioned schema chain.
|
|
22
|
+
*
|
|
23
|
+
* Output:
|
|
24
|
+
* ```
|
|
25
|
+
* export type SupportedVersions = 1 | 2;
|
|
26
|
+
* export type LatestVersion = 2;
|
|
27
|
+
* export type MinSupportedVersion = 1;
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function generateVersionsFromSchema(schema, minSupportedVersion) {
|
|
31
|
+
const {
|
|
32
|
+
chain,
|
|
33
|
+
latestVersion,
|
|
34
|
+
minVersion
|
|
35
|
+
} = resolveSchemaChain(schema, minSupportedVersion);
|
|
36
|
+
const supportedVersions = [];
|
|
37
|
+
for (const {
|
|
38
|
+
version
|
|
39
|
+
} of chain) {
|
|
40
|
+
if (version >= minVersion) {
|
|
41
|
+
supportedVersions.push(version);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let output = GENERATED_FILE_HEADER;
|
|
45
|
+
output += `export type SupportedVersions = ${supportedVersions.join(" | ")};\n`;
|
|
46
|
+
output += `export type LatestVersion = ${latestVersion};\n`;
|
|
47
|
+
output += `export type MinSupportedVersion = ${minVersion};\n`;
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=generateVersionsFromSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateVersionsFromSchema.js","names":["GENERATED_FILE_HEADER","resolveSchemaChain","generateVersionsFromSchema","schema","minSupportedVersion","chain","latestVersion","minVersion","supportedVersions","version","push","output","join"],"sources":["generateVersionsFromSchema.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 { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\n\n/**\n * Generate versions.ts from a versioned schema chain.\n *\n * Output:\n * ```\n * export type SupportedVersions = 1 | 2;\n * export type LatestVersion = 2;\n * export type MinSupportedVersion = 1;\n * ```\n */\nexport function generateVersionsFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): string {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n\n const supportedVersions: number[] = [];\n for (const { version } of chain) {\n if (version >= minVersion) {\n supportedVersions.push(version);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `export type SupportedVersions = ${supportedVersions.join(\" | \")};\\n`;\n output += `export type LatestVersion = ${latestVersion};\\n`;\n output += `export type MinSupportedVersion = ${minVersion};\\n`;\n\n return output;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,qBAAqB,QAAQ,2BAA2B;AACjE,SAASC,kBAAkB,QAAQ,yBAAyB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CACxCC,MAAwB,EACxBC,mBAA4B,EACpB;EACR,MAAM;IAAEC,KAAK;IAAEC,aAAa;IAAEC;EAAW,CAAC,GAAGN,kBAAkB,CAACE,MAAM,EAAEC,mBAAmB,CAAC;EAE5F,MAAMI,iBAA2B,GAAG,EAAE;EACtC,KAAK,MAAM;IAAEC;EAAQ,CAAC,IAAIJ,KAAK,EAAE;IAC/B,IAAII,OAAO,IAAIF,UAAU,EAAE;MACzBC,iBAAiB,CAACE,IAAI,CAACD,OAAO,CAAC;IACjC;EACF;EAEA,IAAIE,MAAM,GAAGX,qBAAqB;EAClCW,MAAM,IAAI,mCAAmCH,iBAAiB,CAACI,IAAI,CAAC,KAAK,CAAC,KAAK;EAC/ED,MAAM,IAAI,+BAA+BL,aAAa,KAAK;EAC3DK,MAAM,IAAI,qCAAqCJ,UAAU,KAAK;EAE9D,OAAOI,MAAM;AACf","ignoreList":[]}
|