@palantir/pack.document-schema.type-gen 0.9.0 → 0.11.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 (156) hide show
  1. package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js +85 -0
  2. package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js.map +1 -0
  3. package/build/esm/commands/asset/assetDeployHandler.js +36 -1
  4. package/build/esm/commands/asset/assetDeployHandler.js.map +1 -1
  5. package/build/esm/commands/asset/assetUpdateSchemaHandler.js +84 -0
  6. package/build/esm/commands/asset/assetUpdateSchemaHandler.js.map +1 -0
  7. package/build/esm/commands/asset/registerAssetCommands.js +3 -1
  8. package/build/esm/commands/asset/registerAssetCommands.js.map +1 -1
  9. package/build/esm/commands/ir/irGenTypesHandler.js +49 -0
  10. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -0
  11. package/build/esm/commands/ir/registerIrCommands.js +2 -0
  12. package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
  13. package/build/esm/commands/schema/registerSchemaCommands.js +2 -2
  14. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  15. package/build/esm/commands/schema/schemaIrHandler.js +56 -0
  16. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -0
  17. package/build/esm/index.js +0 -6
  18. package/build/esm/index.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/ir/__tests__/convertIrToWireSchema.test.js +23 -0
  42. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  43. package/build/esm/utils/ir/irFieldHelpers.js +383 -0
  44. package/build/esm/utils/ir/irFieldHelpers.js.map +1 -0
  45. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  46. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  47. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  48. package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js +13 -0
  49. package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/fixtures.js +78 -13
  51. package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
  52. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +19 -7
  53. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  54. package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +12 -7
  55. package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -1
  56. package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +6 -5
  57. package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -1
  58. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +19 -10
  59. package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
  60. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +15 -10
  61. package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
  62. package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +6 -5
  63. package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -1
  64. package/build/esm/utils/schema/__tests__/snapshotUtils.js +3 -0
  65. package/build/esm/utils/schema/__tests__/snapshotUtils.js.map +1 -1
  66. package/build/esm/utils/schema/convertSchemaToSteps.js +6 -0
  67. package/build/esm/utils/schema/convertSchemaToSteps.js.map +1 -1
  68. package/build/esm/utils/schema/generateIndexFromSchema.js +21 -14
  69. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  70. package/build/esm/utils/schema/generateInternalFromSchema.js +202 -191
  71. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  72. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +89 -80
  73. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  74. package/build/esm/utils/schema/generateScopeFromSchema.js +29 -33
  75. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  76. package/build/esm/utils/schema/generateTypesFromSchema.js +9 -1
  77. package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
  78. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +61 -155
  79. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  80. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +58 -94
  81. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  82. package/build/esm/utils/schema/generateVersionsFromSchema.js +7 -5
  83. package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -1
  84. package/build/esm/utils/schema/loadSchemaModule.js +53 -0
  85. package/build/esm/utils/schema/loadSchemaModule.js.map +1 -0
  86. package/build/esm/utils/schema/resolveSchemaChain.js +68 -9
  87. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  88. package/build/esm/utils/schema/runtimeSchema.js +3 -27
  89. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  90. package/build/esm/utils/schema/writeAllSdkFiles.js +113 -0
  91. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -0
  92. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  93. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  94. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  95. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  96. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  97. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  98. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  99. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  100. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  101. package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js +93 -1
  102. package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js.map +1 -1
  103. package/build/esm/utils/steps/convertStepsToIr.js +43 -35
  104. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  105. package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts +2 -0
  106. package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts.map +1 -0
  107. package/build/types/commands/asset/assetDeployHandler.d.ts +15 -0
  108. package/build/types/commands/asset/assetDeployHandler.d.ts.map +1 -1
  109. package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts +12 -0
  110. package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts.map +1 -0
  111. package/build/types/commands/asset/registerAssetCommands.d.ts.map +1 -1
  112. package/build/types/commands/ir/irGenTypesHandler.d.ts +8 -0
  113. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -0
  114. package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
  115. package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
  116. package/build/types/commands/schema/schemaIrHandler.d.ts +19 -0
  117. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -0
  118. package/build/types/index.d.ts +1 -6
  119. package/build/types/index.d.ts.map +1 -1
  120. package/build/types/utils/ir/irFieldHelpers.d.ts +36 -0
  121. package/build/types/utils/ir/irFieldHelpers.d.ts.map +1 -0
  122. package/build/types/utils/schema/__tests__/fixtures.d.ts +10 -1
  123. package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
  124. package/build/types/utils/schema/__tests__/snapshotUtils.d.ts +2 -0
  125. package/build/types/utils/schema/__tests__/snapshotUtils.d.ts.map +1 -1
  126. package/build/types/utils/schema/convertSchemaToSteps.d.ts.map +1 -1
  127. package/build/types/utils/schema/generateIndexFromSchema.d.ts +5 -3
  128. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  129. package/build/types/utils/schema/generateInternalFromSchema.d.ts +6 -7
  130. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  131. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +3 -8
  132. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  133. package/build/types/utils/schema/generateScopeFromSchema.d.ts +2 -2
  134. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  135. package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
  136. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +4 -7
  137. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  138. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +3 -7
  139. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  140. package/build/types/utils/schema/generateVersionsFromSchema.d.ts +3 -3
  141. package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -1
  142. package/build/types/utils/schema/loadSchemaModule.d.ts +14 -0
  143. package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -0
  144. package/build/types/utils/schema/resolveSchemaChain.d.ts +29 -8
  145. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  146. package/build/types/utils/schema/runtimeSchema.d.ts +2 -32
  147. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  148. package/build/types/utils/schema/writeAllSdkFiles.d.ts +8 -0
  149. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -0
  150. package/build/types/utils/steps/convertStepsToIr.d.ts +3 -3
  151. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  152. package/package.json +4 -4
  153. package/build/esm/commands/schema/schemaGenTypesHandler.js +0 -147
  154. package/build/esm/commands/schema/schemaGenTypesHandler.js.map +0 -1
  155. package/build/types/commands/schema/schemaGenTypesHandler.d.ts +0 -8
  156. package/build/types/commands/schema/schemaGenTypesHandler.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","resolveSchemaChain","findRecordExportName","isRecordSchema","isUnionSchema","TypeKind","convertTypeToTypeScript","fieldType","type","ARRAY","items","Error","inner","needsParens","includes","startsWith","wrapped","BOOLEAN","DOC_REF","DOUBLE","MEDIA_REF","OBJECT_REF","OPTIONAL","item","REF","STRING","USER_REF","convertTypeToFieldTypeDescriptor","schema","name","exportKey","refType","convertTypeToZodSchema","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","collectRecordModels","chain","allRecordModels","Map","version","exportName","Object","has","set","allFields","steps","model","get","fieldName","fields","existing","presentInVersions","Set","alwaysOptional","add","i","length","prevVersion","currVersion","currItem","prevItem","prevFields","keys","currFields","addedFields","recordUpgrades","migrations","annotation","derivedFrom","forwardSource","forward","toString","removedFields","push","size","addedInVersion","totalVersions","values","fieldInfo","generateInternalTypes","output","tsType","optional","generateUpgrades","latestSchema","hasRecords","hasUnions","some","imports","join","typeDescriptor","default","undefined","JSON","stringify","step","fieldMeta","d","f","discriminant","variantKey","variantField","variants","variantExportName","generateInternalSchemaContent","zodType","endsWith","generateInternalFromSchema","internalTypes","upgrades","internalSchema"],"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 { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { VersionedSchemaEntry } from \"./resolveSchemaChain.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport type { RuntimeSchema, SchemaField } from \"./runtimeSchema.js\";\nimport { findRecordExportName, isRecordSchema, isUnionSchema, TypeKind } from \"./runtimeSchema.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}\n\n/**\n * Convert a schema field type to TypeScript string for internal types.\n */\nfunction convertTypeToTypeScript(fieldType: SchemaField): string {\n switch (fieldType.type) {\n case TypeKind.ARRAY: {\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n const inner = convertTypeToTypeScript(fieldType.items);\n // Wrap compound types (unions, other arrays) in parens before appending []\n const needsParens = inner.includes(\"|\") || inner.startsWith(\"readonly \");\n const wrapped = needsParens ? `(${inner})` : inner;\n return `readonly ${wrapped}[]`;\n }\n case TypeKind.BOOLEAN:\n return \"boolean\";\n case TypeKind.DOC_REF:\n return \"string\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"string\";\n case TypeKind.OBJECT_REF:\n return \"string\";\n case TypeKind.OPTIONAL:\n if (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return `(${convertTypeToTypeScript(fieldType.item)} | undefined)`;\n case TypeKind.REF:\n return \"unknown\";\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"string\";\n default:\n throw new Error(`Unknown schema field type: ${fieldType.type}`);\n }\n}\n\n/**\n * Convert a schema field type to a FieldTypeDescriptor source string.\n */\nfunction convertTypeToFieldTypeDescriptor(fieldType: SchemaField, schema: RuntimeSchema): string {\n switch (fieldType.type) {\n case TypeKind.ARRAY:\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n return `{ kind: \"array\", element: ${\n convertTypeToFieldTypeDescriptor(fieldType.items, schema)\n } }`;\n case TypeKind.OPTIONAL:\n if (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return `{ kind: \"optional\", inner: ${\n convertTypeToFieldTypeDescriptor(fieldType.item, schema)\n } }`;\n case TypeKind.REF: {\n if (fieldType.name == null) {\n throw new Error(\"Ref field is missing a name\");\n }\n const exportKey = fieldType.refType === \"record\"\n ? findRecordExportName(fieldType.name, schema) ?? fieldType.name\n : fieldType.name;\n return `{ kind: \"modelRef\", model: \"${exportKey}\" }`;\n }\n default:\n return `{ kind: \"primitive\" }`;\n }\n}\n\n/**\n * Convert a schema field type to a Zod schema string.\n */\nfunction convertTypeToZodSchema(fieldType: SchemaField): string {\n switch (fieldType.type) {\n case TypeKind.ARRAY:\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n return `z.array(${convertTypeToZodSchema(fieldType.items)})`;\n case TypeKind.BOOLEAN:\n return \"z.boolean()\";\n case TypeKind.DOC_REF:\n case TypeKind.MEDIA_REF:\n case TypeKind.OBJECT_REF:\n case TypeKind.STRING:\n case TypeKind.USER_REF:\n return \"z.string()\";\n case TypeKind.DOUBLE:\n return \"z.number()\";\n case TypeKind.OPTIONAL:\n if (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return `${convertTypeToZodSchema(fieldType.item)}.optional()`;\n case TypeKind.REF:\n return \"z.unknown()\";\n default:\n throw new Error(`Unknown schema field type: ${fieldType.type}`);\n }\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: SchemaField;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Default value if any. */\n default?: unknown;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n */\ninterface UpgradeStep {\n name: string;\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; forwardSource: 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: VersionedSchemaEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, schema } of chain) {\n for (const [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n if (!allRecordModels.has(exportName)) {\n allRecordModels.set(exportName, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(exportName)!;\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n const existing = model.allFields.get(fieldName);\n if (existing == null) {\n model.allFields.set(fieldName, {\n fieldType,\n presentInVersions: new Set([version]),\n alwaysOptional: fieldType.type === TypeKind.OPTIONAL,\n });\n } else {\n existing.presentInVersions.add(version);\n if (fieldType.type !== TypeKind.OPTIONAL) {\n existing.alwaysOptional = false;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevVersion = chain[i - 1]!;\n const currVersion = chain[i]!;\n\n for (const [exportName, currItem] of Object.entries(currVersion.schema)) {\n if (!isRecordSchema(currItem)) continue;\n\n const prevItem = prevVersion.schema[exportName];\n if (prevItem == null || !isRecordSchema(prevItem)) continue;\n\n const model = allRecordModels.get(exportName);\n if (model == null) continue;\n\n const prevFields = new Set(Object.keys(prevItem.fields));\n const currFields = new Set(Object.keys(currItem.fields));\n\n // Fields added in this version\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; forwardSource: string; default?: unknown }\n >();\n const recordUpgrades = currVersion.migrations?.[exportName];\n for (const fieldName of currFields) {\n if (!prevFields.has(fieldName)) {\n const annotation = recordUpgrades?.[fieldName];\n if (annotation != null) {\n addedFields.set(fieldName, {\n derivedFrom: [...annotation.derivedFrom],\n forwardSource: annotation.forward.toString(),\n });\n } else {\n addedFields.set(fieldName, {\n derivedFrom: [],\n forwardSource: \"() => undefined\",\n });\n }\n }\n }\n\n // Fields removed in this version\n const removedFields: string[] = [];\n for (const fieldName of prevFields) {\n if (!currFields.has(fieldName)) {\n removedFields.push(fieldName);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n name: `v${currVersion.version}`,\n addedInVersion: currVersion.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 [exportName, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${exportName}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertTypeToTypeScript(fieldInfo.fieldType);\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 _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestSchema: RuntimeSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestSchema).some(isUnionSchema);\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 [exportName, model] of sortedEntries(allRecordModels)) {\n output += `export const ${exportName}Upgrades: UpgradeRegistry<\"${exportName}\"> = {\\n`;\n output += ` modelName: \"${exportName}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertTypeToFieldTypeDescriptor(fieldInfo.fieldType, latestSchema);\n if (fieldInfo.default !== undefined) {\n output += ` ${fieldName}: { type: ${typeDescriptor}, default: ${\n JSON.stringify(fieldInfo.default)\n } },\\n`;\n } else {\n output += ` ${fieldName}: { type: ${typeDescriptor} },\\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 += ` name: \"${step.name}\",\\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 += ` forward: ${fieldMeta.forwardSource},\\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 [exportName, item] of Object.entries(latestSchema)) {\n if (!isUnionSchema(item)) continue;\n\n output += `export const ${exportName}Upgrades: UnionUpgradeRegistry<\"${exportName}\"> = {\\n`;\n output += ` modelName: \"${exportName}\",\\n`;\n output += ` discriminant: \"${item.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantField] of Object.entries(item.variants)) {\n if (\n variantField.type === \"ref\" && variantField.refType === \"record\"\n && variantField.name != null\n ) {\n const variantExportName = findRecordExportName(variantField.name, latestSchema);\n if (variantExportName != null) {\n output += ` \"${variantKey}\": \"${variantExportName}\",\\n`;\n }\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 [exportName, model] of sortedEntries(allRecordModels)) {\n output += `export const ${exportName}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const zodType = convertTypeToZodSchema(fieldInfo.fieldType);\n // In internal schema, all fields that might be absent are optional\n if (fieldInfo.alwaysOptional) {\n // If the type already ends with .optional(), don't double-wrap\n if (zodType.endsWith(\".optional()\")) {\n output += ` ${fieldName}: ${zodType},\\n`;\n } else {\n output += ` ${fieldName}: ${zodType}.optional(),\\n`;\n }\n } else {\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, and _internal/schema.ts\n * from a versioned schema chain.\n *\n * @param schema - The schema definition (initial or versioned)\n * @returns Object containing generated code for each internal file\n */\nexport function generateInternalFromSchema(\n schema: SchemaDefinition,\n): InternalTypesOutput {\n const { chain } = resolveSchemaChain(schema);\n const latestSchema = chain[chain.length - 1]!.schema;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels);\n const upgrades = generateUpgrades(allRecordModels, latestSchema);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n\n return { internalTypes, upgrades, internalSchema };\n}\n"],"mappings":"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","ignoreList":[]}
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":[]}
@@ -16,56 +16,33 @@
16
16
 
