@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.
Files changed (122) hide show
  1. package/README.md +7 -0
  2. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +96 -0
  3. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -0
  4. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +80 -0
  5. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -1
  6. package/build/esm/commands/ir/irDeployHandler.js +5 -0
  7. package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
  8. package/build/esm/commands/ir/irGenAssetHandler.js +6 -1
  9. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  10. package/build/esm/commands/ir/irGenTypesHandler.js +7 -3
  11. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
  12. package/build/esm/commands/ir/irUpdateSchemaHandler.js +18 -11
  13. package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
  14. package/build/esm/commands/ir/resolveIrInput.js +6 -5
  15. package/build/esm/commands/ir/resolveIrInput.js.map +1 -1
  16. package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
  17. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  18. package/build/esm/commands/schema/schemaIrHandler.js +15 -8
  19. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
  20. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.js.map +1 -1
  21. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  22. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  23. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  39. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  40. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  41. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  42. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  43. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +35 -0
  44. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  45. package/build/esm/utils/ir/convertIrToWireSchema.js +1 -0
  46. package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
  47. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  48. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  49. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  51. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  52. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js +178 -0
  53. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
  54. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +40 -1
  55. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  56. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +75 -3
  57. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
  58. package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
  59. package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
  60. package/build/esm/utils/schema/generateIndexFromSchema.js +3 -5
  61. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  62. package/build/esm/utils/schema/generateInternalFromSchema.js +35 -19
  63. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  64. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +9 -11
  65. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  66. package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
  67. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  68. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +8 -9
  69. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  70. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +13 -16
  71. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  72. package/build/esm/utils/schema/resolveSchemaChain.js +108 -20
  73. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  74. package/build/esm/utils/schema/runtimeSchema.js +47 -0
  75. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  76. package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
  77. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
  78. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  79. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  80. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  81. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  82. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  83. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  84. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  85. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  86. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  87. package/build/esm/utils/steps/convertStepsToIr.js +10 -1
  88. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  89. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
  90. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
  91. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  92. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  93. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  94. package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
  95. package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
  96. package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
  97. package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
  98. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  99. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
  100. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
  101. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
  102. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
  103. package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
  104. package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
  105. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  106. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  107. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  108. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  109. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  110. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  111. package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
  112. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  113. package/build/types/utils/schema/runtimeSchema.d.ts +19 -0
  114. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  115. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
  116. package/build/types/utils/steps/convertStepsToIr.d.ts +2 -0
  117. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  118. package/package.json +5 -5
  119. package/build/esm/utils/unknownVariantSuffix.js +0 -22
  120. package/build/esm/utils/unknownVariantSuffix.js.map +0 -1
  121. package/build/types/utils/unknownVariantSuffix.d.ts +0 -3
  122. 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, {}, 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, {}, 3)).toThrow("maxVersion 3 is not in the schema chain");
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":"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","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 formattedVariant = formatVariantName(variantName);
79
- const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
77
+ const variantTypeName = unionVariantName(unionTypeName, variantName);
80
78
  typeNames.push(variantTypeName);
81
- guardNames.push(`is${variantTypeName}`);
79
+ guardNames.push(typeGuardName(variantTypeName));
82
80
  }
83
81
  }
84
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateIndexFromSchema.js","names":["UNKNOWN_UNION_VARIANT","formatVariantName","GENERATED_FILE_HEADER","resolveMinVersion","DOCUMENT_TYPE_PATH","INTERNAL_UPGRADE_FNS_PATH","knownTypeName","MODELS_PATH","narrowKnownFunctionName","TYPES_REEXPORT_PATH","typesFilePath","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","formattedVariant","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 { formatVariantName } from \"@palantir/pack.schema\";\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 TYPES_REEXPORT_PATH,\n typesFilePath,\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 formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n typeNames.push(variantTypeName);\n guardNames.push(`is${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":[]}
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 totalVersions = chain.length;
141
+ const totalEntries = chain.length;
136
142
  for (const model of allRecordModels.values()) {
137
143
  for (const [, fieldInfo] of model.allFields) {
138
- if (fieldInfo.presentInVersions.size < totalVersions) {
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}__Internal {\n`;
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}__v${version} {\n`;
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}Upgrades: UpgradeRegistry<"${modelKey}"> = {\n`;
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}Upgrades: UnionUpgradeRegistry<"${modelKey}"> = {\n`;
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}InternalSchema = z.object({\n`;
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
- if (currentIdx <= 0) continue;
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(`${modelKey}__v${priorVersion}`);
356
+ if (priorVersion != null && fields.some(f => f.derivedFrom.length > 0)) {
357
+ neededTypes.add(versionedInternalTypeName(modelKey, priorVersion));
346
358
  }
347
- neededTypes.add(`${modelKey}__v${step.addedInVersion}`);
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 += ` v${step.currentVersion}: {\n`;
384
+ output += ` ${step.stepKey}: {\n`;
385
+ const currentType = versionedInternalTypeName(modelKey, step.currentVersion);
373
386
  for (const f of step.fields) {
374
- const returnType = `${modelKey}__v${step.currentVersion}["${f.fieldName}"]`;
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<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\n`;
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(chain);
401
- const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : "");
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);