@palantir/pack.document-schema.type-gen 0.31.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 (137) 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/ir/generateModelsFromIr.js +1 -1
  48. package/build/esm/utils/ir/generateModelsFromIr.js.map +1 -1
  49. package/build/esm/utils/ir/generateZodSchemasFromIr.js +1 -1
  50. package/build/esm/utils/ir/generateZodSchemasFromIr.js.map +1 -1
  51. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  52. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  53. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  54. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  55. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  56. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js +178 -0
  57. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
  58. package/build/esm/utils/schema/__tests__/generateIndexFromSchema.test.js +2 -1
  59. package/build/esm/utils/schema/__tests__/generateIndexFromSchema.test.js.map +1 -1
  60. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +40 -1
  61. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  62. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +8 -0
  63. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
  64. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +8 -0
  65. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
  66. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +75 -3
  67. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
  68. package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
  69. package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
  70. package/build/esm/utils/schema/generateIndexFromSchema.js +9 -8
  71. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  72. package/build/esm/utils/schema/generateInternalFromSchema.js +35 -19
  73. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  74. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +16 -12
  75. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  76. package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
  77. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  78. package/build/esm/utils/schema/generateTypesFromSchema.js +1 -2
  79. package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
  80. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +31 -10
  81. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  82. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +20 -14
  83. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  84. package/build/esm/utils/schema/resolveSchemaChain.js +108 -20
  85. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  86. package/build/esm/utils/schema/runtimeSchema.js +57 -0
  87. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  88. package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
  89. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
  90. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  91. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  92. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  93. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  94. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  95. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  96. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  97. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  98. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  99. package/build/esm/utils/steps/convertStepsToIr.js +10 -1
  100. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  101. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
  102. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
  103. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  104. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  105. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  106. package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
  107. package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
  108. package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
  109. package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
  110. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  111. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
  112. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
  113. package/build/types/utils/ir/generateModelsFromIr.d.ts.map +1 -1
  114. package/build/types/utils/ir/generateZodSchemasFromIr.d.ts.map +1 -1
  115. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
  116. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
  117. package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
  118. package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
  119. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  120. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  121. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  122. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  123. package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
  124. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  125. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  126. package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
  127. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  128. package/build/types/utils/schema/runtimeSchema.d.ts +23 -0
  129. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  130. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
  131. package/build/types/utils/steps/convertStepsToIr.d.ts +2 -0
  132. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  133. package/package.json +6 -6
  134. package/build/esm/utils/formatVariantName.js +0 -21
  135. package/build/esm/utils/formatVariantName.js.map +0 -1
  136. package/build/types/utils/formatVariantName.d.ts +0 -2
  137. package/build/types/utils/formatVariantName.d.ts.map +0 -1
