@palantir/pack.document-schema.type-gen 0.32.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +96 -0
- package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -0
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +80 -0
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -1
- package/build/esm/commands/ir/irDeployHandler.js +5 -0
- package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
- package/build/esm/commands/ir/irGenAssetHandler.js +6 -1
- package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
- package/build/esm/commands/ir/irGenTypesHandler.js +7 -3
- package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
- package/build/esm/commands/ir/irUpdateSchemaHandler.js +18 -11
- package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
- package/build/esm/commands/ir/resolveIrInput.js +6 -5
- package/build/esm/commands/ir/resolveIrInput.js.map +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaIrHandler.js +15 -8
- package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
- package/build/esm/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.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 +35 -0
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
- package/build/esm/utils/ir/convertIrToWireSchema.js +1 -0
- package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
- 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__/assertSdkNamesUnique.test.js +178 -0
- package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +40 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +75 -3
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
- package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
- package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
- package/build/esm/utils/schema/generateIndexFromSchema.js +3 -5
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateInternalFromSchema.js +35 -19
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +9 -11
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +8 -9
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +13 -16
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
- package/build/esm/utils/schema/resolveSchemaChain.js +108 -20
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
- package/build/esm/utils/schema/runtimeSchema.js +47 -0
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
- package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
- package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
- 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 +10 -1
- package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
- package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
- package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
- package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
- package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
- package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
- package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
- package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
- package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
- package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
- package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
- package/build/types/utils/schema/runtimeSchema.d.ts +19 -0
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
- package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
- package/build/types/utils/steps/convertStepsToIr.d.ts +2 -0
- package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
- package/package.json +5 -5
- package/build/esm/utils/unknownVariantSuffix.js +0 -22
- package/build/esm/utils/unknownVariantSuffix.js.map +0 -1
- package/build/types/utils/unknownVariantSuffix.d.ts +0 -3
- package/build/types/utils/unknownVariantSuffix.d.ts.map +0 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import * as P from "@palantir/pack.schema";
|
|
18
18
|
import { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from "@palantir/pack.schema";
|
|
19
19
|
import { describe, expect, it } from "vitest";
|
|
20
|
-
import { resolveSchemaChain, stripDeprecatedFieldsForSdk } from "../resolveSchemaChain.js";
|
|
20
|
+
import { collapseChainToMajors, resolveSchemaChain, stripDeprecatedFieldsForSdk } from "../resolveSchemaChain.js";
|
|
21
21
|
|
|
22
22
|
/** Index a record model's fields by key for a given chain entry. */
|
|
23
23
|
function fieldsByKey(entry, modelKey) {
|
|
@@ -57,13 +57,19 @@ describe("resolveSchemaChain provenance", () => {
|
|
|
57
57
|
chain,
|
|
58
58
|
latestVersion,
|
|
59
59
|
minVersion
|
|
60
|
-
} = resolveSchemaChain(v2, 1, {},
|
|
60
|
+
} = resolveSchemaChain(v2, 1, {}, {
|
|
61
|
+
major: 1,
|
|
62
|
+
minor: 0
|
|
63
|
+
});
|
|
61
64
|
expect(chain.map(entry => entry.version)).toEqual([1]);
|
|
62
65
|
expect(latestVersion).toBe(1);
|
|
63
66
|
expect(minVersion).toBe(1);
|
|
64
67
|
});
|
|
65
68
|
it("rejects a maxVersion that is not in the chain", () => {
|
|
66
|
-
expect(() => resolveSchemaChain(v2, undefined, {},
|
|
69
|
+
expect(() => resolveSchemaChain(v2, undefined, {}, {
|
|
70
|
+
major: 3,
|
|
71
|
+
minor: 0
|
|
72
|
+
})).toThrow("maxVersion 3 is not in the schema chain");
|
|
67
73
|
});
|
|
68
74
|
it("keeps a deprecated field present and stamps deprecatedFromVersion + message", () => {
|
|
69
75
|
const {
|
|
@@ -132,4 +138,70 @@ describe("resolveSchemaChain — union provenance", () => {
|
|
|
132
138
|
}
|
|
133
139
|
});
|
|
134
140
|
});
|
|
141
|
+
describe("resolveSchemaChain minor versions", () => {
|
|
142
|
+
const v1 = defineSchema({
|
|
143
|
+
ShapeBox: defineRecord("ShapeBox", {
|
|
144
|
+
docs: "A box",
|
|
145
|
+
fields: {
|
|
146
|
+
color: P.String
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
});
|
|
150
|
+
const v2 = nextSchema(v1).addSchemaUpdate(defineSchemaUpdate("addFill", schema => ({
|
|
151
|
+
ShapeBox: schema.ShapeBox.addField("fillColor", P.Optional(P.String), {
|
|
152
|
+
derivedFrom: ["color"]
|
|
153
|
+
}).build()
|
|
154
|
+
}))).build();
|
|
155
|
+
const v2_1 = nextSchema(v2, {
|
|
156
|
+
bump: "minor"
|
|
157
|
+
}).addSchemaUpdate(defineSchemaUpdate("addLabel", schema => ({
|
|
158
|
+
ShapeBox: schema.ShapeBox.addField("label", P.Optional(P.String)).build()
|
|
159
|
+
}))).build();
|
|
160
|
+
it("records the minor version on chain entries and on fields added in a minor version", () => {
|
|
161
|
+
const {
|
|
162
|
+
chain,
|
|
163
|
+
latestVersion
|
|
164
|
+
} = resolveSchemaChain(v2_1);
|
|
165
|
+
expect(chain.map(entry => [entry.version, entry.minorVersion])).toEqual([[1, undefined], [2, undefined], [2, 1]]);
|
|
166
|
+
expect(latestVersion).toBe(2);
|
|
167
|
+
const fields = fieldsByKey(chain[2], "ShapeBox");
|
|
168
|
+
expect(fields.label.metadata).toEqual({
|
|
169
|
+
addedInVersion: 2,
|
|
170
|
+
addedInMinorVersion: 1
|
|
171
|
+
});
|
|
172
|
+
expect(fields.fillColor.metadata).toEqual({
|
|
173
|
+
addedInVersion: 2
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it("caps the chain at a minor version or at a .0 version", () => {
|
|
177
|
+
expect(resolveSchemaChain(v2_1, undefined, {}, {
|
|
178
|
+
major: 2,
|
|
179
|
+
minor: 1
|
|
180
|
+
}).chain).toHaveLength(3);
|
|
181
|
+
expect(resolveSchemaChain(v2_1, undefined, {}, {
|
|
182
|
+
major: 2,
|
|
183
|
+
minor: 0
|
|
184
|
+
}).chain).toHaveLength(2);
|
|
185
|
+
expect(() => resolveSchemaChain(v2_1, undefined, {}, {
|
|
186
|
+
major: 2,
|
|
187
|
+
minor: 2
|
|
188
|
+
})).toThrow("maxVersion 2.2 is not in the schema chain (available versions: 1, 2, 2.1)");
|
|
189
|
+
});
|
|
190
|
+
it("collapseChainToMajors keeps the last minor's IR and the major's migrations", () => {
|
|
191
|
+
const {
|
|
192
|
+
chain
|
|
193
|
+
} = resolveSchemaChain(v2_1);
|
|
194
|
+
const collapsed = collapseChainToMajors(chain);
|
|
195
|
+
expect(collapsed.map(entry => entry.version)).toEqual([1, 2]);
|
|
196
|
+
expect(collapsed[1].minorVersion).toBeUndefined();
|
|
197
|
+
expect(fieldsByKey(collapsed[1], "ShapeBox").label).toBeDefined();
|
|
198
|
+
expect(collapsed[1].migrations).toEqual({
|
|
199
|
+
ShapeBox: {
|
|
200
|
+
fillColor: {
|
|
201
|
+
derivedFrom: ["color"]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
135
207
|
//# sourceMappingURL=resolveSchemaChain.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","latestVersion","minVersion","toEqual","undefined","toThrow","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union"],"sources":["resolveSchemaChain.test.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 * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"caps the chain at maxVersion\", () => {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v2, 1, {}, 1);\n\n expect(chain.map(entry => entry.version)).toEqual([1]);\n expect(latestVersion).toBe(1);\n expect(minVersion).toBe(1);\n });\n\n it(\"rejects a maxVersion that is not in the chain\", () => {\n expect(() => resolveSchemaChain(v2, undefined, {}, 3)).toThrow(\n \"maxVersion 3 is not in the schema chain\",\n );\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,CAAC,MAAM,uBAAuB;AAC1C,SAASC,YAAY,EAAEC,YAAY,EAAEC,kBAAkB,EAAEC,UAAU,QAAQ,uBAAuB;AAClG,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAK7C,SACEC,kBAAkB,EAClBC,2BAA2B,QAEtB,0BAA0B;;AAEjC;AACA,SAASC,WAAWA,CAACC,KAAuB,EAAEC,QAAgB,EAA6B;EACzF,MAAMC,KAAgB,GAAGF,KAAK,CAACG,EAAE,CAACC,MAAM,CAACH,QAAQ,CAAE;EACnD,IAAIC,KAAK,CAACG,IAAI,KAAK,QAAQ,EAAE,MAAM,IAAIC,KAAK,CAAC,GAAGL,QAAQ,kBAAkB,CAAC;EAC3E,OAAOM,MAAM,CAACC,WAAW,CAACN,KAAK,CAACO,MAAM,CAACC,MAAM,CAACC,GAAG,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,GAAG,EAAED,CAAC,CAAC,CAAC,CAAC;AACrE;AAEAlB,QAAQ,CAAC,+BAA+B,EAAE,MAAM;EAC9C,MAAMoB,EAAE,GAAGvB,YAAY,CAAC;IACtBwB,QAAQ,EAAEzB,YAAY,CAAC,UAAU,EAAE;MACjC0B,IAAI,EAAE,OAAO;MACbN,MAAM,EAAE;QAAEO,IAAI,EAAE5B,CAAC,CAAC6B,MAAM;QAAEC,KAAK,EAAE9B,CAAC,CAAC+B,QAAQ,CAAC/B,CAAC,CAACgC,MAAM;MAAE;IACxD,CAAC;EACH,CAAC,CAAC;EAEF,MAAMC,UAAU,GAAG9B,kBAAkB,CACnC,YAAY,EACX+B,MAAyC,KAAM;IAC9CR,QAAQ,EAAEQ,MAAM,CAACR,QAAQ,CACtBS,QAAQ,CAAC,WAAW,EAAEnC,CAAC,CAAC+B,QAAQ,CAAC/B,CAAC,CAACgC,MAAM,CAAC,EAAE;MAAEI,WAAW,EAAE,CAAC,OAAO;IAAE,CAAC,CAAC,CACvED,QAAQ,CAAC,aAAa,EAAEnC,CAAC,CAAC+B,QAAQ,CAAC/B,CAAC,CAACgC,MAAM,CAAC,EAAE;MAAEI,WAAW,EAAE,CAAC,OAAO;IAAE,CAAC,CAAC,CACzEC,cAAc,CAAC,OAAO,EAAE,2BAA2B,CAAC,CACpDC,KAAK,CAAC;EACX,CAAC,CACH,CAAC;EAED,MAAMC,EAAE,GAAGnC,UAAU,CAACqB,EAAE,CAAC,CAACe,eAAe,CAACP,UAAU,CAAC,CAACK,KAAK,CAAC,CAAC;EAE7D/B,EAAE,CAAC,2DAA2D,EAAE,MAAM;IACpE,MAAM;MAAEkC;IAAM,CAAC,GAAGjC,kBAAkB,CAAC+B,EAAE,CAAC;IACxC,MAAMG,QAAQ,GAAGhC,WAAW,CAAC+B,KAAK,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC;IAE3EvC,MAAM,CAACoC,QAAQ,CAACd,IAAI,CAAEkB,QAAQ,CAACC,cAAc,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IACtD1C,MAAM,CAACoC,QAAQ,CAACO,SAAS,CAAEH,QAAQ,CAACC,cAAc,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IAC3D1C,MAAM,CAACoC,QAAQ,CAACQ,WAAW,CAAEJ,QAAQ,CAACC,cAAc,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;EAC/D,CAAC,CAAC;EAEFzC,EAAE,CAAC,8BAA8B,EAAE,MAAM;IACvC,MAAM;MAAEkC,KAAK;MAAEU,aAAa;MAAEC;IAAW,CAAC,GAAG5C,kBAAkB,CAAC+B,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAE7EjC,MAAM,CAACmC,KAAK,CAACnB,GAAG,CAACX,KAAK,IAAIA,KAAK,CAACkC,OAAO,CAAC,CAAC,CAACQ,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD/C,MAAM,CAAC6C,aAAa,CAAC,CAACH,IAAI,CAAC,CAAC,CAAC;IAC7B1C,MAAM,CAAC8C,UAAU,CAAC,CAACJ,IAAI,CAAC,CAAC,CAAC;EAC5B,CAAC,CAAC;EAEFzC,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxDD,MAAM,CAAC,MAAME,kBAAkB,CAAC+B,EAAE,EAAEe,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAACC,OAAO,CAC5D,yCACF,CAAC;EACH,CAAC,CAAC;EAEFhD,EAAE,CAAC,6EAA6E,EAAE,MAAM;IACtF,MAAM;MAAEkC;IAAM,CAAC,GAAGjC,kBAAkB,CAAC+B,EAAE,CAAC;IACxC,MAAMG,QAAQ,GAAGhC,WAAW,CAAC+B,KAAK,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC;IAE3EvC,MAAM,CAACoC,QAAQ,CAACZ,KAAK,CAAC,CAAC0B,WAAW,CAAC,CAAC;IACpClD,MAAM,CAACoC,QAAQ,CAACZ,KAAK,CAAEgB,QAAQ,CAACC,cAAc,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IACvD1C,MAAM,CAACoC,QAAQ,CAACZ,KAAK,CAAEgB,QAAQ,CAACW,qBAAqB,CAAC,CAACT,IAAI,CAAC,CAAC,CAAC;IAC9D1C,MAAM,CAACoC,QAAQ,CAACZ,KAAK,CAAEgB,QAAQ,CAACY,iBAAiB,CAAC,CAACV,IAAI,CAAC,2BAA2B,CAAC;EACtF,CAAC,CAAC;EAEFzC,EAAE,CAAC,uEAAuE,EAAE,MAAM;IAChF,MAAM;MAAEkC;IAAM,CAAC,GAAGjC,kBAAkB,CAAC+B,EAAE,CAAC;IACxC,MAAMoB,QAAQ,GAAGjD,WAAW,CAAC+B,KAAK,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC;IAE3EvC,MAAM,CAACqD,QAAQ,CAAC7B,KAAK,CAAC,CAAC0B,WAAW,CAAC,CAAC;IACpClD,MAAM,CAACqD,QAAQ,CAAC7B,KAAK,CAAEgB,QAAQ,CAACW,qBAAqB,IAAIH,SAAS,CAAC,CAACM,aAAa,CAAC,CAAC;IACnFtD,MAAM,CAACqD,QAAQ,CAACV,SAAS,CAAC,CAACW,aAAa,CAAC,CAAC;EAC5C,CAAC,CAAC;EAEFrD,EAAE,CAAC,8EAA8E,EAAE,MAAM;IACvF,MAAM;MAAEkC;IAAM,CAAC,GAAGjC,kBAAkB,CAAC+B,EAAE,CAAC;IACxC,MAAMsB,QAAQ,GAAGpD,2BAA2B,CAACgC,KAAK,CAAC;IAEnD,MAAMkB,QAAQ,GAAGjD,WAAW,CAACmD,QAAQ,CAAClB,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC;IAC9EvC,MAAM,CAACqD,QAAQ,CAAC7B,KAAK,CAAC,CAAC0B,WAAW,CAAC,CAAC;IAEpC,MAAMd,QAAQ,GAAGhC,WAAW,CAACmD,QAAQ,CAAClB,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC;IAC9EvC,MAAM,CAACoC,QAAQ,CAACZ,KAAK,CAAC,CAAC8B,aAAa,CAAC,CAAC;IACtCtD,MAAM,CAACoC,QAAQ,CAACO,SAAS,CAAC,CAACO,WAAW,CAAC,CAAC;IAExClD,MAAM,CAACI,WAAW,CAAC+B,KAAK,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAK,CAAC,CAAC,EAAG,UAAU,CAAC,CAACf,KAAK,CAAC,CAAC0B,WAAW,CAAC,CAAC;EACxF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFnD,QAAQ,CAAC,uCAAuC,EAAE,MAAM;EACtD,MAAMoB,EAAE,GAAGvB,YAAY,CAAC;IACtB4D,GAAG,EAAE7D,YAAY,CAAC,KAAK,EAAE;MAAE0B,IAAI,EAAE,EAAE;MAAEN,MAAM,EAAE;QAAE0C,CAAC,EAAE/D,CAAC,CAAC6B;MAAO;IAAE,CAAC,CAAC;IAC/DmC,SAAS,EAAEhE,CAAC,CAACiE,WAAW,CAAC,WAAW,EAAE;MACpCtC,IAAI,EAAE,OAAO;MACbuC,QAAQ,EAAE;QAAEC,GAAG,EAAElE,YAAY,CAAC,OAAO,EAAE;UAAE0B,IAAI,EAAE,EAAE;UAAEN,MAAM,EAAE;YAAE+C,CAAC,EAAEpE,CAAC,CAAC6B;UAAO;QAAE,CAAC;MAAE;IAChF,CAAC;EACH,CAAC,CAAC;EACF,MAAMwC,IAAI,GAAGlE,kBAAkB,CAC7B,MAAM,EACL+B,MAAyC,KAAM;IAC9C4B,GAAG,EAAE5B,MAAM,CAAC4B,GAAG,CAAC3B,QAAQ,CAAC,GAAG,EAAEnC,CAAC,CAAC+B,QAAQ,CAAC/B,CAAC,CAACgC,MAAM,CAAC,CAAC,CAACM,KAAK,CAAC;EAC5D,CAAC,CACH,CAAC;EACD,MAAMC,EAAE,GAAGnC,UAAU,CAACqB,EAAE,CAAC,CAACe,eAAe,CAAC6B,IAAI,CAAC,CAAC/B,KAAK,CAAC,CAAC;EAEvD/B,EAAE,CAAC,4DAA4D,EAAE,MAAM;IACrE,MAAM;MAAEkC;IAAM,CAAC,GAAGjC,kBAAkB,CAAC+B,EAAE,CAAC;IACxC,KAAK,MAAMM,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;MAC5B,MAAMyB,KAAK,GAAG7B,KAAK,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,OAAO,KAAKA,OAAO,CAAC,CAAE/B,EAAE,CAACC,MAAM,CAACiD,SAAU;MAC1E,IAAIM,KAAK,CAACtD,IAAI,KAAK,OAAO,EAAE,MAAM,IAAIC,KAAK,CAAC,6BAA6B,CAAC;MAC1EX,MAAM,CAACgE,KAAK,CAACA,KAAK,CAACxB,QAAQ,CAACC,cAAc,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IACrD;EACF,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","collapseChainToMajors","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","latestVersion","minVersion","major","minor","toEqual","undefined","toThrow","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union","v2_1","bump","minorVersion","label","addedInMinorVersion","toHaveLength","collapsed","migrations"],"sources":["resolveSchemaChain.test.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 * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n collapseChainToMajors,\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"caps the chain at maxVersion\", () => {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v2, 1, {}, {\n major: 1,\n minor: 0,\n });\n\n expect(chain.map(entry => entry.version)).toEqual([1]);\n expect(latestVersion).toBe(1);\n expect(minVersion).toBe(1);\n });\n\n it(\"rejects a maxVersion that is not in the chain\", () => {\n expect(() => resolveSchemaChain(v2, undefined, {}, { major: 3, minor: 0 })).toThrow(\n \"maxVersion 3 is not in the schema chain\",\n );\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n});\n\ndescribe(\"resolveSchemaChain minor versions\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", { docs: \"A box\", fields: { color: P.String } }),\n });\n const v2 = nextSchema(v1)\n .addSchemaUpdate(defineSchemaUpdate(\"addFill\", (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .build(),\n })))\n .build();\n const v2_1 = nextSchema(v2, { bump: \"minor\" })\n .addSchemaUpdate(\n defineSchemaUpdate(\"addLabel\", (schema: P.SchemaBuilder<typeof v2.models>) => ({\n ShapeBox: schema.ShapeBox.addField(\"label\", P.Optional(P.String)).build(),\n })),\n )\n .build();\n\n it(\"records the minor version on chain entries and on fields added in a minor version\", () => {\n const { chain, latestVersion } = resolveSchemaChain(v2_1);\n\n expect(chain.map(entry => [entry.version, entry.minorVersion])).toEqual([\n [1, undefined],\n [2, undefined],\n [2, 1],\n ]);\n expect(latestVersion).toBe(2);\n\n const fields = fieldsByKey(chain[2]!, \"ShapeBox\");\n expect(fields.label!.metadata).toEqual({ addedInVersion: 2, addedInMinorVersion: 1 });\n expect(fields.fillColor!.metadata).toEqual({ addedInVersion: 2 });\n });\n\n it(\"caps the chain at a minor version or at a .0 version\", () => {\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 1 }).chain).toHaveLength(3);\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 0 }).chain).toHaveLength(2);\n expect(() => resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 2 })).toThrow(\n \"maxVersion 2.2 is not in the schema chain (available versions: 1, 2, 2.1)\",\n );\n });\n\n it(\"collapseChainToMajors keeps the last minor's IR and the major's migrations\", () => {\n const { chain } = resolveSchemaChain(v2_1);\n const collapsed = collapseChainToMajors(chain);\n\n expect(collapsed.map(entry => entry.version)).toEqual([1, 2]);\n expect(collapsed[1]!.minorVersion).toBeUndefined();\n expect(fieldsByKey(collapsed[1]!, \"ShapeBox\").label).toBeDefined();\n expect(collapsed[1]!.migrations).toEqual({\n ShapeBox: { fillColor: { derivedFrom: [\"color\"] } },\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
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 { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
+
import { assertVariantNameAllowed } from "@palantir/pack.schema";
|
|
19
|
+
import { resolveMinVersion, stripDeprecatedFieldsForSdk } from "./resolveSchemaChain.js";
|
|
20
|
+
import { internalSchemaName, internalTypeName, knownTypeName, modelName, narrowKnownFunctionName, RESERVED_SDK_NAMES, schemaName, typeGuardName, unionVariantName, upgradesName, versionedDocRefName, versionedInternalTypeName, versionedSchemaName, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Throw if the generated SDK would use one name for two different things, so a clash fails
|
|
24
|
+
* here with a clear message instead of as a TypeScript error in the generated files. Run it
|
|
25
|
+
* before a schema is deployed: model keys are stored in documents, so renaming a model
|
|
26
|
+
* afterwards breaks existing data. Returns the names it checked, for tests.
|
|
27
|
+
*/
|
|
28
|
+
export function assertSdkNamesUnique(irChain, minSupportedVersion) {
|
|
29
|
+
const {
|
|
30
|
+
minVersion
|
|
31
|
+
} = resolveMinVersion(irChain, minSupportedVersion);
|
|
32
|
+
// The SDK leaves out deprecated fields, so check the fields it actually generates.
|
|
33
|
+
const chain = stripDeprecatedFieldsForSdk(irChain);
|
|
34
|
+
|
|
35
|
+
// Generated names end in "_v<version>", so a model key like "Foo_v2" passes today but
|
|
36
|
+
// clashes with record "Foo" once the schema reaches v2, when it can no longer be renamed.
|
|
37
|
+
for (const {
|
|
38
|
+
ir
|
|
39
|
+
} of chain) {
|
|
40
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
41
|
+
if (/_v\d/.test(modelKey)) {
|
|
42
|
+
throw new Error(`Model "${modelKey}" can't contain "_v" followed by a number. The generated SDK adds` + ` "_v<version>" to names, so this one could clash in a later schema version.` + " Rename the model.");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// JSON input bypasses defineUnion, so enforce its reserved names here too.
|
|
46
|
+
if (modelDef.type === "union") {
|
|
47
|
+
if (modelDef.union.discriminant === "rawValue") {
|
|
48
|
+
throw new Error(`Union "${modelKey}" can't use "rawValue" as its discriminant. The generated Unknown case` + " stores the original value in rawValue; choose another name.");
|
|
49
|
+
}
|
|
50
|
+
for (const variantKey of Object.keys(modelDef.union.variants)) {
|
|
51
|
+
assertVariantNameAllowed(variantKey, modelKey);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Each name the SDK uses, and what uses it, e.g. "KnownShape" -> 'union "Shape" (Known type)'.
|
|
58
|
+
const usedNames = new Map();
|
|
59
|
+
const useName = (name, usedFor) => {
|
|
60
|
+
const alreadyUsedFor = usedNames.get(name);
|
|
61
|
+
// The same thing can be added again, e.g. once per version. Only a different thing clashes.
|
|
62
|
+
if (alreadyUsedFor != null && alreadyUsedFor !== usedFor) {
|
|
63
|
+
throw new Error(`The generated SDK would use the name "${name}" for both ${alreadyUsedFor} and ${usedFor}.` + " Rename a model so the names differ.");
|
|
64
|
+
}
|
|
65
|
+
usedNames.set(name, usedFor);
|
|
66
|
+
};
|
|
67
|
+
for (const name of RESERVED_SDK_NAMES) {
|
|
68
|
+
useName(name, "the SDK itself");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// types.ts, schema.ts and models.ts: unversioned names from the latest version.
|
|
72
|
+
const latestIr = chain[chain.length - 1].ir;
|
|
73
|
+
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
74
|
+
const model = `${modelDef.type} "${modelKey}"`; // e.g. 'record "Foo"'
|
|
75
|
+
useName(modelKey, model);
|
|
76
|
+
useName(modelName(modelKey), `${model} (Model)`);
|
|
77
|
+
useName(schemaName(modelKey), `${model} (Zod schema)`);
|
|
78
|
+
if (modelDef.type !== "union") continue;
|
|
79
|
+
useName(knownTypeName(modelKey), `${model} (Known type)`);
|
|
80
|
+
useName(narrowKnownFunctionName(modelKey), `${model} (narrowKnown function)`);
|
|
81
|
+
useName(upgradesName(modelKey), `${model} (upgrades)`);
|
|
82
|
+
for (const variantKey of Object.keys(modelDef.union.variants)) {
|
|
83
|
+
const variant = `variant "${variantKey}" of ${model}`;
|
|
84
|
+
const variantName = unionVariantName(modelKey, variantKey);
|
|
85
|
+
useName(variantName, variant);
|
|
86
|
+
useName(modelName(variantName), `${variant} (Model)`);
|
|
87
|
+
useName(schemaName(variantName), `${variant} (Zod schema)`);
|
|
88
|
+
}
|
|
89
|
+
useName(unionVariantName(modelKey, UNKNOWN_UNION_VARIANT), `variant "${UNKNOWN_UNION_VARIANT}" of ${model}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// types_vN.ts, writeTypes_vN.ts, schema_vN.ts and versionedDocRef.ts, for each supported version.
|
|
93
|
+
for (const {
|
|
94
|
+
version,
|
|
95
|
+
ir
|
|
96
|
+
} of chain) {
|
|
97
|
+
if (version < minVersion) continue;
|
|
98
|
+
useName(versionedDocRefName(version), "the SDK itself");
|
|
99
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
100
|
+
const model = `${modelDef.type} "${modelKey}"`;
|
|
101
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
102
|
+
const zodName = versionedSchemaName(modelKey, version);
|
|
103
|
+
useName(typeName, `${model} (v${version} type)`);
|
|
104
|
+
useName(zodName, `${model} (v${version} Zod schema)`);
|
|
105
|
+
if (modelDef.type === "record") {
|
|
106
|
+
useName(versionedWriteTypeName(modelKey, version), `${model} (v${version} write type)`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
useName(knownTypeName(typeName), `${model} (v${version} Known type)`);
|
|
110
|
+
useName(narrowKnownFunctionName(typeName), `${model} (v${version} narrowKnown function)`);
|
|
111
|
+
const {
|
|
112
|
+
discriminant,
|
|
113
|
+
variants
|
|
114
|
+
} = modelDef.union;
|
|
115
|
+
for (const variantKey of [...Object.keys(variants), UNKNOWN_UNION_VARIANT]) {
|
|
116
|
+
const variant = `variant "${variantKey}" of ${model}`;
|
|
117
|
+
const variantType = unionVariantName(typeName, variantKey);
|
|
118
|
+
useName(variantType, `${variant} (v${version} type)`);
|
|
119
|
+
useName(typeGuardName(variantType), `${variant} (v${version} type guard)`);
|
|
120
|
+
useName(unionVariantName(zodName, variantKey), `${variant} (v${version} Zod schema)`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// A variant's type is its record's fields (or `value` for any other variant) plus the
|
|
124
|
+
// discriminant, so a field named like the discriminant would appear twice.
|
|
125
|
+
for (const [variantKey, targetKey] of Object.entries(variants)) {
|
|
126
|
+
const target = ir.models[targetKey];
|
|
127
|
+
const fields = target?.type === "record" ? target.record.fields.map(field => field.key) : ["value"];
|
|
128
|
+
if (fields.includes(discriminant)) {
|
|
129
|
+
throw new Error(`The generated type "${unionVariantName(typeName, variantKey)}" would have two` + ` properties named "${discriminant}". Rename the discriminant of ${model}.`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// _internal/: every record in any version of the chain.
|
|
136
|
+
for (const {
|
|
137
|
+
version,
|
|
138
|
+
ir
|
|
139
|
+
} of chain) {
|
|
140
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
141
|
+
if (modelDef.type !== "record") continue;
|
|
142
|
+
const model = `record "${modelKey}"`;
|
|
143
|
+
useName(internalTypeName(modelKey), `${model} (internal type)`);
|
|
144
|
+
useName(versionedInternalTypeName(modelKey, version), `${model} (v${version} internal type)`);
|
|
145
|
+
useName(internalSchemaName(modelKey), `${model} (internal Zod schema)`);
|
|
146
|
+
useName(upgradesName(modelKey), `${model} (upgrades)`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return usedNames;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=assertSdkNamesUnique.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertSdkNamesUnique.js","names":["UNKNOWN_UNION_VARIANT","assertVariantNameAllowed","resolveMinVersion","stripDeprecatedFieldsForSdk","internalSchemaName","internalTypeName","knownTypeName","modelName","narrowKnownFunctionName","RESERVED_SDK_NAMES","schemaName","typeGuardName","unionVariantName","upgradesName","versionedDocRefName","versionedInternalTypeName","versionedSchemaName","versionedTypeName","versionedWriteTypeName","assertSdkNamesUnique","irChain","minSupportedVersion","minVersion","chain","ir","modelKey","modelDef","Object","entries","models","test","Error","type","union","discriminant","variantKey","keys","variants","usedNames","Map","useName","name","usedFor","alreadyUsedFor","get","set","latestIr","length","model","variant","variantName","version","typeName","zodName","variantType","targetKey","target","fields","record","map","field","key","includes"],"sources":["assertSdkNamesUnique.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport { assertVariantNameAllowed } from \"@palantir/pack.schema\";\nimport {\n resolveMinVersion,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\nimport {\n internalSchemaName,\n internalTypeName,\n knownTypeName,\n modelName,\n narrowKnownFunctionName,\n RESERVED_SDK_NAMES,\n schemaName,\n typeGuardName,\n unionVariantName,\n upgradesName,\n versionedDocRefName,\n versionedInternalTypeName,\n versionedSchemaName,\n versionedTypeName,\n versionedWriteTypeName,\n} from \"./runtimeSchema.js\";\n\n/**\n * Throw if the generated SDK would use one name for two different things, so a clash fails\n * here with a clear message instead of as a TypeScript error in the generated files. Run it\n * before a schema is deployed: model keys are stored in documents, so renaming a model\n * afterwards breaks existing data. Returns the names it checked, for tests.\n */\nexport function assertSdkNamesUnique(\n irChain: VersionedIrEntry[],\n minSupportedVersion: number | undefined,\n): ReadonlyMap<string, string> {\n const { minVersion } = resolveMinVersion(irChain, minSupportedVersion);\n // The SDK leaves out deprecated fields, so check the fields it actually generates.\n const chain = stripDeprecatedFieldsForSdk(irChain);\n\n // Generated names end in \"_v<version>\", so a model key like \"Foo_v2\" passes today but\n // clashes with record \"Foo\" once the schema reaches v2, when it can no longer be renamed.\n for (const { ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (/_v\\d/.test(modelKey)) {\n throw new Error(\n `Model \"${modelKey}\" can't contain \"_v\" followed by a number. The generated SDK adds`\n + ` \"_v<version>\" to names, so this one could clash in a later schema version.`\n + \" Rename the model.\",\n );\n }\n\n // JSON input bypasses defineUnion, so enforce its reserved names here too.\n if (modelDef.type === \"union\") {\n if (modelDef.union.discriminant === \"rawValue\") {\n throw new Error(\n `Union \"${modelKey}\" can't use \"rawValue\" as its discriminant. The generated Unknown case`\n + \" stores the original value in rawValue; choose another name.\",\n );\n }\n for (const variantKey of Object.keys(modelDef.union.variants)) {\n assertVariantNameAllowed(variantKey, modelKey);\n }\n }\n }\n }\n\n // Each name the SDK uses, and what uses it, e.g. \"KnownShape\" -> 'union \"Shape\" (Known type)'.\n const usedNames = new Map<string, string>();\n const useName = (name: string, usedFor: string): void => {\n const alreadyUsedFor = usedNames.get(name);\n // The same thing can be added again, e.g. once per version. Only a different thing clashes.\n if (alreadyUsedFor != null && alreadyUsedFor !== usedFor) {\n throw new Error(\n `The generated SDK would use the name \"${name}\" for both ${alreadyUsedFor} and ${usedFor}.`\n + \" Rename a model so the names differ.\",\n );\n }\n usedNames.set(name, usedFor);\n };\n\n for (const name of RESERVED_SDK_NAMES) {\n useName(name, \"the SDK itself\");\n }\n\n // types.ts, schema.ts and models.ts: unversioned names from the latest version.\n const latestIr = chain[chain.length - 1]!.ir;\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n const model = `${modelDef.type} \"${modelKey}\"`; // e.g. 'record \"Foo\"'\n useName(modelKey, model);\n useName(modelName(modelKey), `${model} (Model)`);\n useName(schemaName(modelKey), `${model} (Zod schema)`);\n if (modelDef.type !== \"union\") continue;\n\n useName(knownTypeName(modelKey), `${model} (Known type)`);\n useName(narrowKnownFunctionName(modelKey), `${model} (narrowKnown function)`);\n useName(upgradesName(modelKey), `${model} (upgrades)`);\n for (const variantKey of Object.keys(modelDef.union.variants)) {\n const variant = `variant \"${variantKey}\" of ${model}`;\n const variantName = unionVariantName(modelKey, variantKey);\n useName(variantName, variant);\n useName(modelName(variantName), `${variant} (Model)`);\n useName(schemaName(variantName), `${variant} (Zod schema)`);\n }\n useName(\n unionVariantName(modelKey, UNKNOWN_UNION_VARIANT),\n `variant \"${UNKNOWN_UNION_VARIANT}\" of ${model}`,\n );\n }\n\n // types_vN.ts, writeTypes_vN.ts, schema_vN.ts and versionedDocRef.ts, for each supported version.\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n useName(versionedDocRefName(version), \"the SDK itself\");\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n const model = `${modelDef.type} \"${modelKey}\"`;\n const typeName = versionedTypeName(modelKey, version);\n const zodName = versionedSchemaName(modelKey, version);\n useName(typeName, `${model} (v${version} type)`);\n useName(zodName, `${model} (v${version} Zod schema)`);\n if (modelDef.type === \"record\") {\n useName(versionedWriteTypeName(modelKey, version), `${model} (v${version} write type)`);\n continue;\n }\n\n useName(knownTypeName(typeName), `${model} (v${version} Known type)`);\n useName(narrowKnownFunctionName(typeName), `${model} (v${version} narrowKnown function)`);\n const { discriminant, variants } = modelDef.union;\n for (const variantKey of [...Object.keys(variants), UNKNOWN_UNION_VARIANT]) {\n const variant = `variant \"${variantKey}\" of ${model}`;\n const variantType = unionVariantName(typeName, variantKey);\n useName(variantType, `${variant} (v${version} type)`);\n useName(typeGuardName(variantType), `${variant} (v${version} type guard)`);\n useName(unionVariantName(zodName, variantKey), `${variant} (v${version} Zod schema)`);\n }\n\n // A variant's type is its record's fields (or `value` for any other variant) plus the\n // discriminant, so a field named like the discriminant would appear twice.\n for (const [variantKey, targetKey] of Object.entries(variants)) {\n const target = ir.models[targetKey];\n const fields = target?.type === \"record\"\n ? target.record.fields.map(field => field.key)\n : [\"value\"];\n if (fields.includes(discriminant)) {\n throw new Error(\n `The generated type \"${unionVariantName(typeName, variantKey)}\" would have two`\n + ` properties named \"${discriminant}\". Rename the discriminant of ${model}.`,\n );\n }\n }\n }\n }\n\n // _internal/: every record in any version of the chain.\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const model = `record \"${modelKey}\"`;\n useName(internalTypeName(modelKey), `${model} (internal type)`);\n useName(versionedInternalTypeName(modelKey, version), `${model} (v${version} internal type)`);\n useName(internalSchemaName(modelKey), `${model} (internal Zod schema)`);\n useName(upgradesName(modelKey), `${model} (upgrades)`);\n }\n }\n\n return usedNames;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,10 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
-
import { formatVariantName } from "@palantir/pack.schema";
|
|
19
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
20
19
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
-
import { DOCUMENT_TYPE_PATH, INTERNAL_UPGRADE_FNS_PATH, knownTypeName, MODELS_PATH, narrowKnownFunctionName, TYPES_REEXPORT_PATH, typesFilePath, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
|
|
20
|
+
import { DOCUMENT_TYPE_PATH, INTERNAL_UPGRADE_FNS_PATH, knownTypeName, MODELS_PATH, narrowKnownFunctionName, typeGuardName, TYPES_REEXPORT_PATH, typesFilePath, unionVariantName, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
|
|
22
21
|
|
|
23
22
|
/**
|
|
24
23
|
* Generate the index.ts barrel export from a versioned schema.
|
|
@@ -75,10 +74,9 @@ export function generateIndexFromChain(resolved, minSupportedVersion) {
|
|
|
75
74
|
|
|
76
75
|
// Union variant types and their generated `is<Variant>` guards, including the Unknown case.
|
|
77
76
|
for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
|
|
78
|
-
const
|
|
79
|
-
const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
77
|
+
const variantTypeName = unionVariantName(unionTypeName, variantName);
|
|
80
78
|
typeNames.push(variantTypeName);
|
|
81
|
-
guardNames.push(
|
|
79
|
+
guardNames.push(typeGuardName(variantTypeName));
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateIndexFromSchema.js","names":["UNKNOWN_UNION_VARIANT","
|
|
1
|
+
{"version":3,"file":"generateIndexFromSchema.js","names":["UNKNOWN_UNION_VARIANT","GENERATED_FILE_HEADER","resolveMinVersion","DOCUMENT_TYPE_PATH","INTERNAL_UPGRADE_FNS_PATH","knownTypeName","MODELS_PATH","narrowKnownFunctionName","typeGuardName","TYPES_REEXPORT_PATH","typesFilePath","unionVariantName","VERSIONED_DOC_REF_PATH","versionedTypeName","VERSIONS_PATH","generateIndexFromChain","resolved","minSupportedVersion","chain","minVersion","output","version","ir","typeNames","guardNames","modelKey","modelDef","Object","entries","models","type","push","unionTypeName","variantName","keys","union","variants","variantTypeName","length","sort","join"],"sources":["generateIndexFromSchema.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n DOCUMENT_TYPE_PATH,\n INTERNAL_UPGRADE_FNS_PATH,\n knownTypeName,\n MODELS_PATH,\n narrowKnownFunctionName,\n typeGuardName,\n TYPES_REEXPORT_PATH,\n typesFilePath,\n unionVariantName,\n VERSIONED_DOC_REF_PATH,\n versionedTypeName,\n VERSIONS_PATH,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate the index.ts barrel export from a versioned schema.\n *\n * Exports:\n * - `models.js` (star export — model constants and `DocumentModel`; emitted\n * as a factory function when the schema has derived fields, otherwise a const)\n * - `types.js` (star export — latest-version type aliases)\n * - `versions.js` (star export — SupportedVersions, LatestVersion, MinSupportedVersion)\n * - `versionedDocRef.js` (star export — VersionedDocRef types and factory)\n * - `documentType.js` (star export — DOCUMENT_TYPE_NAME and DOCUMENT_TYPE_DESCRIPTION)\n * - `DocumentUpgradeFns` type (the typed shape the factory accepts)\n * - Per supported version: explicit named type exports from `types_vN.js`\n * (not star exports, to avoid polluting autocomplete for read-only consumers)\n * - Per supported version: the union variant type guard *functions* from\n * `types_vN.js` as values (e.g. `isFooBar_v1`), so consumers can narrow a\n * union without re-deriving the discriminant check\n */\nexport function generateIndexFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n let output = GENERATED_FILE_HEADER;\n\n // Star exports for core modules\n output += `export * from \"${MODELS_PATH}\";\\n`;\n output += `export * from \"${TYPES_REEXPORT_PATH}\";\\n`;\n output += `export * from \"${VERSIONS_PATH}\";\\n`;\n output += `export * from \"${VERSIONED_DOC_REF_PATH}\";\\n`;\n output += `export * from \"${DOCUMENT_TYPE_PATH}\";\\n`;\n // The typed upgrade-function table shape. Apps reference this type when\n // constructing the value passed to `DocumentModel(...)`.\n output += `export { type DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n\n // Per-version explicit named type exports\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n const typeNames: string[] = [];\n // Union variant type guard functions (values, not types).\n const guardNames: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n typeNames.push(versionedTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n const unionTypeName = versionedTypeName(modelKey, version);\n typeNames.push(unionTypeName, knownTypeName(unionTypeName));\n guardNames.push(narrowKnownFunctionName(unionTypeName));\n\n // Union variant types and their generated `is<Variant>` guards, including the Unknown case.\n for (\n const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]\n ) {\n const variantTypeName = unionVariantName(unionTypeName, variantName);\n typeNames.push(variantTypeName);\n guardNames.push(typeGuardName(variantTypeName));\n }\n }\n }\n\n if (typeNames.length > 0) {\n output += `export type { ${typeNames.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n\n if (guardNames.length > 0) {\n output += `export { ${guardNames.sort().join(\", \")} } from \"${typesFilePath(version)}\";\\n`;\n }\n }\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
|
|
17
17
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
18
18
|
import { convertFieldTypeToDescriptor, convertFieldTypeToInternalTypeScript, convertFieldTypeToInternalZod } from "../ir/irFieldHelpers.js";
|
|
19
|
-
import { chainNeedsUpgradeFns } from "./resolveSchemaChain.js";
|
|
19
|
+
import { chainNeedsUpgradeFns, getEntryMinorVersion, upgradeStepKey } from "./resolveSchemaChain.js";
|
|
20
|
+
import { internalSchemaName, internalTypeName, upgradesName, versionedInternalTypeName } from "./runtimeSchema.js";
|
|
20
21
|
|
|
21
22
|
/** Collected info about all fields for a model across all versions. */
|
|
22
23
|
|
|
@@ -42,6 +43,8 @@ function getAddedInVersion(fieldInfo) {
|
|
|
42
43
|
|
|
43
44
|
/**
|
|
44
45
|
* Collect all record model info across all versions and compute upgrade steps.
|
|
46
|
+
* Takes the full chain (with minor versions), so a field added in 1.1 gets its
|
|
47
|
+
* own step and counts as missing from 1.0 records.
|
|
45
48
|
*/
|
|
46
49
|
function collectRecordModels(chain) {
|
|
47
50
|
const allRecordModels = new Map();
|
|
@@ -67,11 +70,13 @@ function collectRecordModels(chain) {
|
|
|
67
70
|
fieldType: field.fieldType,
|
|
68
71
|
isOptional: field.isOptional === true,
|
|
69
72
|
presentInVersions: new Set([version]),
|
|
73
|
+
presentInEntries: 1,
|
|
70
74
|
alwaysOptional: field.isOptional === true,
|
|
71
75
|
everOptional: field.isOptional === true
|
|
72
76
|
});
|
|
73
77
|
} else {
|
|
74
78
|
existing.presentInVersions.add(version);
|
|
79
|
+
existing.presentInEntries += 1;
|
|
75
80
|
if (field.isOptional !== true) {
|
|
76
81
|
existing.alwaysOptional = false;
|
|
77
82
|
}
|
|
@@ -124,6 +129,7 @@ function collectRecordModels(chain) {
|
|
|
124
129
|
if (addedFields.size > 0 || removedFields.length > 0) {
|
|
125
130
|
model.steps.push({
|
|
126
131
|
addedInVersion: currEntry.version,
|
|
132
|
+
addedInMinorVersion: getEntryMinorVersion(currEntry),
|
|
127
133
|
fields: addedFields,
|
|
128
134
|
removedFields
|
|
129
135
|
});
|
|
@@ -132,10 +138,10 @@ function collectRecordModels(chain) {
|
|
|
132
138
|
}
|
|
133
139
|
|
|
134
140
|
// Mark fields that are not present in ALL versions as optional in internal type
|
|
135
|
-
const
|
|
141
|
+
const totalEntries = chain.length;
|
|
136
142
|
for (const model of allRecordModels.values()) {
|
|
137
143
|
for (const [, fieldInfo] of model.allFields) {
|
|
138
|
-
if (fieldInfo.
|
|
144
|
+
if (fieldInfo.presentInEntries < totalEntries) {
|
|
139
145
|
fieldInfo.alwaysOptional = true;
|
|
140
146
|
}
|
|
141
147
|
}
|
|
@@ -151,7 +157,7 @@ function generateInternalTypes(allRecordModels) {
|
|
|
151
157
|
output += "\n";
|
|
152
158
|
for (const [modelKey, model] of sortedEntries(allRecordModels)) {
|
|
153
159
|
output += `/** Internal representation containing all fields across all schema versions. */\n`;
|
|
154
|
-
output += `export interface ${modelKey}
|
|
160
|
+
output += `export interface ${internalTypeName(modelKey)} {\n`;
|
|
155
161
|
for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {
|
|
156
162
|
const tsType = convertFieldTypeToInternalTypeScript(fieldInfo.fieldType, fieldInfo.isOptional);
|
|
157
163
|
const optional = fieldInfo.alwaysOptional ? "?" : "";
|
|
@@ -199,7 +205,7 @@ function generatePerVersionInternalTypes(chain) {
|
|
|
199
205
|
fields
|
|
200
206
|
} of versions) {
|
|
201
207
|
output += `/** Internal representation of ${modelKey} at schema version ${version}. */\n`;
|
|
202
|
-
output += `export interface ${modelKey
|
|
208
|
+
output += `export interface ${versionedInternalTypeName(modelKey, version)} {\n`;
|
|
203
209
|
const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));
|
|
204
210
|
for (const field of sortedFields) {
|
|
205
211
|
const tsType = convertFieldTypeToInternalTypeScript(field.fieldType, field.isOptional === true);
|
|
@@ -226,7 +232,7 @@ function generateUpgrades(allRecordModels, latestIr) {
|
|
|
226
232
|
output += `import type { ${imports.join(", ")} } from "@palantir/pack.document-schema.model-types";\n\n`;
|
|
227
233
|
}
|
|
228
234
|
for (const [modelKey, model] of sortedEntries(allRecordModels)) {
|
|
229
|
-
output += `export const ${modelKey}
|
|
235
|
+
output += `export const ${upgradesName(modelKey)}: UpgradeRegistry<"${modelKey}"> = {\n`;
|
|
230
236
|
output += ` modelName: "${modelKey}",\n`;
|
|
231
237
|
|
|
232
238
|
// allFields
|
|
@@ -242,6 +248,9 @@ function generateUpgrades(allRecordModels, latestIr) {
|
|
|
242
248
|
for (const step of model.steps) {
|
|
243
249
|
output += ` {\n`;
|
|
244
250
|
output += ` addedInVersion: ${step.addedInVersion},\n`;
|
|
251
|
+
if (step.addedInMinorVersion > 0) {
|
|
252
|
+
output += ` addedInMinorVersion: ${step.addedInMinorVersion},\n`;
|
|
253
|
+
}
|
|
245
254
|
output += ` fields: {\n`;
|
|
246
255
|
for (const [fieldName, fieldMeta] of step.fields) {
|
|
247
256
|
output += ` ${fieldName}: {\n`;
|
|
@@ -262,7 +271,7 @@ function generateUpgrades(allRecordModels, latestIr) {
|
|
|
262
271
|
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
263
272
|
if (modelDef.type !== "union") continue;
|
|
264
273
|
const union = modelDef.union;
|
|
265
|
-
output += `export const ${modelKey}
|
|
274
|
+
output += `export const ${upgradesName(modelKey)}: UnionUpgradeRegistry<"${modelKey}"> = {\n`;
|
|
266
275
|
output += ` modelName: "${modelKey}",\n`;
|
|
267
276
|
output += ` discriminant: "${union.discriminant}",\n`;
|
|
268
277
|
output += ` variants: {\n`;
|
|
@@ -282,7 +291,7 @@ function generateInternalSchemaContent(allRecordModels) {
|
|
|
282
291
|
let output = GENERATED_FILE_HEADER;
|
|
283
292
|
output += `import { z } from "zod";\n\n`;
|
|
284
293
|
for (const [modelKey, model] of sortedEntries(allRecordModels)) {
|
|
285
|
-
output += `export const ${modelKey}
|
|
294
|
+
output += `export const ${internalSchemaName(modelKey)} = z.object({\n`;
|
|
286
295
|
for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {
|
|
287
296
|
// Use everOptional: a field optional in ANY version must stay optional
|
|
288
297
|
// in the internal schema because older documents may legitimately omit it.
|
|
@@ -319,9 +328,10 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
319
328
|
const neededTypes = new Set();
|
|
320
329
|
for (const [modelKey, model] of sortedEntries(allRecordModels)) {
|
|
321
330
|
for (const step of model.steps) {
|
|
331
|
+
// A derived field's function takes the previous major's type, e.g. `Pick<ShapeBox__v1, "color">`
|
|
332
|
+
// for a 2.0 step. Minor versions can't use `derivedFrom`, so minor steps never need it.
|
|
322
333
|
const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);
|
|
323
|
-
|
|
324
|
-
const priorVersion = chain[currentIdx - 1].version;
|
|
334
|
+
const priorVersion = currentIdx > 0 ? chain[currentIdx - 1].version : undefined;
|
|
325
335
|
const fields = [];
|
|
326
336
|
for (const [fieldName, fieldMeta] of step.fields) {
|
|
327
337
|
fields.push({
|
|
@@ -330,21 +340,23 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
330
340
|
});
|
|
331
341
|
}
|
|
332
342
|
if (fields.length === 0) continue;
|
|
343
|
+
if (priorVersion == null && fields.some(f => f.derivedFrom.length > 0)) continue;
|
|
333
344
|
let list = perModel.get(modelKey);
|
|
334
345
|
if (list == null) {
|
|
335
346
|
list = [];
|
|
336
347
|
perModel.set(modelKey, list);
|
|
337
348
|
}
|
|
338
349
|
list.push({
|
|
350
|
+
stepKey: upgradeStepKey(step.addedInVersion, step.addedInMinorVersion),
|
|
339
351
|
currentVersion: step.addedInVersion,
|
|
340
352
|
priorVersion,
|
|
341
353
|
fields
|
|
342
354
|
});
|
|
343
355
|
// Prior-version type only needed when at least one field derives from it.
|
|
344
|
-
if (fields.some(f => f.derivedFrom.length > 0)) {
|
|
345
|
-
neededTypes.add(
|
|
356
|
+
if (priorVersion != null && fields.some(f => f.derivedFrom.length > 0)) {
|
|
357
|
+
neededTypes.add(versionedInternalTypeName(modelKey, priorVersion));
|
|
346
358
|
}
|
|
347
|
-
neededTypes.add(
|
|
359
|
+
neededTypes.add(versionedInternalTypeName(modelKey, step.addedInVersion));
|
|
348
360
|
}
|
|
349
361
|
}
|
|
350
362
|
let output = GENERATED_FILE_HEADER;
|
|
@@ -359,7 +371,7 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
359
371
|
output += ` * call site. Derived fields receive their declared source fields; required\n`;
|
|
360
372
|
output += ` * additive fields receive no arguments. Optional additive fields are absent\n`;
|
|
361
373
|
output += ` * — \`undefined\` is a legal value at the new version, so the runtime lens\n`;
|
|
362
|
-
output += ` * leaves them alone.\n`;
|
|
374
|
+
output += ` * leaves them alone. Keys are \`v2\` for version 2.0 and \`v2_1\` for 2.1.\n`;
|
|
363
375
|
output += ` */\n`;
|
|
364
376
|
if (perModel.size === 0) {
|
|
365
377
|
output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n`;
|
|
@@ -369,14 +381,17 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
369
381
|
for (const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) => a.localeCompare(b))) {
|
|
370
382
|
output += ` ${modelKey}: {\n`;
|
|
371
383
|
for (const step of steps) {
|
|
372
|
-
output += `
|
|
384
|
+
output += ` ${step.stepKey}: {\n`;
|
|
385
|
+
const currentType = versionedInternalTypeName(modelKey, step.currentVersion);
|
|
373
386
|
for (const f of step.fields) {
|
|
374
|
-
const returnType = `${
|
|
387
|
+
const returnType = `${currentType}["${f.fieldName}"]`;
|
|
375
388
|
if (f.derivedFrom.length === 0) {
|
|
376
389
|
output += ` ${f.fieldName}: () => ${returnType};\n`;
|
|
377
390
|
} else {
|
|
391
|
+
// Steps with derived fields always have a prior version (others are skipped above).
|
|
392
|
+
const priorType = versionedInternalTypeName(modelKey, step.priorVersion);
|
|
378
393
|
const pickKeys = f.derivedFrom.map(d => `"${d}"`).join(" | ");
|
|
379
|
-
output += ` ${f.fieldName}: (oldFields: Pick<${
|
|
394
|
+
output += ` ${f.fieldName}: (oldFields: Pick<${priorType}, ${pickKeys}>) => ${returnType};\n`;
|
|
380
395
|
}
|
|
381
396
|
}
|
|
382
397
|
output += ` };\n`;
|
|
@@ -396,9 +411,10 @@ export function generateInternalFromChain(resolved) {
|
|
|
396
411
|
const {
|
|
397
412
|
chain
|
|
398
413
|
} = resolved;
|
|
414
|
+
const stepChain = resolved.stepChain ?? chain;
|
|
399
415
|
const latestIr = chain[chain.length - 1].ir;
|
|
400
|
-
const allRecordModels = collectRecordModels(
|
|
401
|
-
const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(
|
|
416
|
+
const allRecordModels = collectRecordModels(stepChain);
|
|
417
|
+
const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(stepChain) ? generatePerVersionInternalTypes(chain) : "");
|
|
402
418
|
const upgrades = generateUpgrades(allRecordModels, latestIr);
|
|
403
419
|
const internalSchema = generateInternalSchemaContent(allRecordModels);
|
|
404
420
|
const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);
|