@palantir/pack.document-schema.type-gen 0.11.0 → 0.13.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 (109) hide show
  1. package/build/esm/commands/asset/assetDeployHandler.js +1 -1
  2. package/build/esm/commands/asset/assetDeployHandler.js.map +1 -1
  3. package/build/esm/commands/asset/assetUpdateSchemaHandler.js +1 -1
  4. package/build/esm/commands/asset/assetUpdateSchemaHandler.js.map +1 -1
  5. package/build/esm/commands/ir/irGenAssetHandler.js +81 -12
  6. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  7. package/build/esm/commands/ir/irGenTypesHandler.js +10 -8
  8. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
  9. package/build/esm/commands/ir/registerIrCommands.js +2 -2
  10. package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
  11. package/build/esm/commands/schema/__tests__/readPackConfig.test.js +112 -0
  12. package/build/esm/commands/schema/__tests__/readPackConfig.test.js.map +1 -0
  13. package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
  14. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  15. package/build/esm/commands/schema/schemaIrHandler.js +77 -11
  16. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
  17. package/build/esm/commands/types.js.map +1 -1
  18. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  19. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  20. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  21. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  22. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  23. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  39. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  40. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +9 -0
  41. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -0
  42. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  43. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  44. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  45. package/build/esm/utils/schema/__tests__/generateDocumentTypeFromSchema.test.js +34 -0
  46. package/build/esm/utils/schema/__tests__/generateDocumentTypeFromSchema.test.js.map +1 -0
  47. package/build/esm/utils/schema/__tests__/provenanceScenarios.test.js +184 -0
  48. package/build/esm/utils/schema/__tests__/provenanceScenarios.test.js.map +1 -0
  49. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +122 -0
  50. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -0
  51. package/build/esm/utils/schema/generateDocumentTypeFromSchema.js +39 -0
  52. package/build/esm/utils/schema/generateDocumentTypeFromSchema.js.map +1 -0
  53. package/build/esm/utils/schema/generateIndexFromSchema.js +3 -1
  54. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  55. package/build/esm/utils/schema/generateInternalFromSchema.js +1 -1
  56. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  57. package/build/esm/utils/schema/generateScopeFromSchema.js +2 -2
  58. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  59. package/build/esm/utils/schema/loadSchemaModule.js +2 -5
  60. package/build/esm/utils/schema/loadSchemaModule.js.map +1 -1
  61. package/build/esm/utils/schema/resolveSchemaChain.js +104 -17
  62. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  63. package/build/esm/utils/schema/runtimeSchema.js +3 -0
  64. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  65. package/build/esm/utils/schema/writeAllSdkFiles.js +8 -8
  66. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
  67. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  68. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  69. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  70. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  71. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  72. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  73. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  74. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  75. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  76. package/build/esm/utils/steps/convertStepsToIr.js +49 -24
  77. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  78. package/build/types/commands/ir/irGenAssetHandler.d.ts +16 -5
  79. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  80. package/build/types/commands/ir/irGenTypesHandler.d.ts +0 -1
  81. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  82. package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
  83. package/build/types/commands/schema/__tests__/readPackConfig.test.d.ts +2 -0
  84. package/build/types/commands/schema/__tests__/readPackConfig.test.d.ts.map +1 -0
  85. package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
  86. package/build/types/commands/schema/schemaIrHandler.d.ts +28 -6
  87. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  88. package/build/types/commands/types.d.ts +3 -1
  89. package/build/types/commands/types.d.ts.map +1 -1
  90. package/build/types/utils/schema/__tests__/generateDocumentTypeFromSchema.test.d.ts +2 -0
  91. package/build/types/utils/schema/__tests__/generateDocumentTypeFromSchema.test.d.ts.map +1 -0
  92. package/build/types/utils/schema/__tests__/provenanceScenarios.test.d.ts +2 -0
  93. package/build/types/utils/schema/__tests__/provenanceScenarios.test.d.ts.map +1 -0
  94. package/build/types/utils/schema/__tests__/resolveSchemaChain.test.d.ts +2 -0
  95. package/build/types/utils/schema/__tests__/resolveSchemaChain.test.d.ts.map +1 -0
  96. package/build/types/utils/schema/generateDocumentTypeFromSchema.d.ts +17 -0
  97. package/build/types/utils/schema/generateDocumentTypeFromSchema.d.ts.map +1 -0
  98. package/build/types/utils/schema/generateIndexFromSchema.d.ts +1 -0
  99. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  100. package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -1
  101. package/build/types/utils/schema/resolveSchemaChain.d.ts +26 -1
  102. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  103. package/build/types/utils/schema/runtimeSchema.d.ts +2 -0
  104. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  105. package/build/types/utils/schema/writeAllSdkFiles.d.ts +0 -1
  106. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
  107. package/build/types/utils/steps/convertStepsToIr.d.ts +19 -4
  108. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  109. package/package.json +4 -4