@@ -0,0 +1,178 @@
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 { defineRecord, defineSchema, defineSchemaUpdate, defineUnion, nextSchema } from "@palantir/pack.schema";
18
+ import * as P from "@palantir/pack.schema";
19
+ import { mkdtemp, readdir, readFile, rm } from "fs/promises";
20
+ import os from "os";
21
+ import path from "path";
22
+ import { describe, expect, it } from "vitest";
23
+ import { assertSdkNamesUnique } from "../assertSdkNamesUnique.js";
24
+ import { resolveSchemaChain } from "../resolveSchemaChain.js";
25
+ import { writeAllSdkFiles } from "../writeAllSdkFiles.js";
26
+ import * as fixtures from "./fixtures.js";
27
+ const record = name => defineRecord(name, {
28
+ docs: name,
29
+ fields: {
30
+ x: P.Double
31
+ }
32
+ });
33
+ const union = (name, variants) => defineUnion(name, {
34
+ discriminant: "kind",
35
+ docs: name,
36
+ variants
37
+ });
38
+ function check(models) {
39
+ assertSdkNamesUnique(resolveSchemaChain(defineSchema(models)).chain, undefined);
40
+ }
41
+
42
+ /**
43
+ * Library names that can't clash with a model (see `RESERVED_SDK_NAMES`), so the check doesn't
44
+ * list them. A new import fails the test below until it's added here or there.
45
+ */
46
+ const NON_CLASHING_IMPORTS = new Set(["DocumentId", "DocumentRef", "EditDescription", "MediaId", "ObjectId", "PresencePublishOptions", "RecordId", "RecordRef", "ResourceRid", "UnionUpgradeRegistry", "UnknownUnionVariant", "UpgradeRegistry", "UserId", "ZodType", "z"]);
47
+
48
+ /** Top-level names a generated file declares, re-exports, or imports. */
49
+ function namesInFile(content) {
50
+ const names = [];
51
+ for (const [, name] of content.matchAll(/^export (?:interface|type|const|function) (\w+)/gm)) {
52
+ names.push(name);
53
+ }
54
+ for (const [, list] of content.matchAll(/^(?:import|export)(?: type)? \{([^}]*)\} from /gm)) {
55
+ for (const entry of list.split(",")) {
56
+ // `type Foo_v1 as Foo` binds `Foo`.
57
+ const name = entry.trim().replace(/^type /, "").split(" as ").pop().trim();
58
+ if (name !== "") names.push(name);
59
+ }
60
+ }
61
+ return names;
62
+ }
63
+ describe("assertSdkNamesUnique", () => {
64
+ const Bar = record("Bar");
65
+ const Baz = record("Baz");
66
+ it.each(Object.entries(fixtures))("lists every name the SDK generated from %s uses", async (_fixtureName, schema) => {
67
+ const resolved = resolveSchemaChain(schema);
68
+ // Support every version, so the SDK has files for all of them.
69
+ const minSupportedVersion = resolved.chain[0].version;
70
+ const listed = assertSdkNamesUnique(resolved.chain, minSupportedVersion);
71
+ const outputDir = await mkdtemp(path.join(os.tmpdir(), "sdk-names-"));
72
+ try {
73
+ await writeAllSdkFiles(resolved, outputDir, minSupportedVersion);
74
+ const files = (await readdir(outputDir, {
75
+ recursive: true
76
+ })).filter(file => file.endsWith(".ts"));
77
+ const generated = new Set();
78
+ for (const file of files) {
79
+ const content = await readFile(path.join(outputDir, file), "utf8");
80
+ for (const name of namesInFile(content)) generated.add(name);
81
+ }
82
+
83
+ // A name missing here means a generator creates a name the check doesn't know about.
84
+ expect([...generated].filter(name => !listed.has(name) && !NON_CLASHING_IMPORTS.has(name))).toEqual([]);
85
+ } finally {
86
+ await rm(outputDir, {
87
+ recursive: true
88
+ });
89
+ }
90
+ });
91
+ it("says which two models produce the same name", () => {
92
+ expect(() => check({
93
+ Bar,
94
+ KnownFoo: record("KnownFoo"),
95
+ Foo: union("Foo", {
96
+ bar: Bar
97
+ })
98
+ })).toThrow(`The generated SDK would use the name "KnownFoo" for both record "KnownFoo" and` + ` union "Foo" (Known type). Rename a model so the names differ.`);
99
+ });
100
+ it("rejects two variant keys that format to the same name", () => {
101
+ expect(() => check({
102
+ Bar,
103
+ Baz,
104
+ Foo: union("Foo", {
105
+ "my-box": Bar,
106
+ myBox: Baz
107
+ })
108
+ })).toThrow(`The generated SDK would use the name "FooMyBox" for both`);
109
+ });
110
+ it("rejects a model named like a name the SDK reserves", () => {
111
+ expect(() => check({
112
+ Metadata: record("Metadata")
113
+ })).toThrow(`The generated SDK would use the name "Metadata" for both the SDK itself and record "Metadata"`);
114
+ });
115
+ it("rejects a model key that could clash in a later version", () => {
116
+ // At v2 this would clash with record Foo's v2 type, Foo_v2.
117
+ expect(() => check({
118
+ Foo: record("Foo"),
119
+ Foo_v2: record("Foo_v2")
120
+ })).toThrow(`Model "Foo_v2" can't contain "_v" followed by a number.`);
121
+ });
122
+ it("ignores deprecated fields, which the SDK leaves out", () => {
123
+ const Box = defineRecord("Box", {
124
+ docs: "Box",
125
+ fields: {
126
+ kind: P.Double,
127
+ x: P.Double
128
+ }
129
+ });
130
+ const v1 = defineSchema({
131
+ Box
132
+ });
133
+ // v2 deprecates `kind`, so it no longer collides with the new union's discriminant.
134
+ const addShape = defineSchemaUpdate("addShape", schema => {
135
+ const box = schema.Box.deprecateField("kind", "Use Shape instead.").build();
136
+ return {
137
+ Box: box,
138
+ Shape: union("Shape", {
139
+ box
140
+ })
141
+ };
142
+ });
143
+ const v2 = nextSchema(v1).addSchemaUpdate(addShape).build();
144
+ expect(() => assertSdkNamesUnique(resolveSchemaChain(v2).chain, 1)).not.toThrow();
145
+ });
146
+ it("rejects a variant record with a field named like the discriminant", () => {
147
+ const Box = defineRecord("Box", {
148
+ docs: "Box",
149
+ fields: {
150
+ kind: P.Double
151
+ }
152
+ });
153
+ expect(() => check({
154
+ Box,
155
+ Shape: union("Shape", {
156
+ box: Box
157
+ })
158
+ })).toThrow(`The generated type "Shape_v1Box" would have two properties named "kind".` + ` Rename the discriminant of union "Shape".`);
159
+ });
160
+ it("rejects the discriminant \"value\" when a variant is another union", () => {
161
+ const Inner = union("Inner", {
162
+ bar: Bar
163
+ });
164
+ const Outer = defineUnion("Outer", {
165
+ discriminant: "value",
166
+ docs: "Outer",
167
+ variants: {
168
+ inner: Inner
169
+ }
170
+ });
171
+ expect(() => check({
172
+ Bar,
173
+ Inner,
174
+ Outer
175
+ })).toThrow(`The generated type "Outer_v1Inner" would have two properties named "value".` + ` Rename the discriminant of union "Outer".`);
176
+ });
177
+ });
178
+ //# sourceMappingURL=assertSdkNamesUnique.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSdkNamesUnique.test.js","names":["defineRecord","defineSchema","defineSchemaUpdate","defineUnion","nextSchema","P","mkdtemp","readdir","readFile","rm","os","path","describe","expect","it","assertSdkNamesUnique","resolveSchemaChain","writeAllSdkFiles","fixtures","record","name","docs","fields","x","Double","union","variants","discriminant","check","models","chain","undefined","NON_CLASHING_IMPORTS","Set","namesInFile","content","names","matchAll","push","list","entry","split","trim","replace","pop","Bar","Baz","each","Object","entries","_fixtureName","schema","resolved","minSupportedVersion","version","listed","outputDir","join","tmpdir","files","recursive","filter","file","endsWith","generated","add","has","toEqual","KnownFoo","Foo","bar","toThrow","myBox","Metadata","Foo_v2","Box","kind","v1","addShape","box","deprecateField","build","Shape","v2","addSchemaUpdate","not","Inner","Outer","inner"],"sources":["assertSdkNamesUnique.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 type { ModelDef } from \"@palantir/pack.schema\";\nimport {\n defineRecord,\n defineSchema,\n defineSchemaUpdate,\n defineUnion,\n nextSchema,\n} from \"@palantir/pack.schema\";\nimport * as P from \"@palantir/pack.schema\";\nimport { mkdtemp, readdir, readFile, rm } from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { assertSdkNamesUnique } from \"../assertSdkNamesUnique.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport { writeAllSdkFiles } from \"../writeAllSdkFiles.js\";\nimport * as fixtures from \"./fixtures.js\";\n\nconst record = (name: string) => defineRecord(name, { docs: name, fields: { x: P.Double } });\nconst union = (name: string, variants: Record<string, ModelDef>) =>\n defineUnion(name, { discriminant: \"kind\", docs: name, variants });\n\nfunction check(models: Record<string, ModelDef>): void {\n assertSdkNamesUnique(resolveSchemaChain(defineSchema(models)).chain, undefined);\n}\n\n/**\n * Library names that can't clash with a model (see `RESERVED_SDK_NAMES`), so the check doesn't\n * list them. A new import fails the test below until it's added here or there.\n */\nconst NON_CLASHING_IMPORTS = new Set([\n \"DocumentId\",\n \"DocumentRef\",\n \"EditDescription\",\n \"MediaId\",\n \"ObjectId\",\n \"PresencePublishOptions\",\n \"RecordId\",\n \"RecordRef\",\n \"ResourceRid\",\n \"UnionUpgradeRegistry\",\n \"UnknownUnionVariant\",\n \"UpgradeRegistry\",\n \"UserId\",\n \"ZodType\",\n \"z\",\n]);\n\n/** Top-level names a generated file declares, re-exports, or imports. */\nfunction namesInFile(content: string): string[] {\n const names: string[] = [];\n for (const [, name] of content.matchAll(/^export (?:interface|type|const|function) (\\w+)/gm)) {\n names.push(name!);\n }\n for (const [, list] of content.matchAll(/^(?:import|export)(?: type)? \\{([^}]*)\\} from /gm)) {\n for (const entry of list!.split(\",\")) {\n // `type Foo_v1 as Foo` binds `Foo`.\n const name = entry.trim().replace(/^type /, \"\").split(\" as \").pop()!.trim();\n if (name !== \"\") names.push(name);\n }\n }\n return names;\n}\n\ndescribe(\"assertSdkNamesUnique\", () => {\n const Bar = record(\"Bar\");\n const Baz = record(\"Baz\");\n\n it.each(Object.entries(fixtures))(\n \"lists every name the SDK generated from %s uses\",\n async (_fixtureName, schema) => {\n const resolved = resolveSchemaChain(schema);\n // Support every version, so the SDK has files for all of them.\n const minSupportedVersion = resolved.chain[0]!.version;\n const listed = assertSdkNamesUnique(resolved.chain, minSupportedVersion);\n\n const outputDir = await mkdtemp(path.join(os.tmpdir(), \"sdk-names-\"));\n try {\n await writeAllSdkFiles(resolved, outputDir, minSupportedVersion);\n const files = (await readdir(outputDir, { recursive: true })).filter(file =>\n file.endsWith(\".ts\")\n );\n const generated = new Set<string>();\n for (const file of files) {\n const content = await readFile(path.join(outputDir, file), \"utf8\");\n for (const name of namesInFile(content)) generated.add(name);\n }\n\n // A name missing here means a generator creates a name the check doesn't know about.\n expect(\n [...generated].filter(name => !listed.has(name) && !NON_CLASHING_IMPORTS.has(name)),\n ).toEqual([]);\n } finally {\n await rm(outputDir, { recursive: true });\n }\n },\n );\n\n it(\"says which two models produce the same name\", () => {\n expect(() => check({ Bar, KnownFoo: record(\"KnownFoo\"), Foo: union(\"Foo\", { bar: Bar }) }))\n .toThrow(\n `The generated SDK would use the name \"KnownFoo\" for both record \"KnownFoo\" and`\n + ` union \"Foo\" (Known type). Rename a model so the names differ.`,\n );\n });\n\n it(\"rejects two variant keys that format to the same name\", () => {\n expect(() => check({ Bar, Baz, Foo: union(\"Foo\", { \"my-box\": Bar, myBox: Baz }) })).toThrow(\n `The generated SDK would use the name \"FooMyBox\" for both`,\n );\n });\n\n it(\"rejects a model named like a name the SDK reserves\", () => {\n expect(() => check({ Metadata: record(\"Metadata\") })).toThrow(\n `The generated SDK would use the name \"Metadata\" for both the SDK itself and record \"Metadata\"`,\n );\n });\n\n it(\"rejects a model key that could clash in a later version\", () => {\n // At v2 this would clash with record Foo's v2 type, Foo_v2.\n expect(() => check({ Foo: record(\"Foo\"), Foo_v2: record(\"Foo_v2\") })).toThrow(\n `Model \"Foo_v2\" can't contain \"_v\" followed by a number.`,\n );\n });\n\n it(\"ignores deprecated fields, which the SDK leaves out\", () => {\n const Box = defineRecord(\"Box\", { docs: \"Box\", fields: { kind: P.Double, x: P.Double } });\n const v1 = defineSchema({ Box });\n // v2 deprecates `kind`, so it no longer collides with the new union's discriminant.\n const addShape = defineSchemaUpdate(\n \"addShape\",\n (schema: P.SchemaBuilder<typeof v1.models>) => {\n const box = schema.Box.deprecateField(\"kind\", \"Use Shape instead.\").build();\n return { Box: box, Shape: union(\"Shape\", { box }) };\n },\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addShape).build();\n\n expect(() => assertSdkNamesUnique(resolveSchemaChain(v2).chain, 1)).not.toThrow();\n });\n\n it(\"rejects a variant record with a field named like the discriminant\", () => {\n const Box = defineRecord(\"Box\", { docs: \"Box\", fields: { kind: P.Double } });\n\n expect(() => check({ Box, Shape: union(\"Shape\", { box: Box }) })).toThrow(\n `The generated type \"Shape_v1Box\" would have two properties named \"kind\".`\n + ` Rename the discriminant of union \"Shape\".`,\n );\n });\n\n it(\"rejects the discriminant \\\"value\\\" when a variant is another union\", () => {\n const Inner = union(\"Inner\", { bar: Bar });\n const Outer = defineUnion(\"Outer\", {\n discriminant: \"value\",\n docs: \"Outer\",\n variants: { inner: Inner },\n });\n\n expect(() => check({ Bar, Inner, Outer })).toThrow(\n `The generated type \"Outer_v1Inner\" would have two properties named \"value\".`\n + ` Rename the discriminant of union \"Outer\".`,\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -24,9 +24,10 @@ describe("generateIndexFromChain", () => {
24
24
 
