@palantir/pack.document-schema.type-gen 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/build/esm/commands/asset/assetUpdateSchemaHandler.js +3 -2
  2. package/build/esm/commands/asset/assetUpdateSchemaHandler.js.map +1 -1
  3. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +88 -0
  4. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -0
  5. package/build/esm/commands/ir/irDeployHandler.js +4 -3
  6. package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
  7. package/build/esm/commands/ir/irGenAssetHandler.js +2 -31
  8. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  9. package/build/esm/commands/ir/irGenTypesHandler.js +6 -6
  10. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
  11. package/build/esm/commands/ir/registerIrCommands.js +1 -1
  12. package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
  13. package/build/esm/commands/ir/resolveIrInput.js +50 -0
  14. package/build/esm/commands/ir/resolveIrInput.js.map +1 -0
  15. package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
  16. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  17. package/build/esm/commands/schema/schemaIrHandler.js +14 -4
  18. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
  19. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  20. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  21. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  22. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  23. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  39. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  40. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  41. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  42. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  43. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  44. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  45. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  46. package/build/esm/utils/schema/__tests__/fixtures.js +11 -0
  47. package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
  48. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +6 -1
  49. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/provenanceScenarios.test.js +184 -0
  51. package/build/esm/utils/schema/__tests__/provenanceScenarios.test.js.map +1 -0
  52. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +135 -0
  53. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -0
  54. package/build/esm/utils/schema/generateInternalFromSchema.js +55 -34
  55. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  56. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +12 -10
  57. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  58. package/build/esm/utils/schema/generateScopeFromSchema.js +15 -3
  59. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  60. package/build/esm/utils/schema/loadSchemaModule.js +2 -5
  61. package/build/esm/utils/schema/loadSchemaModule.js.map +1 -1
  62. package/build/esm/utils/schema/resolveSchemaChain.js +135 -29
  63. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  64. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  65. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  66. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  67. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  68. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  69. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  70. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  71. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  72. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  73. package/build/esm/utils/steps/convertStepsToIr.js +49 -24
  74. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  75. package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts.map +1 -1
  76. package/build/types/commands/ir/__tests__/resolveIrInput.test.d.ts +2 -0
  77. package/build/types/commands/ir/__tests__/resolveIrInput.test.d.ts.map +1 -0
  78. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  79. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  80. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  81. package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
  82. package/build/types/commands/ir/resolveIrInput.d.ts +8 -0
  83. package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -0
  84. package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
  85. package/build/types/commands/schema/schemaIrHandler.d.ts +4 -3
  86. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  87. package/build/types/utils/schema/__tests__/fixtures.d.ts +1 -0
  88. package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
  89. package/build/types/utils/schema/__tests__/provenanceScenarios.test.d.ts +2 -0
  90. package/build/types/utils/schema/__tests__/provenanceScenarios.test.d.ts.map +1 -0
  91. package/build/types/utils/schema/__tests__/resolveSchemaChain.test.d.ts +2 -0
  92. package/build/types/utils/schema/__tests__/resolveSchemaChain.test.d.ts.map +1 -0
  93. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  94. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  95. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  96. package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -1
  97. package/build/types/utils/schema/resolveSchemaChain.d.ts +25 -5
  98. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  99. package/build/types/utils/steps/convertStepsToIr.d.ts +19 -4
  100. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  101. package/package.json +4 -4