@@ -0,0 +1,184 @@
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 * as P from "@palantir/pack.schema";
18
+ import { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from "@palantir/pack.schema";
19
+ import { describe, expect, it } from "vitest";
20
+ import { generateInternalFromChain } from "../generateInternalFromSchema.js";
21
+ import { resolveSchemaChain, stripDeprecatedFieldsForSdk } from "../resolveSchemaChain.js";
22
+ function entry(chain, v) {
23
+ return chain.find(c => c.version === v);
24
+ }
25
+ function recordFields(e, key) {
26
+ const m = e.ir.models[key];
27
+ if (m.type !== "record") throw new Error(`${key} not a record`);
28
+ return Object.fromEntries(m.record.fields.map(f => [f.key, f]));
29
+ }
30
+ function unionMeta(e, key) {
31
+ const m = e.ir.models[key];
32
+ if (m.type !== "union") throw new Error(`${key} not a union`);
33
+ return m.union.metadata;
34
+ }
35
+ describe("provenance — scenarios beyond the demo", () => {
36
+ const v1 = defineSchema({
37
+ Box: defineRecord("Box", {
38
+ docs: "",
39
+ fields: {
40
+ a: P.Double
41
+ }
42
+ }),
43
+ OldUnion: P.defineUnion("OldUnion", {
44
+ docs: "",
45
+ variants: {
46
+ box: defineRecord("UVariant", {
47
+ docs: "",
48
+ fields: {
49
+ z: P.Double
50
+ }
51
+ })
52
+ }
53
+ })
54
+ });
55
+ const v2update = defineSchemaUpdate("v2", s => {
56
+ const Box = s.Box.addField("b", P.Optional(P.String)).build();
57
+ const Circle = defineRecord("Circle", {
58
+ docs: "",
59
+ fields: {
60
+ r: P.Double
61
+ }
62
+ });
63
+ const NewUnion = P.defineUnion("NewUnion", {
64
+ docs: "",
65
+ variants: {
66
+ c: Circle
67
+ }
68
+ });
69
+ return {
70
+ Box,
71
+ Circle,
72
+ NewUnion
73
+ };
74
+ });
75
+ const v2 = nextSchema(v1).addSchemaUpdate(v2update).build();
76
+ const v3update = defineSchemaUpdate("v3", s => ({
77
+ Box: s.Box.addField("c", P.Optional(P.Double)).build()
78
+ }));
79
+ const v3 = nextSchema(v2).addSchemaUpdate(v3update).build();
80
+ it("union defined in v1 stays addedInVersion 1 in every version", () => {
81
+ const {
82
+ chain
83
+ } = resolveSchemaChain(v3);
84
+ for (const v of [1, 2, 3]) {
85
+ expect(unionMeta(entry(chain, v), "OldUnion").addedInVersion).toBe(1);
86
+ }
87
+ });
88
+ it("union added in v2 gets addedInVersion 2", () => {
89
+ const {
90
+ chain
91
+ } = resolveSchemaChain(v3);
92
+ expect(entry(chain, 1).ir.models.NewUnion).toBeUndefined();
93
+ expect(unionMeta(entry(chain, 2), "NewUnion").addedInVersion).toBe(2);
94
+ expect(unionMeta(entry(chain, 3), "NewUnion").addedInVersion).toBe(2);
95
+ });
96
+ it("record added in v2 gets its fields stamped addedInVersion 2", () => {
97
+ const {
98
+ chain
99
+ } = resolveSchemaChain(v3);
100
+ expect(entry(chain, 1).ir.models.Circle).toBeUndefined();
101
+ expect(recordFields(entry(chain, 2), "Circle").r.metadata.addedInVersion).toBe(2);
102
+ expect(recordFields(entry(chain, 3), "Circle").r.metadata.addedInVersion).toBe(2);
103
+ });
104
+ it("field added in v3 to a v1 record gets addedInVersion 3; older fields keep theirs", () => {
105
+ const {
106
+ chain
107
+ } = resolveSchemaChain(v3);
108
+ const f = recordFields(entry(chain, 3), "Box");
109
+ expect(f.b.metadata.addedInVersion).toBe(2);
110
+ expect(f.c.metadata.addedInVersion).toBe(3);
111
+ });
112
+ it("hand-built schema provenance is derived from first appearance in the chain", () => {
113
+ const hand = {
114
+ type: "versioned",
115
+ version: 2,
116
+ previous: {
117
+ type: "initial",
118
+ version: 1,
119
+ models: v1.models
120
+ },
121
+ models: {
122
+ Box: defineRecord("Box", {
123
+ docs: "",
124
+ fields: {
125
+ a: P.Double,
126
+ b: P.Double
127
+ }
128
+ })
129
+ }
130
+ };
131
+ const {
132
+ chain
133
+ } = resolveSchemaChain(hand);
134
+ expect(recordFields(entry(chain, 2), "Box").a.metadata.addedInVersion).toBe(1);
135
+ expect(recordFields(entry(chain, 2), "Box").b.metadata.addedInVersion).toBe(2);
136
+ expect(recordFields(entry(chain, 1), "Box").a.metadata.addedInVersion).toBe(1);
137
+ });
138
+ it("upgrade lens still records removedFields + derivedFrom for a deprecated field", () => {
139
+ const b1 = defineSchema({
140
+ Box: defineRecord("Box", {
141
+ docs: "",
142
+ fields: {
143
+ a: P.Double,
144
+ color: P.Optional(P.String)
145
+ }
146
+ })
147
+ });
148
+ const split = defineSchemaUpdate("split", s => ({
149
+ Box: s.Box.addField("fillColor", P.Optional(P.String), {
150
+ derivedFrom: ["color"]
151
+ }).deprecateField("color").build()
152
+ }));
153
+ const b2 = nextSchema(b1).addSchemaUpdate(split).build();
154
+ const resolved = resolveSchemaChain(b2);
155
+ const stripped = {
156
+ ...resolved,
157
+ chain: stripDeprecatedFieldsForSdk(resolved.chain)
158
+ };
159
+ const internal = generateInternalFromChain(stripped);
160
+ expect(internal.upgrades).toContain("removedFields: [\"color\"]");
161
+ expect(internal.upgrades).toContain("derivedFrom: [\"color\"]");
162
+ });
163
+ it("deprecation with and without message both serialize (spread fix #5)", () => {
164
+ const b1 = defineSchema({
165
+ Box: defineRecord("Box", {
166
+ docs: "",
167
+ fields: {
168
+ x: P.Optional(P.String),
169
+ y: P.Optional(P.String)
170
+ }
171
+ })
172
+ });
173
+ const dep = defineSchemaUpdate("dep", s => ({
174
+ Box: s.Box.deprecateField("x", "gone").deprecateField("y").build()
175
+ }));
176
+ const b2 = nextSchema(b1).addSchemaUpdate(dep).build();
177
+ const f = recordFields(entry(resolveSchemaChain(b2).chain, 2), "Box");
178
+ expect(f.x.metadata.deprecatedFromVersion).toBe(2);
179
+ expect(f.x.metadata.deprecatedMessage).toBe("gone");
180
+ expect(f.y.metadata.deprecatedFromVersion).toBe(2);
181
+ expect(f.y.metadata.deprecatedMessage ?? undefined).toBeUndefined();
182
+ });
183
+ });
184
+ //# sourceMappingURL=provenanceScenarios.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenanceScenarios.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","generateInternalFromChain","resolveSchemaChain","stripDeprecatedFieldsForSdk","entry","chain","v","find","c","version","recordFields","e","key","m","ir","models","type","Error","Object","fromEntries","record","fields","map","f","unionMeta","union","metadata","v1","Box","docs","a","Double","OldUnion","defineUnion","variants","box","z","v2update","s","addField","Optional","String","build","Circle","r","NewUnion","v2","addSchemaUpdate","v3update","v3","addedInVersion","toBe","toBeUndefined","b","hand","previous","b1","color","split","derivedFrom","deprecateField","b2","resolved","stripped","internal","upgrades","toContain","x","y","dep","deprecatedFromVersion","deprecatedMessage","undefined"],"sources":["provenanceScenarios.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 { generateInternalFromChain } from \"../generateInternalFromSchema.js\";\nimport {\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\nfunction entry(chain: VersionedIrEntry[], v: number): VersionedIrEntry {\n return chain.find(c => c.version === v)!;\n}\nfunction recordFields(e: VersionedIrEntry, key: string): Record<string, IFieldDef> {\n const m: IModelDef = e.ir.models[key]!;\n if (m.type !== \"record\") throw new Error(`${key} not a record`);\n return Object.fromEntries(m.record.fields.map(f => [f.key, f]));\n}\nfunction unionMeta(e: VersionedIrEntry, key: string) {\n const m: IModelDef = e.ir.models[key]!;\n if (m.type !== \"union\") throw new Error(`${key} not a union`);\n return m.union.metadata;\n}\n\ndescribe(\"provenance — scenarios beyond the demo\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n OldUnion: P.defineUnion(\"OldUnion\", {\n docs: \"\",\n variants: { box: defineRecord(\"UVariant\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n\n const v2update = defineSchemaUpdate(\"v2\", (s: P.SchemaBuilder<typeof v1.models>) => {\n const Box = s.Box.addField(\"b\", P.Optional(P.String)).build();\n const Circle = defineRecord(\"Circle\", { docs: \"\", fields: { r: P.Double } });\n const NewUnion = P.defineUnion(\"NewUnion\", {\n docs: \"\",\n variants: { c: Circle },\n });\n return { Box, Circle, NewUnion };\n });\n const v2 = nextSchema(v1).addSchemaUpdate(v2update).build();\n\n const v3update = defineSchemaUpdate(\"v3\", (s: P.SchemaBuilder<typeof v2.models>) => ({\n Box: s.Box.addField(\"c\", P.Optional(P.Double)).build(),\n }));\n const v3 = nextSchema(v2).addSchemaUpdate(v3update).build();\n\n it(\"union defined in v1 stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v3);\n for (const v of [1, 2, 3]) {\n expect(unionMeta(entry(chain, v), \"OldUnion\").addedInVersion).toBe(1);\n }\n });\n\n it(\"union added in v2 gets addedInVersion 2\", () => {\n const { chain } = resolveSchemaChain(v3);\n expect(entry(chain, 1).ir.models.NewUnion).toBeUndefined();\n expect(unionMeta(entry(chain, 2), \"NewUnion\").addedInVersion).toBe(2);\n expect(unionMeta(entry(chain, 3), \"NewUnion\").addedInVersion).toBe(2);\n });\n\n it(\"record added in v2 gets its fields stamped addedInVersion 2\", () => {\n const { chain } = resolveSchemaChain(v3);\n expect(entry(chain, 1).ir.models.Circle).toBeUndefined();\n expect(recordFields(entry(chain, 2), \"Circle\").r!.metadata.addedInVersion).toBe(2);\n expect(recordFields(entry(chain, 3), \"Circle\").r!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"field added in v3 to a v1 record gets addedInVersion 3; older fields keep theirs\", () => {\n const { chain } = resolveSchemaChain(v3);\n const f = recordFields(entry(chain, 3), \"Box\");\n expect(f.b!.metadata.addedInVersion).toBe(2);\n expect(f.c!.metadata.addedInVersion).toBe(3);\n });\n\n it(\"hand-built schema provenance is derived from first appearance in the chain\", () => {\n const hand: P.SchemaDefinition = {\n type: \"versioned\",\n version: 2,\n previous: { type: \"initial\", version: 1, models: v1.models },\n models: { Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double, b: P.Double } }) },\n };\n const { chain } = resolveSchemaChain(hand);\n expect(recordFields(entry(chain, 2), \"Box\").a!.metadata.addedInVersion).toBe(1);\n expect(recordFields(entry(chain, 2), \"Box\").b!.metadata.addedInVersion).toBe(2);\n expect(recordFields(entry(chain, 1), \"Box\").a!.metadata.addedInVersion).toBe(1);\n });\n\n it(\"upgrade lens still records removedFields + derivedFrom for a deprecated field\", () => {\n const b1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double, color: P.Optional(P.String) } }),\n });\n const split = defineSchemaUpdate(\"split\", (s: P.SchemaBuilder<typeof b1.models>) => ({\n Box: s.Box\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\")\n .build(),\n }));\n const b2 = nextSchema(b1).addSchemaUpdate(split).build();\n\n const resolved = resolveSchemaChain(b2);\n const stripped = { ...resolved, chain: stripDeprecatedFieldsForSdk(resolved.chain) };\n const internal = generateInternalFromChain(stripped);\n expect(internal.upgrades).toContain(\"removedFields: [\\\"color\\\"]\");\n expect(internal.upgrades).toContain(\"derivedFrom: [\\\"color\\\"]\");\n });\n\n it(\"deprecation with and without message both serialize (spread fix #5)\", () => {\n const b1 = defineSchema({\n Box: defineRecord(\"Box\", {\n docs: \"\",\n fields: { x: P.Optional(P.String), y: P.Optional(P.String) },\n }),\n });\n const dep = defineSchemaUpdate(\"dep\", (s: P.SchemaBuilder<typeof b1.models>) => ({\n Box: s.Box.deprecateField(\"x\", \"gone\").deprecateField(\"y\").build(),\n }));\n const b2 = nextSchema(b1).addSchemaUpdate(dep).build();\n const f = recordFields(entry(resolveSchemaChain(b2).chain, 2), \"Box\");\n expect(f.x!.metadata.deprecatedFromVersion).toBe(2);\n expect(f.x!.metadata.deprecatedMessage).toBe(\"gone\");\n expect(f.y!.metadata.deprecatedFromVersion).toBe(2);\n expect(f.y!.metadata.deprecatedMessage ?? undefined).toBeUndefined();\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,122 @@
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 * as P from "@palantir/pack.schema";
18
+ import { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from "@palantir/pack.schema";
19
+ import { describe, expect, it } from "vitest";
20
+ import { resolveSchemaChain, stripDeprecatedFieldsForSdk } from "../resolveSchemaChain.js";
21
+
22
+ /** Index a record model's fields by key for a given chain entry. */
23
+ function fieldsByKey(entry, modelKey) {
24
+ const model = entry.ir.models[modelKey];
25
+ if (model.type !== "record") throw new Error(`${modelKey} is not a record`);
26
+ return Object.fromEntries(model.record.fields.map(f => [f.key, f]));
27
+ }
28
+ describe("resolveSchemaChain provenance", () => {
29
+ const v1 = defineSchema({
30
+ ShapeBox: defineRecord("ShapeBox", {
31
+ docs: "A box",
32
+ fields: {
33
+ left: P.Double,
34
+ color: P.Optional(P.String)
35
+ }
36
+ })
37
+ });
38
+ const colorSplit = defineSchemaUpdate("colorSplit", schema => ({
39
+ ShapeBox: schema.ShapeBox.addField("fillColor", P.Optional(P.String), {
40
+ derivedFrom: ["color"]
41
+ }).addField("strokeColor", P.Optional(P.String), {
42
+ derivedFrom: ["color"]
43
+ }).deprecateField("color", "use fillColor/strokeColor").build()
44
+ }));
45
+ const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();
46
+ it("derives addedInVersion from first appearance in the chain", () => {
47
+ const {
48
+ chain
49
+ } = resolveSchemaChain(v2);
50
+ const v2Fields = fieldsByKey(chain.find(c => c.version === 2), "ShapeBox");
51
+ expect(v2Fields.left.metadata.addedInVersion).toBe(1);
52
+ expect(v2Fields.fillColor.metadata.addedInVersion).toBe(2);
53
+ expect(v2Fields.strokeColor.metadata.addedInVersion).toBe(2);
54
+ });
55
+ it("keeps a deprecated field present and stamps deprecatedFromVersion + message", () => {
56
+ const {
57
+ chain
58
+ } = resolveSchemaChain(v2);
59
+ const v2Fields = fieldsByKey(chain.find(c => c.version === 2), "ShapeBox");
60
+ expect(v2Fields.color).toBeDefined();
61
+ expect(v2Fields.color.metadata.addedInVersion).toBe(1);
62
+ expect(v2Fields.color.metadata.deprecatedFromVersion).toBe(2);
63
+ expect(v2Fields.color.metadata.deprecatedMessage).toBe("use fillColor/strokeColor");
64
+ });
65
+ it("does not mark the field deprecated in versions before the deprecation", () => {
66
+ const {
67
+ chain
68
+ } = resolveSchemaChain(v2);
69
+ const v1Fields = fieldsByKey(chain.find(c => c.version === 1), "ShapeBox");
70
+ expect(v1Fields.color).toBeDefined();
71
+ expect(v1Fields.color.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();
72
+ expect(v1Fields.fillColor).toBeUndefined();
73
+ });
74
+ it("stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only", () => {
75
+ const {
76
+ chain
77
+ } = resolveSchemaChain(v2);
78
+ const stripped = stripDeprecatedFieldsForSdk(chain);
79
+ const v1Fields = fieldsByKey(stripped.find(c => c.version === 1), "ShapeBox");
80
+ expect(v1Fields.color).toBeDefined();
81
+ const v2Fields = fieldsByKey(stripped.find(c => c.version === 2), "ShapeBox");
82
+ expect(v2Fields.color).toBeUndefined();
83
+ expect(v2Fields.fillColor).toBeDefined();
84
+ expect(fieldsByKey(chain.find(c => c.version === 2), "ShapeBox").color).toBeDefined();
85
+ });
86
+ });
87
+ describe("resolveSchemaChain — union provenance", () => {
88
+ const v1 = defineSchema({
89
+ Box: defineRecord("Box", {
90
+ docs: "",
91
+ fields: {
92
+ a: P.Double
93
+ }
94
+ }),
95
+ NodeShape: P.defineUnion("NodeShape", {
96
+ docs: "shape",
97
+ variants: {
98
+ box: defineRecord("Inner", {
99
+ docs: "",
100
+ fields: {
101
+ z: P.Double
102
+ }
103
+ })
104
+ }
105
+ })
106
+ });
107
+ const addB = defineSchemaUpdate("addB", schema => ({
108
+ Box: schema.Box.addField("b", P.Optional(P.String)).build()
109
+ }));
110
+ const v2 = nextSchema(v1).addSchemaUpdate(addB).build();
111
+ it("a v1-defined union stays addedInVersion 1 in every version", () => {
112
+ const {
113
+ chain
114
+ } = resolveSchemaChain(v2);
115
+ for (const version of [1, 2]) {
116
+ const union = chain.find(c => c.version === version).ir.models.NodeShape;
117
+ if (union.type !== "union") throw new Error("NodeShape should be a union");
118
+ expect(union.union.metadata.addedInVersion).toBe(1);
119
+ }
120
+ });
121
+ });
122
+ //# sourceMappingURL=resolveSchemaChain.test.js.map
@@ -0,0 +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","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","undefined","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(\"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":[]}
@@ -0,0 +1,39 @@
1
+ /*
2
+ * Copyright 2026 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
18
+ /**
19
+ * Generate documentType.ts: runtime constants for the document type's user-facing
20
+ * identity, sourced from the IR's top-level `name` and `description`.
21
+ *
22
+ * Output:
23
+ * ```
24
+ * export const DOCUMENT_TYPE_NAME = "Canvas Document";
25
+ * export const DOCUMENT_TYPE_DESCRIPTION = "Schema for the Demo Canvas Application";
26
+ * ```
27
+ *
28
+ * Identity is read off the latest chain entry's IR — it is the same string on
29
+ * every entry (populated by `resolveSchemaChain` from pack-config), so the
30
+ * choice of entry is incidental.
31
+ */
32
+ export function generateDocumentTypeFromChain(resolved) {
33
+ const latestIr = resolved.chain[resolved.chain.length - 1].ir;
34
+ let output = GENERATED_FILE_HEADER;
35
+ output += `export const DOCUMENT_TYPE_NAME = ${JSON.stringify(latestIr.name)};\n`;
36
+ output += `export const DOCUMENT_TYPE_DESCRIPTION = ${JSON.stringify(latestIr.description)};\n`;
37
+ return output;
38
+ }
39
+ //# sourceMappingURL=generateDocumentTypeFromSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateDocumentTypeFromSchema.js","names":["GENERATED_FILE_HEADER","generateDocumentTypeFromChain","resolved","latestIr","chain","length","ir","output","JSON","stringify","name","description"],"sources":["generateDocumentTypeFromSchema.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 { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\n\n/**\n * Generate documentType.ts: runtime constants for the document type's user-facing\n * identity, sourced from the IR's top-level `name` and `description`.\n *\n * Output:\n * ```\n * export const DOCUMENT_TYPE_NAME = \"Canvas Document\";\n * export const DOCUMENT_TYPE_DESCRIPTION = \"Schema for the Demo Canvas Application\";\n * ```\n *\n * Identity is read off the latest chain entry's IR — it is the same string on\n * every entry (populated by `resolveSchemaChain` from pack-config), so the\n * choice of entry is incidental.\n */\nexport function generateDocumentTypeFromChain(resolved: ResolvedIrChain): string {\n const latestIr = resolved.chain[resolved.chain.length - 1]!.ir;\n\n let output = GENERATED_FILE_HEADER;\n output += `export const DOCUMENT_TYPE_NAME = ${JSON.stringify(latestIr.name)};\\n`;\n output += `export const DOCUMENT_TYPE_DESCRIPTION = ${JSON.stringify(latestIr.description)};\\n`;\n return output;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,qBAAqB,QAAQ,2BAA2B;AAGjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,6BAA6BA,CAACC,QAAyB,EAAU;EAC/E,MAAMC,QAAQ,GAAGD,QAAQ,CAACE,KAAK,CAACF,QAAQ,CAACE,KAAK,CAACC,MAAM,GAAG,CAAC,CAAC,CAAEC,EAAE;EAE9D,IAAIC,MAAM,GAAGP,qBAAqB;EAClCO,MAAM,IAAI,qCAAqCC,IAAI,CAACC,SAAS,CAACN,QAAQ,CAACO,IAAI,CAAC,KAAK;EACjFH,MAAM,IAAI,4CAA4CC,IAAI,CAACC,SAAS,CAACN,QAAQ,CAACQ,WAAW,CAAC,KAAK;EAC/F,OAAOJ,MAAM;AACf","ignoreList":[]}
@@ -17,7 +17,7 @@
17
17
  import { formatVariantName } from "../formatVariantName.js";
18
18
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
19
  import { resolveMinVersion } from "./resolveSchemaChain.js";
20
- import { INTERNAL_UPGRADE_FNS_PATH, MODELS_PATH, TYPES_REEXPORT_PATH, typesFilePath, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
20
+ import { DOCUMENT_TYPE_PATH, INTERNAL_UPGRADE_FNS_PATH, MODELS_PATH, TYPES_REEXPORT_PATH, typesFilePath, VERSIONED_DOC_REF_PATH, versionedTypeName, VERSIONS_PATH } from "./runtimeSchema.js";
21
21
 
22
22
  /**
23
23
  * Generate the index.ts barrel export from a versioned schema.
@@ -28,6 +28,7 @@ import { INTERNAL_UPGRADE_FNS_PATH, MODELS_PATH, TYPES_REEXPORT_PATH, typesFileP
28
28
  * - `types.js` (star export — latest-version type aliases)
29
29
  * - `versions.js` (star export — SupportedVersions, LatestVersion, MinSupportedVersion)
30
30
  * - `versionedDocRef.js` (star export — VersionedDocRef types and factory)
31
+ * - `documentType.js` (star export — DOCUMENT_TYPE_NAME and DOCUMENT_TYPE_DESCRIPTION)
31
32
  * - `DocumentUpgradeFns` type (the typed shape the factory accepts)
32
33
  * - Per supported version: explicit named type exports from `types_vN.js`
33
34
  * (not star exports, to avoid polluting autocomplete for read-only consumers)
@@ -46,6 +47,7 @@ export function generateIndexFromChain(resolved, minSupportedVersion) {
46
47
  output += `export * from "${TYPES_REEXPORT_PATH}";\n`;
47
48
  output += `export * from "${VERSIONS_PATH}";\n`;
48
49
  output += `export * from "${VERSIONED_DOC_REF_PATH}";\n`;
50
+ output += `export * from "${DOCUMENT_TYPE_PATH}";\n`;
49
51
  // The typed upgrade-function table shape. Apps reference this type when
50
52
  // constructing the value passed to `DocumentModel(...)`.
51
53
  output += `export { type DocumentUpgradeFns } from "${INTERNAL_UPGRADE_FNS_PATH}";\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"generateIndexFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","MODELS_PATH","TYPES_REEXPORT_PATH","typesFilePath","VERSIONED_DOC_REF_PATH","versionedTypeName","VERSIONS_PATH","generateIndexFromChain","resolved","minSupportedVersion","chain","minVersion","output","version","ir","typeNames","modelKey","modelDef","Object","entries","models","type","push","variantName","keys","union","variants","formattedVariant","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 { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADE_FNS_PATH,\n MODELS_PATH,\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 * - `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 */\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 // 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\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 typeNames.push(versionedTypeName(modelKey, version));\n\n // Union variant types\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n typeNames.push(`${versionedTypeName(modelKey, version)}${formattedVariant}`);\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\n return output;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,qBAAqB,QAAQ,2BAA2B;AAEjE,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SACEC,yBAAyB,EACzBC,WAAW,EACXC,mBAAmB,EACnBC,aAAa,EACbC,sBAAsB,EACtBC,iBAAiB,EACjBC,aAAa,QACR,oBAAoB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,QAAyB,EACzBC,mBAA4B,EACpB;EACR,MAAM;IAAEC;EAAM,CAAC,GAAGF,QAAQ;EAC1B,MAAM;IAAEG;EAAW,CAAC,GAAGZ,iBAAiB,CAACW,KAAK,EAAED,mBAAmB,CAAC;EAEpE,IAAIG,MAAM,GAAGd,qBAAqB;;EAElC;EACAc,MAAM,IAAI,kBAAkBX,WAAW,MAAM;EAC7CW,MAAM,IAAI,kBAAkBV,mBAAmB,MAAM;EACrDU,MAAM,IAAI,kBAAkBN,aAAa,MAAM;EAC/CM,MAAM,IAAI,kBAAkBR,sBAAsB,MAAM;EACxD;EACA;EACAQ,MAAM,IAAI,4CAA4CZ,yBAAyB,MAAM;;EAErF;EACA,KAAK,MAAM;IAAEa,OAAO;IAAEC;EAAG,CAAC,IAAIJ,KAAK,EAAE;IACnC,IAAIG,OAAO,GAAGF,UAAU,EAAE;IAE1B,MAAMI,SAAmB,GAAG,EAAE;IAE9B,KAAK,MAAM,CAACC,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACL,EAAE,CAACM,MAAM,CAAC,EAAE;MAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,QAAQ,EAAE;QAC9BN,SAAS,CAACO,IAAI,CAACjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,CAAC;MACtD,CAAC,MAAM,IAAII,QAAQ,CAACI,IAAI,KAAK,OAAO,EAAE;QACpCN,SAAS,CAACO,IAAI,CAACjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,CAAC;;QAEpD;QACA,KAAK,MAAMU,WAAW,IAAIL,MAAM,CAACM,IAAI,CAACP,QAAQ,CAACQ,KAAK,CAACC,QAAQ,CAAC,EAAE;UAC9D,MAAMC,gBAAgB,GAAG9B,iBAAiB,CAAC0B,WAAW,CAAC;UACvDR,SAAS,CAACO,IAAI,CAAC,GAAGjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,GAAGc,gBAAgB,EAAE,CAAC;QAC9E;MACF;IACF;IAEA,IAAIZ,SAAS,CAACa,MAAM,GAAG,CAAC,EAAE;MACxBhB,MAAM,IAAI,iBAAiBG,SAAS,CAACc,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,YACpD3B,aAAa,CAACU,OAAO,CAAC,MAClB;IACR;EACF;EAEA,OAAOD,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"file":"generateIndexFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveMinVersion","DOCUMENT_TYPE_PATH","INTERNAL_UPGRADE_FNS_PATH","MODELS_PATH","TYPES_REEXPORT_PATH","typesFilePath","VERSIONED_DOC_REF_PATH","versionedTypeName","VERSIONS_PATH","generateIndexFromChain","resolved","minSupportedVersion","chain","minVersion","output","version","ir","typeNames","modelKey","modelDef","Object","entries","models","type","push","variantName","keys","union","variants","formattedVariant","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 { formatVariantName } from \"../formatVariantName.js\";\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 MODELS_PATH,\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 */\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\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 typeNames.push(versionedTypeName(modelKey, version));\n\n // Union variant types\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n typeNames.push(`${versionedTypeName(modelKey, version)}${formattedVariant}`);\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\n return output;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,qBAAqB,QAAQ,2BAA2B;AAEjE,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SACEC,kBAAkB,EAClBC,yBAAyB,EACzBC,WAAW,EACXC,mBAAmB,EACnBC,aAAa,EACbC,sBAAsB,EACtBC,iBAAiB,EACjBC,aAAa,QACR,oBAAoB;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,QAAyB,EACzBC,mBAA4B,EACpB;EACR,MAAM;IAAEC;EAAM,CAAC,GAAGF,QAAQ;EAC1B,MAAM;IAAEG;EAAW,CAAC,GAAGb,iBAAiB,CAACY,KAAK,EAAED,mBAAmB,CAAC;EAEpE,IAAIG,MAAM,GAAGf,qBAAqB;;EAElC;EACAe,MAAM,IAAI,kBAAkBX,WAAW,MAAM;EAC7CW,MAAM,IAAI,kBAAkBV,mBAAmB,MAAM;EACrDU,MAAM,IAAI,kBAAkBN,aAAa,MAAM;EAC/CM,MAAM,IAAI,kBAAkBR,sBAAsB,MAAM;EACxDQ,MAAM,IAAI,kBAAkBb,kBAAkB,MAAM;EACpD;EACA;EACAa,MAAM,IAAI,4CAA4CZ,yBAAyB,MAAM;;EAErF;EACA,KAAK,MAAM;IAAEa,OAAO;IAAEC;EAAG,CAAC,IAAIJ,KAAK,EAAE;IACnC,IAAIG,OAAO,GAAGF,UAAU,EAAE;IAE1B,MAAMI,SAAmB,GAAG,EAAE;IAE9B,KAAK,MAAM,CAACC,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACL,EAAE,CAACM,MAAM,CAAC,EAAE;MAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,QAAQ,EAAE;QAC9BN,SAAS,CAACO,IAAI,CAACjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,CAAC;MACtD,CAAC,MAAM,IAAII,QAAQ,CAACI,IAAI,KAAK,OAAO,EAAE;QACpCN,SAAS,CAACO,IAAI,CAACjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,CAAC;;QAEpD;QACA,KAAK,MAAMU,WAAW,IAAIL,MAAM,CAACM,IAAI,CAACP,QAAQ,CAACQ,KAAK,CAACC,QAAQ,CAAC,EAAE;UAC9D,MAAMC,gBAAgB,GAAG/B,iBAAiB,CAAC2B,WAAW,CAAC;UACvDR,SAAS,CAACO,IAAI,CAAC,GAAGjB,iBAAiB,CAACW,QAAQ,EAAEH,OAAO,CAAC,GAAGc,gBAAgB,EAAE,CAAC;QAC9E;MACF;IACF;IAEA,IAAIZ,SAAS,CAACa,MAAM,GAAG,CAAC,EAAE;MACxBhB,MAAM,IAAI,iBAAiBG,SAAS,CAACc,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,YACpD3B,aAAa,CAACU,OAAO,CAAC,MAClB;IACR;EACF;EAEA,OAAOD,MAAM;AACf","ignoreList":[]}
@@ -105,7 +105,7 @@ function collectRecordModels(chain) {
105
105
  }
106
106
  }
107
107
 
108
- // Fields removed in this version
108
+ // Fields absent from this version relative to the previous one (i.e. deprecated fields).
109
109
  const removedFields = [];
110
110
  for (const fieldKey of prevFields) {
111
111
  if (!currFields.has(fieldKey)) {