17
17
  import { formatVariantName } from "../formatVariantName.js";
18
18
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
19
- import { resolveSchemaChain } from "./resolveSchemaChain.js";
20
- import { INTERNAL_UPGRADES_PATH, isRecordSchema, isUnionSchema, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
21
- /**
22
- * Detect which external ref field types (docRef, mediaRef, objectRef, userRef)
23
- * are present on a record for its model metadata.
24
- */
25
- function findExternalRefType(field) {
26
- switch (field.type) {
27
- case "docRef":
28
- return "docRef";
29
- case "mediaRef":
30
- return "mediaRef";
31
- case "objectRef":
32
- return "objectRef";
33
- case "userRef":
34
- return "userRef";
35
- case "optional":
36
- return field.item ? findExternalRefType(field.item) : undefined;
37
- case "array":
38
- return field.items ? findExternalRefType(field.items) : undefined;
39
- default:
40
- return undefined;
41
- }
42
- }
19
+ import { findExternalRefType } from "../ir/irFieldHelpers.js";
20
+ import { chainHasDerivedFields, resolveMinVersion } from "./resolveSchemaChain.js";
21
+ import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
43
22
  function extractExternalRefFieldTypes(record) {
44
23
  const refs = [];
45
- for (const [fieldName, fieldType] of Object.entries(record.fields)) {
46
- const refType = findExternalRefType(fieldType);
24
+ for (const field of record.fields) {
25
+ const refType = findExternalRefType(field.fieldType);
47
26
  if (refType != null) {
48
- refs.push([fieldName, refType]);
27
+ refs.push([field.key, refType]);
49
28
  }
50
29
  }
51
30
  return refs;
52
31
  }
53
32
 
54
33
  /**
55
- * Generate models.ts and schema manifest from a versioned schema chain.
56
- *
57
- * @param schema - The schema definition (initial or versioned)
58
- * @param minSupportedVersion - Minimum version this client supports (defaults to latest)
59
- * @param options - Configuration for import paths
60
- * @returns Object containing generated models.ts content and schema manifest JSON
34
+ * Generate models.ts from an already-resolved versioned IR chain.
61
35
  */
62
- export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
36
+ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
37
+ const {
38
+ chain
39
+ } = resolved;
63
40
  const {
64
- chain,
65
41
  latestVersion,
66
42
  minVersion
67
- } = resolveSchemaChain(schema, minSupportedVersion);
68
- const latestSchema = chain[chain.length - 1].schema;
43
+ } = resolveMinVersion(chain, minSupportedVersion);
44
+ const latestIr = chain[chain.length - 1].ir;
45
+ const hasDerivedFields = chainHasDerivedFields(chain);
69
46
 
70
47
  // --- Generate models.ts ---
71
48
  let output = GENERATED_FILE_HEADER;
@@ -74,13 +51,13 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
74
51
  const recordNames = [];
75
52
  const unionNames = [];
76
53
  const variantNames = [];
77
- for (const [exportName, item] of Object.entries(latestSchema)) {
78
- if (isRecordSchema(item)) {
79
- recordNames.push(exportName);
80
- } else if (isUnionSchema(item)) {
81
- unionNames.push(exportName);
82
- for (const variantName of Object.keys(item.variants)) {
83
- variantNames.push(`${exportName}${formatVariantName(variantName)}`);
54
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
55
+ if (modelDef.type === "record") {
56
+ recordNames.push(modelKey);
57
+ } else if (modelDef.type === "union") {
58
+ unionNames.push(modelKey);
59
+ for (const variantName of Object.keys(modelDef.union.variants)) {
60
+ variantNames.push(`${modelKey}${formatVariantName(variantName)}`);
84
61
  }
85
62
  }
86
63
  }
@@ -90,6 +67,7 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
90
67
  const modelTypesImports = ["DocumentSchema"];
91
68
  if (recordNames.length > 0) modelTypesImports.push("RecordModel");
92
69
  if (unionNames.length > 0) modelTypesImports.push("UnionModel");
70
+ if (hasDerivedFields) modelTypesImports.push("UpgradeFns");
93
71
  output += `import type { ${modelTypesImports.sort().join(", ")} } from "@palantir/pack.document-schema.model-types";\n`;
94
72
  output += `import { Metadata } from "@palantir/pack.document-schema.model-types";\n`;
95
73
  if (allModelNames.length > 0) {
@@ -107,41 +85,47 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
107
85
  if (chain.length > 1 && upgradeNames.length > 0) {
108
86
  output += `import { ${upgradeNames.join(", ")} } from "${INTERNAL_UPGRADES_PATH}";\n`;
109
87
  }
88
+
89
+ // DocumentUpgradeFns type is needed by the factory's parameter signature.
90
+ if (hasDerivedFields) {
91
+ output += `import type { DocumentUpgradeFns } from "${INTERNAL_UPGRADE_FNS_PATH}";\n`;
92
+ }
110
93
  output += "\n";
111
94
 
112
95
  // Generate model constants
113
- for (const [exportName, item] of Object.entries(latestSchema)) {
114
- if (isRecordSchema(item)) {
115
- const externalRefs = extractExternalRefFieldTypes(item);
96
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
97
+ if (modelDef.type === "record") {
98
+ const externalRefs = extractExternalRefFieldTypes(modelDef.record);
116
99
  const metadataFields = [];
117
100
  if (externalRefs.length > 0) {
118
101
  const entries = externalRefs.map(([field, type]) => ` ${field}: "${type}",`).join("\n");
119
102
  metadataFields.push(` externalRefFieldTypes: {\n${entries}\n },`);
120
103
  }
121
- metadataFields.push(` name: "${exportName}",`);
122
- output += `export interface ${modelName(exportName)} extends RecordModel<${exportName}, typeof ${schemaName(exportName)}> {}\n`;
123
- output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\n`;
124
- output += ` __type: {} as ${exportName},\n`;
125
- output += ` zodSchema: ${schemaName(exportName)},\n`;
104
+ metadataFields.push(` name: "${modelKey}",`);
105
+ output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
106
+ output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
107
+ output += ` __type: {} as ${modelKey},\n`;
108
+ output += ` zodSchema: ${schemaName(modelKey)},\n`;
126
109
  output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
127
110
  output += `};\n\n`;
128
- } else if (isUnionSchema(item)) {
111
+ } else if (modelDef.type === "union") {
112
+ const union = modelDef.union;
129
113
  const metadataFields = [];
130
- metadataFields.push(` discriminant: "${item.discriminant}",`);
131
- metadataFields.push(` name: "${exportName}",`);
132
- output += `export interface ${modelName(exportName)} extends UnionModel<${exportName}, typeof ${schemaName(exportName)}> {}\n`;
133
- output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\n`;
134
- output += ` __type: {} as ${exportName},\n`;
135
- output += ` zodSchema: ${schemaName(exportName)},\n`;
114
+ metadataFields.push(` discriminant: "${union.discriminant}",`);
115
+ metadataFields.push(` name: "${modelKey}",`);
116
+ output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
117
+ output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
118
+ output += ` __type: {} as ${modelKey},\n`;
119
+ output += ` zodSchema: ${schemaName(modelKey)},\n`;
136
120
  output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
137
121
  output += `};\n\n`;
138
122
 
139
123
  // Generate variant models
140
- for (const variantName of Object.keys(item.variants)) {
124
+ for (const variantName of Object.keys(union.variants)) {
141
125
  const formattedVariant = formatVariantName(variantName);
142
- const variantTypeName = `${exportName}${formattedVariant}`;
126
+ const variantTypeName = `${modelKey}${formattedVariant}`;
143
127
  const variantMetadata = [];
144
- variantMetadata.push(` discriminant: "${item.discriminant}",`);
128
+ variantMetadata.push(` discriminant: "${union.discriminant}",`);
145
129
  variantMetadata.push(` name: "${variantTypeName}",`);
146
130
  output += `export interface ${modelName(variantTypeName)} extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\n`;
147
131
  output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\n`;
@@ -155,14 +139,14 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
155
139
 
156
140
  // Generate DocumentModel
157
141
  const modelEntries = [];
158
- for (const [exportName, item] of Object.entries(latestSchema)) {
159
- if (isRecordSchema(item)) {
160
- modelEntries.push(` ${exportName}: ${modelName(exportName)}`);
161
- } else if (isUnionSchema(item)) {
162
- modelEntries.push(` ${exportName}: ${modelName(exportName)}`);
163
- for (const variantName of Object.keys(item.variants)) {
142
+ for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
143
+ if (modelDef.type === "record") {
144
+ modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
145
+ } else if (modelDef.type === "union") {
146
+ modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
147
+ for (const variantName of Object.keys(modelDef.union.variants)) {
164
148
  const formattedVariant = formatVariantName(variantName);
165
- const variantTypeName = `${exportName}${formattedVariant}`;
149
+ const variantTypeName = `${modelKey}${formattedVariant}`;
166
150
  modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);
167
151
  }
168
152
  }
@@ -172,22 +156,47 @@ export function generateModelMetadataFromSchema(schema, minSupportedVersion) {
172
156
  let upgradesBlock;
173
157
  const allUpgradeNames = [...recordNames, ...unionNames];
174
158
  if (chain.length > 1 && allUpgradeNames.length > 0) {
175
- const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join("\n");
176
- upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
159
+ const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join("\n");
160
+ upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
177
161
  } else {
178
162
  upgradesBlock = "";
179
163
  }
180
- output += `export const DocumentModel = {\n`;
181
- output += `${modelEntries.join(",\n")},\n`;
182
- output += ` [Metadata]: {\n`;
183
- output += ` version: ${latestVersion},\n`;
164
+
165
+ // Common metadata literal: shared between the const and factory forms.
166
+ let metadataBody = ` [Metadata]: {\n`;
167
+ metadataBody += ` version: ${latestVersion},\n`;
184
168
  if (minVersion !== latestVersion) {
185
- output += ` minSupportedVersion: ${minVersion},\n`;
169
+ metadataBody += ` minSupportedVersion: ${minVersion},\n`;
170
+ }
171
+ metadataBody += upgradesBlock;
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.
177
+ output += `/**\n`;
178
+ 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 += ` */\n`;
181
+ output += `export function DocumentModel(upgradeFns: DocumentUpgradeFns): DocumentSchema {\n`;
182
+ output += ` return {\n`;
183
+ output += `${modelEntriesBody},\n`;
184
+ output += metadataBody;
185
+ output += ` upgradeFns: upgradeFns as unknown as UpgradeFns,\n`;
186
+ output += ` },\n`;
187
+ output += ` };\n`;
188
+ output += `}\n\n`;
189
+ output += `export type DocumentModel = ReturnType<typeof DocumentModel>;\n`;
190
+ } else {
191
+ // Const form: no derived fields means no upgrade functions are required.
192
+ output += `export const DocumentModel = {\n`;
193
+ output += `${modelEntriesBody},\n`;
194
+ // Const form indents one level less than the factory body.
195
+ output += metadataBody.replace(/^ {4}/gm, " ");
196
+ output += ` },\n`;
197
+ output += `} as const satisfies DocumentSchema;\n\n`;
198
+ output += `export type DocumentModel = typeof DocumentModel;\n`;
186
199
  }
187
- output += upgradesBlock;
188
- output += ` },\n`;
189
- output += `} as const satisfies DocumentSchema;\n\n`;
190
- output += `export type DocumentModel = typeof DocumentModel;\n`;
191
200
  return {
192
201
  modelsFile: output
193
202
  };
@@ -1 +1 @@
1
- {"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveSchemaChain","INTERNAL_UPGRADES_PATH","isRecordSchema","isUnionSchema","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","findExternalRefType","field","type","item","undefined","items","extractExternalRefFieldTypes","record","refs","fieldName","fieldType","Object","entries","fields","refType","push","generateModelMetadataFromSchema","schema","minSupportedVersion","chain","latestVersion","minVersion","latestSchema","length","output","recordNames","unionNames","variantNames","exportName","variantName","keys","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","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 { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport type { RuntimeSchemaRecord, SchemaField } from \"./runtimeSchema.js\";\nimport {\n INTERNAL_UPGRADES_PATH,\n isRecordSchema,\n isUnionSchema,\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\n/**\n * Detect which external ref field types (docRef, mediaRef, objectRef, userRef)\n * are present on a record for its model metadata.\n */\nfunction findExternalRefType(field: SchemaField): string | undefined {\n switch (field.type) {\n case \"docRef\":\n return \"docRef\";\n case \"mediaRef\":\n return \"mediaRef\";\n case \"objectRef\":\n return \"objectRef\";\n case \"userRef\":\n return \"userRef\";\n case \"optional\":\n return field.item ? findExternalRefType(field.item) : undefined;\n case \"array\":\n return field.items ? findExternalRefType(field.items) : undefined;\n default:\n return undefined;\n }\n}\n\nfunction extractExternalRefFieldTypes(\n record: RuntimeSchemaRecord,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const refType = findExternalRefType(fieldType);\n if (refType != null) {\n refs.push([fieldName, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts and schema manifest from a versioned schema chain.\n *\n * @param schema - The schema definition (initial or versioned)\n * @param minSupportedVersion - Minimum version this client supports (defaults to latest)\n * @param options - Configuration for import paths\n * @returns Object containing generated models.ts content and schema manifest JSON\n */\nexport function generateModelMetadataFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n const latestSchema = chain[chain.length - 1]!.schema;\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 [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n recordNames.push(exportName);\n } else if (isUnionSchema(item)) {\n unionNames.push(exportName);\n for (const variantName of Object.keys(item.variants)) {\n variantNames.push(`${exportName}${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\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 output += \"\\n\";\n\n // Generate model constants\n for (const [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n const externalRefs = extractExternalRefFieldTypes(item);\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: \"${exportName}\",`);\n\n output += `export interface ${\n modelName(exportName)\n } extends RecordModel<${exportName}, typeof ${schemaName(exportName)}> {}\\n`;\n output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\\n`;\n output += ` __type: {} as ${exportName},\\n`;\n output += ` zodSchema: ${schemaName(exportName)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (isUnionSchema(item)) {\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${item.discriminant}\",`);\n metadataFields.push(` name: \"${exportName}\",`);\n\n output += `export interface ${\n modelName(exportName)\n } extends UnionModel<${exportName}, typeof ${schemaName(exportName)}> {}\\n`;\n output += `export const ${modelName(exportName)}: ${modelName(exportName)} = {\\n`;\n output += ` __type: {} as ${exportName},\\n`;\n output += ` zodSchema: ${schemaName(exportName)},\\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(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${exportName}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${item.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 [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item)) {\n modelEntries.push(` ${exportName}: ${modelName(exportName)}`);\n } else if (isUnionSchema(item)) {\n modelEntries.push(` ${exportName}: ${modelName(exportName)}`);\n for (const variantName of Object.keys(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${exportName}${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 output += `export const DocumentModel = {\\n`;\n output += `${modelEntries.join(\",\\n\")},\\n`;\n output += ` [Metadata]: {\\n`;\n output += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n output += ` minSupportedVersion: ${minVersion},\\n`;\n }\n output += upgradesBlock;\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\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","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":[]}
@@ -15,8 +15,8 @@
15
15
  */
16
16
 
17
17
  import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
18
- import { resolveSchemaChain } from "./resolveSchemaChain.js";
19
- import { isRecordSchema, isUnionSchema, modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
18
+ import { resolveMinVersion } from "./resolveSchemaChain.js";
19
+ import { modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
20
20
 
21
21
  /**
22
22
  * Generate versionedDocRef.ts from a versioned schema chain.
@@ -28,22 +28,22 @@ import { isRecordSchema, isUnionSchema, modelName, MODELS_PATH, typesFilePath, v
28
28
  * Every model gets a version-specific overload on every version so that
29
29
  * write data is always typed to the exact version, not the latest.
30
30
  */
31
- export function generateScopeFromSchema(schema, minSupportedVersion) {
31
+ export function generateScopeFromChain(resolved, minSupportedVersion) {
32
+ const {
33
+ chain
34
+ } = resolved;
32
35
  const {
33
- chain,
34
36
  minVersion
35
- } = resolveSchemaChain(schema, minSupportedVersion);
37
+ } = resolveMinVersion(chain, minSupportedVersion);
36
38
 
37
39
  // Filter to supported versions
38
40
  const supportedVersions = chain.filter(v => v.version >= minVersion);
39
41
 
40
- // Collect all model names from the latest schema
41
- const latestSchema = chain[chain.length - 1].schema;
42
+ // Collect all model names from the latest IR
43
+ const latestIr = chain[chain.length - 1].ir;
42
44
  const allModelNames = [];
43
- for (const [exportName, item] of Object.entries(latestSchema)) {
44
- if (isRecordSchema(item) || isUnionSchema(item)) {
45
- allModelNames.push(exportName);
46
- }
45
+ for (const modelKey of Object.keys(latestIr.models)) {
46
+ allModelNames.push(modelKey);
47
47
  }
48
48
 
49
49
  // Build output
@@ -60,16 +60,16 @@ export function generateScopeFromSchema(schema, minSupportedVersion) {
60
60
  // Import per-version types
61
61
  for (const {
62
62
  version,
63
- schema: versionSchema
63
+ ir
64
64
  } of supportedVersions) {
65
65
  const readTypeImports = [];
66
66
  const writeTypeImports = [];
67
- for (const [exportName, item] of Object.entries(versionSchema)) {
68
- if (isRecordSchema(item)) {
69
- readTypeImports.push(versionedTypeName(exportName, version));
70
- writeTypeImports.push(versionedWriteTypeName(exportName, version));
71
- } else if (isUnionSchema(item)) {
72
- readTypeImports.push(versionedTypeName(exportName, version));
67
+ for (const [modelKey, modelDef] of Object.entries(ir.models)) {
68
+ if (modelDef.type === "record") {
69
+ readTypeImports.push(versionedTypeName(modelKey, version));
70
+ writeTypeImports.push(versionedWriteTypeName(modelKey, version));
71
+ } else if (modelDef.type === "union") {
72
+ readTypeImports.push(versionedTypeName(modelKey, version));
73
73
  }
74
74
  }
75
75
  if (readTypeImports.length > 0) {
@@ -82,32 +82,28 @@ export function generateScopeFromSchema(schema, minSupportedVersion) {
82
82
  output += "\n";
83
83
 
84
84
  // Generate per-version VersionedDocRef interfaces extending DocumentRef.
85
- // Every model gets a version-specific overload on every version so that
86
- // write data is always typed to the exact version, not the latest.
87
85
  for (const {
88
86
  version,
89
- schema: versionSchema
87
+ ir
90
88
  } of supportedVersions) {
91
89
  output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\n`;
92
90
  output += ` readonly version: ${version};\n`;
93
91
 
94
92
  // updateRecord overloads — record models get write types, union models get Partial<read>
95
- for (const [exportName, item] of Object.entries(versionSchema)) {
96
- if (isRecordSchema(item)) {
97
- const writeType = versionedWriteTypeName(exportName, version);
98
- output += ` updateRecord(ref: RecordRef<typeof ${modelName(exportName)}>, data: ${writeType}): Promise<void>;\n`;
99
- } else if (isUnionSchema(item)) {
100
- const readType = versionedTypeName(exportName, version);
101
- output += ` updateRecord(ref: RecordRef<typeof ${modelName(exportName)}>, data: Partial<${readType}>): Promise<void>;\n`;
93
+ for (const [modelKey, modelDef] of Object.entries(ir.models)) {
94
+ if (modelDef.type === "record") {
95
+ const writeType = versionedWriteTypeName(modelKey, version);
96
+ output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: ${writeType}): Promise<void>;\n`;
97
+ } else if (modelDef.type === "union") {
98
+ const readType = versionedTypeName(modelKey, version);
99
+ output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: Partial<${readType}>): Promise<void>;\n`;
102
100
  }
103
101
  }
104
102
 
105
103
  // setCollectionRecord overloads
106
- for (const [exportName, item] of Object.entries(versionSchema)) {
107
- if (isRecordSchema(item) || isUnionSchema(item)) {
108
- const readType = versionedTypeName(exportName, version);
109
- output += ` setCollectionRecord(model: typeof ${modelName(exportName)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
110
- }
104
+ for (const [modelKey] of Object.entries(ir.models)) {
105
+ const readType = versionedTypeName(modelKey, version);
106
+ output += ` setCollectionRecord(model: typeof ${modelName(modelKey)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
111
107
  }
112
108
  output += `}\n\n`;
113
109
  }