25
25
  // Guards are exported as values (not `export type`) so consumers can narrow
26
26
  // a union at runtime without re-deriving the discriminant check.
27
- expect(result).toContain(`export { isShape_v1Circle, isShape_v1Rectangle } from "./types_v1.js";`);
27
+ expect(result).toContain(`export { isShape_v1Circle, isShape_v1Rectangle, isShape_v1Unknown, narrowKnownShape_v1 } from "./types_v1.js";`);
28
28
  // The variant *types* remain a separate type-only export.
29
29
  expect(result).toMatch(/export type \{[^}]*Shape_v1Circle[^}]*\} from "\.\/types_v1\.js";/);
30
+ expect(result).toMatch(/export type \{[^}]*KnownShape_v1[^}]*\} from "\.\/types_v1\.js";/);
30
31
  });
31
32
  it("emits no value guard export when the schema has no unions", () => {
32
33
  const result = generateIndexFromChain(resolveSchemaChain(singleVersionSchema));
@@ -1 +1 @@
1
- {"version":3,"file":"generateIndexFromSchema.test.js","names":["describe","expect","it","generateIndexFromChain","resolveSchemaChain","singleVersionSchema","unionTypesSchema","result","toContain","toMatch","not"],"sources":["generateIndexFromSchema.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 { describe, expect, it } from \"vitest\";\nimport { generateIndexFromChain } from \"../generateIndexFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport { singleVersionSchema, unionTypesSchema } from \"./fixtures.js\";\n\ndescribe(\"generateIndexFromChain\", () => {\n it(\"re-exports union variant type guards as values\", () => {\n const result = generateIndexFromChain(resolveSchemaChain(unionTypesSchema));\n\n // Guards are exported as values (not `export type`) so consumers can narrow\n // a union at runtime without re-deriving the discriminant check.\n expect(result).toContain(\n `export { isShape_v1Circle, isShape_v1Rectangle } from \"./types_v1.js\";`,\n );\n // The variant *types* remain a separate type-only export.\n expect(result).toMatch(/export type \\{[^}]*Shape_v1Circle[^}]*\\} from \"\\.\\/types_v1\\.js\";/);\n });\n\n it(\"emits no value guard export when the schema has no unions\", () => {\n const result = generateIndexFromChain(resolveSchemaChain(singleVersionSchema));\n\n // No unions → no `is<Variant>` guards → no value export from types_v1.\n expect(result).not.toMatch(/export \\{ is\\w+ \\} from \"\\.\\/types_v1\\.js\";/);\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,sBAAsB,QAAQ,+BAA+B;AACtE,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,mBAAmB,EAAEC,gBAAgB,QAAQ,eAAe;AAErEN,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCE,EAAE,CAAC,gDAAgD,EAAE,MAAM;IACzD,MAAMK,MAAM,GAAGJ,sBAAsB,CAACC,kBAAkB,CAACE,gBAAgB,CAAC,CAAC;;IAE3E;IACA;IACAL,MAAM,CAACM,MAAM,CAAC,CAACC,SAAS,CACtB,wEACF,CAAC;IACD;IACAP,MAAM,CAACM,MAAM,CAAC,CAACE,OAAO,CAAC,mEAAmE,CAAC;EAC7F,CAAC,CAAC;EAEFP,EAAE,CAAC,2DAA2D,EAAE,MAAM;IACpE,MAAMK,MAAM,GAAGJ,sBAAsB,CAACC,kBAAkB,CAACC,mBAAmB,CAAC,CAAC;;IAE9E;IACAJ,MAAM,CAACM,MAAM,CAAC,CAACG,GAAG,CAACD,OAAO,CAAC,6CAA6C,CAAC;EAC3E,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"generateIndexFromSchema.test.js","names":["describe","expect","it","generateIndexFromChain","resolveSchemaChain","singleVersionSchema","unionTypesSchema","result","toContain","toMatch","not"],"sources":["generateIndexFromSchema.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 { describe, expect, it } from \"vitest\";\nimport { generateIndexFromChain } from \"../generateIndexFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport { singleVersionSchema, unionTypesSchema } from \"./fixtures.js\";\n\ndescribe(\"generateIndexFromChain\", () => {\n it(\"re-exports union variant type guards as values\", () => {\n const result = generateIndexFromChain(resolveSchemaChain(unionTypesSchema));\n\n // Guards are exported as values (not `export type`) so consumers can narrow\n // a union at runtime without re-deriving the discriminant check.\n expect(result).toContain(\n `export { isShape_v1Circle, isShape_v1Rectangle, isShape_v1Unknown, narrowKnownShape_v1 } from \"./types_v1.js\";`,\n );\n // The variant *types* remain a separate type-only export.\n expect(result).toMatch(/export type \\{[^}]*Shape_v1Circle[^}]*\\} from \"\\.\\/types_v1\\.js\";/);\n expect(result).toMatch(/export type \\{[^}]*KnownShape_v1[^}]*\\} from \"\\.\\/types_v1\\.js\";/);\n });\n\n it(\"emits no value guard export when the schema has no unions\", () => {\n const result = generateIndexFromChain(resolveSchemaChain(singleVersionSchema));\n\n // No unions → no `is<Variant>` guards → no value export from types_v1.\n expect(result).not.toMatch(/export \\{ is\\w+ \\} from \"\\.\\/types_v1\\.js\";/);\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,sBAAsB,QAAQ,+BAA+B;AACtE,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,mBAAmB,EAAEC,gBAAgB,QAAQ,eAAe;AAErEN,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCE,EAAE,CAAC,gDAAgD,EAAE,MAAM;IACzD,MAAMK,MAAM,GAAGJ,sBAAsB,CAACC,kBAAkB,CAACE,gBAAgB,CAAC,CAAC;;IAE3E;IACA;IACAL,MAAM,CAACM,MAAM,CAAC,CAACC,SAAS,CACtB,gHACF,CAAC;IACD;IACAP,MAAM,CAACM,MAAM,CAAC,CAACE,OAAO,CAAC,mEAAmE,CAAC;IAC3FR,MAAM,CAACM,MAAM,CAAC,CAACE,OAAO,CAAC,kEAAkE,CAAC;EAC5F,CAAC,CAAC;EAEFP,EAAE,CAAC,2DAA2D,EAAE,MAAM;IACpE,MAAMK,MAAM,GAAGJ,sBAAsB,CAACC,kBAAkB,CAACC,mBAAmB,CAAC,CAAC;;IAE9E;IACAJ,MAAM,CAACM,MAAM,CAAC,CAACG,GAAG,CAACD,OAAO,CAAC,6CAA6C,CAAC;EAC3E,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -14,10 +14,12 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import * as P from "@palantir/pack.schema";
18
+ import { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from "@palantir/pack.schema";
17
19
  import path from "path";
18
20
  import { describe, expect, it } from "vitest";
19
21
  import { generateInternalFromChain } from "../generateInternalFromSchema.js";
20
- import { resolveSchemaChain } from "../resolveSchemaChain.js";
22
+ import { collapseChainToMajors, resolveSchemaChain } from "../resolveSchemaChain.js";
21
23
  import { nestedOptionalsSchema, nestedUnionSchema, optionalToRequiredFieldSchema, singleVersionSchema, twoVersionDerivedFieldsSchema, twoVersionFieldRemovalSchema, twoVersionRequiredAdditiveSchema } from "./fixtures.js";
22
24
  import { formatInternalTypesSnapshot } from "./snapshotUtils.js";
23
25
  describe("generateInternalFromChain", () => {
@@ -55,4 +57,41 @@ describe("generateInternalFromChain", () => {
55
57
  await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(path.join(snapshotDir, "two-version-optional-fields.snap"));
56
58
  });
57
59
  });
60
+ describe("generateInternalFromChain minor versions", () => {
61
+ const v1 = defineSchema({
62
+ Shape: defineRecord("Shape", {
63
+ docs: "A shape",
64
+ fields: {
65
+ color: P.String
66
+ }
67
+ })
68
+ });
69
+ const v1_1 = nextSchema(v1, {
70
+ bump: "minor"
71
+ }).addSchemaUpdate(defineSchemaUpdate("addFields", schema => ({
72
+ Shape: schema.Shape.addField("label", P.String).addField("note", P.Optional(P.String)).build()
73
+ }))).build();
74
+ function resolveForSdk() {
75
+ const {
76
+ chain,
77
+ latestVersion,
78
+ minVersion
79
+ } = resolveSchemaChain(v1_1);
80
+ return {
81
+ chain: collapseChainToMajors(chain),
82
+ latestVersion,
83
+ minVersion,
84
+ stepChain: chain
85
+ };
86
+ }
87
+ it("emits a minor-version upgrade step and keyed upgrade functions", () => {
88
+ const result = generateInternalFromChain(resolveForSdk());
89
+ expect(result.upgrades).toContain("addedInMinorVersion: 1");
90
+ expect(result.internalUpgradeFns).toContain("v1_1: {");
91
+ expect(result.internalUpgradeFns).toContain("label: () => Shape__v1[\"label\"]");
92
+ expect(result.internalUpgradeFns).not.toContain("note:");
93
+ // Fields added in 1.1 are missing from 1.0 records, so the raw internal type keeps them optional.
94
+ expect(result.internalTypes).toContain("readonly label?: string;");
95
+ });
96
+ });
58
97
  //# sourceMappingURL=generateInternalFromSchema.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateInternalFromSchema.test.js","names":["path","describe","expect","it","generateInternalFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","optionalToRequiredFieldSchema","singleVersionSchema","twoVersionDerivedFieldsSchema","twoVersionFieldRemovalSchema","twoVersionRequiredAdditiveSchema","formatInternalTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","internalUpgradeFns","toContain"],"sources":["generateInternalFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateInternalFromChain } from \"../generateInternalFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n optionalToRequiredFieldSchema,\n singleVersionSchema,\n twoVersionDerivedFieldsSchema,\n twoVersionFieldRemovalSchema,\n twoVersionRequiredAdditiveSchema,\n} from \"./fixtures.js\";\nimport { formatInternalTypesSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateInternalFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateInternalFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionFieldRemovalSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"two-version derived fields\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionDerivedFieldsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-derived-fields.snap\"),\n );\n });\n\n it(\"two-version required additive field emits a zero-arg upgrade fn signature\", async () => {\n const result = generateInternalFromChain(\n resolveSchemaChain(twoVersionRequiredAdditiveSchema),\n );\n expect(result.internalUpgradeFns).toContain(\"opacity: () => ShapeBox__v2[\\\"opacity\\\"]\");\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-required-additive.snap\"),\n );\n });\n\n it(\"nested union schema generates upgrade registries for all variant targets\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-union.snap\"),\n );\n });\n\n it(\"field optional in v1 and required in v2 stays optional in internal schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(optionalToRequiredFieldSchema));\n // \"label\" is Optional(String) in v1 but String in v2.\n // The internal Zod schema must keep it optional because v1 documents\n // may legitimately omit the field.\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-optional-fields.snap\"),\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateInternalFromSchema.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","path","describe","expect","it","generateInternalFromChain","collapseChainToMajors","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","optionalToRequiredFieldSchema","singleVersionSchema","twoVersionDerivedFieldsSchema","twoVersionFieldRemovalSchema","twoVersionRequiredAdditiveSchema","formatInternalTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","internalUpgradeFns","toContain","v1","Shape","docs","fields","color","String","v1_1","bump","addSchemaUpdate","schema","addField","Optional","build","resolveForSdk","chain","latestVersion","minVersion","stepChain","upgrades","not","internalTypes"],"sources":["generateInternalFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateInternalFromChain } from \"../generateInternalFromSchema.js\";\nimport { collapseChainToMajors, resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n optionalToRequiredFieldSchema,\n singleVersionSchema,\n twoVersionDerivedFieldsSchema,\n twoVersionFieldRemovalSchema,\n twoVersionRequiredAdditiveSchema,\n} from \"./fixtures.js\";\nimport { formatInternalTypesSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateInternalFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateInternalFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionFieldRemovalSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"two-version derived fields\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionDerivedFieldsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-derived-fields.snap\"),\n );\n });\n\n it(\"two-version required additive field emits a zero-arg upgrade fn signature\", async () => {\n const result = generateInternalFromChain(\n resolveSchemaChain(twoVersionRequiredAdditiveSchema),\n );\n expect(result.internalUpgradeFns).toContain(\"opacity: () => ShapeBox__v2[\\\"opacity\\\"]\");\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-required-additive.snap\"),\n );\n });\n\n it(\"nested union schema generates upgrade registries for all variant targets\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-union.snap\"),\n );\n });\n\n it(\"field optional in v1 and required in v2 stays optional in internal schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(optionalToRequiredFieldSchema));\n // \"label\" is Optional(String) in v1 but String in v2.\n // The internal Zod schema must keep it optional because v1 documents\n // may legitimately omit the field.\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-optional-fields.snap\"),\n );\n });\n});\n\ndescribe(\"generateInternalFromChain minor versions\", () => {\n const v1 = defineSchema({\n Shape: defineRecord(\"Shape\", { docs: \"A shape\", fields: { color: P.String } }),\n });\n const v1_1 = nextSchema(v1, { bump: \"minor\" })\n .addSchemaUpdate(\n defineSchemaUpdate(\"addFields\", (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Shape: schema.Shape\n .addField(\"label\", P.String)\n .addField(\"note\", P.Optional(P.String))\n .build(),\n })),\n )\n .build();\n\n function resolveForSdk() {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v1_1);\n return { chain: collapseChainToMajors(chain), latestVersion, minVersion, stepChain: chain };\n }\n\n it(\"emits a minor-version upgrade step and keyed upgrade functions\", () => {\n const result = generateInternalFromChain(resolveForSdk());\n\n expect(result.upgrades).toContain(\"addedInMinorVersion: 1\");\n expect(result.internalUpgradeFns).toContain(\"v1_1: {\");\n expect(result.internalUpgradeFns).toContain(\"label: () => Shape__v1[\\\"label\\\"]\");\n expect(result.internalUpgradeFns).not.toContain(\"note:\");\n // Fields added in 1.1 are missing from 1.0 records, so the raw internal type keeps them optional.\n expect(result.internalTypes).toContain(\"readonly label?: string;\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -61,4 +61,12 @@ describe("generateVersionedTypesFromChain", () => {
61
61
  expect(result.readTypes.has(1)).toBe(false);
62
62
  });
63
63
  });
64
+ describe("generateVersionedTypesFromChain unknown union variants", () => {
65
+ it("adds an Unknown case and guard to every union", () => {
66
+ const readTypes = generateVersionedTypesFromChain(resolveSchemaChain(unionTypesSchema)).readTypes.get(1);
67
+ expect(readTypes).toContain("export type Shape_v1Unknown = UnknownUnionVariant<\"type\">;");
68
+ expect(readTypes).toContain("export type Shape_v1 = Shape_v1Circle | Shape_v1Rectangle | Shape_v1Unknown;");
69
+ expect(readTypes).toContain("export function isShape_v1Unknown(value: Shape_v1)");
70
+ });
71
+ });
64
72
  //# sourceMappingURL=generateVersionedTypesFromSchema.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateVersionedTypesFromSchema.test.js","names":["path","describe","expect","it","generateVersionedTypesFromChain","resolveSchemaChain","aliasedEntryNameSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","threeVersionChainSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","readTypes","size","toBe","has"],"sources":["generateVersionedTypesFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedTypesFromChain } from \"../generateVersionedTypesFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n aliasedEntryNameSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n threeVersionChainSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedTypesSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedTypesFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedTypesFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"three-version chain\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(threeVersionChainSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"three-version-chain.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"preserves aliased export name when export key differs from model name\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(aliasedEntryNameSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"alias-types.snap\"),\n );\n });\n\n it(\"includes value field for union variants that reference another union\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.readTypes.size).toBe(1);\n expect(result.readTypes.has(2)).toBe(true);\n expect(result.readTypes.has(1)).toBe(false);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateVersionedTypesFromSchema.test.js","names":["path","describe","expect","it","generateVersionedTypesFromChain","resolveSchemaChain","aliasedEntryNameSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","threeVersionChainSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","readTypes","size","toBe","has","get","toContain"],"sources":["generateVersionedTypesFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedTypesFromChain } from \"../generateVersionedTypesFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n aliasedEntryNameSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n threeVersionChainSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedTypesSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedTypesFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedTypesFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"three-version chain\", async () => {\n const result = generateVersionedTypesFromChain(\n resolveSchemaChain(threeVersionChainSchema, 1),\n 1,\n );\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"three-version-chain.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"preserves aliased export name when export key differs from model name\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(aliasedEntryNameSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"alias-types.snap\"),\n );\n });\n\n it(\"includes value field for union variants that reference another union\", async () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedTypesFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.readTypes.size).toBe(1);\n expect(result.readTypes.has(2)).toBe(true);\n expect(result.readTypes.has(1)).toBe(false);\n });\n});\n\ndescribe(\"generateVersionedTypesFromChain unknown union variants\", () => {\n it(\"adds an Unknown case and guard to every union\", () => {\n const readTypes = generateVersionedTypesFromChain(resolveSchemaChain(unionTypesSchema))\n .readTypes.get(1)!;\n\n expect(readTypes).toContain(\"export type Shape_v1Unknown = UnknownUnionVariant<\\\"type\\\">;\");\n expect(readTypes).toContain(\n \"export type Shape_v1 = Shape_v1Circle | Shape_v1Rectangle | Shape_v1Unknown;\",\n );\n expect(readTypes).toContain(\"export function isShape_v1Unknown(value: Shape_v1)\");\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,IAAI,MAAM,MAAM;AACvB,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,+BAA+B,QAAQ,wCAAwC;AACxF,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,eAAe,EACfC,mBAAmB,EACnBC,uBAAuB,EACvBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,gBAAgB,QACX,eAAe;AACtB,SAASC,4BAA4B,QAAQ,oBAAoB;AAEjEb,QAAQ,CAAC,iCAAiC,EAAE,MAAM;EAChD,MAAMc,WAAW,GAAGf,IAAI,CAACgB,IAAI,CAACC,SAAS,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAE7Fd,EAAE,CAAC,uBAAuB,EAAE,YAAY;IACtC,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACI,mBAAmB,CAAC,CAAC;IACvF,MAAMP,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,qBAAqB,CAC9C,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,6BAA6B,EAAE,YAAY;IAC5C,MAAMe,MAAM,GAAGd,+BAA+B,CAC5CC,kBAAkB,CAACM,wBAAwB,EAAE,CAAC,CAAC,EAC/C,CACF,CAAC;IACD,MAAMT,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,2BAA2B,CACpD,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,2BAA2B,EAAE,YAAY;IAC1C,MAAMe,MAAM,GAAGd,+BAA+B,CAC5CC,kBAAkB,CAACO,4BAA4B,EAAE,CAAC,CAAC,EACnD,CACF,CAAC;IACD,MAAMV,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,gCAAgC,CACzD,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,qBAAqB,EAAE,YAAY;IACpC,MAAMe,MAAM,GAAGd,+BAA+B,CAC5CC,kBAAkB,CAACK,uBAAuB,EAAE,CAAC,CAAC,EAC9C,CACF,CAAC;IACD,MAAMR,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,0BAA0B,CACnD,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,wBAAwB,EAAE,YAAY;IACvC,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACG,eAAe,CAAC,CAAC;IACnF,MAAMN,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,iBAAiB,CAC1C,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,yBAAyB,EAAE,YAAY;IACxC,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACQ,gBAAgB,CAAC,CAAC;IACpF,MAAMX,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,kBAAkB,CAC3C,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,uEAAuE,EAAE,YAAY;IACtF,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACC,sBAAsB,CAAC,CAAC;IAC1F,MAAMJ,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,kBAAkB,CAC3C,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,sEAAsE,EAAE,YAAY;IACrF,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACE,iBAAiB,CAAC,CAAC;IACrF,MAAML,MAAM,CAAC,MAAMY,4BAA4B,CAACI,MAAM,CAAC,CAAC,CAACC,mBAAmB,CAC1EnB,IAAI,CAACgB,IAAI,CAACD,WAAW,EAAE,4BAA4B,CACrD,CAAC;EACH,CAAC,CAAC;EAEFZ,EAAE,CAAC,oDAAoD,EAAE,MAAM;IAC7D,MAAMe,MAAM,GAAGd,+BAA+B,CAACC,kBAAkB,CAACM,wBAAwB,CAAC,CAAC;IAC5FT,MAAM,CAACgB,MAAM,CAACE,SAAS,CAACC,IAAI,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IACrCpB,MAAM,CAACgB,MAAM,CAACE,SAAS,CAACG,GAAG,CAAC,CAAC,CAAC,CAAC,CAACD,IAAI,CAAC,IAAI,CAAC;IAC1CpB,MAAM,CAACgB,MAAM,CAACE,SAAS,CAACG,GAAG,CAAC,CAAC,CAAC,CAAC,CAACD,IAAI,CAAC,KAAK,CAAC;EAC7C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFrB,QAAQ,CAAC,wDAAwD,EAAE,MAAM;EACvEE,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxD,MAAMiB,SAAS,GAAGhB,+BAA+B,CAACC,kBAAkB,CAACQ,gBAAgB,CAAC,CAAC,CACpFO,SAAS,CAACI,GAAG,CAAC,CAAC,CAAE;IAEpBtB,MAAM,CAACkB,SAAS,CAAC,CAACK,SAAS,CAAC,8DAA8D,CAAC;IAC3FvB,MAAM,CAACkB,SAAS,CAAC,CAACK,SAAS,CACzB,8EACF,CAAC;IACDvB,MAAM,CAACkB,SAAS,CAAC,CAACK,SAAS,CAAC,oDAAoD,CAAC;EACnF,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -57,4 +57,12 @@ describe("generateVersionedZodFromChain", () => {
57
57
  expect(result.zodSchemas.has(1)).toBe(false);
58
58
  });
