@palantir/pack.document-schema.type-gen 0.33.0 → 0.34.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 (74) hide show
  1. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js +1 -1
  2. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js.map +1 -1
  3. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +1 -1
  4. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -1
  5. package/build/esm/commands/ir/irDeployHandler.js +1 -1
  6. package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
  7. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  8. package/build/esm/commands/ir/irUpdateSchemaHandler.js +1 -1
  9. package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
  10. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/unionDef.js.map +1 -1
  11. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  12. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  13. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  14. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  15. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  16. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  17. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  18. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  19. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  20. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  21. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  22. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  23. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  33. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +36 -0
  34. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  35. package/build/esm/utils/ir/convertIrToWireSchema.js +9 -7
  36. package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
  37. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  38. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  39. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  40. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  41. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  42. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +31 -0
  43. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  44. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +47 -0
  45. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
  46. package/build/esm/utils/schema/generateInternalFromSchema.js +7 -0
  47. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  48. package/build/esm/utils/schema/resolveSchemaChain.js +29 -1
  49. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  50. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  51. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  52. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  53. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  54. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  55. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  56. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  57. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  58. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  59. package/build/esm/utils/steps/convertStepsToIr.js +20 -1
  60. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  61. package/build/types/commands/ir/irDeployHandler.d.ts +1 -1
  62. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  63. package/build/types/commands/ir/irGenAssetHandler.d.ts +1 -1
  64. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  65. package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
  66. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts +3 -0
  67. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts.map +1 -1
  68. package/build/types/utils/ir/convertIrToWireSchema.d.ts +2 -2
  69. package/build/types/utils/ir/convertIrToWireSchema.d.ts.map +1 -1
  70. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  71. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  72. package/build/types/utils/steps/convertStepsToIr.d.ts +2 -0
  73. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  74. package/package.json +18 -4
@@ -139,6 +139,42 @@ describe("convertIrToWireSchema", () => {
139
139
  square: "Square"
140
140
  });
141
141
  expect("union" in shape).toBe(false); // no conjure nesting