@@ -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 removed in this version\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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA,SAASA,qBAAqB,QAAQ,2BAA2B;AACjE,SACEC,4BAA4B,EAC5BC,oCAAoC,EACpCC,6BAA6B,QACxB,yBAAyB;AAChC,SACEC,oBAAoB,QAGf,yBAAyB;;AAahC;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA,SAASC,aAAaA,CAAIC,GAAmB,EAAiB;EAC5D,OAAOC,KAAK,CAACC,IAAI,CAACF,GAAG,CAACG,OAAO,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KAAKD,CAAC,CAACE,aAAa,CAACD,CAAC,CAAC,CAAC;AACzE;AAEA,SAASE,iBAAiBA,CAACC,SAAuB,EAAU;EAC1D,OAAOC,IAAI,CAACC,GAAG,CAAC,GAAGF,SAAS,CAACG,iBAAiB,CAAC;AACjD;;AAEA;AACA;AACA;AACA,SAASC,mBAAmBA,CAC1BC,KAAyB,EACK;EAC9B,MAAMC,eAAe,GAAG,IAAIC,GAAG,CAA0B,CAAC;;EAE1D;EACA,KAAK,MAAM;IAAEC,OAAO;IAAEC;EAAG,CAAC,IAAIJ,KAAK,EAAE;IACnC,KAAK,MAAM,CAACK,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAAClB,OAAO,CAACe,EAAE,CAACI,MAAM,CAAC,EAAE;MAC5D,IAAIF,QAAQ,CAACG,IAAI,KAAK,QAAQ,EAAE;MAEhC,IAAI,CAACR,eAAe,CAACS,GAAG,CAACL,QAAQ,CAAC,EAAE;QAClCJ,eAAe,CAACU,GAAG,CAACN,QAAQ,EAAE;UAC5BO,SAAS,EAAE,IAAIV,GAAG,CAAC,CAAC;UACpBW,KAAK,EAAE;QACT,CAAC,CAAC;MACJ;MAEA,MAAMC,KAAK,GAAGb,eAAe,CAACc,GAAG,CAACV,QAAQ,CAAE;MAE5C,KAAK,MAAMW,KAAK,IAAIV,QAAQ,CAACW,MAAM,CAACC,MAAM,EAAE;QAC1C,MAAMC,QAAQ,GAAGL,KAAK,CAACF,SAAS,CAACG,GAAG,CAACC,KAAK,CAACI,GAAG,CAAC;QAC/C,IAAID,QAAQ,IAAI,IAAI,EAAE;UACpBL,KAAK,CAACF,SAAS,CAACD,GAAG,CAACK,KAAK,CAACI,GAAG,EAAE;YAC7BC,SAAS,EAAEL,KAAK,CAACK,SAAS;YAC1BC,UAAU,EAAEN,KAAK,CAACM,UAAU,KAAK,IAAI;YACrCxB,iBAAiB,EAAE,IAAIyB,GAAG,CAAC,CAACpB,OAAO,CAAC,CAAC;YACrCqB,cAAc,EAAER,KAAK,CAACM,UAAU,KAAK,IAAI;YACzCG,YAAY,EAAET,KAAK,CAACM,UAAU,KAAK;UACrC,CAAC,CAAC;QACJ,CAAC,MAAM;UACLH,QAAQ,CAACrB,iBAAiB,CAAC4B,GAAG,CAACvB,OAAO,CAAC;UACvC,IAAIa,KAAK,CAACM,UAAU,KAAK,IAAI,EAAE;YAC7BH,QAAQ,CAACK,cAAc,GAAG,KAAK;UACjC;UACA,IAAIR,KAAK,CAACM,UAAU,KAAK,IAAI,EAAE;YAC7BH,QAAQ,CAACM,YAAY,GAAG,IAAI;UAC9B;QACF;MACF;IACF;EACF;;EAEA;EACA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG3B,KAAK,CAAC4B,MAAM,EAAED,CAAC,EAAE,EAAE;IACrC,MAAME,SAAS,GAAG7B,KAAK,CAAC2B,CAAC,GAAG,CAAC,CAAE;IAC/B,MAAMG,SAAS,GAAG9B,KAAK,CAAC2B,CAAC,CAAE;IAE3B,KAAK,MAAM,CAACtB,QAAQ,EAAE0B,YAAY,CAAC,IAAIxB,MAAM,CAAClB,OAAO,CAACyC,SAAS,CAAC1B,EAAE,CAACI,MAAM,CAAC,EAAE;MAC1E,IAAIuB,YAAY,CAACtB,IAAI,KAAK,QAAQ,EAAE;MAEpC,MAAMuB,YAAY,GAAGH,SAAS,CAACzB,EAAE,CAACI,MAAM,CAACH,QAAQ,CAAC;MAClD,IAAI2B,YAAY,IAAI,IAAI,IAAIA,YAAY,CAACvB,IAAI,KAAK,QAAQ,EAAE;MAE5D,MAAMK,KAAK,GAAGb,eAAe,CAACc,GAAG,CAACV,QAAQ,CAAC;MAC3C,IAAIS,KAAK,IAAI,IAAI,EAAE;MAEnB,MAAMmB,UAAU,GAAG,IAAIV,GAAG,CAACS,YAAY,CAACf,MAAM,CAACC,MAAM,CAAChC,GAAG,CAACgD,CAAC,IAAIA,CAAC,CAACd,GAAG,CAAC,CAAC;MACtE,MAAMe,UAAU,GAAG,IAAIZ,GAAG,CAACQ,YAAY,CAACd,MAAM,CAACC,MAAM,CAAChC,GAAG,CAACgD,CAAC,IAAIA,CAAC,CAACd,GAAG,CAAC,CAAC;;MAEtE;MACA;MACA;MACA,MAAMgB,WAAW,GAAG,IAAIlC,GAAG,CAGzB,CAAC;MACH,MAAMmC,cAAc,GAAGP,SAAS,CAACQ,UAAU,GAAGjC,QAAQ,CAAC;MACvD,KAAK,MAAMW,KAAK,IAAIe,YAAY,CAACd,MAAM,CAACC,MAAM,EAAE;QAC9C,MAAMqB,QAAQ,GAAGvB,KAAK,CAACI,GAAG;QAC1B,IAAIa,UAAU,CAACvB,GAAG,CAAC6B,QAAQ,CAAC,EAAE;QAC9B,MAAMjB,UAAU,GAAGN,KAAK,CAACM,UAAU,KAAK,IAAI;QAC5C,MAAMkB,UAAU,GAAGH,cAAc,GAAGE,QAAQ,CAAC;QAC7C,MAAME,WAAW,GAAGD,UAAU,IAAI,IAAI,GAAG,CAAC,GAAGA,UAAU,CAACC,WAAW,CAAC,GAAG,EAAE;QACzE,IAAIA,WAAW,CAACb,MAAM,KAAK,CAAC,IAAIN,UAAU,EAAE;QAC5Cc,WAAW,CAACzB,GAAG,CAAC4B,QAAQ,EAAE;UAAEE,WAAW;UAAEnB;QAAW,CAAC,CAAC;MACxD;;MAEA;MACA,MAAMoB,aAAuB,GAAG,EAAE;MAClC,KAAK,MAAMH,QAAQ,IAAIN,UAAU,EAAE;QACjC,IAAI,CAACE,UAAU,CAACzB,GAAG,CAAC6B,QAAQ,CAAC,EAAE;UAC7BG,aAAa,CAACC,IAAI,CAACJ,QAAQ,CAAC;QAC9B;MACF;MAEA,IAAIH,WAAW,CAACQ,IAAI,GAAG,CAAC,IAAIF,aAAa,CAACd,MAAM,GAAG,CAAC,EAAE;QACpDd,KAAK,CAACD,KAAK,CAAC8B,IAAI,CAAC;UACfE,cAAc,EAAEf,SAAS,CAAC3B,OAAO;UACjCe,MAAM,EAAEkB,WAAW;UACnBM;QACF,CAAC,CAAC;MACJ;IACF;EACF;;EAEA;EACA,MAAMI,aAAa,GAAG9C,KAAK,CAAC4B,MAAM;EAClC,KAAK,MAAMd,KAAK,IAAIb,eAAe,CAAC8C,MAAM,CAAC,CAAC,EAAE;IAC5C,KAAK,MAAM,GAAGpD,SAAS,CAAC,IAAImB,KAAK,CAACF,SAAS,EAAE;MAC3C,IAAIjB,SAAS,CAACG,iBAAiB,CAAC8C,IAAI,GAAGE,aAAa,EAAE;QACpDnD,SAAS,CAAC6B,cAAc,GAAG,IAAI;MACjC;IACF;EACF;EAEA,OAAOvB,eAAe;AACxB;;AAEA;AACA;AACA;AACA,SAAS+C,qBAAqBA,CAC5B/C,eAA6C,EACrC;EACR,IAAIgD,MAAM,GAAGrE,qBAAqB;EAClCqE,MAAM,IAAI,IAAI;EAEd,KAAK,MAAM,CAAC5C,QAAQ,EAAES,KAAK,CAAC,IAAI7B,aAAa,CAACgB,eAAe,CAAC,EAAE;IAC9DgD,MAAM,IAAI,oFAAoF;IAC9FA,MAAM,IAAI,oBAAoB5C,QAAQ,gBAAgB;IAEtD,KAAK,MAAM,CAAC6C,SAAS,EAAEvD,SAAS,CAAC,IAAIV,aAAa,CAAC6B,KAAK,CAACF,SAAS,CAAC,EAAE;MACnE,MAAMuC,MAAM,GAAGrE,oCAAoC,CACjDa,SAAS,CAAC0B,SAAS,EACnB1B,SAAS,CAAC2B,UACZ,CAAC;MACD,MAAM8B,QAAQ,GAAGzD,SAAS,CAAC6B,cAAc,GAAG,GAAG,GAAG,EAAE;MACpDyB,MAAM,IAAI,cAAcC,SAAS,GAAGE,QAAQ,KAAKD,MAAM,KAAK;IAC9D;IAEAF,MAAM,IAAI,OAAO;EACnB;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASI,+BAA+BA,CACtCrD,KAAyB,EACjB;EACR;EACA,MAAMsD,gBAAgB,GAAG,IAAIpD,GAAG,CAG9B,CAAC;EAEH,KAAK,MAAM;IAAEC,OAAO;IAAEC;EAAG,CAAC,IAAIJ,KAAK,EAAE;IACnC,KAAK,MAAM,CAACK,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAAClB,OAAO,CAACe,EAAE,CAACI,MAAM,CAAC,EAAE;MAC5D,IAAIF,QAAQ,CAACG,IAAI,KAAK,QAAQ,EAAE;MAChC,IAAI8C,IAAI,GAAGD,gBAAgB,CAACvC,GAAG,CAACV,QAAQ,CAAC;MACzC,IAAIkD,IAAI,IAAI,IAAI,EAAE;QAChBA,IAAI,GAAG,EAAE;QACTD,gBAAgB,CAAC3C,GAAG,CAACN,QAAQ,EAAEkD,IAAI,CAAC;MACtC;MACAA,IAAI,CAACZ,IAAI,CAAC;QAAExC,OAAO;QAAEe,MAAM,EAAEZ,QAAQ,CAACW,MAAM,CAACC;MAAO,CAAC,CAAC;IACxD;EACF;EAEA,IAAI+B,MAAM,GAAG,EAAE;EACf,MAAMO,YAAY,GAAGrE,KAAK,CAACC,IAAI,CAACkE,gBAAgB,CAACjE,OAAO,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KACxED,CAAC,CAACE,aAAa,CAACD,CAAC,CACnB,CAAC;EACD,KAAK,MAAM,CAACa,QAAQ,EAAEoD,QAAQ,CAAC,IAAID,YAAY,EAAE;IAC/C,KAAK,MAAM;MAAErD,OAAO;MAAEe;IAAO,CAAC,IAAIuC,QAAQ,EAAE;MAC1CR,MAAM,IAAI,kCAAkC5C,QAAQ,sBAAsBF,OAAO,QAAQ;MACzF8C,MAAM,IAAI,oBAAoB5C,QAAQ,MAAMF,OAAO,MAAM;MACzD,MAAMuD,YAAY,GAAG,CAAC,GAAGxC,MAAM,CAAC,CAAC5B,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAAC6B,GAAG,CAAC3B,aAAa,CAACD,CAAC,CAAC4B,GAAG,CAAC,CAAC;MAC3E,KAAK,MAAMJ,KAAK,IAAI0C,YAAY,EAAE;QAChC,MAAMP,MAAM,GAAGrE,oCAAoC,CACjDkC,KAAK,CAACK,SAAS,EACfL,KAAK,CAACM,UAAU,KAAK,IACvB,CAAC;QACD,MAAM8B,QAAQ,GAAGpC,KAAK,CAACM,UAAU,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE;QACrD2B,MAAM,IAAI,cAAcjC,KAAK,CAACI,GAAG,GAAGgC,QAAQ,KAAKD,MAAM,KAAK;MAC9D;MACAF,MAAM,IAAI,OAAO;IACnB;EACF;EACA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA,SAASU,gBAAgBA,CACvB1D,eAA6C,EAC7C2D,QAAiC,EACzB;EACR,IAAIX,MAAM,GAAGrE,qBAAqB;EAElC,MAAMiF,UAAU,GAAG5D,eAAe,CAAC2C,IAAI,GAAG,CAAC;EAC3C,MAAMkB,SAAS,GAAGvD,MAAM,CAACwC,MAAM,CAACa,QAAQ,CAACpD,MAAM,CAAC,CAACuD,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACvD,IAAI,KAAK,OAAO,CAAC;EAE9E,MAAMwD,OAAiB,GAAG,EAAE;EAC5B,IAAIJ,UAAU,EAAEI,OAAO,CAACtB,IAAI,CAAC,iBAAiB,CAAC;EAC/C,IAAImB,SAAS,EAAEG,OAAO,CAACtB,IAAI,CAAC,sBAAsB,CAAC;EAEnD,IAAIsB,OAAO,CAACrC,MAAM,GAAG,CAAC,EAAE;IACtBqB,MAAM,IAAI,iBACRgB,OAAO,CAACC,IAAI,CAAC,IAAI,CAAC,2DACuC;EAC7D;EAEA,KAAK,MAAM,CAAC7D,QAAQ,EAAES,KAAK,CAAC,IAAI7B,aAAa,CAACgB,eAAe,CAAC,EAAE;IAC9DgD,MAAM,IAAI,gBAAgB5C,QAAQ,8BAA8BA,QAAQ,UAAU;IAClF4C,MAAM,IAAI,iBAAiB5C,QAAQ,MAAM;;IAEzC;IACA4C,MAAM,IAAI,kBAAkB;IAC5B,KAAK,MAAM,CAACC,SAAS,EAAEvD,SAAS,CAAC,IAAIV,aAAa,CAAC6B,KAAK,CAACF,SAAS,CAAC,EAAE;MACnE,MAAMuD,cAAc,GAAGtF,4BAA4B,CACjDc,SAAS,CAAC0B,SAAS,EACnB1B,SAAS,CAAC2B,UACZ,CAAC;MACD2B,MAAM,IAAI,OAAOC,SAAS,aAAaiB,cAAc,qBACnDzE,iBAAiB,CAACC,SAAS,CAAC,OACvB;IACT;IACAsD,MAAM,IAAI,QAAQ;;IAElB;IACAA,MAAM,IAAI,cAAc;IACxB,KAAK,MAAMmB,IAAI,IAAItD,KAAK,CAACD,KAAK,EAAE;MAC9BoC,MAAM,IAAI,SAAS;MACnBA,MAAM,IAAI,yBAAyBmB,IAAI,CAACvB,cAAc,KAAK;MAC3DI,MAAM,IAAI,mBAAmB;MAC7B,KAAK,MAAM,CAACC,SAAS,EAAEmB,SAAS,CAAC,IAAID,IAAI,CAAClD,MAAM,EAAE;QAChD+B,MAAM,IAAI,WAAWC,SAAS,OAAO;QACrCD,MAAM,IAAI,2BACRoB,SAAS,CAAC5B,WAAW,CAACvD,GAAG,CAACoF,CAAC,IAAI,IAAIA,CAAC,GAAG,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC,MAC/C;QACNjB,MAAM,IAAI,cAAc;MAC1B;MACAA,MAAM,IAAI,YAAY;MACtB,IAAImB,IAAI,CAAC1B,aAAa,CAACd,MAAM,GAAG,CAAC,EAAE;QACjCqB,MAAM,IAAI,yBAAyBmB,IAAI,CAAC1B,aAAa,CAACxD,GAAG,CAACgD,CAAC,IAAI,IAAIA,CAAC,GAAG,CAAC,CAACgC,IAAI,CAAC,IAAI,CAAC,MAAM;MAC3F;MACAjB,MAAM,IAAI,UAAU;IACtB;IACAA,MAAM,IAAI,QAAQ;IAElBA,MAAM,IAAI,QAAQ;EACpB;;EAEA;EACA,KAAK,MAAM,CAAC5C,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAAClB,OAAO,CAACuE,QAAQ,CAACpD,MAAM,CAAC,EAAE;IAClE,IAAIF,QAAQ,CAACG,IAAI,KAAK,OAAO,EAAE;IAE/B,MAAM8D,KAAK,GAAGjE,QAAQ,CAACiE,KAAK;IAC5BtB,MAAM,IAAI,gBAAgB5C,QAAQ,mCAAmCA,QAAQ,UAAU;IACvF4C,MAAM,IAAI,iBAAiB5C,QAAQ,MAAM;IACzC4C,MAAM,IAAI,oBAAoBsB,KAAK,CAACC,YAAY,MAAM;IACtDvB,MAAM,IAAI,iBAAiB;IAC3B,KAAK,MAAM,CAACwB,UAAU,EAAEC,eAAe,CAAC,IAAInE,MAAM,CAAClB,OAAO,CAACkF,KAAK,CAACI,QAAQ,CAAC,EAAE;MAC1E1B,MAAM,IAAI,QAAQwB,UAAU,OAAOC,eAAe,MAAM;IAC1D;IACAzB,MAAM,IAAI,QAAQ;IAClBA,MAAM,IAAI,QAAQ;EACpB;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA,SAAS2B,6BAA6BA,CACpC3E,eAA6C,EACrC;EACR,IAAIgD,MAAM,GAAGrE,qBAAqB;EAClCqE,MAAM,IAAI,8BAA8B;EAExC,KAAK,MAAM,CAAC5C,QAAQ,EAAES,KAAK,CAAC,IAAI7B,aAAa,CAACgB,eAAe,CAAC,EAAE;IAC9DgD,MAAM,IAAI,gBAAgB5C,QAAQ,+BAA+B;IAEjE,KAAK,MAAM,CAAC6C,SAAS,EAAEvD,SAAS,CAAC,IAAIV,aAAa,CAAC6B,KAAK,CAACF,SAAS,CAAC,EAAE;MACnE;MACA;MACA,MAAMiE,OAAO,GAAG9F,6BAA6B,CAC3CY,SAAS,CAAC0B,SAAS,EACnB1B,SAAS,CAAC6B,cAAc,IAAI7B,SAAS,CAAC8B,YACxC,CAAC;MACDwB,MAAM,IAAI,KAAKC,SAAS,KAAK2B,OAAO,KAAK;IAC3C;IAEA5B,MAAM,IAAI,uBAAuB;EACnC;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS6B,kBAAkBA,CACzB9E,KAAyB,EACzBC,eAA6C,EACrC;EAWR,MAAM8E,QAAQ,GAAG,IAAI7E,GAAG,CAAsB,CAAC;EAC/C,MAAM8E,WAAW,GAAG,IAAIzD,GAAG,CAAS,CAAC;EAErC,KAAK,MAAM,CAAClB,QAAQ,EAAES,KAAK,CAAC,IAAI7B,aAAa,CAACgB,eAAe,CAAC,EAAE;IAC9D,KAAK,MAAMmE,IAAI,IAAItD,KAAK,CAACD,KAAK,EAAE;MAC9B,MAAMoE,UAAU,GAAGjF,KAAK,CAACkF,SAAS,CAACC,CAAC,IAAIA,CAAC,CAAChF,OAAO,KAAKiE,IAAI,CAACvB,cAAc,CAAC;MAC1E,IAAIoC,UAAU,IAAI,CAAC,EAAE;MACrB,MAAMG,YAAY,GAAGpF,KAAK,CAACiF,UAAU,GAAG,CAAC,CAAC,CAAE9E,OAAO;MAEnD,MAAMe,MAAwB,GAAG,EAAE;MACnC,KAAK,MAAM,CAACgC,SAAS,EAAEmB,SAAS,CAAC,IAAID,IAAI,CAAClD,MAAM,EAAE;QAChDA,MAAM,CAACyB,IAAI,CAAC;UAAEO,SAAS;UAAET,WAAW,EAAE,CAAC,GAAG4B,SAAS,CAAC5B,WAAW;QAAE,CAAC,CAAC;MACrE;MACA,IAAIvB,MAAM,CAACU,MAAM,KAAK,CAAC,EAAE;MAEzB,IAAI2B,IAAI,GAAGwB,QAAQ,CAAChE,GAAG,CAACV,QAAQ,CAAC;MACjC,IAAIkD,IAAI,IAAI,IAAI,EAAE;QAChBA,IAAI,GAAG,EAAE;QACTwB,QAAQ,CAACpE,GAAG,CAACN,QAAQ,EAAEkD,IAAI,CAAC;MAC9B;MACAA,IAAI,CAACZ,IAAI,CAAC;QACR0C,cAAc,EAAEjB,IAAI,CAACvB,cAAc;QACnCuC,YAAY;QACZlE;MACF,CAAC,CAAC;MACF;MACA,IAAIA,MAAM,CAAC6C,IAAI,CAAC7B,CAAC,IAAIA,CAAC,CAACO,WAAW,CAACb,MAAM,GAAG,CAAC,CAAC,EAAE;QAC9CoD,WAAW,CAACtD,GAAG,CAAC,GAAGrB,QAAQ,MAAM+E,YAAY,EAAE,CAAC;MAClD;MACAJ,WAAW,CAACtD,GAAG,CAAC,GAAGrB,QAAQ,MAAM+D,IAAI,CAACvB,cAAc,EAAE,CAAC;IACzD;EACF;EAEA,IAAII,MAAM,GAAGrE,qBAAqB;EAClCqE,MAAM,IAAI,IAAI;EAEd,IAAI+B,WAAW,CAACpC,IAAI,GAAG,CAAC,EAAE;IACxB,MAAM0C,MAAM,GAAGnG,KAAK,CAACC,IAAI,CAAC4F,WAAW,CAAC,CAAC1F,IAAI,CAAC,CAAC;IAC7C2D,MAAM,IAAI,iBAAiBqC,MAAM,CAACpB,IAAI,CAAC,IAAI,CAAC,2BAA2B;EACzE;EAEAjB,MAAM,IAAI,OAAO;EACjBA,MAAM,IAAI,+EAA+E;EACzFA,MAAM,IACJ,yFAAyF;EAC3FA,MAAM,IAAI,+EAA+E;EACzFA,MAAM,IAAI,gFAAgF;EAC1FA,MAAM,IAAI,+EAA+E;EACzFA,MAAM,IAAI,yBAAyB;EACnCA,MAAM,IAAI,OAAO;EACjB,IAAI8B,QAAQ,CAACnC,IAAI,KAAK,CAAC,EAAE;IACvBK,MAAM,IAAI,uEAAuE;IACjFA,MAAM,IAAI,0CAA0C;EACtD,CAAC,MAAM;IACLA,MAAM,IAAI,yCAAyC;IACnD,KACE,MAAM,CAAC5C,QAAQ,EAAEQ,KAAK,CAAC,IAAI1B,KAAK,CAACC,IAAI,CAAC2F,QAAQ,CAAC1F,OAAO,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KACtED,CAAC,CAACE,aAAa,CAACD,CAAC,CACnB,CAAC,EACD;MACAyD,MAAM,IAAI,KAAK5C,QAAQ,OAAO;MAC9B,KAAK,MAAM+D,IAAI,IAAIvD,KAAK,EAAE;QACxBoC,MAAM,IAAI,QAAQmB,IAAI,CAACiB,cAAc,OAAO;QAC5C,KAAK,MAAMnD,CAAC,IAAIkC,IAAI,CAAClD,MAAM,EAAE;UAC3B,MAAMqE,UAAU,GAAG,GAAGlF,QAAQ,MAAM+D,IAAI,CAACiB,cAAc,KAAKnD,CAAC,CAACgB,SAAS,IAAI;UAC3E,IAAIhB,CAAC,CAACO,WAAW,CAACb,MAAM,KAAK,CAAC,EAAE;YAC9BqB,MAAM,IAAI,SAASf,CAAC,CAACgB,SAAS,WAAWqC,UAAU,KAAK;UAC1D,CAAC,MAAM;YACL,MAAMC,QAAQ,GAAGtD,CAAC,CAACO,WAAW,CAACvD,GAAG,CAACoF,CAAC,IAAI,IAAIA,CAAC,GAAG,CAAC,CAACJ,IAAI,CAAC,KAAK,CAAC;YAC7DjB,MAAM,IACJ,SAASf,CAAC,CAACgB,SAAS,sBAAsB7C,QAAQ,MAAM+D,IAAI,CAACgB,YAAY,KAAKI,QAAQ,SAASD,UAAU,KAAK;UAClH;QACF;QACAtC,MAAM,IAAI,UAAU;MACtB;MACAA,MAAM,IAAI,QAAQ;IACpB;IACAA,MAAM,IAAI,KAAK;EACjB;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASwC,yBAAyBA,CACvCC,QAAyB,EACJ;EACrB,MAAM;IAAE1F;EAAM,CAAC,GAAG0F,QAAQ;EAC1B,MAAM9B,QAAQ,GAAG5D,KAAK,CAACA,KAAK,CAAC4B,MAAM,GAAG,CAAC,CAAC,CAAExB,EAAE;EAE5C,MAAMH,eAAe,GAAGF,mBAAmB,CAACC,KAAK,CAAC;EAElD,MAAM2F,aAAa,GAAG3C,qBAAqB,CAAC/C,eAAe,CAAC,IACvDjB,oBAAoB,CAACgB,KAAK,CAAC,GAAGqD,+BAA+B,CAACrD,KAAK,CAAC,GAAG,EAAE,CAAC;EAC/E,MAAM4F,QAAQ,GAAGjC,gBAAgB,CAAC1D,eAAe,EAAE2D,QAAQ,CAAC;EAC5D,MAAMiC,cAAc,GAAGjB,6BAA6B,CAAC3E,eAAe,CAAC;EACrE,MAAM6F,kBAAkB,GAAGhB,kBAAkB,CAAC9E,KAAK,EAAEC,eAAe,CAAC;EAErE,OAAO;IAAE0F,aAAa;IAAEC,QAAQ;IAAEC,cAAc;IAAEC;EAAmB,CAAC;AACxE","ignoreList":[]}
@@ -17,7 +17,7 @@
17
17
  import { formatVariantName } from "../formatVariantName.js";