59
59
  });
60
+ describe("generateVersionedZodFromChain unknown union variants", () => {
61
+ it("accepts the Unknown case in every union schema", () => {
62
+ const zodSchemas = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema)).zodSchemas.get(1);
63
+ expect(zodSchemas).toContain("export const ShapeSchema_v1Unknown = z.object({");
64
+ expect(zodSchemas).toContain("type: z.literal(\"unknown\"),");
65
+ expect(zodSchemas).toMatch(/z\.discriminatedUnion\("type", \[[^\]]*ShapeSchema_v1Unknown/);
66
+ });
67
+ });
60
68
  //# sourceMappingURL=generateVersionedZodFromSchema.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateVersionedZodFromSchema.test.js","names":["path","describe","expect","it","generateVersionedZodFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedZodSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","zodSchemas","size","toBe","has"],"sources":["generateVersionedZodFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedZodFromChain } from \"../generateVersionedZodFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedZodSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedZodFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedZodFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"includes value field in Zod schema for union variants that reference another union\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.zodSchemas.size).toBe(1);\n expect(result.zodSchemas.has(2)).toBe(true);\n expect(result.zodSchemas.has(1)).toBe(false);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateVersionedZodFromSchema.test.js","names":["path","describe","expect","it","generateVersionedZodFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","refFieldsSchema","singleVersionSchema","twoVersionAdditiveSchema","twoVersionFieldRemovalSchema","unionTypesSchema","formatVersionedZodSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","zodSchemas","size","toBe","has","get","toContain","toMatch"],"sources":["generateVersionedZodFromSchema.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 path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateVersionedZodFromChain } from \"../generateVersionedZodFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n refFieldsSchema,\n singleVersionSchema,\n twoVersionAdditiveSchema,\n twoVersionFieldRemovalSchema,\n unionTypesSchema,\n} from \"./fixtures.js\";\nimport { formatVersionedZodSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateVersionedZodFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateVersionedZodFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"two-version additive change\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionAdditiveSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-additive.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateVersionedZodFromChain(\n resolveSchemaChain(twoVersionFieldRemovalSchema, 1),\n 1,\n );\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"schema with union types\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-types.snap\"),\n );\n });\n\n it(\"schema with ref fields\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(refFieldsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"ref-fields.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"includes value field in Zod schema for union variants that reference another union\", async () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatVersionedZodSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"union-reference-union.snap\"),\n );\n });\n\n it(\"respects minSupportedVersion default (latest only)\", () => {\n const result = generateVersionedZodFromChain(resolveSchemaChain(twoVersionAdditiveSchema));\n expect(result.zodSchemas.size).toBe(1);\n expect(result.zodSchemas.has(2)).toBe(true);\n expect(result.zodSchemas.has(1)).toBe(false);\n });\n});\n\ndescribe(\"generateVersionedZodFromChain unknown union variants\", () => {\n it(\"accepts the Unknown case in every union schema\", () => {\n const zodSchemas = generateVersionedZodFromChain(resolveSchemaChain(unionTypesSchema))\n .zodSchemas.get(1)!;\n\n expect(zodSchemas).toContain(\"export const ShapeSchema_v1Unknown = z.object({\");\n expect(zodSchemas).toContain(\"type: z.literal(\\\"unknown\\\"),\");\n expect(zodSchemas).toMatch(/z\\.discriminatedUnion\\(\"type\", \\[[^\\]]*ShapeSchema_v1Unknown/);\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -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