142
+ expect(JSON.parse(JSON.stringify(shape))).not.toHaveProperty("variantMetadata");
143
+ });
144
+ it("should pass through the version each later-added variant was added in", () => {
145
+ const shape = convertIrToWireSchema({
146
+ name: "Test",
147
+ description: "Test",
148
+ version: 2,
149
+ primaryModelKeys: ["Shape"],
150
+ models: {
151
+ Shape: {
152
+ type: "union",
153
+ union: {
154
+ key: "Shape",
155
+ discriminant: "type",
156
+ name: "Shape",
157
+ variants: {
158
+ circle: "Circle",
159
+ square: "Square"
160
+ },
161
+ metadata: {
162
+ addedInVersion: 1
163
+ },
164
+ variantMetadata: {
165
+ square: {
166
+ addedInVersion: 2
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }).models["Shape"];
173
+ expect(shape.variantMetadata).toEqual({
174
+ square: {
175
+ addedInVersion: 2
176
+ }
177
+ });
142
178
  });
143
179
  it("should convert value field type with FieldValueType wrapper", () => {
144
180
  const record = {
@@ -1 +1 @@
1
- {"version":3,"file":"convertIrToWireSchema.test.js","names":["describe","expect","it","IFieldValueUnion","convertIrToWireSchema","record","key","name","fields","fieldType","type","value","string","metadata","addedInVersion","addedInMinorVersion","isOptional","shape","description","version","primaryModelKeys","models","Shape","toEqual","wire","Person","toBeDefined","personModel","toBe","person","nameField","union","discriminant","variants","circle","square","shapeModel","defaultValue","R","recordModel","field","valueType","array","allowNullValue","fn","resourceRef","payload","resourceRids","boolean","datetime","docRef","documentTypeRids","double","minValue","maxValue","integer","mediaRef","modelRef","modelTypes","object","interfaceTypeRids","objectTypeRids","maxLength","text","unmanagedJson","userRef","wireValue","toBeUndefined","val","Object","entries","FooAlias","model"],"sources":["convertIrToWireSchema.test.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { FieldValueType, RecordDef, UnionDef } from \"@osdk/foundry.pack\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IModelDef,\n IRealTimeDocumentSchema,\n IRecordDef,\n IUnionDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { IFieldValueUnion } from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { convertIrToWireSchema } from \"../convertIrToWireSchema.js\";\n\ndescribe(\"convertIrToWireSchema\", () => {\n it(\"should pass through the minor version a field was added in\", () => {\n const record: IRecordDef = {\n key: \"Shape\",\n name: \"Shape\",\n fields: [\n {\n key: \"label\",\n name: \"label\",\n fieldType: { type: \"value\", value: IFieldValueUnion.string({}) },\n metadata: { addedInVersion: 2, addedInMinorVersion: 1 },\n isOptional: true,\n },\n ],\n };\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test schema\",\n version: 2,\n primaryModelKeys: [\"Shape\"],\n models: { Shape: { type: \"record\", record } as IModelDef },\n };\n\n const shape = convertIrToWireSchema(ir).models[\"Shape\"] as { type: \"record\" } & RecordDef;\n\n expect(shape.fields[0]!.metadata).toEqual({ addedInVersion: 2, addedInMinorVersion: 1 });\n });\n\n it(\"should flatten record model and rename fields correctly\", () => {\n const record: IRecordDef = {\n key: \"Person\",\n name: \"Person\",\n description: \"A person\",\n fields: [\n {\n key: \"name\",\n name: \"Name\",\n fieldType: {\n type: \"value\",\n value: IFieldValueUnion.string({}),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test schema\",\n version: 1,\n primaryModelKeys: [\"Person\"],\n models: {\n Person: { type: \"record\", record } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n\n // Top-level structure\n expect(wire.primaryModelKeys).toEqual([\"Person\"]);\n expect(wire.models).toBeDefined();\n\n // Model is flattened (no .record wrapper)\n const personModel = wire.models[\"Person\"];\n expect(personModel).toBeDefined();\n expect(personModel!.type).toBe(\"record\");\n const person = personModel as { type: \"record\" } & RecordDef;\n expect(person.key).toBe(\"Person\");\n expect(person.name).toBe(\"Person\");\n expect(\"record\" in person).toBe(false); // no conjure nesting\n\n // Field uses wire field names\n const nameField = person.fields[0]!;\n expect(nameField.key).toBe(\"name\");\n expect(nameField.fieldType).toBeDefined();\n expect(nameField.metadata).toEqual({ addedInVersion: 1 });\n });\n\n it(\"should flatten union model\", () => {\n const union: IUnionDef = {\n key: \"Shape\",\n discriminant: \"shapeType\",\n name: \"Shape\",\n variants: { circle: \"Circle\", square: \"Square\" },\n metadata: { addedInVersion: 1 },\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"Shape\"],\n models: {\n Shape: { type: \"union\", union } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n const shapeModel = wire.models[\"Shape\"];\n expect(shapeModel).toBeDefined();\n expect(shapeModel!.type).toBe(\"union\");\n const shape = shapeModel as { type: \"union\" } & UnionDef;\n\n expect(shape.key).toBe(\"Shape\");\n expect(shape.discriminant).toBe(\"shapeType\");\n expect(shape.variants).toEqual({ circle: \"Circle\", square: \"Square\" });\n expect(\"union\" in shape).toBe(false); // no conjure nesting\n });\n\n it(\"should convert value field type with FieldValueType wrapper\", () => {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"f\",\n name: \"f\",\n fieldType: {\n type: \"value\",\n value: IFieldValueUnion.string({ defaultValue: \"abc\" }),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const field = recordModel.fields[0]!;\n\n // Wire format wraps in { valueType: { type: \"string\", defaultValue: \"abc\" } }\n expect(field.fieldType).toEqual({\n type: \"value\",\n valueType: {\n type: \"string\",\n defaultValue: \"abc\",\n },\n });\n });\n\n it(\"should convert array field type with FieldValueType wrapper on elements\", () => {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"tags\",\n name: \"Tags\",\n fieldType: {\n type: \"array\",\n array: {\n allowNullValue: false,\n value: IFieldValueUnion.string({}),\n },\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const field = recordModel.fields[0]!;\n\n expect(field.fieldType).toEqual({\n type: \"array\",\n allowNullValue: false,\n value: {\n valueType: {\n type: \"string\",\n },\n },\n });\n });\n\n it(\"should flatten all field value union variants\", () => {\n const variants: Array<{\n fn: (payload: never) => IFieldValueUnion;\n type: string;\n payload: Record<string, unknown>;\n }> = [\n {\n fn: IFieldValueUnion.resourceRef,\n type: \"resourceRef\",\n payload: { resourceRids: [\"rid3\"] },\n },\n { fn: IFieldValueUnion.boolean, type: \"boolean\", payload: {} },\n { fn: IFieldValueUnion.datetime, type: \"datetime\", payload: {} },\n { fn: IFieldValueUnion.docRef, type: \"docRef\", payload: { documentTypeRids: [\"rid1\"] } },\n { fn: IFieldValueUnion.double, type: \"double\", payload: { minValue: 0, maxValue: 100 } },\n { fn: IFieldValueUnion.integer, type: \"integer\", payload: { defaultValue: 42 } },\n { fn: IFieldValueUnion.mediaRef, type: \"mediaRef\", payload: {} },\n { fn: IFieldValueUnion.modelRef, type: \"modelRef\", payload: { modelTypes: [\"Foo\"] } },\n {\n fn: IFieldValueUnion.object,\n type: \"object\",\n payload: { interfaceTypeRids: [], objectTypeRids: [\"rid2\"] },\n },\n { fn: IFieldValueUnion.string, type: \"string\", payload: { maxLength: 255 } },\n { fn: IFieldValueUnion.text, type: \"text\", payload: {} },\n { fn: IFieldValueUnion.unmanagedJson, type: \"unmanagedJson\", payload: {} },\n { fn: IFieldValueUnion.userRef, type: \"userRef\", payload: {} },\n ];\n\n for (const { fn, type, payload } of variants) {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"f\",\n name: \"f\",\n fieldType: {\n type: \"value\",\n value: fn(payload as never),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const fieldType = recordModel.fields[0]!.fieldType;\n expect(fieldType.type).toBe(\"value\");\n const wireValue = (fieldType as { type: \"value\" } & FieldValueType).valueType;\n expect(wireValue.type).toBe(type);\n // no conjure nesting key\n expect((wireValue as unknown as Record<string, unknown>)[type]).toBeUndefined();\n // Payload fields should be at top level\n for (const [key, val] of Object.entries(payload)) {\n expect((wireValue as unknown as Record<string, unknown>)[key]).toEqual(val);\n }\n }\n });\n\n it(\"should preserve declared name (not export key) for aliased models on the wire\", () => {\n const record: IRecordDef = {\n key: \"FooAlias\",\n name: \"Foo\",\n description: \"A foo\",\n fields: [],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"FooAlias\"],\n models: {\n FooAlias: { type: \"record\", record } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n const model = wire.models[\"FooAlias\"] as { type: \"record\"; name: string; key: string };\n // Wire format uses name for on-the-wire identity — must be declared name, not alias\n expect(model.name).toBe(\"Foo\");\n expect(model.key).toBe(\"FooAlias\");\n });\n\n it(\"should strip name, description, version from output\", () => {\n const ir: IRealTimeDocumentSchema = {\n name: \"My Schema\",\n description: \"My description\",\n version: 5,\n primaryModelKeys: [],\n models: {},\n };\n\n const wire = convertIrToWireSchema(ir);\n\n expect(\"name\" in wire).toBe(false);\n expect(\"description\" in wire).toBe(false);\n expect(\"version\" in wire).toBe(false);\n expect(wire.primaryModelKeys).toEqual([]);\n expect(wire.models).toEqual({});\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAO7C,SAASC,gBAAgB,QAAQ,4DAA4D;AAC7F,SAASC,qBAAqB,QAAQ,6BAA6B;AAEnEJ,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCE,EAAE,CAAC,4DAA4D,EAAE,MAAM;IACrE,MAAMG,MAAkB,GAAG;MACzBC,GAAG,EAAE,OAAO;MACZC,IAAI,EAAE,OAAO;MACbC,MAAM,EAAE,CACN;QACEF,GAAG,EAAE,OAAO;QACZC,IAAI,EAAE,OAAO;QACbE,SAAS,EAAE;UAAEC,IAAI,EAAE,OAAO;UAAEC,KAAK,EAAER,gBAAgB,CAACS,MAAM,CAAC,CAAC,CAAC;QAAE,CAAC;QAChEC,QAAQ,EAAE;UAAEC,cAAc,EAAE,CAAC;UAAEC,mBAAmB,EAAE;QAAE,CAAC;QACvDC,UAAU,EAAE;MACd,CAAC;IAEL,CAAC;IASD,MAAMC,KAAK,GAAGb,qBAAqB,CARC;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,aAAa;MAC1BC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,OAAO,CAAC;MAC3BC,MAAM,EAAE;QAAEC,KAAK,EAAE;UAAEZ,IAAI,EAAE,QAAQ;UAAEL;QAAO;MAAe;IAC3D,CAEsC,CAAC,CAACgB,MAAM,CAAC,OAAO,CAAmC;IAEzFpB,MAAM,CAACgB,KAAK,CAACT,MAAM,CAAC,CAAC,CAAC,CAAEK,QAAQ,CAAC,CAACU,OAAO,CAAC;MAAET,cAAc,EAAE,CAAC;MAAEC,mBAAmB,EAAE;IAAE,CAAC,CAAC;EAC1F,CAAC,CAAC;EAEFb,EAAE,CAAC,yDAAyD,EAAE,MAAM;IAClE,MAAMG,MAAkB,GAAG;MACzBC,GAAG,EAAE,QAAQ;MACbC,IAAI,EAAE,QAAQ;MACdW,WAAW,EAAE,UAAU;MACvBV,MAAM,EAAE,CACN;QACEF,GAAG,EAAE,MAAM;QACXC,IAAI,EAAE,MAAM;QACZE,SAAS,EAAE;UACTC,IAAI,EAAE,OAAO;UACbC,KAAK,EAAER,gBAAgB,CAACS,MAAM,CAAC,CAAC,CAAC;QACnC,CAAC;QACDC,QAAQ,EAAE;UAAEC,cAAc,EAAE;QAAE;MAChC,CAAC;IAEL,CAAC;IAYD,MAAMU,IAAI,GAAGpB,qBAAqB,CAVE;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,aAAa;MAC1BC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;MAC5BC,MAAM,EAAE;QACNI,MAAM,EAAE;UAAEf,IAAI,EAAE,QAAQ;UAAEL;QAAO;MACnC;IACF,CAEqC,CAAC;;IAEtC;IACAJ,MAAM,CAACuB,IAAI,CAACJ,gBAAgB,CAAC,CAACG,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjDtB,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,CAACK,WAAW,CAAC,CAAC;;IAEjC;IACA,MAAMC,WAAW,GAAGH,IAAI,CAACH,MAAM,CAAC,QAAQ,CAAC;IACzCpB,MAAM,CAAC0B,WAAW,CAAC,CAACD,WAAW,CAAC,CAAC;IACjCzB,MAAM,CAAC0B,WAAW,CAAEjB,IAAI,CAAC,CAACkB,IAAI,CAAC,QAAQ,CAAC;IACxC,MAAMC,MAAM,GAAGF,WAA6C;IAC5D1B,MAAM,CAAC4B,MAAM,CAACvB,GAAG,CAAC,CAACsB,IAAI,CAAC,QAAQ,CAAC;IACjC3B,MAAM,CAAC4B,MAAM,CAACtB,IAAI,CAAC,CAACqB,IAAI,CAAC,QAAQ,CAAC;IAClC3B,MAAM,CAAC,QAAQ,IAAI4B,MAAM,CAAC,CAACD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;;IAExC;IACA,MAAME,SAAS,GAAGD,MAAM,CAACrB,MAAM,CAAC,CAAC,CAAE;IACnCP,MAAM,CAAC6B,SAAS,CAACxB,GAAG,CAAC,CAACsB,IAAI,CAAC,MAAM,CAAC;IAClC3B,MAAM,CAAC6B,SAAS,CAACrB,SAAS,CAAC,CAACiB,WAAW,CAAC,CAAC;IACzCzB,MAAM,CAAC6B,SAAS,CAACjB,QAAQ,CAAC,CAACU,OAAO,CAAC;MAAET,cAAc,EAAE;IAAE,CAAC,CAAC;EAC3D,CAAC,CAAC;EAEFZ,EAAE,CAAC,4BAA4B,EAAE,MAAM;IAmBrC,MAAMsB,IAAI,GAAGpB,qBAAqB,CAVE;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,MAAM;MACnBC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,OAAO,CAAC;MAC3BC,MAAM,EAAE;QACNC,KAAK,EAAE;UAAEZ,IAAI,EAAE,OAAO;UAAEqB,KAAK,EAdR;YACvBzB,GAAG,EAAE,OAAO;YACZ0B,YAAY,EAAE,WAAW;YACzBzB,IAAI,EAAE,OAAO;YACb0B,QAAQ,EAAE;cAAEC,MAAM,EAAE,QAAQ;cAAEC,MAAM,EAAE;YAAS,CAAC;YAChDtB,QAAQ,EAAE;cAAEC,cAAc,EAAE;YAAE;UAChC;QAQkC;MAChC;IACF,CAEqC,CAAC;IACtC,MAAMsB,UAAU,GAAGZ,IAAI,CAACH,MAAM,CAAC,OAAO,CAAC;IACvCpB,MAAM,CAACmC,UAAU,CAAC,CAACV,WAAW,CAAC,CAAC;IAChCzB,MAAM,CAACmC,UAAU,CAAE1B,IAAI,CAAC,CAACkB,IAAI,CAAC,OAAO,CAAC;IACtC,MAAMX,KAAK,GAAGmB,UAA0C;IAExDnC,MAAM,CAACgB,KAAK,CAACX,GAAG,CAAC,CAACsB,IAAI,CAAC,OAAO,CAAC;IAC/B3B,MAAM,CAACgB,KAAK,CAACe,YAAY,CAAC,CAACJ,IAAI,CAAC,WAAW,CAAC;IAC5C3B,MAAM,CAACgB,KAAK,CAACgB,QAAQ,CAAC,CAACV,OAAO,CAAC;MAAEW,MAAM,EAAE,QAAQ;MAAEC,MAAM,EAAE;IAAS,CAAC,CAAC;IACtElC,MAAM,CAAC,OAAO,IAAIgB,KAAK,CAAC,CAACW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;EACxC,CAAC,CAAC;EAEF1B,EAAE,CAAC,6DAA6D,EAAE,MAAM;IACtE,MAAMG,MAAkB,GAAG;MACzBC,GAAG,EAAE,GAAG;MACRC,IAAI,EAAE,GAAG;MACTC,MAAM,EAAE,CACN;QACEF,GAAG,EAAE,GAAG;QACRC,IAAI,EAAE,GAAG;QACTE,SAAS,EAAE;UACTC,IAAI,EAAE,OAAO;UACbC,KAAK,EAAER,gBAAgB,CAACS,MAAM,CAAC;YAAEyB,YAAY,EAAE;UAAM,CAAC;QACxD,CAAC;QACDxB,QAAQ,EAAE;UAAEC,cAAc,EAAE;QAAE;MAChC,CAAC;IAEL,CAAC;IAUD,MAAMU,IAAI,GAAGpB,qBAAqB,CARE;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,MAAM;MACnBC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,GAAG,CAAC;MACvBC,MAAM,EAAE;QAAEiB,CAAC,EAAE;UAAE5B,IAAI,EAAE,QAAQ;UAAEL;QAAO;MAAe;IACvD,CAEqC,CAAC;IACtCJ,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAC,CAACK,WAAW,CAAC,CAAC;IACtCzB,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAEX,IAAI,CAAC,CAACkB,IAAI,CAAC,QAAQ,CAAC;IAC7C,MAAMW,WAAW,GAAGf,IAAI,CAACH,MAAM,CAAC,GAAG,CAAmC;IACtE,MAAMmB,KAAK,GAAGD,WAAW,CAAC/B,MAAM,CAAC,CAAC,CAAE;;IAEpC;IACAP,MAAM,CAACuC,KAAK,CAAC/B,SAAS,CAAC,CAACc,OAAO,CAAC;MAC9Bb,IAAI,EAAE,OAAO;MACb+B,SAAS,EAAE;QACT/B,IAAI,EAAE,QAAQ;QACd2B,YAAY,EAAE;MAChB;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnC,EAAE,CAAC,yEAAyE,EAAE,MAAM;IAClF,MAAMG,MAAkB,GAAG;MACzBC,GAAG,EAAE,GAAG;MACRC,IAAI,EAAE,GAAG;MACTC,MAAM,EAAE,CACN;QACEF,GAAG,EAAE,MAAM;QACXC,IAAI,EAAE,MAAM;QACZE,SAAS,EAAE;UACTC,IAAI,EAAE,OAAO;UACbgC,KAAK,EAAE;YACLC,cAAc,EAAE,KAAK;YACrBhC,KAAK,EAAER,gBAAgB,CAACS,MAAM,CAAC,CAAC,CAAC;UACnC;QACF,CAAC;QACDC,QAAQ,EAAE;UAAEC,cAAc,EAAE;QAAE;MAChC,CAAC;IAEL,CAAC;IAUD,MAAMU,IAAI,GAAGpB,qBAAqB,CARE;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,MAAM;MACnBC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,GAAG,CAAC;MACvBC,MAAM,EAAE;QAAEiB,CAAC,EAAE;UAAE5B,IAAI,EAAE,QAAQ;UAAEL;QAAO;MAAe;IACvD,CAEqC,CAAC;IACtCJ,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAC,CAACK,WAAW,CAAC,CAAC;IACtCzB,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAEX,IAAI,CAAC,CAACkB,IAAI,CAAC,QAAQ,CAAC;IAC7C,MAAMW,WAAW,GAAGf,IAAI,CAACH,MAAM,CAAC,GAAG,CAAmC;IACtE,MAAMmB,KAAK,GAAGD,WAAW,CAAC/B,MAAM,CAAC,CAAC,CAAE;IAEpCP,MAAM,CAACuC,KAAK,CAAC/B,SAAS,CAAC,CAACc,OAAO,CAAC;MAC9Bb,IAAI,EAAE,OAAO;MACbiC,cAAc,EAAE,KAAK;MACrBhC,KAAK,EAAE;QACL8B,SAAS,EAAE;UACT/B,IAAI,EAAE;QACR;MACF;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxD,MAAM+B,QAIJ,GAAG,CACH;MACEW,EAAE,EAAEzC,gBAAgB,CAAC0C,WAAW;MAChCnC,IAAI,EAAE,aAAa;MACnBoC,OAAO,EAAE;QAAEC,YAAY,EAAE,CAAC,MAAM;MAAE;IACpC,CAAC,EACD;MAAEH,EAAE,EAAEzC,gBAAgB,CAAC6C,OAAO;MAAEtC,IAAI,EAAE,SAAS;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,EAC9D;MAAEF,EAAE,EAAEzC,gBAAgB,CAAC8C,QAAQ;MAAEvC,IAAI,EAAE,UAAU;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,EAChE;MAAEF,EAAE,EAAEzC,gBAAgB,CAAC+C,MAAM;MAAExC,IAAI,EAAE,QAAQ;MAAEoC,OAAO,EAAE;QAAEK,gBAAgB,EAAE,CAAC,MAAM;MAAE;IAAE,CAAC,EACxF;MAAEP,EAAE,EAAEzC,gBAAgB,CAACiD,MAAM;MAAE1C,IAAI,EAAE,QAAQ;MAAEoC,OAAO,EAAE;QAAEO,QAAQ,EAAE,CAAC;QAAEC,QAAQ,EAAE;MAAI;IAAE,CAAC,EACxF;MAAEV,EAAE,EAAEzC,gBAAgB,CAACoD,OAAO;MAAE7C,IAAI,EAAE,SAAS;MAAEoC,OAAO,EAAE;QAAET,YAAY,EAAE;MAAG;IAAE,CAAC,EAChF;MAAEO,EAAE,EAAEzC,gBAAgB,CAACqD,QAAQ;MAAE9C,IAAI,EAAE,UAAU;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,EAChE;MAAEF,EAAE,EAAEzC,gBAAgB,CAACsD,QAAQ;MAAE/C,IAAI,EAAE,UAAU;MAAEoC,OAAO,EAAE;QAAEY,UAAU,EAAE,CAAC,KAAK;MAAE;IAAE,CAAC,EACrF;MACEd,EAAE,EAAEzC,gBAAgB,CAACwD,MAAM;MAC3BjD,IAAI,EAAE,QAAQ;MACdoC,OAAO,EAAE;QAAEc,iBAAiB,EAAE,EAAE;QAAEC,cAAc,EAAE,CAAC,MAAM;MAAE;IAC7D,CAAC,EACD;MAAEjB,EAAE,EAAEzC,gBAAgB,CAACS,MAAM;MAAEF,IAAI,EAAE,QAAQ;MAAEoC,OAAO,EAAE;QAAEgB,SAAS,EAAE;MAAI;IAAE,CAAC,EAC5E;MAAElB,EAAE,EAAEzC,gBAAgB,CAAC4D,IAAI;MAAErD,IAAI,EAAE,MAAM;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,EACxD;MAAEF,EAAE,EAAEzC,gBAAgB,CAAC6D,aAAa;MAAEtD,IAAI,EAAE,eAAe;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,EAC1E;MAAEF,EAAE,EAAEzC,gBAAgB,CAAC8D,OAAO;MAAEvD,IAAI,EAAE,SAAS;MAAEoC,OAAO,EAAE,CAAC;IAAE,CAAC,CAC/D;IAED,KAAK,MAAM;MAAEF,EAAE;MAAElC,IAAI;MAAEoC;IAAQ,CAAC,IAAIb,QAAQ,EAAE;MAC5C,MAAM5B,MAAkB,GAAG;QACzBC,GAAG,EAAE,GAAG;QACRC,IAAI,EAAE,GAAG;QACTC,MAAM,EAAE,CACN;UACEF,GAAG,EAAE,GAAG;UACRC,IAAI,EAAE,GAAG;UACTE,SAAS,EAAE;YACTC,IAAI,EAAE,OAAO;YACbC,KAAK,EAAEiC,EAAE,CAACE,OAAgB;UAC5B,CAAC;UACDjC,QAAQ,EAAE;YAAEC,cAAc,EAAE;UAAE;QAChC,CAAC;MAEL,CAAC;MAUD,MAAMU,IAAI,GAAGpB,qBAAqB,CARE;QAClCG,IAAI,EAAE,MAAM;QACZW,WAAW,EAAE,MAAM;QACnBC,OAAO,EAAE,CAAC;QACVC,gBAAgB,EAAE,CAAC,GAAG,CAAC;QACvBC,MAAM,EAAE;UAAEiB,CAAC,EAAE;YAAE5B,IAAI,EAAE,QAAQ;YAAEL;UAAO;QAAe;MACvD,CAEqC,CAAC;MACtCJ,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAC,CAACK,WAAW,CAAC,CAAC;MACtCzB,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,GAAG,CAAC,CAAEX,IAAI,CAAC,CAACkB,IAAI,CAAC,QAAQ,CAAC;MAC7C,MAAMW,WAAW,GAAGf,IAAI,CAACH,MAAM,CAAC,GAAG,CAAmC;MACtE,MAAMZ,SAAS,GAAG8B,WAAW,CAAC/B,MAAM,CAAC,CAAC,CAAC,CAAEC,SAAS;MAClDR,MAAM,CAACQ,SAAS,CAACC,IAAI,CAAC,CAACkB,IAAI,CAAC,OAAO,CAAC;MACpC,MAAMsC,SAAS,GAAIzD,SAAS,CAAwCgC,SAAS;MAC7ExC,MAAM,CAACiE,SAAS,CAACxD,IAAI,CAAC,CAACkB,IAAI,CAAClB,IAAI,CAAC;MACjC;MACAT,MAAM,CAAEiE,SAAS,CAAwCxD,IAAI,CAAC,CAAC,CAACyD,aAAa,CAAC,CAAC;MAC/E;MACA,KAAK,MAAM,CAAC7D,GAAG,EAAE8D,GAAG,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACxB,OAAO,CAAC,EAAE;QAChD7C,MAAM,CAAEiE,SAAS,CAAwC5D,GAAG,CAAC,CAAC,CAACiB,OAAO,CAAC6C,GAAG,CAAC;MAC7E;IACF;EACF,CAAC,CAAC;EAEFlE,EAAE,CAAC,+EAA+E,EAAE,MAAM;IAkBxF,MAAMsB,IAAI,GAAGpB,qBAAqB,CAVE;MAClCG,IAAI,EAAE,MAAM;MACZW,WAAW,EAAE,MAAM;MACnBC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,CAAC,UAAU,CAAC;MAC9BC,MAAM,EAAE;QACNkD,QAAQ,EAAE;UAAE7D,IAAI,EAAE,QAAQ;UAAEL,MAAM,EAbX;YACzBC,GAAG,EAAE,UAAU;YACfC,IAAI,EAAE,KAAK;YACXW,WAAW,EAAE,OAAO;YACpBV,MAAM,EAAE;UACV;QAQuC;MACrC;IACF,CAEqC,CAAC;IACtC,MAAMgE,KAAK,GAAGhD,IAAI,CAACH,MAAM,CAAC,UAAU,CAAkD;IACtF;IACApB,MAAM,CAACuE,KAAK,CAACjE,IAAI,CAAC,CAACqB,IAAI,CAAC,KAAK,CAAC;IAC9B3B,MAAM,CAACuE,KAAK,CAAClE,GAAG,CAAC,CAACsB,IAAI,CAAC,UAAU,CAAC;EACpC,CAAC,CAAC;EAEF1B,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAS9D,MAAMsB,IAAI,GAAGpB,qBAAqB,CARE;MAClCG,IAAI,EAAE,WAAW;MACjBW,WAAW,EAAE,gBAAgB;MAC7BC,OAAO,EAAE,CAAC;MACVC,gBAAgB,EAAE,EAAE;MACpBC,MAAM,EAAE,CAAC;IACX,CAEqC,CAAC;IAEtCpB,MAAM,CAAC,MAAM,IAAIuB,IAAI,CAAC,CAACI,IAAI,CAAC,KAAK,CAAC;IAClC3B,MAAM,CAAC,aAAa,IAAIuB,IAAI,CAAC,CAACI,IAAI,CAAC,KAAK,CAAC;IACzC3B,MAAM,CAAC,SAAS,IAAIuB,IAAI,CAAC,CAACI,IAAI,CAAC,KAAK,CAAC;IACrC3B,MAAM,CAACuB,IAAI,CAACJ,gBAAgB,CAAC,CAACG,OAAO,CAAC,EAAE,CAAC;IACzCtB,MAAM,CAACuB,IAAI,CAACH,MAAM,CAAC,CAACE,OAAO,CAAC,CAAC,CAAC,CAAC;EACjC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"convertIrToWireSchema.test.js","names":["describe","expect","it","IFieldValueUnion","convertIrToWireSchema","record","key","name","fields","fieldType","type","value","string","metadata","addedInVersion","addedInMinorVersion","isOptional","shape","description","version","primaryModelKeys","models","Shape","toEqual","wire","Person","toBeDefined","personModel","toBe","person","nameField","union","discriminant","variants","circle","square","shapeModel","JSON","parse","stringify","not","toHaveProperty","variantMetadata","defaultValue","R","recordModel","field","valueType","array","allowNullValue","fn","resourceRef","payload","resourceRids","boolean","datetime","docRef","documentTypeRids","double","minValue","maxValue","integer","mediaRef","modelRef","modelTypes","object","interfaceTypeRids","objectTypeRids","maxLength","text","unmanagedJson","userRef","wireValue","toBeUndefined","val","Object","entries","FooAlias","model"],"sources":["convertIrToWireSchema.test.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { FieldValueType, RecordDef, UnionDef } from \"@palantir/pack.core/generatedPlatformSdk\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IModelDef,\n IRealTimeDocumentSchema,\n IRecordDef,\n IUnionDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { IFieldValueUnion } from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { convertIrToWireSchema } from \"../convertIrToWireSchema.js\";\n\ndescribe(\"convertIrToWireSchema\", () => {\n it(\"should pass through the minor version a field was added in\", () => {\n const record: IRecordDef = {\n key: \"Shape\",\n name: \"Shape\",\n fields: [\n {\n key: \"label\",\n name: \"label\",\n fieldType: { type: \"value\", value: IFieldValueUnion.string({}) },\n metadata: { addedInVersion: 2, addedInMinorVersion: 1 },\n isOptional: true,\n },\n ],\n };\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test schema\",\n version: 2,\n primaryModelKeys: [\"Shape\"],\n models: { Shape: { type: \"record\", record } as IModelDef },\n };\n\n const shape = convertIrToWireSchema(ir).models[\"Shape\"] as { type: \"record\" } & RecordDef;\n\n expect(shape.fields[0]!.metadata).toEqual({ addedInVersion: 2, addedInMinorVersion: 1 });\n });\n\n it(\"should flatten record model and rename fields correctly\", () => {\n const record: IRecordDef = {\n key: \"Person\",\n name: \"Person\",\n description: \"A person\",\n fields: [\n {\n key: \"name\",\n name: \"Name\",\n fieldType: {\n type: \"value\",\n value: IFieldValueUnion.string({}),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test schema\",\n version: 1,\n primaryModelKeys: [\"Person\"],\n models: {\n Person: { type: \"record\", record } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n\n // Top-level structure\n expect(wire.primaryModelKeys).toEqual([\"Person\"]);\n expect(wire.models).toBeDefined();\n\n // Model is flattened (no .record wrapper)\n const personModel = wire.models[\"Person\"];\n expect(personModel).toBeDefined();\n expect(personModel!.type).toBe(\"record\");\n const person = personModel as { type: \"record\" } & RecordDef;\n expect(person.key).toBe(\"Person\");\n expect(person.name).toBe(\"Person\");\n expect(\"record\" in person).toBe(false); // no conjure nesting\n\n // Field uses wire field names\n const nameField = person.fields[0]!;\n expect(nameField.key).toBe(\"name\");\n expect(nameField.fieldType).toBeDefined();\n expect(nameField.metadata).toEqual({ addedInVersion: 1 });\n });\n\n it(\"should flatten union model\", () => {\n const union: IUnionDef = {\n key: \"Shape\",\n discriminant: \"shapeType\",\n name: \"Shape\",\n variants: { circle: \"Circle\", square: \"Square\" },\n metadata: { addedInVersion: 1 },\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"Shape\"],\n models: {\n Shape: { type: \"union\", union } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n const shapeModel = wire.models[\"Shape\"];\n expect(shapeModel).toBeDefined();\n expect(shapeModel!.type).toBe(\"union\");\n const shape = shapeModel as { type: \"union\" } & UnionDef;\n\n expect(shape.key).toBe(\"Shape\");\n expect(shape.discriminant).toBe(\"shapeType\");\n expect(shape.variants).toEqual({ circle: \"Circle\", square: \"Square\" });\n expect(\"union\" in shape).toBe(false); // no conjure nesting\n expect(JSON.parse(JSON.stringify(shape))).not.toHaveProperty(\"variantMetadata\");\n });\n\n it(\"should pass through the version each later-added variant was added in\", () => {\n const union: IUnionDef = {\n key: \"Shape\",\n discriminant: \"type\",\n name: \"Shape\",\n variants: { circle: \"Circle\", square: \"Square\" },\n metadata: { addedInVersion: 1 },\n variantMetadata: { square: { addedInVersion: 2 } },\n };\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 2,\n primaryModelKeys: [\"Shape\"],\n models: { Shape: { type: \"union\", union } as IModelDef },\n };\n\n const shape = convertIrToWireSchema(ir).models[\"Shape\"] as { type: \"union\" } & UnionDef;\n\n expect(shape.variantMetadata).toEqual({ square: { addedInVersion: 2 } });\n });\n\n it(\"should convert value field type with FieldValueType wrapper\", () => {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"f\",\n name: \"f\",\n fieldType: {\n type: \"value\",\n value: IFieldValueUnion.string({ defaultValue: \"abc\" }),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const field = recordModel.fields[0]!;\n\n // Wire format wraps in { valueType: { type: \"string\", defaultValue: \"abc\" } }\n expect(field.fieldType).toEqual({\n type: \"value\",\n valueType: {\n type: \"string\",\n defaultValue: \"abc\",\n },\n });\n });\n\n it(\"should convert array field type with FieldValueType wrapper on elements\", () => {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"tags\",\n name: \"Tags\",\n fieldType: {\n type: \"array\",\n array: {\n allowNullValue: false,\n value: IFieldValueUnion.string({}),\n },\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const field = recordModel.fields[0]!;\n\n expect(field.fieldType).toEqual({\n type: \"array\",\n allowNullValue: false,\n value: {\n valueType: {\n type: \"string\",\n },\n },\n });\n });\n\n it(\"should flatten all field value union variants\", () => {\n const variants: Array<{\n fn: (payload: never) => IFieldValueUnion;\n type: string;\n payload: Record<string, unknown>;\n }> = [\n {\n fn: IFieldValueUnion.resourceRef,\n type: \"resourceRef\",\n payload: { resourceRids: [\"rid3\"] },\n },\n { fn: IFieldValueUnion.boolean, type: \"boolean\", payload: {} },\n { fn: IFieldValueUnion.datetime, type: \"datetime\", payload: {} },\n { fn: IFieldValueUnion.docRef, type: \"docRef\", payload: { documentTypeRids: [\"rid1\"] } },\n { fn: IFieldValueUnion.double, type: \"double\", payload: { minValue: 0, maxValue: 100 } },\n { fn: IFieldValueUnion.integer, type: \"integer\", payload: { defaultValue: 42 } },\n { fn: IFieldValueUnion.mediaRef, type: \"mediaRef\", payload: {} },\n { fn: IFieldValueUnion.modelRef, type: \"modelRef\", payload: { modelTypes: [\"Foo\"] } },\n {\n fn: IFieldValueUnion.object,\n type: \"object\",\n payload: { interfaceTypeRids: [], objectTypeRids: [\"rid2\"] },\n },\n { fn: IFieldValueUnion.string, type: \"string\", payload: { maxLength: 255 } },\n { fn: IFieldValueUnion.text, type: \"text\", payload: {} },\n { fn: IFieldValueUnion.unmanagedJson, type: \"unmanagedJson\", payload: {} },\n { fn: IFieldValueUnion.userRef, type: \"userRef\", payload: {} },\n ];\n\n for (const { fn, type, payload } of variants) {\n const record: IRecordDef = {\n key: \"R\",\n name: \"R\",\n fields: [\n {\n key: \"f\",\n name: \"f\",\n fieldType: {\n type: \"value\",\n value: fn(payload as never),\n },\n metadata: { addedInVersion: 1 },\n },\n ],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"R\"],\n models: { R: { type: \"record\", record } as IModelDef },\n };\n\n const wire = convertIrToWireSchema(ir);\n expect(wire.models[\"R\"]).toBeDefined();\n expect(wire.models[\"R\"]!.type).toBe(\"record\");\n const recordModel = wire.models[\"R\"] as { type: \"record\" } & RecordDef;\n const fieldType = recordModel.fields[0]!.fieldType;\n expect(fieldType.type).toBe(\"value\");\n const wireValue = (fieldType as { type: \"value\" } & FieldValueType).valueType;\n expect(wireValue.type).toBe(type);\n // no conjure nesting key\n expect((wireValue as unknown as Record<string, unknown>)[type]).toBeUndefined();\n // Payload fields should be at top level\n for (const [key, val] of Object.entries(payload)) {\n expect((wireValue as unknown as Record<string, unknown>)[key]).toEqual(val);\n }\n }\n });\n\n it(\"should preserve declared name (not export key) for aliased models on the wire\", () => {\n const record: IRecordDef = {\n key: \"FooAlias\",\n name: \"Foo\",\n description: \"A foo\",\n fields: [],\n };\n\n const ir: IRealTimeDocumentSchema = {\n name: \"Test\",\n description: \"Test\",\n version: 1,\n primaryModelKeys: [\"FooAlias\"],\n models: {\n FooAlias: { type: \"record\", record } as IModelDef,\n },\n };\n\n const wire = convertIrToWireSchema(ir);\n const model = wire.models[\"FooAlias\"] as { type: \"record\"; name: string; key: string };\n // Wire format uses name for on-the-wire identity — must be declared name, not alias\n expect(model.name).toBe(\"Foo\");\n expect(model.key).toBe(\"FooAlias\");\n });\n\n it(\"should strip name, description, version from output\", () => {\n const ir: IRealTimeDocumentSchema = {\n name: \"My Schema\",\n description: \"My description\",\n version: 5,\n primaryModelKeys: [],\n models: {},\n };\n\n const wire = convertIrToWireSchema(ir);\n\n expect(\"name\" in wire).toBe(false);\n expect(\"description\" in wire).toBe(false);\n expect(\"version\" in wire).toBe(false);\n expect(wire.primaryModelKeys).toEqual([]);\n expect(wire.models).toEqual({});\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -20,7 +20,7 @@
20
20
  * The IR uses conjure-style tagged unions where the payload is nested under a key
21
21
  * matching the discriminant (e.g. `{ type: "record", record: { ... } }`).
22
22
  *
23
- * The Foundry API (DocumentTypeSchema from @osdk/foundry.pack) uses flat discriminated
23
+ * The Foundry API (DocumentTypeSchema from the generated platform SDK) uses flat discriminated
24
24
  * unions where payload fields are spread alongside the type discriminant
25
25
  * (e.g. `{ type: "record", key: "...", name: "...", ... }`).
26
26
  *
@@ -40,9 +40,6 @@ export function convertIrToWireSchema(ir) {
40
40
  function convertModelDef(model) {
41
41
  switch (model.type) {
42
42
  case "record":
43
- // TODO: The @osdk/foundry.pack wire types still declare `metadata` as required on
44
- // RecordDef, but the Pack API schema (api-gateway / backpack) has removed it.
45
- // Cast through unknown until the published types catch up.
46
43
  return {
47
44
  type: "record",
48
45
  key: model.record.key,
@@ -60,7 +57,8 @@ function convertModelDef(model) {
60
57
  variants: {
61
58
  ...model.union.variants
62
59
  },
63
- metadata: convertSchemaMeta(model.union.metadata)
60
+ metadata: convertSchemaMeta(model.union.metadata),
61
+ variantMetadata: convertVariantMetadata(model.union.variantMetadata)
64
62
  };
65
63
  default:
66
64
  {
@@ -114,8 +112,6 @@ function convertFieldValueType(value) {
114
112
  function convertFieldValueUnion(value) {
115
113
  switch (value.type) {
116
114
  case "resourceRef":
117
- // TODO: @osdk/foundry.pack does not yet declare the resourceRef variant. Drop the
118
- // cast once the api-gateway publish and osdk regeneration land.
119
115
  return {
120
116
  type: "resourceRef",
121
117
  resourceRids: [...value.resourceRef.resourceRids]
@@ -197,6 +193,12 @@ function convertSchemaMeta(meta) {
197
193
  deprecatedMessage: orUndefined(meta.deprecatedMessage)
198
194
  };
199
195
  }
196
+ function convertVariantMetadata(variantMetadata) {
197
+ if (variantMetadata == null) {
198
+ return undefined;
199
+ }
200
+ return Object.fromEntries(Object.entries(variantMetadata).map(([variantKey, meta]) => [variantKey, convertSchemaMeta(meta)]));
201
+ }
200
202
  function orUndefined(value) {
201
203
  return value ?? undefined;
202
204
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convertIrToWireSchema.js","names":["convertIrToWireSchema","ir","wireModels","key","model","Object","entries","models","convertModelDef","primaryModelKeys","type","record","name","description","orUndefined","fields","map","convertFieldDef","union","discriminant","variants","metadata","convertSchemaMeta","Error","field","isOptional","fieldType","convertFieldTypeUnion","allowNullValue","array","value","convertFieldValueType","set","valueType","convertFieldValueUnion","resourceRids","resourceRef","defaultValue","boolean","datetime","documentTypeRids","docRef","rejectNaN","double","minValue","maxValue","integer","mediaRef","modelTypes","modelRef","interfaceTypeRids","object","objectTypeRids","string","minLength","maxLength","text","meta","addedInVersion","addedInMinorVersion","deprecatedFromVersion","deprecatedMessage","undefined"],"sources":["convertIrToWireSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n DocumentTypeSchema,\n FieldDef,\n FieldTypeUnion,\n FieldValueType,\n FieldValueUnion,\n ModelDef,\n SchemaMetadata,\n} from \"@osdk/foundry.pack\";\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IFieldValueUnion,\n IModelDef,\n IRealTimeDocumentSchema,\n ISchemaMeta,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\n\n/**\n * Converts the internal IR schema to the wire format expected by the Foundry API.\n *\n * The IR uses conjure-style tagged unions where the payload is nested under a key\n * matching the discriminant (e.g. `{ type: \"record\", record: { ... } }`).\n *\n * The Foundry API (DocumentTypeSchema from @osdk/foundry.pack) uses flat discriminated\n * unions where payload fields are spread alongside the type discriminant\n * (e.g. `{ type: \"record\", key: \"...\", name: \"...\", ... }`).\n *\n * This function performs that structural conversion. Field names already match between\n * the IR and wire format.\n */\nexport function convertIrToWireSchema(ir: IRealTimeDocumentSchema): DocumentTypeSchema {\n const wireModels: DocumentTypeSchema[\"models\"] = {};\n\n for (const [key, model] of Object.entries(ir.models)) {\n wireModels[key] = convertModelDef(model);\n }\n\n return {\n primaryModelKeys: [...ir.primaryModelKeys],\n models: wireModels,\n };\n}\n\nfunction convertModelDef(model: IModelDef): ModelDef {\n switch (model.type) {\n case \"record\":\n // TODO: The @osdk/foundry.pack wire types still declare `metadata` as required on\n // RecordDef, but the Pack API schema (api-gateway / backpack) has removed it.\n // Cast through unknown until the published types catch up.\n return {\n type: \"record\",\n key: model.record.key,\n name: model.record.name,\n description: orUndefined(model.record.description),\n fields: [...model.record.fields.map(convertFieldDef)],\n } as unknown as ModelDef;\n case \"union\":\n return {\n type: \"union\",\n key: model.union.key,\n discriminant: model.union.discriminant,\n name: model.union.name,\n description: orUndefined(model.union.description),\n variants: { ...model.union.variants },\n metadata: convertSchemaMeta(model.union.metadata),\n };\n default: {\n const _exhaustive: never = model;\n throw new Error(`Unknown model type: ${(_exhaustive as IModelDef).type}`);\n }\n }\n}\n\nfunction convertFieldDef(field: IFieldDef): FieldDef {\n return {\n key: field.key,\n name: field.name,\n description: orUndefined(field.description),\n isOptional: orUndefined(field.isOptional),\n fieldType: convertFieldTypeUnion(field.fieldType),\n metadata: convertSchemaMeta(field.metadata),\n };\n}\n\nfunction convertFieldTypeUnion(fieldType: IFieldTypeUnion): FieldTypeUnion {\n switch (fieldType.type) {\n case \"array\":\n return {\n type: \"array\",\n allowNullValue: fieldType.array.allowNullValue,\n value: convertFieldValueType(fieldType.array.value),\n };\n case \"map\":\n return {\n type: \"map\",\n allowNullValue: fieldType.map.allowNullValue,\n key: convertFieldValueType(fieldType.map.key),\n value: convertFieldValueType(fieldType.map.value),\n };\n case \"set\":\n return {\n type: \"set\",\n allowNullValue: fieldType.set.allowNullValue,\n value: convertFieldValueType(fieldType.set.value),\n };\n case \"value\":\n return {\n type: \"value\",\n valueType: convertFieldValueUnion(fieldType.value),\n };\n }\n}\n\nfunction convertFieldValueType(value: IFieldValueUnion): FieldValueType {\n return {\n valueType: convertFieldValueUnion(value),\n };\n}\n\nfunction convertFieldValueUnion(value: IFieldValueUnion): FieldValueUnion {\n switch (value.type) {\n case \"resourceRef\":\n // TODO: @osdk/foundry.pack does not yet declare the resourceRef variant. Drop the\n // cast once the api-gateway publish and osdk regeneration land.\n return {\n type: \"resourceRef\",\n resourceRids: [...value.resourceRef.resourceRids],\n } as unknown as FieldValueUnion;\n case \"boolean\":\n return { type: \"boolean\", defaultValue: orUndefined(value.boolean.defaultValue) };\n case \"datetime\":\n return { type: \"datetime\", value: value.datetime.value };\n case \"docRef\":\n return { type: \"docRef\", documentTypeRids: [...value.docRef.documentTypeRids] };\n case \"double\":\n return {\n type: \"double\",\n defaultValue: rejectNaN(orUndefined(value.double.defaultValue)),\n minValue: rejectNaN(orUndefined(value.double.minValue)),\n maxValue: rejectNaN(orUndefined(value.double.maxValue)),\n };\n case \"integer\":\n return {\n type: \"integer\",\n defaultValue: orUndefined(value.integer.defaultValue),\n minValue: orUndefined(value.integer.minValue),\n maxValue: orUndefined(value.integer.maxValue),\n };\n case \"mediaRef\":\n return { type: \"mediaRef\", value: value.mediaRef.value };\n case \"modelRef\":\n return { type: \"modelRef\", modelTypes: [...value.modelRef.modelTypes] };\n case \"object\":\n return {\n type: \"object\",\n interfaceTypeRids: [...value.object.interfaceTypeRids],\n objectTypeRids: [...value.object.objectTypeRids],\n };\n case \"string\":\n return {\n type: \"string\",\n defaultValue: orUndefined(value.string.defaultValue),\n minLength: orUndefined(value.string.minLength),\n maxLength: orUndefined(value.string.maxLength),\n };\n case \"text\":\n return {\n type: \"text\",\n defaultValue: orUndefined(value.text.defaultValue),\n minLength: orUndefined(value.text.minLength),\n maxLength: orUndefined(value.text.maxLength),\n };\n case \"unmanagedJson\":\n return { type: \"unmanagedJson\" };\n case \"userRef\":\n return { type: \"userRef\" };\n }\n}\n\nfunction convertSchemaMeta(meta: ISchemaMeta): SchemaMetadata {\n return {\n addedInVersion: meta.addedInVersion,\n addedInMinorVersion: orUndefined(meta.addedInMinorVersion),\n deprecatedFromVersion: orUndefined(meta.deprecatedFromVersion),\n deprecatedMessage: orUndefined(meta.deprecatedMessage),\n };\n}\n\nfunction orUndefined<T>(value: T | null | undefined): T | undefined {\n return value ?? undefined;\n}\n\nfunction rejectNaN(value: number | \"NaN\" | undefined): number | undefined {\n if (value === \"NaN\") {\n throw new Error(\"NaN is not a valid double value for wire serialization\");\n }\n return value;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"convertIrToWireSchema.js","names":["convertIrToWireSchema","ir","wireModels","key","model","Object","entries","models","convertModelDef","primaryModelKeys","type","record","name","description","orUndefined","fields","map","convertFieldDef","union","discriminant","variants","metadata","convertSchemaMeta","variantMetadata","convertVariantMetadata","Error","field","isOptional","fieldType","convertFieldTypeUnion","allowNullValue","array","value","convertFieldValueType","set","valueType","convertFieldValueUnion","resourceRids","resourceRef","defaultValue","boolean","datetime","documentTypeRids","docRef","rejectNaN","double","minValue","maxValue","integer","mediaRef","modelTypes","modelRef","interfaceTypeRids","object","objectTypeRids","string","minLength","maxLength","text","meta","addedInVersion","addedInMinorVersion","deprecatedFromVersion","deprecatedMessage","undefined","fromEntries","variantKey"],"sources":["convertIrToWireSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n DocumentTypeSchema,\n FieldDef,\n FieldTypeUnion,\n FieldValueType,\n FieldValueUnion,\n ModelDef,\n SchemaMetadata,\n} from \"@palantir/pack.core/generatedPlatformSdk\";\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IFieldValueUnion,\n IModelDef,\n IRealTimeDocumentSchema,\n ISchemaMeta,\n IUnionDef,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\n\n/**\n * Converts the internal IR schema to the wire format expected by the Foundry API.\n *\n * The IR uses conjure-style tagged unions where the payload is nested under a key\n * matching the discriminant (e.g. `{ type: \"record\", record: { ... } }`).\n *\n * The Foundry API (DocumentTypeSchema from the generated platform SDK) uses flat discriminated\n * unions where payload fields are spread alongside the type discriminant\n * (e.g. `{ type: \"record\", key: \"...\", name: \"...\", ... }`).\n *\n * This function performs that structural conversion. Field names already match between\n * the IR and wire format.\n */\nexport function convertIrToWireSchema(ir: IRealTimeDocumentSchema): DocumentTypeSchema {\n const wireModels: DocumentTypeSchema[\"models\"] = {};\n\n for (const [key, model] of Object.entries(ir.models)) {\n wireModels[key] = convertModelDef(model);\n }\n\n return {\n primaryModelKeys: [...ir.primaryModelKeys],\n models: wireModels,\n };\n}\n\nfunction convertModelDef(model: IModelDef): ModelDef {\n switch (model.type) {\n case \"record\":\n return {\n type: \"record\",\n key: model.record.key,\n name: model.record.name,\n description: orUndefined(model.record.description),\n fields: [...model.record.fields.map(convertFieldDef)],\n };\n case \"union\":\n return {\n type: \"union\",\n key: model.union.key,\n discriminant: model.union.discriminant,\n name: model.union.name,\n description: orUndefined(model.union.description),\n variants: { ...model.union.variants },\n metadata: convertSchemaMeta(model.union.metadata),\n variantMetadata: convertVariantMetadata(model.union.variantMetadata),\n };\n default: {\n const _exhaustive: never = model;\n throw new Error(`Unknown model type: ${(_exhaustive as IModelDef).type}`);\n }\n }\n}\n\nfunction convertFieldDef(field: IFieldDef): FieldDef {\n return {\n key: field.key,\n name: field.name,\n description: orUndefined(field.description),\n isOptional: orUndefined(field.isOptional),\n fieldType: convertFieldTypeUnion(field.fieldType),\n metadata: convertSchemaMeta(field.metadata),\n };\n}\n\nfunction convertFieldTypeUnion(fieldType: IFieldTypeUnion): FieldTypeUnion {\n switch (fieldType.type) {\n case \"array\":\n return {\n type: \"array\",\n allowNullValue: fieldType.array.allowNullValue,\n value: convertFieldValueType(fieldType.array.value),\n };\n case \"map\":\n return {\n type: \"map\",\n allowNullValue: fieldType.map.allowNullValue,\n key: convertFieldValueType(fieldType.map.key),\n value: convertFieldValueType(fieldType.map.value),\n };\n case \"set\":\n return {\n type: \"set\",\n allowNullValue: fieldType.set.allowNullValue,\n value: convertFieldValueType(fieldType.set.value),\n };\n case \"value\":\n return {\n type: \"value\",\n valueType: convertFieldValueUnion(fieldType.value),\n };\n }\n}\n\nfunction convertFieldValueType(value: IFieldValueUnion): FieldValueType {\n return {\n valueType: convertFieldValueUnion(value),\n };\n}\n\nfunction convertFieldValueUnion(value: IFieldValueUnion): FieldValueUnion {\n switch (value.type) {\n case \"resourceRef\":\n return {\n type: \"resourceRef\",\n resourceRids: [...value.resourceRef.resourceRids],\n };\n case \"boolean\":\n return { type: \"boolean\", defaultValue: orUndefined(value.boolean.defaultValue) };\n case \"datetime\":\n return { type: \"datetime\", value: value.datetime.value };\n case \"docRef\":\n return { type: \"docRef\", documentTypeRids: [...value.docRef.documentTypeRids] };\n case \"double\":\n return {\n type: \"double\",\n defaultValue: rejectNaN(orUndefined(value.double.defaultValue)),\n minValue: rejectNaN(orUndefined(value.double.minValue)),\n maxValue: rejectNaN(orUndefined(value.double.maxValue)),\n };\n case \"integer\":\n return {\n type: \"integer\",\n defaultValue: orUndefined(value.integer.defaultValue),\n minValue: orUndefined(value.integer.minValue),\n maxValue: orUndefined(value.integer.maxValue),\n };\n case \"mediaRef\":\n return { type: \"mediaRef\", value: value.mediaRef.value };\n case \"modelRef\":\n return { type: \"modelRef\", modelTypes: [...value.modelRef.modelTypes] };\n case \"object\":\n return {\n type: \"object\",\n interfaceTypeRids: [...value.object.interfaceTypeRids],\n objectTypeRids: [...value.object.objectTypeRids],\n };\n case \"string\":\n return {\n type: \"string\",\n defaultValue: orUndefined(value.string.defaultValue),\n minLength: orUndefined(value.string.minLength),\n maxLength: orUndefined(value.string.maxLength),\n };\n case \"text\":\n return {\n type: \"text\",\n defaultValue: orUndefined(value.text.defaultValue),\n minLength: orUndefined(value.text.minLength),\n maxLength: orUndefined(value.text.maxLength),\n };\n case \"unmanagedJson\":\n return { type: \"unmanagedJson\" };\n case \"userRef\":\n return { type: \"userRef\" };\n }\n}\n\nfunction convertSchemaMeta(meta: ISchemaMeta): SchemaMetadata {\n return {\n addedInVersion: meta.addedInVersion,\n addedInMinorVersion: orUndefined(meta.addedInMinorVersion),\n deprecatedFromVersion: orUndefined(meta.deprecatedFromVersion),\n deprecatedMessage: orUndefined(meta.deprecatedMessage),\n };\n}\n\nfunction convertVariantMetadata(\n variantMetadata: IUnionDef[\"variantMetadata\"],\n): Record<string, SchemaMetadata> | undefined {\n if (variantMetadata == null) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(variantMetadata).map((\n [variantKey, meta],\n ) => [variantKey, convertSchemaMeta(meta)]),\n );\n}\n\nfunction orUndefined<T>(value: T | null | undefined): T | undefined {\n return value ?? undefined;\n}\n\nfunction rejectNaN(value: number | \"NaN\" | undefined): number | undefined {\n if (value === \"NaN\") {\n throw new Error(\"NaN is not a valid double value for wire serialization\");\n }\n return value;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,7 +2,7 @@
2
2
  // documentType.ts
3
3
  // ============================================================
4
4
 
5
- /* Generated by @palantir/pack.document-schema.type-gen@0.33.0 */
5
+ /* Generated by @palantir/pack.document-schema.type-gen@0.34.0 */
6
6
 
7
7
  export const DOCUMENT_TYPE_NAME = 'Canvas Document Type';
8
8
  export const DOCUMENT_TYPE_DESCRIPTION = 'Document type description for demo canvas';
@@ -1 +1 @@
1
- {"version":3,"file":"with-name-and-description.js","names":["DOCUMENT_TYPE_NAME","DOCUMENT_TYPE_DESCRIPTION"],"sources":["with-name-and-description.ts"],"sourcesContent":["// ============================================================\n// documentType.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.33.0 */\n\nexport const DOCUMENT_TYPE_NAME = 'Canvas Document Type';\nexport const DOCUMENT_TYPE_DESCRIPTION =\n 'Document type description for demo canvas';\n"],"mappings":"AAAA;AACA;AACA;;AAEA;;AAEA,OAAO,MAAMA,kBAAkB,GAAG,sBAAsB;AACxD,OAAO,MAAMC,yBAAyB,GACpC,2CAA2C","ignoreList":[]}
1
+ {"version":3,"file":"with-name-and-description.js","names":["DOCUMENT_TYPE_NAME","DOCUMENT_TYPE_DESCRIPTION"],"sources":["with-name-and-description.ts"],"sourcesContent":["// ============================================================\n// documentType.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.34.0 */\n\nexport const DOCUMENT_TYPE_NAME = 'Canvas Document Type';\nexport const DOCUMENT_TYPE_DESCRIPTION =\n 'Document type description for demo canvas';\n"],"mappings":"AAAA;AACA;AACA;;AAEA;;AAEA,OAAO,MAAMA,kBAAkB,GAAG,sBAAsB;AACxD,OAAO,MAAMC,yBAAyB,GACpC,2CAA2C","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"single-version.js","names":[],"sources":["single-version.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.33.0 */\n\nexport type SupportedVersions = 1;\nexport type LatestVersion = 1;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"single-version.js","names":[],"sources":["single-version.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.34.0 */\n\nexport type SupportedVersions = 1;\nexport type LatestVersion = 1;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"three-version-chain.js","names":[],"sources":["three-version-chain.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.33.0 */\n\nexport type SupportedVersions = 1 | 2 | 3;\nexport type LatestVersion = 3;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"three-version-chain.js","names":[],"sources":["three-version-chain.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.34.0 */\n\nexport type SupportedVersions = 1 | 2 | 3;\nexport type LatestVersion = 3;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"two-version.js","names":[],"sources":["two-version.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.33.0 */\n\nexport type SupportedVersions = 1 | 2;\nexport type LatestVersion = 2;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"two-version.js","names":[],"sources":["two-version.ts"],"sourcesContent":["// ============================================================\n// versions.ts\n// ============================================================\n\n/* Generated by @palantir/pack.document-schema.type-gen@0.34.0 */\n\nexport type SupportedVersions = 1 | 2;\nexport type LatestVersion = 2;\nexport type MinSupportedVersion = 1;\n"],"mappings":"","ignoreList":[]}
@@ -94,4 +94,35 @@ describe("generateInternalFromChain minor versions", () => {
94
94
  expect(result.internalTypes).toContain("readonly label?: string;");
95
95
  });
96
96
  });
97
+ describe("generateInternalFromChain union variants", () => {
98
+ it("records the version of a variant added after the union", () => {
99
+ const Circle = defineRecord("Circle", {
100
+ docs: "",
101
+ fields: {
102
+ radius: P.Double
103
+ }
104
+ });
105
+ const Square = defineRecord("Square", {
106
+ docs: "",
107
+ fields: {
108
+ side: P.Double
109
+ }
110
+ });
111
+ const v1 = defineSchema({
112
+ Circle,
113
+ Square,
114
+ Shape: P.defineUnion("Shape", {
115
+ docs: "",
116
+ variants: {
117
+ circle: Circle
118
+ }
119
+ })
120
+ });
121
+ const v2 = nextSchema(v1).addSchemaUpdate(defineSchemaUpdate("addSquare", schema => ({
122
+ Shape: schema.Shape.addVariant("square", Square).build()
123
+ }))).build();
124
+ const result = generateInternalFromChain(resolveSchemaChain(v2));
125
+ expect(result.upgrades).toContain("variantAddedInVersions: {\n \"square\": 2,\n },");
126
+ });
127
+ });
97
128
  //# sourceMappingURL=generateInternalFromSchema.test.js.map
@@ -1 +1 @@
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":[]}
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","Circle","radius","Double","Square","side","defineUnion","variants","circle","v2","addVariant"],"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\ndescribe(\"generateInternalFromChain union variants\", () => {\n it(\"records the version of a variant added after the union\", () => {\n const Circle = defineRecord(\"Circle\", { docs: \"\", fields: { radius: P.Double } });\n const Square = defineRecord(\"Square\", { docs: \"\", fields: { side: P.Double } });\n const v1 = defineSchema({\n Circle,\n Square,\n Shape: P.defineUnion(\"Shape\", { docs: \"\", variants: { circle: Circle } }),\n });\n const v2 = nextSchema(v1)\n .addSchemaUpdate(defineSchemaUpdate(\"addSquare\", schema => ({\n Shape: schema.Shape.addVariant(\"square\", Square).build(),\n })))\n .build();\n\n const result = generateInternalFromChain(resolveSchemaChain(v2));\n\n expect(result.upgrades).toContain(\"variantAddedInVersions: {\\n \\\"square\\\": 2,\\n },\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -137,6 +137,53 @@ describe("resolveSchemaChain — union provenance", () => {
137
137
  expect(union.union.metadata.addedInVersion).toBe(1);
138
138
  }
139
139
  });
140
+ it("records the version of a variant added after the union, and only that variant", () => {
141
+ const Circle = defineRecord("Circle", {
142
+ docs: "",
143
+ fields: {
144
+ radius: P.Double
145
+ }
146
+ });
147
+ const Square = defineRecord("Square", {
148
+ docs: "",
149
+ fields: {
150
+ side: P.Double
151
+ }
152
+ });
153
+ const shapes = defineSchema({
154
+ Circle,
155
+ Square,
156
+ Shape: P.defineUnion("Shape", {
157
+ docs: "",
158
+ variants: {
159
+ circle: Circle
160
+ }
161
+ })
162
+ });
163
+ const addSquare = nextSchema(shapes).addSchemaUpdate(defineSchemaUpdate("addSquare", schema => ({
164
+ Shape: schema.Shape.addVariant("square", Square).build()
165
+ }))).build();
166
+ const v3 = nextSchema(addSquare).build();
167
+ const {
168
+ chain
169
+ } = resolveSchemaChain(v3);
170
+ const unions = chain.map(entry => {
171
+ const model = entry.ir.models.Shape;
172
+ if (model.type !== "union") throw new Error("Shape should be a union");
173
+ return model.union;
174
+ });
175
+ expect(unions[0]).not.toHaveProperty("variantMetadata");
176
+ expect(unions[1].variantMetadata).toEqual({
177
+ square: {
178
+ addedInVersion: 2
179
+ }
180
+ });
181
+ expect(unions[2].variantMetadata).toEqual({
182
+ square: {
183
+ addedInVersion: 2
184
+ }
185
+ });
186
+ });
140
187
  });
141
188
  describe("resolveSchemaChain minor versions", () => {
142
189
  const v1 = defineSchema({
@@ -1 +1 @@
1
- {"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","collapseChainToMajors","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","latestVersion","minVersion","major","minor","toEqual","undefined","toThrow","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union","v2_1","bump","minorVersion","label","addedInMinorVersion","toHaveLength","collapsed","migrations"],"sources":["resolveSchemaChain.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n collapseChainToMajors,\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"caps the chain at maxVersion\", () => {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v2, 1, {}, {\n major: 1,\n minor: 0,\n });\n\n expect(chain.map(entry => entry.version)).toEqual([1]);\n expect(latestVersion).toBe(1);\n expect(minVersion).toBe(1);\n });\n\n it(\"rejects a maxVersion that is not in the chain\", () => {\n expect(() => resolveSchemaChain(v2, undefined, {}, { major: 3, minor: 0 })).toThrow(\n \"maxVersion 3 is not in the schema chain\",\n );\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n});\n\ndescribe(\"resolveSchemaChain minor versions\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", { docs: \"A box\", fields: { color: P.String } }),\n });\n const v2 = nextSchema(v1)\n .addSchemaUpdate(defineSchemaUpdate(\"addFill\", (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .build(),\n })))\n .build();\n const v2_1 = nextSchema(v2, { bump: \"minor\" })\n .addSchemaUpdate(\n defineSchemaUpdate(\"addLabel\", (schema: P.SchemaBuilder<typeof v2.models>) => ({\n ShapeBox: schema.ShapeBox.addField(\"label\", P.Optional(P.String)).build(),\n })),\n )\n .build();\n\n it(\"records the minor version on chain entries and on fields added in a minor version\", () => {\n const { chain, latestVersion } = resolveSchemaChain(v2_1);\n\n expect(chain.map(entry => [entry.version, entry.minorVersion])).toEqual([\n [1, undefined],\n [2, undefined],\n [2, 1],\n ]);\n expect(latestVersion).toBe(2);\n\n const fields = fieldsByKey(chain[2]!, \"ShapeBox\");\n expect(fields.label!.metadata).toEqual({ addedInVersion: 2, addedInMinorVersion: 1 });\n expect(fields.fillColor!.metadata).toEqual({ addedInVersion: 2 });\n });\n\n it(\"caps the chain at a minor version or at a .0 version\", () => {\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 1 }).chain).toHaveLength(3);\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 0 }).chain).toHaveLength(2);\n expect(() => resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 2 })).toThrow(\n \"maxVersion 2.2 is not in the schema chain (available versions: 1, 2, 2.1)\",\n );\n });\n\n it(\"collapseChainToMajors keeps the last minor's IR and the major's migrations\", () => {\n const { chain } = resolveSchemaChain(v2_1);\n const collapsed = collapseChainToMajors(chain);\n\n expect(collapsed.map(entry => entry.version)).toEqual([1, 2]);\n expect(collapsed[1]!.minorVersion).toBeUndefined();\n expect(fieldsByKey(collapsed[1]!, \"ShapeBox\").label).toBeDefined();\n expect(collapsed[1]!.migrations).toEqual({\n ShapeBox: { fillColor: { derivedFrom: [\"color\"] } },\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","collapseChainToMajors","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","latestVersion","minVersion","major","minor","toEqual","undefined","toThrow","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union","Circle","radius","Square","side","shapes","Shape","circle","addSquare","addVariant","v3","unions","not","toHaveProperty","variantMetadata","square","v2_1","bump","minorVersion","label","addedInMinorVersion","toHaveLength","collapsed","migrations"],"sources":["resolveSchemaChain.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n collapseChainToMajors,\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"caps the chain at maxVersion\", () => {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v2, 1, {}, {\n major: 1,\n minor: 0,\n });\n\n expect(chain.map(entry => entry.version)).toEqual([1]);\n expect(latestVersion).toBe(1);\n expect(minVersion).toBe(1);\n });\n\n it(\"rejects a maxVersion that is not in the chain\", () => {\n expect(() => resolveSchemaChain(v2, undefined, {}, { major: 3, minor: 0 })).toThrow(\n \"maxVersion 3 is not in the schema chain\",\n );\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n\n it(\"records the version of a variant added after the union, and only that variant\", () => {\n const Circle = defineRecord(\"Circle\", { docs: \"\", fields: { radius: P.Double } });\n const Square = defineRecord(\"Square\", { docs: \"\", fields: { side: P.Double } });\n const shapes = defineSchema({\n Circle,\n Square,\n Shape: P.defineUnion(\"Shape\", { docs: \"\", variants: { circle: Circle } }),\n });\n const addSquare = nextSchema(shapes)\n .addSchemaUpdate(defineSchemaUpdate(\"addSquare\", schema => ({\n Shape: schema.Shape.addVariant(\"square\", Square).build(),\n })))\n .build();\n const v3 = nextSchema(addSquare).build();\n\n const { chain } = resolveSchemaChain(v3);\n const unions = chain.map(entry => {\n const model = entry.ir.models.Shape!;\n if (model.type !== \"union\") throw new Error(\"Shape should be a union\");\n return model.union;\n });\n\n expect(unions[0]).not.toHaveProperty(\"variantMetadata\");\n expect(unions[1]!.variantMetadata).toEqual({ square: { addedInVersion: 2 } });\n expect(unions[2]!.variantMetadata).toEqual({ square: { addedInVersion: 2 } });\n });\n});\n\ndescribe(\"resolveSchemaChain minor versions\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", { docs: \"A box\", fields: { color: P.String } }),\n });\n const v2 = nextSchema(v1)\n .addSchemaUpdate(defineSchemaUpdate(\"addFill\", (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .build(),\n })))\n .build();\n const v2_1 = nextSchema(v2, { bump: \"minor\" })\n .addSchemaUpdate(\n defineSchemaUpdate(\"addLabel\", (schema: P.SchemaBuilder<typeof v2.models>) => ({\n ShapeBox: schema.ShapeBox.addField(\"label\", P.Optional(P.String)).build(),\n })),\n )\n .build();\n\n it(\"records the minor version on chain entries and on fields added in a minor version\", () => {\n const { chain, latestVersion } = resolveSchemaChain(v2_1);\n\n expect(chain.map(entry => [entry.version, entry.minorVersion])).toEqual([\n [1, undefined],\n [2, undefined],\n [2, 1],\n ]);\n expect(latestVersion).toBe(2);\n\n const fields = fieldsByKey(chain[2]!, \"ShapeBox\");\n expect(fields.label!.metadata).toEqual({ addedInVersion: 2, addedInMinorVersion: 1 });\n expect(fields.fillColor!.metadata).toEqual({ addedInVersion: 2 });\n });\n\n it(\"caps the chain at a minor version or at a .0 version\", () => {\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 1 }).chain).toHaveLength(3);\n expect(resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 0 }).chain).toHaveLength(2);\n expect(() => resolveSchemaChain(v2_1, undefined, {}, { major: 2, minor: 2 })).toThrow(\n \"maxVersion 2.2 is not in the schema chain (available versions: 1, 2, 2.1)\",\n );\n });\n\n it(\"collapseChainToMajors keeps the last minor's IR and the major's migrations\", () => {\n const { chain } = resolveSchemaChain(v2_1);\n const collapsed = collapseChainToMajors(chain);\n\n expect(collapsed.map(entry => entry.version)).toEqual([1, 2]);\n expect(collapsed[1]!.minorVersion).toBeUndefined();\n expect(fieldsByKey(collapsed[1]!, \"ShapeBox\").label).toBeDefined();\n expect(collapsed[1]!.migrations).toEqual({\n ShapeBox: { fillColor: { derivedFrom: [\"color\"] } },\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -279,6 +279,13 @@ function generateUpgrades(allRecordModels, latestIr) {
279
279
  output += ` "${variantKey}": "${variantModelKey}",\n`;
280
280
  }
281
281
  output += ` },\n`;
282
+ if (union.variantMetadata != null) {
283
+ output += ` variantAddedInVersions: {\n`;
284
+ for (const [variantKey, meta] of Object.entries(union.variantMetadata)) {
285
+ output += ` "${variantKey}": ${meta.addedInVersion},\n`;
286
+ }
287
+ output += ` },\n`;
288
+ }
282
289
  output += `};\n\n`;
283
290
  }
284
291
  return output;