18
18
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
19
  import { findExternalRefType } from "../ir/irFieldHelpers.js";
20
- import { chainHasDerivedFields, resolveMinVersion } from "./resolveSchemaChain.js";
20
+ import { chainNeedsUpgradeFns, resolveMinVersion } from "./resolveSchemaChain.js";
21
21
  import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
22
22
  function extractExternalRefFieldTypes(record) {
23
23
  const refs = [];
@@ -42,7 +42,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
42
42
  minVersion
43
43
  } = resolveMinVersion(chain, minSupportedVersion);
44
44
  const latestIr = chain[chain.length - 1].ir;
45
- const hasDerivedFields = chainHasDerivedFields(chain);
45
+ const needsUpgradeFns = chainNeedsUpgradeFns(chain);
46
46
 
47
47
  // --- Generate models.ts ---
48
48
  let output = GENERATED_FILE_HEADER;
@@ -67,7 +67,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
67
67
  const modelTypesImports = ["DocumentSchema"];
68
68
  if (recordNames.length > 0) modelTypesImports.push("RecordModel");
69
69
  if (unionNames.length > 0) modelTypesImports.push("UnionModel");
70
- if (hasDerivedFields) modelTypesImports.push("UpgradeFns");
70
+ if (needsUpgradeFns) modelTypesImports.push("UpgradeFns");
71
71
  output += `import type { ${modelTypesImports.sort().join(", ")} } from "@palantir/pack.document-schema.model-types";\n`;
