@palantir/pack.document-schema.type-gen 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/build/esm/cli.js +0 -2
- package/build/esm/cli.js.map +1 -1
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +88 -0
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -0
- package/build/esm/commands/ir/irDeployHandler.js +69 -17
- package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
- package/build/esm/commands/ir/irGenAssetHandler.js +3 -34
- package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
- package/build/esm/commands/{asset/assetUpdateSchemaHandler.js → ir/irUpdateSchemaHandler.js} +26 -31
- package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -0
- package/build/esm/commands/ir/registerIrCommands.js +3 -1
- package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
- package/build/esm/commands/ir/resolveIrInput.js +50 -0
- package/build/esm/commands/ir/resolveIrInput.js.map +1 -0
- package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaIrHandler.js +14 -4
- package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
- package/build/esm/commands/types.js.map +1 -1
- package/build/esm/commands/{asset → utils}/__tests__/buildPrefixRewriteFetch.test.js +1 -1
- package/build/esm/commands/utils/__tests__/buildPrefixRewriteFetch.test.js.map +1 -0
- package/build/esm/commands/utils/firstPartyPrefix.js +47 -0
- package/build/esm/commands/utils/firstPartyPrefix.js.map +1 -0
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/fixtures.js +11 -0
- package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +6 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +13 -0
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
- package/build/esm/utils/schema/generateInternalFromSchema.js +54 -33
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +12 -10
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js +13 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
- package/build/esm/utils/schema/resolveSchemaChain.js +37 -11
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
- package/build/types/cli.d.ts.map +1 -1
- package/build/types/commands/ir/__tests__/resolveIrInput.test.d.ts +2 -0
- package/build/types/commands/ir/__tests__/resolveIrInput.test.d.ts.map +1 -0
- package/build/types/commands/ir/irDeployHandler.d.ts +8 -2
- package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irUpdateSchemaHandler.d.ts +15 -0
- package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -0
- package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
- package/build/types/commands/ir/resolveIrInput.d.ts +8 -0
- package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -0
- package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
- package/build/types/commands/schema/schemaIrHandler.d.ts +4 -3
- package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
- package/build/types/commands/types.d.ts +1 -3
- package/build/types/commands/types.d.ts.map +1 -1
- package/build/types/commands/utils/__tests__/buildPrefixRewriteFetch.test.d.ts.map +1 -0
- package/build/types/commands/{asset/assetDeployHandler.d.ts → utils/firstPartyPrefix.d.ts} +2 -11
- package/build/types/commands/utils/firstPartyPrefix.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts +1 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/resolveSchemaChain.d.ts +13 -5
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
- package/package.json +3 -3
- package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js.map +0 -1
- package/build/esm/commands/asset/assetDeployHandler.js +0 -95
- package/build/esm/commands/asset/assetDeployHandler.js.map +0 -1
- package/build/esm/commands/asset/assetUpdateSchemaHandler.js.map +0 -1
- package/build/esm/commands/asset/registerAssetCommands.js +0 -24
- package/build/esm/commands/asset/registerAssetCommands.js.map +0 -1
- package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts.map +0 -1
- package/build/types/commands/asset/assetDeployHandler.d.ts.map +0 -1
- package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts +0 -12
- package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts.map +0 -1
- package/build/types/commands/asset/registerAssetCommands.d.ts +0 -3
- package/build/types/commands/asset/registerAssetCommands.d.ts.map +0 -1
- /package/build/types/commands/{asset → utils}/__tests__/buildPrefixRewriteFetch.test.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.js","names":["defineRecord","defineSchema","defineSchemaUpdate","defineUnion","modelToRef","nextSchema","P","singleVersionModels","ShapeBox","docs","fields","left","Double","right","top","bottom","color","Optional","String","singleVersionSchemaNarrow","singleVersionSchema","twoVersionFieldRemovalSchema","type","models","fillColor","strokeColor","opacity","version","previous","addFillColorUpdate","schema","addField","build","twoVersionAdditiveSchema","addSchemaUpdate","CircleRecord","radius","DocRef","UserRefField","refFieldsSchema","Circle","Drawing","mainShape","extraShapes","Array","background","attachment","owner","RectangleRecord","width","height","unionTypesSchema","Rectangle","Shape","variants","circle","rectangle","nestedOptionalsSchema","Config","tags","scores","label","twoVersionDerivedFieldsSchema","migrations","derivedFrom","aliasedEntryNameSchema","FooAlias","name","AnimalRecord","species","PlantRecord","genus","LivingBeingUnion","animal","plant","nestedUnionSchema","Animal","Plant","LivingBeing","Entity","livingBeing","optionalToRequiredFieldSchema","v1","Item","threeVersionChainSchema","v1Models","v2Models","hexColor","v3Models"],"sources":["fixtures.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SchemaBuilder, SchemaDefinition } from \"@palantir/pack.schema\";\nimport {\n defineRecord,\n defineSchema,\n defineSchemaUpdate,\n defineUnion,\n modelToRef,\n nextSchema,\n} from \"@palantir/pack.schema\";\nimport * as P from \"@palantir/pack.schema\";\n\n/** Single-version schema: ShapeBox with 5 fields */\nconst singleVersionModels = {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n color: P.Optional(P.String),\n },\n }),\n};\nconst singleVersionSchemaNarrow = defineSchema(singleVersionModels);\nexport const singleVersionSchema: SchemaDefinition = singleVersionSchemaNarrow;\n\n/** Two-version schema with field removal (color removed, fillColor + strokeColor + opacity added) */\nexport const twoVersionFieldRemovalSchema: SchemaDefinition = {\n type: \"versioned\",\n models: {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n fillColor: P.Optional(P.String),\n strokeColor: P.Optional(P.String),\n opacity: P.Optional(P.Double),\n },\n }),\n },\n version: 2,\n previous: singleVersionSchema,\n};\n\n/** Two-version schema with additive change only (adds fillColor) */\nconst addFillColorUpdate = defineSchemaUpdate(\n \"addFillColor\",\n (schema: SchemaBuilder<typeof singleVersionModels>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String))\n .build(),\n }),\n);\n\nexport const twoVersionAdditiveSchema: SchemaDefinition = nextSchema(singleVersionSchemaNarrow)\n .addSchemaUpdate(addFillColorUpdate)\n .build();\n\n/** Schema with ref fields: tests import paths for record refs, DocumentRef, UserRef */\nconst CircleRecord = defineRecord(\"Circle\", {\n docs: \"A circle\",\n fields: {\n radius: P.Double,\n },\n});\n\nconst DocRef: P.DocRef = { type: \"docRef\" };\nconst UserRefField: P.UserRef = { type: \"userRef\" };\n\nexport const refFieldsSchema: SchemaDefinition = defineSchema({\n Circle: CircleRecord,\n Drawing: defineRecord(\"Drawing\", {\n docs: \"A drawing with references\",\n fields: {\n mainShape: CircleRecord,\n extraShapes: P.Array(modelToRef(CircleRecord)),\n background: P.Optional(modelToRef(CircleRecord)),\n attachment: DocRef,\n owner: P.Optional(UserRefField),\n },\n }),\n});\n\n/** Schema with union types: tests union variant interfaces, discriminated union, and type guards */\nconst RectangleRecord = defineRecord(\"Rectangle\", {\n docs: \"A rectangle\",\n fields: {\n width: P.Double,\n height: P.Double,\n },\n});\n\nexport const unionTypesSchema: SchemaDefinition = defineSchema({\n Circle: CircleRecord,\n Rectangle: RectangleRecord,\n Shape: defineUnion(\"Shape\", {\n docs: \"A shape\",\n variants: {\n circle: CircleRecord,\n rectangle: RectangleRecord,\n },\n }),\n});\n\n/** Schema with nested optionals: tests that optional inside array structures is preserved */\nexport const nestedOptionalsSchema: SchemaDefinition = defineSchema({\n Config: defineRecord(\"Config\", {\n docs: \"A config with nested optional fields\",\n fields: {\n tags: P.Array(P.Optional(P.String)),\n scores: P.Array(P.Optional(P.Double)),\n label: P.Optional(P.String),\n },\n }),\n});\n\n/** Two-version schema with derived fields (color split into fillColor + strokeColor) */\nexport const twoVersionDerivedFieldsSchema: SchemaDefinition = {\n type: \"versioned\",\n models: {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n fillColor: P.Optional(P.String),\n strokeColor: P.Optional(P.String),\n opacity: P.Optional(P.Double),\n },\n }),\n },\n version: 2,\n previous: singleVersionSchema,\n migrations: {\n ShapeBox: {\n fillColor: {\n derivedFrom: [\"color\"],\n },\n strokeColor: {\n derivedFrom: [\"color\"],\n },\n },\n },\n};\n\n/** Schema with aliased export key: export key \"FooAlias\" differs from model name \"Foo\" */\nexport const aliasedEntryNameSchema: SchemaDefinition = defineSchema({\n FooAlias: defineRecord(\"Foo\", {\n docs: \"A record exported under an alias\",\n fields: {\n name: P.String,\n },\n }),\n});\n\n/** Schema with nested union: Entity union has a variant that points to another union (LivingBeing) */\nconst AnimalRecord = defineRecord(\"Animal\", {\n docs: \"An animal\",\n fields: { species: P.String },\n});\n\nconst PlantRecord = defineRecord(\"Plant\", {\n docs: \"A plant\",\n fields: { genus: P.String },\n});\n\nconst LivingBeingUnion = defineUnion(\"LivingBeing\", {\n docs: \"A living being\",\n variants: {\n animal: AnimalRecord,\n plant: PlantRecord,\n },\n});\n\nexport const nestedUnionSchema: SchemaDefinition = defineSchema({\n Animal: AnimalRecord,\n Plant: PlantRecord,\n LivingBeing: LivingBeingUnion,\n Entity: defineUnion(\"Entity\", {\n docs: \"An entity\",\n variants: {\n livingBeing: LivingBeingUnion,\n },\n }),\n});\n\n/**\n * Two-version schema where a field starts as Optional(String) in v1 and becomes\n * required (String) in v2. The internal schema must remain optional because\n * documents written under v1 may legitimately omit the field.\n */\nexport const optionalToRequiredFieldSchema: SchemaDefinition = (() => {\n const v1 = defineSchema({\n Item: defineRecord(\"Item\", {\n docs: \"An item\",\n fields: {\n name: P.String,\n label: P.Optional(P.String),\n },\n }),\n });\n return {\n type: \"versioned\" as const,\n models: {\n Item: defineRecord(\"Item\", {\n docs: \"An item\",\n fields: {\n name: P.String,\n label: P.String,\n },\n }),\n },\n version: 2,\n previous: v1,\n };\n})();\n\n/** Three-version chain: Item (name, color -> name, hexColor -> name, hexColor, tags) */\nexport const threeVersionChainSchema: SchemaDefinition = (() => {\n const v1Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n color: P.Optional(P.String),\n },\n }),\n };\n const v2Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n hexColor: P.Optional(P.String),\n },\n }),\n };\n const v3Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n hexColor: P.Optional(P.String),\n tags: P.Optional(P.String),\n },\n }),\n };\n return {\n type: \"versioned\",\n models: v3Models,\n version: 3,\n previous: {\n type: \"versioned\",\n models: v2Models,\n version: 2,\n previous: { type: \"initial\", version: 1, models: v1Models },\n },\n };\n})();\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fixtures.js","names":["defineRecord","defineSchema","defineSchemaUpdate","defineUnion","modelToRef","nextSchema","P","singleVersionModels","ShapeBox","docs","fields","left","Double","right","top","bottom","color","Optional","String","singleVersionSchemaNarrow","singleVersionSchema","twoVersionFieldRemovalSchema","type","models","fillColor","strokeColor","opacity","version","previous","addFillColorUpdate","schema","addField","build","twoVersionAdditiveSchema","addSchemaUpdate","addOpacityRequiredUpdate","twoVersionRequiredAdditiveSchema","CircleRecord","radius","DocRef","UserRefField","refFieldsSchema","Circle","Drawing","mainShape","extraShapes","Array","background","attachment","owner","RectangleRecord","width","height","unionTypesSchema","Rectangle","Shape","variants","circle","rectangle","nestedOptionalsSchema","Config","tags","scores","label","twoVersionDerivedFieldsSchema","migrations","derivedFrom","aliasedEntryNameSchema","FooAlias","name","AnimalRecord","species","PlantRecord","genus","LivingBeingUnion","animal","plant","nestedUnionSchema","Animal","Plant","LivingBeing","Entity","livingBeing","optionalToRequiredFieldSchema","v1","Item","threeVersionChainSchema","v1Models","v2Models","hexColor","v3Models"],"sources":["fixtures.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SchemaBuilder, SchemaDefinition } from \"@palantir/pack.schema\";\nimport {\n defineRecord,\n defineSchema,\n defineSchemaUpdate,\n defineUnion,\n modelToRef,\n nextSchema,\n} from \"@palantir/pack.schema\";\nimport * as P from \"@palantir/pack.schema\";\n\n/** Single-version schema: ShapeBox with 5 fields */\nconst singleVersionModels = {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n color: P.Optional(P.String),\n },\n }),\n};\nconst singleVersionSchemaNarrow = defineSchema(singleVersionModels);\nexport const singleVersionSchema: SchemaDefinition = singleVersionSchemaNarrow;\n\n/** Two-version schema with field removal (color removed, fillColor + strokeColor + opacity added) */\nexport const twoVersionFieldRemovalSchema: SchemaDefinition = {\n type: \"versioned\",\n models: {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n fillColor: P.Optional(P.String),\n strokeColor: P.Optional(P.String),\n opacity: P.Optional(P.Double),\n },\n }),\n },\n version: 2,\n previous: singleVersionSchema,\n};\n\n/** Two-version schema with additive change only (adds fillColor) */\nconst addFillColorUpdate = defineSchemaUpdate(\n \"addFillColor\",\n (schema: SchemaBuilder<typeof singleVersionModels>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String))\n .build(),\n }),\n);\n\nexport const twoVersionAdditiveSchema: SchemaDefinition = nextSchema(singleVersionSchemaNarrow)\n .addSchemaUpdate(addFillColorUpdate)\n .build();\n\n/**\n * Two-version schema adding a *required* additive field. Drives the type\n * generator down the path where `DocumentUpgradeFns` must include a zero-arg\n * thunk for the new field — `() => Model__v<current>[field]`. Optional\n * additive fields (above) are deliberately absent from `DocumentUpgradeFns`.\n */\nconst addOpacityRequiredUpdate = defineSchemaUpdate(\n \"addOpacityRequired\",\n (schema: SchemaBuilder<typeof singleVersionModels>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"opacity\", P.Double)\n .build(),\n }),\n);\n\nexport const twoVersionRequiredAdditiveSchema: SchemaDefinition = nextSchema(\n singleVersionSchemaNarrow,\n).addSchemaUpdate(addOpacityRequiredUpdate).build();\n\n/** Schema with ref fields: tests import paths for record refs, DocumentRef, UserRef */\nconst CircleRecord = defineRecord(\"Circle\", {\n docs: \"A circle\",\n fields: {\n radius: P.Double,\n },\n});\n\nconst DocRef: P.DocRef = { type: \"docRef\" };\nconst UserRefField: P.UserRef = { type: \"userRef\" };\n\nexport const refFieldsSchema: SchemaDefinition = defineSchema({\n Circle: CircleRecord,\n Drawing: defineRecord(\"Drawing\", {\n docs: \"A drawing with references\",\n fields: {\n mainShape: CircleRecord,\n extraShapes: P.Array(modelToRef(CircleRecord)),\n background: P.Optional(modelToRef(CircleRecord)),\n attachment: DocRef,\n owner: P.Optional(UserRefField),\n },\n }),\n});\n\n/** Schema with union types: tests union variant interfaces, discriminated union, and type guards */\nconst RectangleRecord = defineRecord(\"Rectangle\", {\n docs: \"A rectangle\",\n fields: {\n width: P.Double,\n height: P.Double,\n },\n});\n\nexport const unionTypesSchema: SchemaDefinition = defineSchema({\n Circle: CircleRecord,\n Rectangle: RectangleRecord,\n Shape: defineUnion(\"Shape\", {\n docs: \"A shape\",\n variants: {\n circle: CircleRecord,\n rectangle: RectangleRecord,\n },\n }),\n});\n\n/** Schema with nested optionals: tests that optional inside array structures is preserved */\nexport const nestedOptionalsSchema: SchemaDefinition = defineSchema({\n Config: defineRecord(\"Config\", {\n docs: \"A config with nested optional fields\",\n fields: {\n tags: P.Array(P.Optional(P.String)),\n scores: P.Array(P.Optional(P.Double)),\n label: P.Optional(P.String),\n },\n }),\n});\n\n/** Two-version schema with derived fields (color split into fillColor + strokeColor) */\nexport const twoVersionDerivedFieldsSchema: SchemaDefinition = {\n type: \"versioned\",\n models: {\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box shape\",\n fields: {\n left: P.Double,\n right: P.Double,\n top: P.Double,\n bottom: P.Double,\n fillColor: P.Optional(P.String),\n strokeColor: P.Optional(P.String),\n opacity: P.Optional(P.Double),\n },\n }),\n },\n version: 2,\n previous: singleVersionSchema,\n migrations: {\n ShapeBox: {\n fillColor: {\n derivedFrom: [\"color\"],\n },\n strokeColor: {\n derivedFrom: [\"color\"],\n },\n },\n },\n};\n\n/** Schema with aliased export key: export key \"FooAlias\" differs from model name \"Foo\" */\nexport const aliasedEntryNameSchema: SchemaDefinition = defineSchema({\n FooAlias: defineRecord(\"Foo\", {\n docs: \"A record exported under an alias\",\n fields: {\n name: P.String,\n },\n }),\n});\n\n/** Schema with nested union: Entity union has a variant that points to another union (LivingBeing) */\nconst AnimalRecord = defineRecord(\"Animal\", {\n docs: \"An animal\",\n fields: { species: P.String },\n});\n\nconst PlantRecord = defineRecord(\"Plant\", {\n docs: \"A plant\",\n fields: { genus: P.String },\n});\n\nconst LivingBeingUnion = defineUnion(\"LivingBeing\", {\n docs: \"A living being\",\n variants: {\n animal: AnimalRecord,\n plant: PlantRecord,\n },\n});\n\nexport const nestedUnionSchema: SchemaDefinition = defineSchema({\n Animal: AnimalRecord,\n Plant: PlantRecord,\n LivingBeing: LivingBeingUnion,\n Entity: defineUnion(\"Entity\", {\n docs: \"An entity\",\n variants: {\n livingBeing: LivingBeingUnion,\n },\n }),\n});\n\n/**\n * Two-version schema where a field starts as Optional(String) in v1 and becomes\n * required (String) in v2. The internal schema must remain optional because\n * documents written under v1 may legitimately omit the field.\n */\nexport const optionalToRequiredFieldSchema: SchemaDefinition = (() => {\n const v1 = defineSchema({\n Item: defineRecord(\"Item\", {\n docs: \"An item\",\n fields: {\n name: P.String,\n label: P.Optional(P.String),\n },\n }),\n });\n return {\n type: \"versioned\" as const,\n models: {\n Item: defineRecord(\"Item\", {\n docs: \"An item\",\n fields: {\n name: P.String,\n label: P.String,\n },\n }),\n },\n version: 2,\n previous: v1,\n };\n})();\n\n/** Three-version chain: Item (name, color -> name, hexColor -> name, hexColor, tags) */\nexport const threeVersionChainSchema: SchemaDefinition = (() => {\n const v1Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n color: P.Optional(P.String),\n },\n }),\n };\n const v2Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n hexColor: P.Optional(P.String),\n },\n }),\n };\n const v3Models = {\n Item: defineRecord(\"Item\", {\n docs: \"\",\n fields: {\n name: P.String,\n hexColor: P.Optional(P.String),\n tags: P.Optional(P.String),\n },\n }),\n };\n return {\n type: \"versioned\",\n models: v3Models,\n version: 3,\n previous: {\n type: \"versioned\",\n models: v2Models,\n version: 2,\n previous: { type: \"initial\", version: 1, models: v1Models },\n },\n };\n})();\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -18,7 +18,7 @@ import path from "path";
|
|
|
18
18
|
import { describe, expect, it } from "vitest";
|
|
19
19
|
import { generateInternalFromChain } from "../generateInternalFromSchema.js";
|
|
20
20
|
import { resolveSchemaChain } from "../resolveSchemaChain.js";
|
|
21
|
-
import { nestedOptionalsSchema, nestedUnionSchema, optionalToRequiredFieldSchema, singleVersionSchema, twoVersionDerivedFieldsSchema, twoVersionFieldRemovalSchema } from "./fixtures.js";
|
|
21
|
+
import { nestedOptionalsSchema, nestedUnionSchema, optionalToRequiredFieldSchema, singleVersionSchema, twoVersionDerivedFieldsSchema, twoVersionFieldRemovalSchema, twoVersionRequiredAdditiveSchema } from "./fixtures.js";
|
|
22
22
|
import { formatInternalTypesSnapshot } from "./snapshotUtils.js";
|
|
23
23
|
describe("generateInternalFromChain", () => {
|
|
24
24
|
const snapshotDir = path.join(__dirname, "__snapshots__", "generateInternalFromSchema");
|
|
@@ -38,6 +38,11 @@ describe("generateInternalFromChain", () => {
|
|
|
38
38
|
const result = generateInternalFromChain(resolveSchemaChain(twoVersionDerivedFieldsSchema));
|
|
39
39
|
await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(path.join(snapshotDir, "two-version-derived-fields.snap"));
|
|
40
40
|
});
|
|
41
|
+
it("two-version required additive field emits a zero-arg upgrade fn signature", async () => {
|
|
42
|
+
const result = generateInternalFromChain(resolveSchemaChain(twoVersionRequiredAdditiveSchema));
|
|
43
|
+
expect(result.internalUpgradeFns).toContain("opacity: () => ShapeBox__v2[\"opacity\"]");
|
|
44
|
+
await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(path.join(snapshotDir, "two-version-required-additive.snap"));
|
|
45
|
+
});
|
|
41
46
|
it("nested union schema generates upgrade registries for all variant targets", async () => {
|
|
42
47
|
const result = generateInternalFromChain(resolveSchemaChain(nestedUnionSchema));
|
|
43
48
|
await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(path.join(snapshotDir, "nested-union.snap"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInternalFromSchema.test.js","names":["path","describe","expect","it","generateInternalFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","optionalToRequiredFieldSchema","singleVersionSchema","twoVersionDerivedFieldsSchema","twoVersionFieldRemovalSchema","formatInternalTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot"],"sources":["generateInternalFromSchema.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateInternalFromChain } from \"../generateInternalFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n optionalToRequiredFieldSchema,\n singleVersionSchema,\n twoVersionDerivedFieldsSchema,\n twoVersionFieldRemovalSchema,\n} 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(\"nested union schema generates upgrade registries for all variant targets\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-union.snap\"),\n );\n });\n\n it(\"field optional in v1 and required in v2 stays optional in internal schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(optionalToRequiredFieldSchema));\n // \"label\" is Optional(String) in v1 but String in v2.\n // The internal Zod schema must keep it optional because v1 documents\n // may legitimately omit the field.\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-optional-fields.snap\"),\n );\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,IAAI,MAAM,MAAM;AACvB,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,yBAAyB,QAAQ,kCAAkC;AAC5E,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SACEC,qBAAqB,EACrBC,iBAAiB,EACjBC,6BAA6B,EAC7BC,mBAAmB,EACnBC,6BAA6B,EAC7BC,4BAA4B,
|
|
1
|
+
{"version":3,"file":"generateInternalFromSchema.test.js","names":["path","describe","expect","it","generateInternalFromChain","resolveSchemaChain","nestedOptionalsSchema","nestedUnionSchema","optionalToRequiredFieldSchema","singleVersionSchema","twoVersionDerivedFieldsSchema","twoVersionFieldRemovalSchema","twoVersionRequiredAdditiveSchema","formatInternalTypesSnapshot","snapshotDir","join","__dirname","result","toMatchFileSnapshot","internalUpgradeFns","toContain"],"sources":["generateInternalFromSchema.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from \"path\";\nimport { describe, expect, it } from \"vitest\";\nimport { generateInternalFromChain } from \"../generateInternalFromSchema.js\";\nimport { resolveSchemaChain } from \"../resolveSchemaChain.js\";\nimport {\n nestedOptionalsSchema,\n nestedUnionSchema,\n optionalToRequiredFieldSchema,\n singleVersionSchema,\n twoVersionDerivedFieldsSchema,\n twoVersionFieldRemovalSchema,\n twoVersionRequiredAdditiveSchema,\n} from \"./fixtures.js\";\nimport { formatInternalTypesSnapshot } from \"./snapshotUtils.js\";\n\ndescribe(\"generateInternalFromChain\", () => {\n const snapshotDir = path.join(__dirname, \"__snapshots__\", \"generateInternalFromSchema\");\n\n it(\"single-version schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(singleVersionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"single-version.snap\"),\n );\n });\n\n it(\"nested optionals inside arrays\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedOptionalsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-optionals.snap\"),\n );\n });\n\n it(\"two-version field removal\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionFieldRemovalSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-field-removal.snap\"),\n );\n });\n\n it(\"two-version derived fields\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(twoVersionDerivedFieldsSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-derived-fields.snap\"),\n );\n });\n\n it(\"two-version required additive field emits a zero-arg upgrade fn signature\", async () => {\n const result = generateInternalFromChain(\n resolveSchemaChain(twoVersionRequiredAdditiveSchema),\n );\n expect(result.internalUpgradeFns).toContain(\"opacity: () => ShapeBox__v2[\\\"opacity\\\"]\");\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-required-additive.snap\"),\n );\n });\n\n it(\"nested union schema generates upgrade registries for all variant targets\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(nestedUnionSchema));\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"nested-union.snap\"),\n );\n });\n\n it(\"field optional in v1 and required in v2 stays optional in internal schema\", async () => {\n const result = generateInternalFromChain(resolveSchemaChain(optionalToRequiredFieldSchema));\n // \"label\" is Optional(String) in v1 but String in v2.\n // The internal Zod schema must keep it optional because v1 documents\n // may legitimately omit the field.\n await expect(await formatInternalTypesSnapshot(result)).toMatchFileSnapshot(\n path.join(snapshotDir, \"two-version-optional-fields.snap\"),\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -52,6 +52,19 @@ describe("resolveSchemaChain provenance", () => {
|
|
|
52
52
|
expect(v2Fields.fillColor.metadata.addedInVersion).toBe(2);
|
|
53
53
|
expect(v2Fields.strokeColor.metadata.addedInVersion).toBe(2);
|
|
54
54
|
});
|
|
55
|
+
it("caps the chain at maxVersion", () => {
|
|
56
|
+
const {
|
|
57
|
+
chain,
|
|
58
|
+
latestVersion,
|
|
59
|
+
minVersion
|
|
60
|
+
} = resolveSchemaChain(v2, 1, {}, 1);
|
|
61
|
+
expect(chain.map(entry => entry.version)).toEqual([1]);
|
|
62
|
+
expect(latestVersion).toBe(1);
|
|
63
|
+
expect(minVersion).toBe(1);
|
|
64
|
+
});
|
|
65
|
+
it("rejects a maxVersion that is not in the chain", () => {
|
|
66
|
+
expect(() => resolveSchemaChain(v2, undefined, {}, 3)).toThrow("maxVersion 3 is not in the schema chain");
|
|
67
|
+
});
|
|
55
68
|
it("keeps a deprecated field present and stamps deprecatedFromVersion + message", () => {
|
|
56
69
|
const {
|
|
57
70
|
chain
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","undefined","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union"],"sources":["resolveSchemaChain.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"resolveSchemaChain.test.js","names":["P","defineRecord","defineSchema","defineSchemaUpdate","nextSchema","describe","expect","it","resolveSchemaChain","stripDeprecatedFieldsForSdk","fieldsByKey","entry","modelKey","model","ir","models","type","Error","Object","fromEntries","record","fields","map","f","key","v1","ShapeBox","docs","left","Double","color","Optional","String","colorSplit","schema","addField","derivedFrom","deprecateField","build","v2","addSchemaUpdate","chain","v2Fields","find","c","version","metadata","addedInVersion","toBe","fillColor","strokeColor","latestVersion","minVersion","toEqual","undefined","toThrow","toBeDefined","deprecatedFromVersion","deprecatedMessage","v1Fields","toBeUndefined","stripped","Box","a","NodeShape","defineUnion","variants","box","z","addB","union"],"sources":["resolveSchemaChain.test.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as P from \"@palantir/pack.schema\";\nimport { defineRecord, defineSchema, defineSchemaUpdate, nextSchema } from \"@palantir/pack.schema\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n IFieldDef,\n IModelDef,\n} from \"../../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport {\n resolveSchemaChain,\n stripDeprecatedFieldsForSdk,\n type VersionedIrEntry,\n} from \"../resolveSchemaChain.js\";\n\n/** Index a record model's fields by key for a given chain entry. */\nfunction fieldsByKey(entry: VersionedIrEntry, modelKey: string): Record<string, IFieldDef> {\n const model: IModelDef = entry.ir.models[modelKey]!;\n if (model.type !== \"record\") throw new Error(`${modelKey} is not a record`);\n return Object.fromEntries(model.record.fields.map(f => [f.key, f]));\n}\n\ndescribe(\"resolveSchemaChain provenance\", () => {\n const v1 = defineSchema({\n ShapeBox: defineRecord(\"ShapeBox\", {\n docs: \"A box\",\n fields: { left: P.Double, color: P.Optional(P.String) },\n }),\n });\n\n const colorSplit = defineSchemaUpdate(\n \"colorSplit\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n ShapeBox: schema.ShapeBox\n .addField(\"fillColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .addField(\"strokeColor\", P.Optional(P.String), { derivedFrom: [\"color\"] })\n .deprecateField(\"color\", \"use fillColor/strokeColor\")\n .build(),\n }),\n );\n\n const v2 = nextSchema(v1).addSchemaUpdate(colorSplit).build();\n\n it(\"derives addedInVersion from first appearance in the chain\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.left!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.fillColor!.metadata.addedInVersion).toBe(2);\n expect(v2Fields.strokeColor!.metadata.addedInVersion).toBe(2);\n });\n\n it(\"caps the chain at maxVersion\", () => {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(v2, 1, {}, 1);\n\n expect(chain.map(entry => entry.version)).toEqual([1]);\n expect(latestVersion).toBe(1);\n expect(minVersion).toBe(1);\n });\n\n it(\"rejects a maxVersion that is not in the chain\", () => {\n expect(() => resolveSchemaChain(v2, undefined, {}, 3)).toThrow(\n \"maxVersion 3 is not in the schema chain\",\n );\n });\n\n it(\"keeps a deprecated field present and stamps deprecatedFromVersion + message\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v2Fields = fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\");\n\n expect(v2Fields.color).toBeDefined();\n expect(v2Fields.color!.metadata.addedInVersion).toBe(1);\n expect(v2Fields.color!.metadata.deprecatedFromVersion).toBe(2);\n expect(v2Fields.color!.metadata.deprecatedMessage).toBe(\"use fillColor/strokeColor\");\n });\n\n it(\"does not mark the field deprecated in versions before the deprecation\", () => {\n const { chain } = resolveSchemaChain(v2);\n const v1Fields = fieldsByKey(chain.find(c => c.version === 1)!, \"ShapeBox\");\n\n expect(v1Fields.color).toBeDefined();\n expect(v1Fields.color!.metadata.deprecatedFromVersion ?? undefined).toBeUndefined();\n expect(v1Fields.fillColor).toBeUndefined();\n });\n\n it(\"stripDeprecatedFieldsForSdk drops deprecated fields from v>=deprecation only\", () => {\n const { chain } = resolveSchemaChain(v2);\n const stripped = stripDeprecatedFieldsForSdk(chain);\n\n const v1Fields = fieldsByKey(stripped.find(c => c.version === 1)!, \"ShapeBox\");\n expect(v1Fields.color).toBeDefined();\n\n const v2Fields = fieldsByKey(stripped.find(c => c.version === 2)!, \"ShapeBox\");\n expect(v2Fields.color).toBeUndefined();\n expect(v2Fields.fillColor).toBeDefined();\n\n expect(fieldsByKey(chain.find(c => c.version === 2)!, \"ShapeBox\").color).toBeDefined();\n });\n});\n\ndescribe(\"resolveSchemaChain — union provenance\", () => {\n const v1 = defineSchema({\n Box: defineRecord(\"Box\", { docs: \"\", fields: { a: P.Double } }),\n NodeShape: P.defineUnion(\"NodeShape\", {\n docs: \"shape\",\n variants: { box: defineRecord(\"Inner\", { docs: \"\", fields: { z: P.Double } }) },\n }),\n });\n const addB = defineSchemaUpdate(\n \"addB\",\n (schema: P.SchemaBuilder<typeof v1.models>) => ({\n Box: schema.Box.addField(\"b\", P.Optional(P.String)).build(),\n }),\n );\n const v2 = nextSchema(v1).addSchemaUpdate(addB).build();\n\n it(\"a v1-defined union stays addedInVersion 1 in every version\", () => {\n const { chain } = resolveSchemaChain(v2);\n for (const version of [1, 2]) {\n const union = chain.find(c => c.version === version)!.ir.models.NodeShape!;\n if (union.type !== \"union\") throw new Error(\"NodeShape should be a union\");\n expect(union.union.metadata.addedInVersion).toBe(1);\n }\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,12 +16,18 @@
|
|
|
16
16
|
|
|
17
17
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
18
18
|
import { convertFieldTypeToDescriptor, convertFieldTypeToInternalTypeScript, convertFieldTypeToInternalZod } from "../ir/irFieldHelpers.js";
|
|
19
|
-
import {
|
|
19
|
+
import { chainNeedsUpgradeFns } from "./resolveSchemaChain.js";
|
|
20
20
|
|
|
21
21
|
/** Collected info about all fields for a model across all versions. */
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Represents an upgrade step for a model between version transitions.
|
|
25
|
+
*
|
|
26
|
+
* `fields` only contains entries that require lens treatment — derived fields
|
|
27
|
+
* (`derivedFrom.length > 0`) and required additive fields (`derivedFrom.length
|
|
28
|
+
* === 0 && !isOptional`). Optional additive fields are absent because
|
|
29
|
+
* `undefined` is a legal value at the current version and the lens has no
|
|
30
|
+
* work to do.
|
|
25
31
|
*/
|
|
26
32
|
|
|
27
33
|
/**
|
|
@@ -30,6 +36,9 @@ import { chainHasDerivedFields } from "./resolveSchemaChain.js";
|
|
|
30
36
|
function sortedEntries(map) {
|
|
31
37
|
return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));
|
|
32
38
|
}
|
|
39
|
+
function getAddedInVersion(fieldInfo) {
|
|
40
|
+
return Math.min(...fieldInfo.presentInVersions);
|
|
41
|
+
}
|
|
33
42
|
|
|
34
43
|
/**
|
|
35
44
|
* Collect all record model info across all versions and compute upgrade steps.
|
|
@@ -87,22 +96,22 @@ function collectRecordModels(chain) {
|
|
|
87
96
|
const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));
|
|
88
97
|
const currFields = new Set(currModelDef.record.fields.map(f => f.key));
|
|
89
98
|
|
|
90
|
-
// Fields added in this version
|
|
99
|
+
// Fields added in this version that require lens treatment. Optional
|
|
100
|
+
// additive fields are skipped — `undefined` is a legal v_current value
|
|
101
|
+
// for them, so the lens has nothing to invent.
|
|
91
102
|
const addedFields = new Map();
|
|
92
103
|
const recordUpgrades = currEntry.migrations?.[modelKey];
|
|
93
|
-
for (const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
}
|
|
104
|
+
for (const field of currModelDef.record.fields) {
|
|
105
|
+
const fieldKey = field.key;
|
|
106
|
+
if (prevFields.has(fieldKey)) continue;
|
|
107
|
+
const isOptional = field.isOptional === true;
|
|
108
|
+
const annotation = recordUpgrades?.[fieldKey];
|
|
109
|
+
const derivedFrom = annotation != null ? [...annotation.derivedFrom] : [];
|
|
110
|
+
if (derivedFrom.length === 0 && isOptional) continue;
|
|
111
|
+
addedFields.set(fieldKey, {
|
|
112
|
+
derivedFrom,
|
|
113
|
+
isOptional
|
|
114
|
+
});
|
|
106
115
|
}
|
|
107
116
|
|
|
108
117
|
// Fields absent from this version relative to the previous one (i.e. deprecated fields).
|
|
@@ -224,7 +233,7 @@ function generateUpgrades(allRecordModels, latestIr) {
|
|
|
224
233
|
output += ` allFields: {\n`;
|
|
225
234
|
for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {
|
|
226
235
|
const typeDescriptor = convertFieldTypeToDescriptor(fieldInfo.fieldType, fieldInfo.isOptional);
|
|
227
|
-
output += ` ${fieldName}: { type: ${typeDescriptor} },\n`;
|
|
236
|
+
output += ` ${fieldName}: { type: ${typeDescriptor}, addedInVersion: ${getAddedInVersion(fieldInfo)} },\n`;
|
|
228
237
|
}
|
|
229
238
|
output += ` },\n`;
|
|
230
239
|
|
|
@@ -237,9 +246,6 @@ function generateUpgrades(allRecordModels, latestIr) {
|
|
|
237
246
|
for (const [fieldName, fieldMeta] of step.fields) {
|
|
238
247
|
output += ` ${fieldName}: {\n`;
|
|
239
248
|
output += ` derivedFrom: [${fieldMeta.derivedFrom.map(d => `"${d}"`).join(", ")}],\n`;
|
|
240
|
-
if (fieldMeta.default !== undefined) {
|
|
241
|
-
output += ` default: ${JSON.stringify(fieldMeta.default)},\n`;
|
|
242
|
-
}
|
|
243
249
|
output += ` },\n`;
|
|
244
250
|
}
|
|
245
251
|
output += ` },\n`;
|
|
@@ -292,16 +298,21 @@ function generateInternalSchemaContent(allRecordModels) {
|
|
|
292
298
|
* Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`
|
|
293
299
|
* interface enumerating every upgrade function the app must supply at boot.
|
|
294
300
|
*
|
|
295
|
-
* For
|
|
296
|
-
*
|
|
297
|
-
* `
|
|
298
|
-
*
|
|
299
|
-
*
|
|
301
|
+
* For each `(modelName, v${version}, fieldName)` triple in a step's `fields`,
|
|
302
|
+
* emit one property:
|
|
303
|
+
* - Derived (`derivedFrom.length > 0`):
|
|
304
|
+
* `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.
|
|
305
|
+
* - Required additive (`derivedFrom.length === 0`):
|
|
306
|
+
* `() => <Model>__v<current>[fieldName]`.
|
|
307
|
+
*
|
|
308
|
+
* Optional additive fields are filtered out at step-collection time and don't
|
|
309
|
+
* appear here — `undefined` is a legal v<current> value for them, so the app
|
|
310
|
+
* has no obligation to invent one.
|
|
300
311
|
*
|
|
301
312
|
* The interface is consumed by the generated `DocumentModel` factory in
|
|
302
|
-
* `models.ts`, which requires it as a parameter when the schema
|
|
303
|
-
*
|
|
304
|
-
* (still exported for type-uniformity in downstream code).
|
|
313
|
+
* `models.ts`, which requires it as a parameter when the schema needs any
|
|
314
|
+
* upgrade functions. Schemas with no required fields added past v1 emit an
|
|
315
|
+
* empty interface (still exported for type-uniformity in downstream code).
|
|
305
316
|
*/
|
|
306
317
|
function generateUpgradeFns(chain, allRecordModels) {
|
|
307
318
|
const perModel = new Map();
|
|
@@ -313,7 +324,6 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
313
324
|
const priorVersion = chain[currentIdx - 1].version;
|
|
314
325
|
const fields = [];
|
|
315
326
|
for (const [fieldName, fieldMeta] of step.fields) {
|
|
316
|
-
if (fieldMeta.derivedFrom.length === 0) continue;
|
|
317
327
|
fields.push({
|
|
318
328
|
fieldName,
|
|
319
329
|
derivedFrom: [...fieldMeta.derivedFrom]
|
|
@@ -330,7 +340,10 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
330
340
|
priorVersion,
|
|
331
341
|
fields
|
|
332
342
|
});
|
|
333
|
-
|
|
343
|
+
// Prior-version type only needed when at least one field derives from it.
|
|
344
|
+
if (fields.some(f => f.derivedFrom.length > 0)) {
|
|
345
|
+
neededTypes.add(`${modelKey}__v${priorVersion}`);
|
|
346
|
+
}
|
|
334
347
|
neededTypes.add(`${modelKey}__v${step.addedInVersion}`);
|
|
335
348
|
}
|
|
336
349
|
}
|
|
@@ -343,7 +356,10 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
343
356
|
output += `/**\n`;
|
|
344
357
|
output += ` * Typed upgrade functions the application must supply at boot. Coverage is\n`;
|
|
345
358
|
output += ` * exhaustive: missing or extra entries fail type-check at the \`DocumentModel(...)\`\n`;
|
|
346
|
-
output += ` * call site.
|
|
359
|
+
output += ` * call site. Derived fields receive their declared source fields; required\n`;
|
|
360
|
+
output += ` * additive fields receive no arguments. Optional additive fields are absent\n`;
|
|
361
|
+
output += ` * — \`undefined\` is a legal value at the new version, so the runtime lens\n`;
|
|
362
|
+
output += ` * leaves them alone.\n`;
|
|
347
363
|
output += ` */\n`;
|
|
348
364
|
if (perModel.size === 0) {
|
|
349
365
|
output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n`;
|
|
@@ -355,8 +371,13 @@ function generateUpgradeFns(chain, allRecordModels) {
|
|
|
355
371
|
for (const step of steps) {
|
|
356
372
|
output += ` v${step.currentVersion}: {\n`;
|
|
357
373
|
for (const f of step.fields) {
|
|
358
|
-
const
|
|
359
|
-
|
|
374
|
+
const returnType = `${modelKey}__v${step.currentVersion}["${f.fieldName}"]`;
|
|
375
|
+
if (f.derivedFrom.length === 0) {
|
|
376
|
+
output += ` ${f.fieldName}: () => ${returnType};\n`;
|
|
377
|
+
} else {
|
|
378
|
+
const pickKeys = f.derivedFrom.map(d => `"${d}"`).join(" | ");
|
|
379
|
+
output += ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\n`;
|
|
380
|
+
}
|
|
360
381
|
}
|
|
361
382
|
output += ` };\n`;
|
|
362
383
|
}
|
|
@@ -377,7 +398,7 @@ export function generateInternalFromChain(resolved) {
|
|
|
377
398
|
} = resolved;
|
|
378
399
|
const latestIr = chain[chain.length - 1].ir;
|
|
379
400
|
const allRecordModels = collectRecordModels(chain);
|
|
380
|
-
const internalTypes = generateInternalTypes(allRecordModels) + (
|
|
401
|
+
const internalTypes = generateInternalTypes(allRecordModels) + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : "");
|
|
381
402
|
const upgrades = generateUpgrades(allRecordModels, latestIr);
|
|
382
403
|
const internalSchema = generateInternalSchemaContent(allRecordModels);
|
|
383
404
|
const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainHasDerivedFields","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","presentInVersions","Set","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","totalVersions","values","fieldInfo","generateInternalTypes","output","fieldName","tsType","optional","generatePerVersionInternalTypes","perModelVersions","list","sortedModels","versions","sortedFields","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","default","undefined","JSON","stringify","union","discriminant","variantKey","variantModelKey","variants","generateInternalSchemaContent","zodType","generateUpgradeFns","perModel","neededTypes","currentIdx","findIndex","c","priorVersion","currentVersion","sorted","pickKeys","generateInternalFromChain","resolved","internalTypes","upgrades","internalSchema","internalUpgradeFns"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport {\n chainHasDerivedFields,\n type ResolvedIrChain,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n /** _internal/upgradeFns.ts content */\n internalUpgradeFns: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n */\ninterface UpgradeStep {\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; default?: unknown }>;\n removedFields: string[];\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; default?: unknown }\n >();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const fieldKey of currFields) {\n if (!prevFields.has(fieldKey)) {\n const annotation = recordUpgrades?.[fieldKey];\n if (annotation != null) {\n addedFields.set(fieldKey, {\n derivedFrom: [...annotation.derivedFrom],\n });\n } else {\n addedFields.set(fieldKey, {\n derivedFrom: [],\n });\n }\n }\n }\n\n // Fields absent from this version relative to the previous one (i.e. deprecated fields).\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n addedInVersion: currEntry.version,\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalVersions = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInVersions.size < totalVersions) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${modelKey}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate per-version internal interfaces (e.g. `ShapeBox__v1`, `ShapeBox__v2`).\n *\n * Each interface contains only the fields present in that version, with their\n * actual optionality taken straight from that version's IR. The downstream\n * `DocumentUpgradeFns` generator uses these so each upgrade function's\n * parameter can `Pick` the prior version's fields and its return type can\n * index the current version's field type precisely.\n */\nfunction generatePerVersionInternalTypes(\n chain: VersionedIrEntry[],\n): string {\n // Group by model so each model's versions appear together in ascending order.\n const perModelVersions = new Map<\n string,\n { version: number; fields: readonly IFieldDef[] }[]\n >();\n\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n let list = perModelVersions.get(modelKey);\n if (list == null) {\n list = [];\n perModelVersions.set(modelKey, list);\n }\n list.push({ version, fields: modelDef.record.fields });\n }\n }\n\n let output = \"\";\n const sortedModels = Array.from(perModelVersions.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n for (const [modelKey, versions] of sortedModels) {\n for (const { version, fields } of versions) {\n output += `/** Internal representation of ${modelKey} at schema version ${version}. */\\n`;\n output += `export interface ${modelKey}__v${version} {\\n`;\n const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));\n for (const field of sortedFields) {\n const tsType = convertFieldTypeToInternalTypeScript(\n field.fieldType,\n field.isOptional === true,\n );\n const optional = field.isOptional === true ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n output += \"}\\n\\n\";\n }\n }\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}Upgrades: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor} },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n if (fieldMeta.default !== undefined) {\n output += ` default: ${JSON.stringify(fieldMeta.default)},\\n`;\n }\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`\n * interface enumerating every upgrade function the app must supply at boot.\n *\n * For every `(modelName, v${version}, fieldName)` triple where `derivedFrom` is\n * non-empty, emit a property typed\n * `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.\n * Additive fields (empty `derivedFrom`) are intentionally absent — they are\n * handled by the structural `default` in `_internal/upgrades.ts`.\n *\n * The interface is consumed by the generated `DocumentModel` factory in\n * `models.ts`, which requires it as a parameter when the schema has any\n * derived fields. Schemas without derived fields emit an empty interface\n * (still exported for type-uniformity in downstream code).\n */\nfunction generateUpgradeFns(\n chain: VersionedIrEntry[],\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n interface UpgradeFnEntry {\n fieldName: string;\n derivedFrom: readonly string[];\n }\n interface StepEntry {\n currentVersion: number;\n priorVersion: number;\n fields: UpgradeFnEntry[];\n }\n\n const perModel = new Map<string, StepEntry[]>();\n const neededTypes = new Set<string>();\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n for (const step of model.steps) {\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n if (currentIdx <= 0) continue;\n const priorVersion = chain[currentIdx - 1]!.version;\n\n const fields: UpgradeFnEntry[] = [];\n for (const [fieldName, fieldMeta] of step.fields) {\n if (fieldMeta.derivedFrom.length === 0) continue;\n fields.push({ fieldName, derivedFrom: [...fieldMeta.derivedFrom] });\n }\n if (fields.length === 0) continue;\n\n let list = perModel.get(modelKey);\n if (list == null) {\n list = [];\n perModel.set(modelKey, list);\n }\n list.push({\n currentVersion: step.addedInVersion,\n priorVersion,\n fields,\n });\n neededTypes.add(`${modelKey}__v${priorVersion}`);\n neededTypes.add(`${modelKey}__v${step.addedInVersion}`);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `\\n`;\n\n if (neededTypes.size > 0) {\n const sorted = Array.from(neededTypes).sort();\n output += `import type { ${sorted.join(\", \")} } from \"./types.js\";\\n\\n`;\n }\n\n output += `/**\\n`;\n output += ` * Typed upgrade functions the application must supply at boot. Coverage is\\n`;\n output +=\n ` * exhaustive: missing or extra entries fail type-check at the \\`DocumentModel(...)\\`\\n`;\n output += ` * call site. Additive fields (empty \\`derivedFrom\\`) are intentionally absent.\\n`;\n output += ` */\\n`;\n if (perModel.size === 0) {\n output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\\n`;\n output += `export interface DocumentUpgradeFns {}\\n`;\n } else {\n output += `export interface DocumentUpgradeFns {\\n`;\n for (\n const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n ) {\n output += ` ${modelKey}: {\\n`;\n for (const step of steps) {\n output += ` v${step.currentVersion}: {\\n`;\n for (const f of step.fields) {\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${modelKey}__v${step.currentVersion}[\"${f.fieldName}\"];\\n`;\n }\n output += ` };\\n`;\n }\n output += ` };\\n`;\n }\n output += `}\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, _internal/schema.ts and\n * _internal/upgradeFns.ts from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainHasDerivedFields(chain) ? generatePerVersionInternalTypes(chain) : \"\");\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);\n\n return { internalTypes, upgrades, internalSchema, internalUpgradeFns };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainNeedsUpgradeFns","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","getAddedInVersion","fieldInfo","Math","min","presentInVersions","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","Set","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","totalVersions","values","generateInternalTypes","output","fieldName","tsType","optional","generatePerVersionInternalTypes","perModelVersions","list","sortedModels","versions","sortedFields","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","union","discriminant","variantKey","variantModelKey","variants","generateInternalSchemaContent","zodType","generateUpgradeFns","perModel","neededTypes","currentIdx","findIndex","c","priorVersion","currentVersion","sorted","returnType","pickKeys","generateInternalFromChain","resolved","internalTypes","upgrades","internalSchema","internalUpgradeFns"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport {\n chainNeedsUpgradeFns,\n type ResolvedIrChain,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n /** _internal/upgradeFns.ts content */\n internalUpgradeFns: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n *\n * `fields` only contains entries that require lens treatment — derived fields\n * (`derivedFrom.length > 0`) and required additive fields (`derivedFrom.length\n * === 0 && !isOptional`). Optional additive fields are absent because\n * `undefined` is a legal value at the current version and the lens has no\n * work to do.\n */\ninterface UpgradeStep {\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; isOptional: boolean }>;\n removedFields: string[];\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction getAddedInVersion(fieldInfo: AllFieldInfo): number {\n return Math.min(...fieldInfo.presentInVersions);\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version that require lens treatment. Optional\n // additive fields are skipped — `undefined` is a legal v_current value\n // for them, so the lens has nothing to invent.\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; isOptional: boolean }\n >();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const field of currModelDef.record.fields) {\n const fieldKey = field.key;\n if (prevFields.has(fieldKey)) continue;\n const isOptional = field.isOptional === true;\n const annotation = recordUpgrades?.[fieldKey];\n const derivedFrom = annotation != null ? [...annotation.derivedFrom] : [];\n if (derivedFrom.length === 0 && isOptional) continue;\n addedFields.set(fieldKey, { derivedFrom, isOptional });\n }\n\n // Fields absent from this version relative to the previous one (i.e. deprecated fields).\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n addedInVersion: currEntry.version,\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalVersions = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInVersions.size < totalVersions) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${modelKey}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate per-version internal interfaces (e.g. `ShapeBox__v1`, `ShapeBox__v2`).\n *\n * Each interface contains only the fields present in that version, with their\n * actual optionality taken straight from that version's IR. The downstream\n * `DocumentUpgradeFns` generator uses these so each upgrade function's\n * parameter can `Pick` the prior version's fields and its return type can\n * index the current version's field type precisely.\n */\nfunction generatePerVersionInternalTypes(\n chain: VersionedIrEntry[],\n): string {\n // Group by model so each model's versions appear together in ascending order.\n const perModelVersions = new Map<\n string,\n { version: number; fields: readonly IFieldDef[] }[]\n >();\n\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n let list = perModelVersions.get(modelKey);\n if (list == null) {\n list = [];\n perModelVersions.set(modelKey, list);\n }\n list.push({ version, fields: modelDef.record.fields });\n }\n }\n\n let output = \"\";\n const sortedModels = Array.from(perModelVersions.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n for (const [modelKey, versions] of sortedModels) {\n for (const { version, fields } of versions) {\n output += `/** Internal representation of ${modelKey} at schema version ${version}. */\\n`;\n output += `export interface ${modelKey}__v${version} {\\n`;\n const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));\n for (const field of sortedFields) {\n const tsType = convertFieldTypeToInternalTypeScript(\n field.fieldType,\n field.isOptional === true,\n );\n const optional = field.isOptional === true ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n output += \"}\\n\\n\";\n }\n }\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}Upgrades: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor}, addedInVersion: ${\n getAddedInVersion(fieldInfo)\n } },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`\n * interface enumerating every upgrade function the app must supply at boot.\n *\n * For each `(modelName, v${version}, fieldName)` triple in a step's `fields`,\n * emit one property:\n * - Derived (`derivedFrom.length > 0`):\n * `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.\n * - Required additive (`derivedFrom.length === 0`):\n * `() => <Model>__v<current>[fieldName]`.\n *\n * Optional additive fields are filtered out at step-collection time and don't\n * appear here — `undefined` is a legal v<current> value for them, so the app\n * has no obligation to invent one.\n *\n * The interface is consumed by the generated `DocumentModel` factory in\n * `models.ts`, which requires it as a parameter when the schema needs any\n * upgrade functions. Schemas with no required fields added past v1 emit an\n * empty interface (still exported for type-uniformity in downstream code).\n */\nfunction generateUpgradeFns(\n chain: VersionedIrEntry[],\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n interface UpgradeFnEntry {\n fieldName: string;\n derivedFrom: readonly string[];\n }\n interface StepEntry {\n currentVersion: number;\n priorVersion: number;\n fields: UpgradeFnEntry[];\n }\n\n const perModel = new Map<string, StepEntry[]>();\n const neededTypes = new Set<string>();\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n for (const step of model.steps) {\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n if (currentIdx <= 0) continue;\n const priorVersion = chain[currentIdx - 1]!.version;\n\n const fields: UpgradeFnEntry[] = [];\n for (const [fieldName, fieldMeta] of step.fields) {\n fields.push({ fieldName, derivedFrom: [...fieldMeta.derivedFrom] });\n }\n if (fields.length === 0) continue;\n\n let list = perModel.get(modelKey);\n if (list == null) {\n list = [];\n perModel.set(modelKey, list);\n }\n list.push({\n currentVersion: step.addedInVersion,\n priorVersion,\n fields,\n });\n // Prior-version type only needed when at least one field derives from it.\n if (fields.some(f => f.derivedFrom.length > 0)) {\n neededTypes.add(`${modelKey}__v${priorVersion}`);\n }\n neededTypes.add(`${modelKey}__v${step.addedInVersion}`);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `\\n`;\n\n if (neededTypes.size > 0) {\n const sorted = Array.from(neededTypes).sort();\n output += `import type { ${sorted.join(\", \")} } from \"./types.js\";\\n\\n`;\n }\n\n output += `/**\\n`;\n output += ` * Typed upgrade functions the application must supply at boot. Coverage is\\n`;\n output +=\n ` * exhaustive: missing or extra entries fail type-check at the \\`DocumentModel(...)\\`\\n`;\n output += ` * call site. Derived fields receive their declared source fields; required\\n`;\n output += ` * additive fields receive no arguments. Optional additive fields are absent\\n`;\n output += ` * — \\`undefined\\` is a legal value at the new version, so the runtime lens\\n`;\n output += ` * leaves them alone.\\n`;\n output += ` */\\n`;\n if (perModel.size === 0) {\n output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\\n`;\n output += `export interface DocumentUpgradeFns {}\\n`;\n } else {\n output += `export interface DocumentUpgradeFns {\\n`;\n for (\n const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n ) {\n output += ` ${modelKey}: {\\n`;\n for (const step of steps) {\n output += ` v${step.currentVersion}: {\\n`;\n for (const f of step.fields) {\n const returnType = `${modelKey}__v${step.currentVersion}[\"${f.fieldName}\"]`;\n if (f.derivedFrom.length === 0) {\n output += ` ${f.fieldName}: () => ${returnType};\\n`;\n } else {\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\\n`;\n }\n }\n output += ` };\\n`;\n }\n output += ` };\\n`;\n }\n output += `}\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, _internal/schema.ts and\n * _internal/upgradeFns.ts from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : \"\");\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);\n\n return { internalTypes, upgrades, internalSchema, internalUpgradeFns };\n}\n"],"mappings":"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","ignoreList":[]}
|