72
72
  output += `import { Metadata } from "@palantir/pack.document-schema.model-types";\n`;
73
73
  if (allModelNames.length > 0) {
@@ -87,7 +87,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
87
87
  }
88
88
 
89
89
  // DocumentUpgradeFns type is needed by the factory's parameter signature.
90
- if (hasDerivedFields) {
90
+ if (needsUpgradeFns) {
91
91
  output += `import type { DocumentUpgradeFns } from "${INTERNAL_UPGRADE_FNS_PATH}";\n`;
92
92
  }
93
93
  output += "\n";
@@ -170,13 +170,14 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
170
170
  }
171
171
  metadataBody += upgradesBlock;
172
172
  const modelEntriesBody = modelEntries.map(e => ` ${e}`).join(",\n");
173
- if (hasDerivedFields) {
174
- // Factory form: schema has derived fields, so the runtime requires the app
175
- // to supply typed upgrade functions. The factory makes this a compile-time
176
- // requirement — apps can't get a DocumentSchema value without passing them.
173
+ if (needsUpgradeFns) {
174
+ // Factory form: schema has at least one derived field or required additive
175
+ // field, so the runtime requires the app to supply typed upgrade functions.
176
+ // The factory makes this a compile-time requirement — apps can't get a
177
+ // DocumentSchema value without passing them.
177
178
  output += `/**\n`;
178
179
  output += ` * Construct the DocumentModel for this SDK, wiring in the typed forward\n`;
179
- output += ` * functions the runtime needs to materialize derived fields.\n`;
180
+ output += ` * functions the runtime needs to materialize fields added past v1.\n`;
180
181
  output += ` */\n`;
181
182
  output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\n`;
182
183
  output += ` return {\n`;
@@ -188,7 +189,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
188
189
  output += `}\n\n`;
189
190
  output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\n`;
190
191
  } else {
191
- // Const form: no derived fields means no upgrade functions are required.
192
+ // Const form: no field added past v1 needs lens treatment, so no upgrade
193
+ // functions are required.
192
194
  output += `export const DocumentModel = {\n`;
193
195
  output += `${modelEntriesBody},\n`;
194
196
  // Const form indents one level less than the factory body.
@@ -1 +1 @@
1
- {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","findExternalRefType","chainHasDerivedFields","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","hasDerivedFields","output","recordNames","unionNames","variantNames","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","metadataBody","modelEntriesBody","e","replace","modelsFile"],"sources":["generateModelMetadataFromSchema.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 { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { chainHasDerivedFields, resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADE_FNS_PATH,\n INTERNAL_UPGRADES_PATH,\n modelName,\n SCHEMA_REEXPORT_PATH,\n schemaName,\n TYPES_REEXPORT_PATH,\n} from \"./runtimeSchema.js\";\n\nexport interface ModelMetadataOutput {\n /** models.ts content -- DocumentModel with version metadata and upgrade references */\n modelsFile: string;\n}\n\nfunction extractExternalRefFieldTypes(\n record: IRecordDef,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const field of record.fields) {\n const refType = findExternalRefType(field.fieldType);\n if (refType != null) {\n refs.push([field.key, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts from an already-resolved versioned IR chain.\n */\nexport function generateModelMetadataFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain } = resolved;\n const { latestVersion, minVersion } = resolveMinVersion(chain, minSupportedVersion);\n const latestIr = chain[chain.length - 1]!.ir;\n const hasDerivedFields = chainHasDerivedFields(chain);\n\n // --- Generate models.ts ---\n let output = GENERATED_FILE_HEADER;\n\n // Collect model names for imports\n const recordNames: string[] = [];\n const unionNames: string[] = [];\n const variantNames: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n recordNames.push(modelKey);\n } else if (modelDef.type === \"union\") {\n unionNames.push(modelKey);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n variantNames.push(`${modelKey}${formatVariantName(variantName)}`);\n }\n }\n }\n\n const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();\n\n // Imports\n const modelTypesImports: string[] = [\"DocumentSchema\"];\n if (recordNames.length > 0) modelTypesImports.push(\"RecordModel\");\n if (unionNames.length > 0) modelTypesImports.push(\"UnionModel\");\n if (hasDerivedFields) modelTypesImports.push(\"UpgradeFns\");\n\n output += `import type { ${\n modelTypesImports.sort().join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n`;\n output += `import { Metadata } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n if (allModelNames.length > 0) {\n output += `import type { ${allModelNames.join(\", \")} } from \"${TYPES_REEXPORT_PATH}\";\\n`;\n }\n\n // Schema imports\n const schemaNames = allModelNames.map(n => schemaName(n));\n if (schemaNames.length > 0) {\n output += `import { ${schemaNames.join(\", \")} } from \"${SCHEMA_REEXPORT_PATH}\";\\n`;\n }\n\n // Upgrade imports (only if there are upgrades)\n const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);\n if (chain.length > 1 && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n // DocumentUpgradeFns type is needed by the factory's parameter signature.\n if (hasDerivedFields) {\n output += `import type { DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n const externalRefs = extractExternalRefFieldTypes(modelDef.record);\n const metadataFields: string[] = [];\n\n if (externalRefs.length > 0) {\n const entries = externalRefs.map(([field, type]) => ` ${field}: \"${type}\",`).join(\n \"\\n\",\n );\n metadataFields.push(` externalRefFieldTypes: {\\n${entries}\\n },`);\n }\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (modelDef.type === \"union\") {\n const union = modelDef.union;\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${union.discriminant}\",`);\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n\n // Generate variant models\n for (const variantName of Object.keys(union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${union.discriminant}\",`);\n variantMetadata.push(` name: \"${variantTypeName}\",`);\n\n output += `export interface ${\n modelName(variantTypeName)\n } extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\\n`;\n output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\\n`;\n output += ` __type: {} as ${variantTypeName},\\n`;\n output += ` zodSchema: ${schemaName(variantTypeName)},\\n`;\n output += ` [Metadata]: {\\n${variantMetadata.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n }\n }\n }\n\n // Generate DocumentModel\n const modelEntries: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n } else if (modelDef.type === \"union\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);\n }\n }\n }\n\n // Build upgrades map (includes both record and union entries)\n let upgradesBlock: string;\n const allUpgradeNames = [...recordNames, ...unionNames];\n if (chain.length > 1 && allUpgradeNames.length > 0) {\n const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n // Common metadata literal: shared between the const and factory forms.\n let metadataBody = ` [Metadata]: {\\n`;\n metadataBody += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n metadataBody += ` minSupportedVersion: ${minVersion},\\n`;\n }\n metadataBody += upgradesBlock;\n\n const modelEntriesBody = modelEntries.map(e => ` ${e}`).join(\",\\n\");\n\n if (hasDerivedFields) {\n // Factory form: schema has derived fields, so the runtime requires the app\n // to supply typed upgrade functions. The factory makes this a compile-time\n // requirement — apps can't get a DocumentSchema value without passing them.\n output += `/**\\n`;\n output += ` * Construct the DocumentModel for this SDK, wiring in the typed forward\\n`;\n output += ` * functions the runtime needs to materialize derived fields.\\n`;\n output += ` */\\n`;\n output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\\n`;\n output += ` return {\\n`;\n output += `${modelEntriesBody},\\n`;\n output += metadataBody;\n output += ` upgradeFns: upgradeFns as unknown as UpgradeFns,\\n`;\n output += ` },\\n`;\n output += ` };\\n`;\n output += `}\\n\\n`;\n output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\\n`;\n } else {\n // Const form: no derived fields means no upgrade functions are required.\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntriesBody},\\n`;\n // Const form indents one level less than the factory body.\n output += metadataBody.replace(/^ {4}/gm, \" \");\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n }\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","findExternalRefType","chainNeedsUpgradeFns","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","needsUpgradeFns","output","recordNames","unionNames","variantNames","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","metadataBody","modelEntriesBody","e","replace","modelsFile"],"sources":["generateModelMetadataFromSchema.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 { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { chainNeedsUpgradeFns, resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADE_FNS_PATH,\n INTERNAL_UPGRADES_PATH,\n modelName,\n SCHEMA_REEXPORT_PATH,\n schemaName,\n TYPES_REEXPORT_PATH,\n} from \"./runtimeSchema.js\";\n\nexport interface ModelMetadataOutput {\n /** models.ts content -- DocumentModel with version metadata and upgrade references */\n modelsFile: string;\n}\n\nfunction extractExternalRefFieldTypes(\n record: IRecordDef,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const field of record.fields) {\n const refType = findExternalRefType(field.fieldType);\n if (refType != null) {\n refs.push([field.key, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts from an already-resolved versioned IR chain.\n */\nexport function generateModelMetadataFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain } = resolved;\n const { latestVersion, minVersion } = resolveMinVersion(chain, minSupportedVersion);\n const latestIr = chain[chain.length - 1]!.ir;\n const needsUpgradeFns = chainNeedsUpgradeFns(chain);\n\n // --- Generate models.ts ---\n let output = GENERATED_FILE_HEADER;\n\n // Collect model names for imports\n const recordNames: string[] = [];\n const unionNames: string[] = [];\n const variantNames: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n recordNames.push(modelKey);\n } else if (modelDef.type === \"union\") {\n unionNames.push(modelKey);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n variantNames.push(`${modelKey}${formatVariantName(variantName)}`);\n }\n }\n }\n\n const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();\n\n // Imports\n const modelTypesImports: string[] = [\"DocumentSchema\"];\n if (recordNames.length > 0) modelTypesImports.push(\"RecordModel\");\n if (unionNames.length > 0) modelTypesImports.push(\"UnionModel\");\n if (needsUpgradeFns) modelTypesImports.push(\"UpgradeFns\");\n\n output += `import type { ${\n modelTypesImports.sort().join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n`;\n output += `import { Metadata } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n if (allModelNames.length > 0) {\n output += `import type { ${allModelNames.join(\", \")} } from \"${TYPES_REEXPORT_PATH}\";\\n`;\n }\n\n // Schema imports\n const schemaNames = allModelNames.map(n => schemaName(n));\n if (schemaNames.length > 0) {\n output += `import { ${schemaNames.join(\", \")} } from \"${SCHEMA_REEXPORT_PATH}\";\\n`;\n }\n\n // Upgrade imports (only if there are upgrades)\n const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);\n if (chain.length > 1 && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n // DocumentUpgradeFns type is needed by the factory's parameter signature.\n if (needsUpgradeFns) {\n output += `import type { DocumentUpgradeFns } from \"${INTERNAL_UPGRADE_FNS_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n const externalRefs = extractExternalRefFieldTypes(modelDef.record);\n const metadataFields: string[] = [];\n\n if (externalRefs.length > 0) {\n const entries = externalRefs.map(([field, type]) => ` ${field}: \"${type}\",`).join(\n \"\\n\",\n );\n metadataFields.push(` externalRefFieldTypes: {\\n${entries}\\n },`);\n }\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (modelDef.type === \"union\") {\n const union = modelDef.union;\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${union.discriminant}\",`);\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n\n // Generate variant models\n for (const variantName of Object.keys(union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${union.discriminant}\",`);\n variantMetadata.push(` name: \"${variantTypeName}\",`);\n\n output += `export interface ${\n modelName(variantTypeName)\n } extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\\n`;\n output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\\n`;\n output += ` __type: {} as ${variantTypeName},\\n`;\n output += ` zodSchema: ${schemaName(variantTypeName)},\\n`;\n output += ` [Metadata]: {\\n${variantMetadata.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n }\n }\n }\n\n // Generate DocumentModel\n const modelEntries: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n } else if (modelDef.type === \"union\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);\n }\n }\n }\n\n // Build upgrades map (includes both record and union entries)\n let upgradesBlock: string;\n const allUpgradeNames = [...recordNames, ...unionNames];\n if (chain.length > 1 && allUpgradeNames.length > 0) {\n const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n // Common metadata literal: shared between the const and factory forms.\n let metadataBody = ` [Metadata]: {\\n`;\n metadataBody += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n metadataBody += ` minSupportedVersion: ${minVersion},\\n`;\n }\n metadataBody += upgradesBlock;\n\n const modelEntriesBody = modelEntries.map(e => ` ${e}`).join(\",\\n\");\n\n if (needsUpgradeFns) {\n // Factory form: schema has at least one derived field or required additive\n // field, so the runtime requires the app to supply typed upgrade functions.\n // The factory makes this a compile-time requirement — apps can't get a\n // DocumentSchema value without passing them.\n output += `/**\\n`;\n output += ` * Construct the DocumentModel for this SDK, wiring in the typed forward\\n`;\n output += ` * functions the runtime needs to materialize fields added past v1.\\n`;\n output += ` */\\n`;\n output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\\n`;\n output += ` return {\\n`;\n output += `${modelEntriesBody},\\n`;\n output += metadataBody;\n output += ` upgradeFns: upgradeFns as unknown as UpgradeFns,\\n`;\n output += ` },\\n`;\n output += ` };\\n`;\n output += `}\\n\\n`;\n output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\\n`;\n } else {\n // Const form: no field added past v1 needs lens treatment, so no upgrade\n // functions are required.\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntriesBody},\\n`;\n // Const form indents one level less than the factory body.\n output += metadataBody.replace(/^ {4}/gm, \" \");\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n }\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -50,7 +50,7 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
50
50
  let output = GENERATED_FILE_HEADER;
51
51
 
52
52
  // Import model-types
53
- output += `import type { DocumentRef, RecordId, RecordRef } from "@palantir/pack.document-schema.model-types";\n`;
53
+ output += `import type { DocumentRef, EditDescription, PresencePublishOptions, RecordId, RecordRef } from "@palantir/pack.document-schema.model-types";\n`;
54
54
 
55
55
  // Import model types from models.ts
56
56
  const modelImports = allModelNames.map(n => modelName(n));
@@ -100,10 +100,22 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
100
100
  }
101
101
  }
102
102
 
103
- // setCollectionRecord overloads
103
+ // setRecord overloads
104
104
  for (const [modelKey] of Object.entries(ir.models)) {
105
105
  const readType = versionedTypeName(modelKey, version);
106
- output += ` setCollectionRecord(model: typeof ${modelName(modelKey)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
106
+ output += ` setRecord(model: typeof ${modelName(modelKey)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
107
+ }
108
+
109
+ // custom presence overloads
110
+ for (const [modelKey] of Object.entries(ir.models)) {
111
+ const readType = versionedTypeName(modelKey, version);
112
+ output += ` updateCustomPresence(model: typeof ${modelName(modelKey)}, data: ${readType}, options?: PresencePublishOptions): void;\n`;
113
+ }
114
+
115
+ // custom activity description overloads
116
+ for (const [modelKey] of Object.entries(ir.models)) {
117
+ const readType = versionedTypeName(modelKey, version);
118
+ output += ` describeEdit(model: typeof ${modelName(modelKey)}, data: ${readType}): EditDescription<typeof ${modelName(modelKey)}>;\n`;
107
119
  }
108
120
  output += `}\n\n`;
109
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromChain","resolved","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestIr","length","ir","allModelNames","modelKey","Object","keys","models","push","output","modelImports","map","n","typeImportsFromModels","join","readTypeImports","writeTypeImports","modelDef","entries","type","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest IR\n const latestIr = chain[chain.length - 1]!.ir;\n const allModelNames: string[] = [];\n for (const modelKey of Object.keys(latestIr.models)) {\n allModelNames.push(modelKey);\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, RecordId, RecordRef } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n // Import model types from models.ts\n const modelImports = allModelNames.map(n => modelName(n));\n const typeImportsFromModels = [\"DocumentModel\", ...modelImports];\n output += `import type { ${typeImportsFromModels.join(\", \")} } from \"${MODELS_PATH}\";\\n`;\n\n // Import per-version types\n for (const { version, ir } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n writeTypeImports.push(versionedWriteTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n }\n }\n\n if (readTypeImports.length > 0) {\n output += `import type { ${readTypeImports.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n if (writeTypeImports.length > 0) {\n output += `import type { ${writeTypeImports.sort().join(\", \")} } from \"${\n writeTypesFilePath(version)\n }\";\\n`;\n }\n }\n\n output += \"\\n\";\n\n // Generate per-version VersionedDocRef interfaces extending DocumentRef.\n for (const { version, ir } of supportedVersions) {\n output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\\n`;\n output += ` readonly version: ${version};\\n`;\n\n // updateRecord overloads — record models get write types, union models get Partial<read>\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const writeType = versionedWriteTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (modelDef.type === \"union\") {\n const readType = versionedTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setCollectionRecord overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` setCollectionRecord(model: typeof ${\n modelName(modelKey)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromChain","resolved","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestIr","length","ir","allModelNames","modelKey","Object","keys","models","push","output","modelImports","map","n","typeImportsFromModels","join","readTypeImports","writeTypeImports","modelDef","entries","type","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest IR\n const latestIr = chain[chain.length - 1]!.ir;\n const allModelNames: string[] = [];\n for (const modelKey of Object.keys(latestIr.models)) {\n allModelNames.push(modelKey);\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, EditDescription, PresencePublishOptions, RecordId, RecordRef } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n // Import model types from models.ts\n const modelImports = allModelNames.map(n => modelName(n));\n const typeImportsFromModels = [\"DocumentModel\", ...modelImports];\n output += `import type { ${typeImportsFromModels.join(\", \")} } from \"${MODELS_PATH}\";\\n`;\n\n // Import per-version types\n for (const { version, ir } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n writeTypeImports.push(versionedWriteTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n }\n }\n\n if (readTypeImports.length > 0) {\n output += `import type { ${readTypeImports.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n if (writeTypeImports.length > 0) {\n output += `import type { ${writeTypeImports.sort().join(\", \")} } from \"${\n writeTypesFilePath(version)\n }\";\\n`;\n }\n }\n\n output += \"\\n\";\n\n // Generate per-version VersionedDocRef interfaces extending DocumentRef.\n for (const { version, ir } of supportedVersions) {\n output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\\n`;\n output += ` readonly version: ${version};\\n`;\n\n // updateRecord overloads — record models get write types, union models get Partial<read>\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const writeType = versionedWriteTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (modelDef.type === \"union\") {\n const readType = versionedTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setRecord overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` setRecord(model: typeof ${\n modelName(modelKey)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n\n // custom presence overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` updateCustomPresence(model: typeof ${\n modelName(modelKey)\n }, data: ${readType}, options?: PresencePublishOptions): void;\\n`;\n }\n\n // custom activity description overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` describeEdit(model: typeof ${\n modelName(modelKey)\n }, data: ${readType}): EditDescription<typeof ${modelName(modelKey)}>;\\n`;\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { defineSchema } from "@palantir/pack.schema";
17
18
  import fs from "fs-extra";
18
19
  import path from "path";
19
20
  import { pathToFileURL } from "url";
@@ -31,11 +32,7 @@ export function extractSchemaDefinition(schemaModule) {
31
32
  return defaultExport;
32
33
  }
33
34
  const models = extractValidSchema(schemaModule);
34
- return {
35
- type: "initial",
36
- version: 1,
37
- models
38
- };
35
+ return defineSchema(models);
39
36
  }
40
37
 
41
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loadSchemaModule.js","names":["fs","path","pathToFileURL","extractValidSchema","extractSchemaDefinition","schemaModule","defaultExport","default","type","models","version","loadSchemaModule","filePath","inputPath","resolve","pathExists","Error","href"],"sources":["loadSchemaModule.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 { InitialSchema, SchemaDefinition } from \"@palantir/pack.schema\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { extractValidSchema } from \"./validateSchemaModule.js\";\n\n/**\n * Pull a `SchemaDefinition` out of an imported module. Accepts either a chain\n * built via `defineSchemaUpdate(...)` (`type: \"initial\" | \"versioned\"`) or a\n * plain `ModelDefs` object exported as `default` (which is wrapped in an\n * `InitialSchema` at version 1).\n */\nexport function extractSchemaDefinition(schemaModule: unknown): SchemaDefinition {\n const mod = schemaModule as Record<string, unknown>;\n const defaultExport = mod.default;\n\n if (\n typeof defaultExport === \"object\" && defaultExport != null\n && \"type\" in defaultExport\n && (defaultExport.type === \"initial\" || defaultExport.type === \"versioned\")\n ) {\n return defaultExport as SchemaDefinition;\n }\n\n const models = extractValidSchema(schemaModule);\n return { type: \"initial\", version: 1, models } satisfies InitialSchema;\n}\n\n/**\n * Resolve and import a schema module from a file path, returning a\n * `SchemaDefinition` ready for IR resolution.\n */\nexport async function loadSchemaModule(filePath: string): Promise<SchemaDefinition> {\n const inputPath = path.resolve(filePath);\n if (!(await fs.pathExists(inputPath))) {\n throw new Error(`Input file not found: ${inputPath}`);\n }\n const schemaModule: unknown = await import(pathToFileURL(inputPath).href);\n return extractSchemaDefinition(schemaModule);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,EAAE,MAAM,UAAU;AACzB,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,aAAa,QAAQ,KAAK;AACnC,SAASC,kBAAkB,QAAQ,2BAA2B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAACC,YAAqB,EAAoB;EAE/E,MAAMC,aAAa,GADPD,YAAY,CACEE,OAAO;EAEjC,IACE,OAAOD,aAAa,KAAK,QAAQ,IAAIA,aAAa,IAAI,IAAI,IACvD,MAAM,IAAIA,aAAa,KACtBA,aAAa,CAACE,IAAI,KAAK,SAAS,IAAIF,aAAa,CAACE,IAAI,KAAK,WAAW,CAAC,EAC3E;IACA,OAAOF,aAAa;EACtB;EAEA,MAAMG,MAAM,GAAGN,kBAAkB,CAACE,YAAY,CAAC;EAC/C,OAAO;IAAEG,IAAI,EAAE,SAAS;IAAEE,OAAO,EAAE,CAAC;IAAED;EAAO,CAAC;AAChD;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeE,gBAAgBA,CAACC,QAAgB,EAA6B;EAClF,MAAMC,SAAS,GAAGZ,IAAI,CAACa,OAAO,CAACF,QAAQ,CAAC;EACxC,IAAI,EAAE,MAAMZ,EAAE,CAACe,UAAU,CAACF,SAAS,CAAC,CAAC,EAAE;IACrC,MAAM,IAAIG,KAAK,CAAC,yBAAyBH,SAAS,EAAE,CAAC;EACvD;EACA,MAAMR,YAAqB,GAAG,MAAM,MAAM,CAACH,aAAa,CAACW,SAAS,CAAC,CAACI,IAAI,CAAC;EACzE,OAAOb,uBAAuB,CAACC,YAAY,CAAC;AAC9C","ignoreList":[]}
1
+ {"version":3,"file":"loadSchemaModule.js","names":["defineSchema","fs","path","pathToFileURL","extractValidSchema","extractSchemaDefinition","schemaModule","defaultExport","default","type","models","loadSchemaModule","filePath","inputPath","resolve","pathExists","Error","href"],"sources":["loadSchemaModule.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 { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { defineSchema } from \"@palantir/pack.schema\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport { extractValidSchema } from \"./validateSchemaModule.js\";\n\n/**\n * Pull a `SchemaDefinition` out of an imported module. Accepts either a chain\n * built via `defineSchemaUpdate(...)` (`type: \"initial\" | \"versioned\"`) or a\n * plain `ModelDefs` object exported as `default` (which is wrapped in an\n * `InitialSchema` at version 1).\n */\nexport function extractSchemaDefinition(schemaModule: unknown): SchemaDefinition {\n const mod = schemaModule as Record<string, unknown>;\n const defaultExport = mod.default;\n\n if (\n typeof defaultExport === \"object\" && defaultExport != null\n && \"type\" in defaultExport\n && (defaultExport.type === \"initial\" || defaultExport.type === \"versioned\")\n ) {\n return defaultExport as SchemaDefinition;\n }\n\n const models = extractValidSchema(schemaModule);\n return defineSchema(models);\n}\n\n/**\n * Resolve and import a schema module from a file path, returning a\n * `SchemaDefinition` ready for IR resolution.\n */\nexport async function loadSchemaModule(filePath: string): Promise<SchemaDefinition> {\n const inputPath = path.resolve(filePath);\n if (!(await fs.pathExists(inputPath))) {\n throw new Error(`Input file not found: ${inputPath}`);\n }\n const schemaModule: unknown = await import(pathToFileURL(inputPath).href);\n return extractSchemaDefinition(schemaModule);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,YAAY,QAAQ,uBAAuB;AACpD,OAAOC,EAAE,MAAM,UAAU;AACzB,OAAOC,IAAI,MAAM,MAAM;AACvB,SAASC,aAAa,QAAQ,KAAK;AACnC,SAASC,kBAAkB,QAAQ,2BAA2B;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAACC,YAAqB,EAAoB;EAE/E,MAAMC,aAAa,GADPD,YAAY,CACEE,OAAO;EAEjC,IACE,OAAOD,aAAa,KAAK,QAAQ,IAAIA,aAAa,IAAI,IAAI,IACvD,MAAM,IAAIA,aAAa,KACtBA,aAAa,CAACE,IAAI,KAAK,SAAS,IAAIF,aAAa,CAACE,IAAI,KAAK,WAAW,CAAC,EAC3E;IACA,OAAOF,aAAa;EACtB;EAEA,MAAMG,MAAM,GAAGN,kBAAkB,CAACE,YAAY,CAAC;EAC/C,OAAON,YAAY,CAACU,MAAM,CAAC;AAC7B;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeC,gBAAgBA,CAACC,QAAgB,EAA6B;EAClF,MAAMC,SAAS,GAAGX,IAAI,CAACY,OAAO,CAACF,QAAQ,CAAC;EACxC,IAAI,EAAE,MAAMX,EAAE,CAACc,UAAU,CAACF,SAAS,CAAC,CAAC,EAAE;IACrC,MAAM,IAAIG,KAAK,CAAC,yBAAyBH,SAAS,EAAE,CAAC;EACvD;EACA,MAAMP,YAAqB,GAAG,MAAM,MAAM,CAACH,aAAa,CAACU,SAAS,CAAC,CAACI,IAAI,CAAC;EACzE,OAAOZ,uBAAuB,CAACC,YAAY,CAAC;AAC9C","ignoreList":[]}