@palantir/pack.document-schema.type-gen 0.32.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +96 -0
- package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -0
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +80 -0
- package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -1
- package/build/esm/commands/ir/irDeployHandler.js +5 -0
- package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
- package/build/esm/commands/ir/irGenAssetHandler.js +6 -1
- package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
- package/build/esm/commands/ir/irGenTypesHandler.js +7 -3
- package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
- package/build/esm/commands/ir/irUpdateSchemaHandler.js +18 -11
- package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
- package/build/esm/commands/ir/resolveIrInput.js +6 -5
- package/build/esm/commands/ir/resolveIrInput.js.map +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaIrHandler.js +15 -8
- package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
- package/build/esm/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +35 -0
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
- package/build/esm/utils/ir/convertIrToWireSchema.js +1 -0
- package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js +178 -0
- package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +40 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +75 -3
- package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
- package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
- package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
- package/build/esm/utils/schema/generateIndexFromSchema.js +3 -5
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateInternalFromSchema.js +35 -19
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +9 -11
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +8 -9
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +13 -16
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
- package/build/esm/utils/schema/resolveSchemaChain.js +108 -20
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
- package/build/esm/utils/schema/runtimeSchema.js +47 -0
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
- package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
- package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
- package/build/esm/utils/steps/convertStepsToIr.js +10 -1
- package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
- package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
- package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
- package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
- package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
- package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
- package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
- package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
- package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
- package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
- package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
- package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
- package/build/types/utils/schema/runtimeSchema.d.ts +19 -0
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
- package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
- package/build/types/utils/steps/convertStepsToIr.d.ts +2 -0
- package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
- package/package.json +5 -5
- package/build/esm/utils/unknownVariantSuffix.js +0 -22
- package/build/esm/utils/unknownVariantSuffix.js.map +0 -1
- package/build/types/utils/unknownVariantSuffix.d.ts +0 -3
- package/build/types/utils/unknownVariantSuffix.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainNeedsUpgradeFns","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","getAddedInVersion","fieldInfo","Math","min","presentInVersions","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","Set","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","totalVersions","values","generateInternalTypes","output","fieldName","tsType","optional","generatePerVersionInternalTypes","perModelVersions","list","sortedModels","versions","sortedFields","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","union","discriminant","variantKey","variantModelKey","variants","generateInternalSchemaContent","zodType","generateUpgradeFns","perModel","neededTypes","currentIdx","findIndex","c","priorVersion","currentVersion","sorted","returnType","pickKeys","generateInternalFromChain","resolved","internalTypes","upgrades","internalSchema","internalUpgradeFns"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldDef,\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport {\n chainNeedsUpgradeFns,\n type ResolvedIrChain,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n /** _internal/upgradeFns.ts content */\n internalUpgradeFns: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n *\n * `fields` only contains entries that require lens treatment — derived fields\n * (`derivedFrom.length > 0`) and required additive fields (`derivedFrom.length\n * === 0 && !isOptional`). Optional additive fields are absent because\n * `undefined` is a legal value at the current version and the lens has no\n * work to do.\n */\ninterface UpgradeStep {\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; isOptional: boolean }>;\n removedFields: string[];\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction getAddedInVersion(fieldInfo: AllFieldInfo): number {\n return Math.min(...fieldInfo.presentInVersions);\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version that require lens treatment. Optional\n // additive fields are skipped — `undefined` is a legal v_current value\n // for them, so the lens has nothing to invent.\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; isOptional: boolean }\n >();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const field of currModelDef.record.fields) {\n const fieldKey = field.key;\n if (prevFields.has(fieldKey)) continue;\n const isOptional = field.isOptional === true;\n const annotation = recordUpgrades?.[fieldKey];\n const derivedFrom = annotation != null ? [...annotation.derivedFrom] : [];\n if (derivedFrom.length === 0 && isOptional) continue;\n addedFields.set(fieldKey, { derivedFrom, isOptional });\n }\n\n // Fields absent from this version relative to the previous one (i.e. deprecated fields).\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n addedInVersion: currEntry.version,\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalVersions = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInVersions.size < totalVersions) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${modelKey}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate per-version internal interfaces (e.g. `ShapeBox__v1`, `ShapeBox__v2`).\n *\n * Each interface contains only the fields present in that version, with their\n * actual optionality taken straight from that version's IR. The downstream\n * `DocumentUpgradeFns` generator uses these so each upgrade function's\n * parameter can `Pick` the prior version's fields and its return type can\n * index the current version's field type precisely.\n */\nfunction generatePerVersionInternalTypes(\n chain: VersionedIrEntry[],\n): string {\n // Group by model so each model's versions appear together in ascending order.\n const perModelVersions = new Map<\n string,\n { version: number; fields: readonly IFieldDef[] }[]\n >();\n\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n let list = perModelVersions.get(modelKey);\n if (list == null) {\n list = [];\n perModelVersions.set(modelKey, list);\n }\n list.push({ version, fields: modelDef.record.fields });\n }\n }\n\n let output = \"\";\n const sortedModels = Array.from(perModelVersions.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n for (const [modelKey, versions] of sortedModels) {\n for (const { version, fields } of versions) {\n output += `/** Internal representation of ${modelKey} at schema version ${version}. */\\n`;\n output += `export interface ${modelKey}__v${version} {\\n`;\n const sortedFields = [...fields].sort((a, b) => a.key.localeCompare(b.key));\n for (const field of sortedFields) {\n const tsType = convertFieldTypeToInternalTypeScript(\n field.fieldType,\n field.isOptional === true,\n );\n const optional = field.isOptional === true ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n output += \"}\\n\\n\";\n }\n }\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}Upgrades: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor}, addedInVersion: ${\n getAddedInVersion(fieldInfo)\n } },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgradeFns.ts content: a typed `DocumentUpgradeFns`\n * interface enumerating every upgrade function the app must supply at boot.\n *\n * For each `(modelName, v${version}, fieldName)` triple in a step's `fields`,\n * emit one property:\n * - Derived (`derivedFrom.length > 0`):\n * `(oldFields: Pick<<Model>__v<prior>, derivedFrom[number]>) => <Model>__v<current>[fieldName]`.\n * - Required additive (`derivedFrom.length === 0`):\n * `() => <Model>__v<current>[fieldName]`.\n *\n * Optional additive fields are filtered out at step-collection time and don't\n * appear here — `undefined` is a legal v<current> value for them, so the app\n * has no obligation to invent one.\n *\n * The interface is consumed by the generated `DocumentModel` factory in\n * `models.ts`, which requires it as a parameter when the schema needs any\n * upgrade functions. Schemas with no required fields added past v1 emit an\n * empty interface (still exported for type-uniformity in downstream code).\n */\nfunction generateUpgradeFns(\n chain: VersionedIrEntry[],\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n interface UpgradeFnEntry {\n fieldName: string;\n derivedFrom: readonly string[];\n }\n interface StepEntry {\n currentVersion: number;\n priorVersion: number;\n fields: UpgradeFnEntry[];\n }\n\n const perModel = new Map<string, StepEntry[]>();\n const neededTypes = new Set<string>();\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n for (const step of model.steps) {\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n if (currentIdx <= 0) continue;\n const priorVersion = chain[currentIdx - 1]!.version;\n\n const fields: UpgradeFnEntry[] = [];\n for (const [fieldName, fieldMeta] of step.fields) {\n fields.push({ fieldName, derivedFrom: [...fieldMeta.derivedFrom] });\n }\n if (fields.length === 0) continue;\n\n let list = perModel.get(modelKey);\n if (list == null) {\n list = [];\n perModel.set(modelKey, list);\n }\n list.push({\n currentVersion: step.addedInVersion,\n priorVersion,\n fields,\n });\n // Prior-version type only needed when at least one field derives from it.\n if (fields.some(f => f.derivedFrom.length > 0)) {\n neededTypes.add(`${modelKey}__v${priorVersion}`);\n }\n neededTypes.add(`${modelKey}__v${step.addedInVersion}`);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n output += `\\n`;\n\n if (neededTypes.size > 0) {\n const sorted = Array.from(neededTypes).sort();\n output += `import type { ${sorted.join(\", \")} } from \"./types.js\";\\n\\n`;\n }\n\n output += `/**\\n`;\n output += ` * Typed upgrade functions the application must supply at boot. Coverage is\\n`;\n output +=\n ` * exhaustive: missing or extra entries fail type-check at the \\`DocumentModel(...)\\`\\n`;\n output += ` * call site. Derived fields receive their declared source fields; required\\n`;\n output += ` * additive fields receive no arguments. Optional additive fields are absent\\n`;\n output += ` * — \\`undefined\\` is a legal value at the new version, so the runtime lens\\n`;\n output += ` * leaves them alone.\\n`;\n output += ` */\\n`;\n if (perModel.size === 0) {\n output += `// eslint-disable-next-line @typescript-eslint/no-empty-object-type\\n`;\n output += `export interface DocumentUpgradeFns {}\\n`;\n } else {\n output += `export interface DocumentUpgradeFns {\\n`;\n for (\n const [modelKey, steps] of Array.from(perModel.entries()).sort(([a], [b]) =>\n a.localeCompare(b)\n )\n ) {\n output += ` ${modelKey}: {\\n`;\n for (const step of steps) {\n output += ` v${step.currentVersion}: {\\n`;\n for (const f of step.fields) {\n const returnType = `${modelKey}__v${step.currentVersion}[\"${f.fieldName}\"]`;\n if (f.derivedFrom.length === 0) {\n output += ` ${f.fieldName}: () => ${returnType};\\n`;\n } else {\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${modelKey}__v${step.priorVersion}, ${pickKeys}>) => ${returnType};\\n`;\n }\n }\n output += ` };\\n`;\n }\n output += ` };\\n`;\n }\n output += `}\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, _internal/schema.ts and\n * _internal/upgradeFns.ts from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainNeedsUpgradeFns(chain) ? generatePerVersionInternalTypes(chain) : \"\");\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n const internalUpgradeFns = generateUpgradeFns(chain, allRecordModels);\n\n return { internalTypes, upgrades, internalSchema, internalUpgradeFns };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","chainNeedsUpgradeFns","getEntryMinorVersion","upgradeStepKey","internalSchemaName","internalTypeName","upgradesName","versionedInternalTypeName","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","presentInEntries","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","removedFields","push","size","addedInVersion","addedInMinorVersion","totalEntries","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","undefined","stepKey","currentVersion","sorted","currentType","returnType","priorType","pickKeys","generateInternalFromChain","resolved","stepChain","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 getEntryMinorVersion,\n type ResolvedIrChain,\n upgradeStepKey,\n type VersionedIrEntry,\n} from \"./resolveSchemaChain.js\";\nimport {\n internalSchemaName,\n internalTypeName,\n upgradesName,\n versionedInternalTypeName,\n} 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 /** _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 /** Major versions where this field exists. */\n presentInVersions: Set<number>;\n /** How many versions have this field, counting 3.0, 3.1 and 3.2 separately. Fewer than all → optional. */\n presentInEntries: 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 addedInMinorVersion: number;\n fields: Map<string, UpgradeStepField>;\n removedFields: string[];\n}\n\ninterface UpgradeStepField {\n derivedFrom: string[];\n isOptional: boolean;\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 * Takes the full chain (with minor versions), so a field added in 1.1 gets its\n * own step and counts as missing from 1.0 records.\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 presentInEntries: 1,\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n existing.presentInEntries += 1;\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<string, UpgradeStepField>();\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 addedInMinorVersion: getEntryMinorVersion(currEntry),\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 totalEntries = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInEntries < totalEntries) {\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 ${internalTypeName(modelKey)} {\\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 ${versionedInternalTypeName(modelKey, 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 ${upgradesName(modelKey)}: 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 if (step.addedInMinorVersion > 0) {\n output += ` addedInMinorVersion: ${step.addedInMinorVersion},\\n`;\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 ${upgradesName(modelKey)}: 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 ${internalSchemaName(modelKey)} = 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 stepKey: string;\n currentVersion: number;\n priorVersion: number | undefined;\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 // A derived field's function takes the previous major's type, e.g. `Pick<ShapeBox__v1, \"color\">`\n // for a 2.0 step. Minor versions can't use `derivedFrom`, so minor steps never need it.\n const currentIdx = chain.findIndex(c => c.version === step.addedInVersion);\n const priorVersion = currentIdx > 0 ? chain[currentIdx - 1]!.version : undefined;\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 if (priorVersion == null && fields.some(f => f.derivedFrom.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 stepKey: upgradeStepKey(step.addedInVersion, step.addedInMinorVersion),\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 (priorVersion != null && fields.some(f => f.derivedFrom.length > 0)) {\n neededTypes.add(versionedInternalTypeName(modelKey, priorVersion));\n }\n neededTypes.add(versionedInternalTypeName(modelKey, 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. Keys are \\`v2\\` for version 2.0 and \\`v2_1\\` for 2.1.\\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 += ` ${step.stepKey}: {\\n`;\n const currentType = versionedInternalTypeName(modelKey, step.currentVersion);\n for (const f of step.fields) {\n const returnType = `${currentType}[\"${f.fieldName}\"]`;\n if (f.derivedFrom.length === 0) {\n output += ` ${f.fieldName}: () => ${returnType};\\n`;\n } else {\n // Steps with derived fields always have a prior version (others are skipped above).\n const priorType = versionedInternalTypeName(modelKey, step.priorVersion!);\n const pickKeys = f.derivedFrom.map(d => `\"${d}\"`).join(\" | \");\n output +=\n ` ${f.fieldName}: (oldFields: Pick<${priorType}, ${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 stepChain = resolved.stepChain ?? chain;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(stepChain);\n\n const internalTypes = generateInternalTypes(allRecordModels)\n + (chainNeedsUpgradeFns(stepChain) ? 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":[]}
|
|
@@ -14,11 +14,10 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { formatVariantName } from "@palantir/pack.schema";
|
|
18
17
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
18
|
import { findExternalRefType } from "../ir/irFieldHelpers.js";
|
|
20
19
|
import { chainNeedsUpgradeFns, resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
-
import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
|
|
20
|
+
import { INTERNAL_UPGRADE_FNS_PATH, INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH, unionVariantName, upgradesName } from "./runtimeSchema.js";
|
|
22
21
|
function extractExternalRefFieldTypes(record) {
|
|
23
22
|
const refs = [];
|
|
24
23
|
for (const field of record.fields) {
|
|
@@ -42,7 +41,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
42
41
|
minVersion
|
|
43
42
|
} = resolveMinVersion(chain, minSupportedVersion);
|
|
44
43
|
const latestIr = chain[chain.length - 1].ir;
|
|
45
|
-
const
|
|
44
|
+
const stepChain = resolved.stepChain ?? chain;
|
|
45
|
+
const needsUpgradeFns = chainNeedsUpgradeFns(stepChain);
|
|
46
46
|
|
|
47
47
|
// --- Generate models.ts ---
|
|
48
48
|
let output = GENERATED_FILE_HEADER;
|
|
@@ -59,7 +59,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
59
59
|
} else if (modelDef.type === "union") {
|
|
60
60
|
unionNames.push(modelKey);
|
|
61
61
|
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
62
|
-
const variantModelName =
|
|
62
|
+
const variantModelName = unionVariantName(modelKey, variantName);
|
|
63
63
|
variantNames.push(variantModelName);
|
|
64
64
|
unionByVariantName.set(variantModelName, modelKey);
|
|
65
65
|
}
|
|
@@ -85,8 +85,8 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// Upgrade imports (only if there are upgrades)
|
|
88
|
-
const upgradeNames = [...recordNames, ...unionNames].map(n =>
|
|
89
|
-
const needsUpgradeRegistry =
|
|
88
|
+
const upgradeNames = [...recordNames, ...unionNames].map(n => upgradesName(n));
|
|
89
|
+
const needsUpgradeRegistry = stepChain.length > 1 || unionNames.length > 0;
|
|
90
90
|
if (needsUpgradeRegistry && upgradeNames.length > 0) {
|
|
91
91
|
output += `import { ${upgradeNames.join(", ")} } from "${INTERNAL_UPGRADES_PATH}";\n`;
|
|
92
92
|
}
|
|
@@ -127,8 +127,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
127
127
|
|
|
128
128
|
// Generate variant models
|
|
129
129
|
for (const variantName of Object.keys(union.variants)) {
|
|
130
|
-
const
|
|
131
|
-
const variantTypeName = `${modelKey}${formattedVariant}`;
|
|
130
|
+
const variantTypeName = unionVariantName(modelKey, variantName);
|
|
132
131
|
const variantMetadata = [];
|
|
133
132
|
variantMetadata.push(` discriminant: "${union.discriminant}",`);
|
|
134
133
|
variantMetadata.push(` name: "${variantTypeName}",`);
|
|
@@ -150,8 +149,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
150
149
|
} else if (modelDef.type === "union") {
|
|
151
150
|
modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
|
|
152
151
|
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
153
|
-
const
|
|
154
|
-
const variantTypeName = `${modelKey}${formattedVariant}`;
|
|
152
|
+
const variantTypeName = unionVariantName(modelKey, variantName);
|
|
155
153
|
modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);
|
|
156
154
|
}
|
|
157
155
|
}
|
|
@@ -162,7 +160,7 @@ export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
|
162
160
|
const allUpgradeNames = [...recordNames, ...unionNames];
|
|
163
161
|
if (needsUpgradeRegistry && allUpgradeNames.length > 0) {
|
|
164
162
|
// A variant model uses its union's registry, which finds the variant by its discriminant.
|
|
165
|
-
const upgradeEntries = [...allUpgradeNames.map(n => ` ${n}: ${n}
|
|
163
|
+
const upgradeEntries = [...allUpgradeNames.map(n => ` ${n}: ${upgradesName(n)},`), ...variantNames.map(n => ` ${n}: ${upgradesName(unionByVariantName.get(n))},`)].join("\n");
|
|
166
164
|
upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
|
|
167
165
|
} else {
|
|
168
166
|
upgradesBlock = "";
|
|
@@ -1 +1 @@
|
|
|
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","unionByVariantName","Map","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","variantModelName","set","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","needsUpgradeRegistry","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","get","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 { formatVariantName } from \"@palantir/pack.schema\";\nimport type { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.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 // Each variant model's union, e.g. NodeShapeBox -> NodeShape.\n const unionByVariantName = new Map<string, 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 const variantModelName = `${modelKey}${formatVariantName(variantName)}`;\n variantNames.push(variantModelName);\n unionByVariantName.set(variantModelName, modelKey);\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 const needsUpgradeRegistry = chain.length > 1 || unionNames.length > 0;\n if (needsUpgradeRegistry && 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 (needsUpgradeRegistry && allUpgradeNames.length > 0) {\n // A variant model uses its union's registry, which finds the variant by its discriminant.\n const upgradeEntries = [\n ...allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`),\n ...variantNames.map(n => ` ${n}: ${unionByVariantName.get(n)}Upgrades,`),\n ].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":[]}
|
|
1
|
+
{"version":3,"file":"generateModelMetadataFromSchema.js","names":["GENERATED_FILE_HEADER","findExternalRefType","chainNeedsUpgradeFns","resolveMinVersion","INTERNAL_UPGRADE_FNS_PATH","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","unionVariantName","upgradesName","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","stepChain","needsUpgradeFns","output","recordNames","unionNames","variantNames","unionByVariantName","Map","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","variantModelName","set","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","needsUpgradeRegistry","externalRefs","metadataFields","discriminant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","get","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 { 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 unionVariantName,\n upgradesName,\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 stepChain = resolved.stepChain ?? chain;\n const needsUpgradeFns = chainNeedsUpgradeFns(stepChain);\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 // Each variant model's union, e.g. NodeShapeBox -> NodeShape.\n const unionByVariantName = new Map<string, 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 const variantModelName = unionVariantName(modelKey, variantName);\n variantNames.push(variantModelName);\n unionByVariantName.set(variantModelName, modelKey);\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 => upgradesName(n));\n const needsUpgradeRegistry = stepChain.length > 1 || unionNames.length > 0;\n if (needsUpgradeRegistry && 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 variantTypeName = unionVariantName(modelKey, variantName);\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 variantTypeName = unionVariantName(modelKey, variantName);\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 (needsUpgradeRegistry && allUpgradeNames.length > 0) {\n // A variant model uses its union's registry, which finds the variant by its discriminant.\n const upgradeEntries = [\n ...allUpgradeNames.map(n => ` ${n}: ${upgradesName(n)},`),\n ...variantNames.map(n => ` ${n}: ${upgradesName(unionByVariantName.get(n)!)},`),\n ].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":[]}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
18
18
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
19
|
-
import { modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
|
|
19
|
+
import { modelName, MODELS_PATH, typesFilePath, versionedDocRefName, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Generate versionedDocRef.ts from a versioned schema chain.
|
|
@@ -86,7 +86,8 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
|
|
|
86
86
|
version,
|
|
87
87
|
ir
|
|
88
88
|
} of supportedVersions) {
|
|
89
|
-
|
|
89
|
+
const docRefName = versionedDocRefName(version);
|
|
90
|
+
output += `export interface ${docRefName} extends DocumentRef<DocumentModel> {\n`;
|
|
90
91
|
output += ` readonly version: ${version};\n`;
|
|
91
92
|
|
|
92
93
|
// updateRecord overloads — record models get write types, union models get Partial<read>
|
|
@@ -121,12 +122,8 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Union type
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
} else {
|
|
127
|
-
const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(" | ");
|
|
128
|
-
output += `export type VersionedDocRef = ${unionMembers};\n`;
|
|
129
|
-
}
|
|
125
|
+
const unionMembers = supportedVersions.map(v => versionedDocRefName(v.version)).join(" | ");
|
|
126
|
+
output += `export type VersionedDocRef = ${unionMembers};\n`;
|
|
130
127
|
|
|
131
128
|
// asVersioned — identity cast to unlock version-specific write overloads
|
|
132
129
|
output += `\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\n`;
|
|
@@ -135,7 +132,7 @@ export function generateScopeFromChain(resolved, minSupportedVersion) {
|
|
|
135
132
|
output += `}\n`;
|
|
136
133
|
|
|
137
134
|
// matchVersion — exhaustive version handler
|
|
138
|
-
const handlerProps = supportedVersions.map(v => ` readonly ${v.version}: (doc:
|
|
135
|
+
const handlerProps = supportedVersions.map(v => ` readonly ${v.version}: (doc: ${versionedDocRefName(v.version)}) => R;`).join("\n");
|
|
139
136
|
output += `\n/**\n`;
|
|
140
137
|
output += ` * Exhaustive version handler. TypeScript enforces that every supported\n`;
|
|
141
138
|
output += ` * version has a corresponding handler -- adding a new schema version\n`;
|
|
@@ -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, 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":[]}
|
|
1
|
+
{"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedDocRefName","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","docRefName","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 versionedDocRefName,\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 const docRefName = versionedDocRefName(version);\n output += `export interface ${docRefName} 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 const unionMembers = supportedVersions.map(v => versionedDocRefName(v.version)).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\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: ${versionedDocRefName(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":[]}
|
|
@@ -15,12 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { UNKNOWN_UNION_VARIANT } from "@palantir/pack.document-schema.model-types";
|
|
18
|
-
import { formatVariantName } from "@palantir/pack.schema";
|
|
19
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
20
19
|
import { collectReferencedTypes, convertFieldTypeToTypeScript, detectUsedRefTypes } from "../ir/irFieldHelpers.js";
|
|
21
|
-
import { UNKNOWN_VARIANT_SUFFIX } from "../unknownVariantSuffix.js";
|
|
22
20
|
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
23
|
-
import { knownTypeName, narrowKnownFunctionName, typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
21
|
+
import { knownTypeName, narrowKnownFunctionName, typeGuardName, typesFilePath, unionVariantName, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
24
22
|
/**
|
|
25
23
|
* Generate read types for a specific schema version.
|
|
26
24
|
*/
|
|
@@ -61,7 +59,7 @@ function generateReadTypesForVersion(version, ir) {
|
|
|
61
59
|
const discriminantField = union.discriminant;
|
|
62
60
|
const variantInterfaces = [];
|
|
63
61
|
for (const [variantName, variantModelKey] of Object.entries(union.variants)) {
|
|
64
|
-
const interfaceName =
|
|
62
|
+
const interfaceName = unionVariantName(typeName, variantName);
|
|
65
63
|
variantInterfaces.push({
|
|
66
64
|
name: interfaceName,
|
|
67
65
|
discriminatorValue: variantName
|
|
@@ -84,7 +82,7 @@ function generateReadTypesForVersion(version, ir) {
|
|
|
84
82
|
}
|
|
85
83
|
}
|
|
86
84
|
const knownVariantNames = variantInterfaces.map(v => v.name);
|
|
87
|
-
const unknownName =
|
|
85
|
+
const unknownName = unionVariantName(typeName, UNKNOWN_UNION_VARIANT);
|
|
88
86
|
output += `export type ${unknownName} = UnknownUnionVariant<"${discriminantField}">;\n\n`;
|
|
89
87
|
variantInterfaces.push({
|
|
90
88
|
name: unknownName,
|
|
@@ -102,7 +100,8 @@ function generateReadTypesForVersion(version, ir) {
|
|
|
102
100
|
output += ` return value == null || value.${discriminantField} === "${UNKNOWN_UNION_VARIANT}" ? undefined : value;\n`;
|
|
103
101
|
output += "}\n\n";
|
|
104
102
|
for (const variant of variantInterfaces) {
|
|
105
|
-
|
|
103
|
+
const guardName = typeGuardName(variant.name);
|
|
104
|
+
output += `export function ${guardName}(value: ${typeName}): value is ${variant.name} {\n`;
|
|
106
105
|
output += ` return value.${discriminantField} === "${variant.discriminatorValue}";\n`;
|
|
107
106
|
output += "}\n\n";
|
|
108
107
|
}
|
|
@@ -169,9 +168,9 @@ function generateTypesReExport({
|
|
|
169
168
|
reExports.push(`export type { ${knownTypeName(versioned)} as ${knownTypeName(modelKey)} } from "${typesFilePath(version)}";`, `export { ${narrowKnownFunctionName(versioned)} as ${narrowKnownFunctionName(modelKey)} } from "${typesFilePath(version)}";`);
|
|
170
169
|
// Also re-export union variant types, including the Unknown case
|
|
171
170
|
for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
reExports.push(`export type { ${versionedVariant} as ${
|
|
171
|
+
const versionedVariant = unionVariantName(versioned, variantName);
|
|
172
|
+
const unversionedVariant = unionVariantName(modelKey, variantName);
|
|
173
|
+
reExports.push(`export type { ${versionedVariant} as ${unversionedVariant} } from "${typesFilePath(version)}";`);
|
|
175
174
|
}
|
|
176
175
|
}
|
|
177
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["UNKNOWN_UNION_VARIANT","formatVariantName","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","UNKNOWN_VARIANT_SUFFIX","resolveMinVersion","knownTypeName","narrowKnownFunctionName","typesFilePath","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","Object","values","models","some","model","type","add","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","entries","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","knownVariantNames","map","v","unknownName","knownName","length","variant","generateWriteTypesForVersion","referencedLocalTypes","Set","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport"],"sources":["generateVersionedTypesFromSchema.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport { formatVariantName } from \"@palantir/pack.schema\";\nimport type { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n collectReferencedTypes,\n convertFieldTypeToTypeScript,\n detectUsedRefTypes,\n} from \"../ir/irFieldHelpers.js\";\nimport { UNKNOWN_VARIANT_SUFFIX } from \"../unknownVariantSuffix.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n knownTypeName,\n narrowKnownFunctionName,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n if (Object.values(ir.models).some(model => model.type === \"union\")) {\n usedRefTypes.add(\"UnknownUnionVariant\");\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record interfaces\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const record = modelDef.record;\n const typeName = versionedTypeName(modelKey, version);\n\n if (record.description) {\n output += `/**\\n * ${record.description}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const field of record.fields) {\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n const optional = field.isOptional ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const typeName = versionedTypeName(modelKey, version);\n const discriminantField = union.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n // Look up the variant's model to check if it's a record\n const variantModel = ir.models[variantModelKey];\n if (variantModel != null && variantModel.type === \"record\") {\n const recordTypeName = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the type\n const tsType = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n const knownVariantNames = variantInterfaces.map(v => v.name);\n const unknownName = `${typeName}${UNKNOWN_VARIANT_SUFFIX}`;\n output += `export type ${unknownName} = UnknownUnionVariant<\"${discriminantField}\">;\\n\\n`;\n variantInterfaces.push({ name: unknownName, discriminatorValue: UNKNOWN_UNION_VARIANT });\n\n output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // The variants this SDK knows, and a helper to narrow to them before reading variant fields.\n const knownName = knownTypeName(typeName);\n output += `export type ${knownName} = ${\n knownVariantNames.length > 0 ? knownVariantNames.join(\" | \") : \"never\"\n };\\n\\n`;\n output += \"/** Return the value if this SDK knows its variant, otherwise undefined. */\\n\";\n output += `export function ${narrowKnownFunctionName(typeName)}(\\n`;\n output += ` value: ${typeName} | undefined,\\n`;\n output += `): ${knownName} | undefined {\\n`;\n output +=\n ` return value == null || value.${discriminantField} === \"${UNKNOWN_UNION_VARIANT}\" ? undefined : value;\\n`;\n output += \"}\\n\\n\";\n\n for (const variant of variantInterfaces) {\n output +=\n `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const modelDef of Object.values(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n for (const field of modelDef.record.fields) {\n collectReferencedTypes(field.fieldType, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const typeName = versionedWriteTypeName(modelKey, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const field of modelDef.record.fields) {\n // All fields are optional in write types\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n output += ` readonly ${field.key}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ ir, version }: VersionedIrEntry): string {\n const reExports: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n\n reExports.push(\n `export type { ${knownTypeName(versioned)} as ${knownTypeName(modelKey)} } from \"${\n typesFilePath(version)\n }\";`,\n `export { ${narrowKnownFunctionName(versioned)} as ${\n narrowKnownFunctionName(modelKey)\n } } from \"${typesFilePath(version)}\";`,\n );\n // Also re-export union variant types, including the Unknown case\n for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n const unversionedVariant = `${modelKey}${formattedVariant}`;\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from an already-resolved\n * versioned IR chain.\n */\nexport function generateVersionedTypesFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, ir));\n writeTypes.set(version, generateWriteTypesForVersion(version, ir));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,qBAAqB,QAAQ,4CAA4C;AAClF,SAASC,iBAAiB,QAAQ,uBAAuB;AAEzD,SAASC,qBAAqB,QAAQ,2BAA2B;AACjE,SACEC,sBAAsB,EACtBC,4BAA4B,EAC5BC,kBAAkB,QACb,yBAAyB;AAChC,SAASC,sBAAsB,QAAQ,4BAA4B;AAEnE,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SACEC,aAAa,EACbC,uBAAuB,EACvBC,aAAa,EACbC,iBAAiB,EACjBC,sBAAsB,QACjB,oBAAoB;AAW3B;AACA;AACA;AACA,SAASC,2BAA2BA,CAClCC,OAAe,EACfC,EAA2B,EACnB;EACR,MAAMC,YAAY,GAAGX,kBAAkB,CAACU,EAAE,CAAC;EAC3C,IAAIE,MAAM,CAACC,MAAM,CAACH,EAAE,CAACI,MAAM,CAAC,CAACC,IAAI,CAACC,KAAK,IAAIA,KAAK,CAACC,IAAI,KAAK,OAAO,CAAC,EAAE;IAClEN,YAAY,CAACO,GAAG,CAAC,qBAAqB,CAAC;EACzC;EAEA,IAAIC,MAAM,GAAGtB,qBAAqB;EAElC,IAAIc,YAAY,CAACS,IAAI,GAAG,CAAC,EAAE;IACzB,MAAMC,YAAY,GAAGC,KAAK,CAACC,IAAI,CAACZ,YAAY,CAAC,CAACa,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAC/DN,MAAM,IACJ,iBAAiBE,YAAY,yDAAyD;EAC1F;EAEAF,MAAM,IAAI,IAAI;;EAEd;EACA,KAAK,MAAM,CAACO,QAAQ,EAAEC,QAAQ,CAAC,IAAIf,MAAM,CAACgB,OAAO,CAAClB,EAAE,CAACI,MAAM,CAAC,EAAE;IAC5D,IAAIa,QAAQ,CAACV,IAAI,KAAK,QAAQ,EAAE;IAEhC,MAAMY,MAAM,GAAGF,QAAQ,CAACE,MAAM;IAC9B,MAAMC,QAAQ,GAAGxB,iBAAiB,CAACoB,QAAQ,EAAEjB,OAAO,CAAC;IAErD,IAAIoB,MAAM,CAACE,WAAW,EAAE;MACtBZ,MAAM,IAAI,WAAWU,MAAM,CAACE,WAAW,SAAS;IAClD;IAEAZ,MAAM,IAAI,oBAAoBW,QAAQ,MAAM;IAE5C,KAAK,MAAME,KAAK,IAAIH,MAAM,CAACI,MAAM,EAAE;MACjC,MAAMC,MAAM,GAAGnC,4BAA4B,CAACiC,KAAK,CAACG,SAAS,EAAE1B,OAAO,CAAC;MACrE,MAAM2B,QAAQ,GAAGJ,KAAK,CAACK,UAAU,GAAG,GAAG,GAAG,EAAE;MAC5ClB,MAAM,IAAI,cAAca,KAAK,CAACM,GAAG,GAAGF,QAAQ,KAAKF,MAAM,KAAK;IAC9D;IAEAf,MAAM,IAAI,OAAO;EACnB;;EAEA;EACA,KAAK,MAAM,CAACO,QAAQ,EAAEC,QAAQ,CAAC,IAAIf,MAAM,CAACgB,OAAO,CAAClB,EAAE,CAACI,MAAM,CAAC,EAAE;IAC5D,IAAIa,QAAQ,CAACV,IAAI,KAAK,OAAO,EAAE;IAE/B,MAAMsB,KAAK,GAAGZ,QAAQ,CAACY,KAAK;IAC5B,MAAMT,QAAQ,GAAGxB,iBAAiB,CAACoB,QAAQ,EAAEjB,OAAO,CAAC;IACrD,MAAM+B,iBAAiB,GAAGD,KAAK,CAACE,YAAY;IAC5C,MAAMC,iBAAsE,GAAG,EAAE;IAEjF,KAAK,MAAM,CAACC,WAAW,EAAEC,eAAe,CAAC,IAAIhC,MAAM,CAACgB,OAAO,CAACW,KAAK,CAACM,QAAQ,CAAC,EAAE;MAC3E,MAAMC,aAAa,GAAG,GAAGhB,QAAQ,GAAGlC,iBAAiB,CAAC+C,WAAW,CAAC,EAAE;MACpED,iBAAiB,CAACK,IAAI,CAAC;QAAEC,IAAI,EAAEF,aAAa;QAAEG,kBAAkB,EAAEN;MAAY,CAAC,CAAC;;MAEhF;MACA,MAAMO,YAAY,GAAGxC,EAAE,CAACI,MAAM,CAAC8B,eAAe,CAAC;MAC/C,IAAIM,YAAY,IAAI,IAAI,IAAIA,YAAY,CAACjC,IAAI,KAAK,QAAQ,EAAE;QAC1D,MAAMkC,cAAc,GAAG7C,iBAAiB,CAACsC,eAAe,EAAEnC,OAAO,CAAC;QAClEU,MAAM,IAAI,oBAAoB2B,aAAa,YAAYK,cAAc,MAAM;QAC3EhC,MAAM,IAAI,cAAcqB,iBAAiB,MAAMG,WAAW,MAAM;QAChExB,MAAM,IAAI,OAAO;MACnB,CAAC,MAAM;QACL;QACA,MAAMe,MAAM,GAAG5B,iBAAiB,CAACsC,eAAe,EAAEnC,OAAO,CAAC;QAC1DU,MAAM,IAAI,oBAAoB2B,aAAa,MAAM;QACjD3B,MAAM,IAAI,cAAcqB,iBAAiB,MAAMG,WAAW,MAAM;QAChExB,MAAM,IAAI,qBAAqBe,MAAM,KAAK;QAC1Cf,MAAM,IAAI,OAAO;MACnB;IACF;IAEA,MAAMiC,iBAAiB,GAAGV,iBAAiB,CAACW,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACN,IAAI,CAAC;IAC5D,MAAMO,WAAW,GAAG,GAAGzB,QAAQ,GAAG7B,sBAAsB,EAAE;IAC1DkB,MAAM,IAAI,eAAeoC,WAAW,2BAA2Bf,iBAAiB,SAAS;IACzFE,iBAAiB,CAACK,IAAI,CAAC;MAAEC,IAAI,EAAEO,WAAW;MAAEN,kBAAkB,EAAEtD;IAAsB,CAAC,CAAC;IAExFwB,MAAM,IAAI,eAAeW,QAAQ,MAAMY,iBAAiB,CAACW,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACN,IAAI,CAAC,CAACvB,IAAI,CAAC,KAAK,CAAC,OAAO;;IAE5F;IACA,MAAM+B,SAAS,GAAGrD,aAAa,CAAC2B,QAAQ,CAAC;IACzCX,MAAM,IAAI,eAAeqC,SAAS,MAChCJ,iBAAiB,CAACK,MAAM,GAAG,CAAC,GAAGL,iBAAiB,CAAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,OACjE;IACPN,MAAM,IAAI,+EAA+E;IACzFA,MAAM,IAAI,mBAAmBf,uBAAuB,CAAC0B,QAAQ,CAAC,KAAK;IACnEX,MAAM,IAAI,YAAYW,QAAQ,iBAAiB;IAC/CX,MAAM,IAAI,MAAMqC,SAAS,kBAAkB;IAC3CrC,MAAM,IACJ,mCAAmCqB,iBAAiB,SAAS7C,qBAAqB,0BAA0B;IAC9GwB,MAAM,IAAI,OAAO;IAEjB,KAAK,MAAMuC,OAAO,IAAIhB,iBAAiB,EAAE;MACvCvB,MAAM,IACJ,qBAAqBuC,OAAO,CAACV,IAAI,WAAWlB,QAAQ,eAAe4B,OAAO,CAACV,IAAI,MAAM;MACvF7B,MAAM,IAAI,kBAAkBqB,iBAAiB,SAASkB,OAAO,CAACT,kBAAkB,MAAM;MACtF9B,MAAM,IAAI,OAAO;IACnB;EACF;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA,SAASwC,4BAA4BA,CACnClD,OAAe,EACfC,EAA2B,EACnB;EACR,MAAMC,YAAY,GAAGX,kBAAkB,CAACU,EAAE,CAAC;;EAE3C;EACA,MAAMkD,oBAAoB,GAAG,IAAIC,GAAG,CAAS,CAAC;EAC9C,KAAK,MAAMlC,QAAQ,IAAIf,MAAM,CAACC,MAAM,CAACH,EAAE,CAACI,MAAM,CAAC,EAAE;IAC/C,IAAIa,QAAQ,CAACV,IAAI,KAAK,QAAQ,EAAE;IAChC,KAAK,MAAMe,KAAK,IAAIL,QAAQ,CAACE,MAAM,CAACI,MAAM,EAAE;MAC1CnC,sBAAsB,CAACkC,KAAK,CAACG,SAAS,EAAE1B,OAAO,EAAEmD,oBAAoB,CAAC;IACxE;EACF;EAEA,IAAIzC,MAAM,GAAGtB,qBAAqB;EAElC,IAAIc,YAAY,CAACS,IAAI,GAAG,CAAC,EAAE;IACzB,MAAMC,YAAY,GAAGC,KAAK,CAACC,IAAI,CAACZ,YAAY,CAAC,CAACa,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAC/DN,MAAM,IACJ,iBAAiBE,YAAY,yDAAyD;EAC1F;EAEA,IAAIuC,oBAAoB,CAACxC,IAAI,GAAG,CAAC,EAAE;IACjC,MAAM0C,cAAc,GAAGxC,KAAK,CAACC,IAAI,CAACqC,oBAAoB,CAAC,CAACpC,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IACzEN,MAAM,IAAI,iBAAiB2C,cAAc,YAAYzD,aAAa,CAACI,OAAO,CAAC,MAAM;EACnF;EAEAU,MAAM,IAAI,IAAI;;EAEd;EACA,KAAK,MAAM,CAACO,QAAQ,EAAEC,QAAQ,CAAC,IAAIf,MAAM,CAACgB,OAAO,CAAClB,EAAE,CAACI,MAAM,CAAC,EAAE;IAC5D,IAAIa,QAAQ,CAACV,IAAI,KAAK,QAAQ,EAAE;IAEhC,MAAMa,QAAQ,GAAGvB,sBAAsB,CAACmB,QAAQ,EAAEjB,OAAO,CAAC;IAE1DU,MAAM,IAAI,eAAeW,QAAQ,QAAQ;IAEzC,KAAK,MAAME,KAAK,IAAIL,QAAQ,CAACE,MAAM,CAACI,MAAM,EAAE;MAC1C;MACA,MAAMC,MAAM,GAAGnC,4BAA4B,CAACiC,KAAK,CAACG,SAAS,EAAE1B,OAAO,CAAC;MACrEU,MAAM,IAAI,cAAca,KAAK,CAACM,GAAG,MAAMJ,MAAM,KAAK;IACpD;IAEAf,MAAM,IAAI,QAAQ;EACpB;EAEA,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA,SAAS4C,qBAAqBA,CAAC;EAAErD,EAAE;EAAED;AAA0B,CAAC,EAAU;EACxE,MAAMuD,SAAmB,GAAG,EAAE;EAC9B,KAAK,MAAM,CAACtC,QAAQ,EAAEC,QAAQ,CAAC,IAAIf,MAAM,CAACgB,OAAO,CAAClB,EAAE,CAACI,MAAM,CAAC,EAAE;IAC5D,IAAIa,QAAQ,CAACV,IAAI,KAAK,QAAQ,EAAE;MAC9B,MAAMgD,SAAS,GAAG3D,iBAAiB,CAACoB,QAAQ,EAAEjB,OAAO,CAAC;MACtDuD,SAAS,CAACjB,IAAI,CACZ,iBAAiBkB,SAAS,OAAOvC,QAAQ,YAAYrB,aAAa,CAACI,OAAO,CAAC,IAC7E,CAAC;IACH,CAAC,MAAM,IAAIkB,QAAQ,CAACV,IAAI,KAAK,OAAO,EAAE;MACpC,MAAMgD,SAAS,GAAG3D,iBAAiB,CAACoB,QAAQ,EAAEjB,OAAO,CAAC;MACtDuD,SAAS,CAACjB,IAAI,CACZ,iBAAiBkB,SAAS,OAAOvC,QAAQ,YAAYrB,aAAa,CAACI,OAAO,CAAC,IAC7E,CAAC;MAEDuD,SAAS,CAACjB,IAAI,CACZ,iBAAiB5C,aAAa,CAAC8D,SAAS,CAAC,OAAO9D,aAAa,CAACuB,QAAQ,CAAC,YACrErB,aAAa,CAACI,OAAO,CAAC,IACpB,EACJ,YAAYL,uBAAuB,CAAC6D,SAAS,CAAC,OAC5C7D,uBAAuB,CAACsB,QAAQ,CAAC,YACvBrB,aAAa,CAACI,OAAO,CAAC,IACpC,CAAC;MACD;MACA,KAAK,MAAMkC,WAAW,IAAI,CAAC,GAAG/B,MAAM,CAACsD,IAAI,CAACvC,QAAQ,CAACY,KAAK,CAACM,QAAQ,CAAC,EAAElD,qBAAqB,CAAC,EAAE;QAC1F,MAAMwE,gBAAgB,GAAGvE,iBAAiB,CAAC+C,WAAW,CAAC;QACvD,MAAMyB,gBAAgB,GAAG,GAAG9D,iBAAiB,CAACoB,QAAQ,EAAEjB,OAAO,CAAC,GAAG0D,gBAAgB,EAAE;QAErFH,SAAS,CAACjB,IAAI,CACZ,iBAAiBqB,gBAAgB,OAFR,GAAG1C,QAAQ,GAAGyC,gBAAgB,EAAE,YAGvD9D,aAAa,CAACI,OAAO,CAAC,IAE1B,CAAC;MACH;IACF;EACF;EAEA,OAAOZ,qBAAqB,GAAGmE,SAAS,CAACvC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AAC5D;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAAS4C,+BAA+BA,CAC7CC,QAAyB,EACzBC,mBAA4B,EACN;EACtB,MAAM;IAAEC;EAAM,CAAC,GAAGF,QAAQ;EAC1B,MAAM;IAAEG;EAAW,CAAC,GAAGvE,iBAAiB,CAACsE,KAAK,EAAED,mBAAmB,CAAC;EAEpE,MAAMG,SAAS,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAC3C,MAAMC,UAAU,GAAG,IAAID,GAAG,CAAiB,CAAC;EAE5C,KAAK,MAAM;IAAElE,OAAO;IAAEC;EAAG,CAAC,IAAI8D,KAAK,EAAE;IACnC,IAAI/D,OAAO,GAAGgE,UAAU,EAAE;IAE1BC,SAAS,CAACG,GAAG,CAACpE,OAAO,EAAED,2BAA2B,CAACC,OAAO,EAAEC,EAAE,CAAC,CAAC;IAChEkE,UAAU,CAACC,GAAG,CAACpE,OAAO,EAAEkD,4BAA4B,CAAClD,OAAO,EAAEC,EAAE,CAAC,CAAC;EACpE;EAEA,MAAMoE,aAAa,GAAGf,qBAAqB,CAACS,KAAK,CAACA,KAAK,CAACf,MAAM,GAAG,CAAC,CAAE,CAAC;EAErE,OAAO;IAAEiB,SAAS;IAAEE,UAAU;IAAEE;EAAc,CAAC;AACjD","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["UNKNOWN_UNION_VARIANT","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","resolveMinVersion","knownTypeName","narrowKnownFunctionName","typeGuardName","typesFilePath","unionVariantName","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","Object","values","models","some","model","type","add","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","entries","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","knownVariantNames","map","v","unknownName","knownName","length","variant","guardName","generateWriteTypesForVersion","referencedLocalTypes","Set","localTypesList","generateTypesReExport","reExports","versioned","keys","versionedVariant","unversionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport"],"sources":["generateVersionedTypesFromSchema.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 { UNKNOWN_UNION_VARIANT } from \"@palantir/pack.document-schema.model-types\";\nimport type { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n collectReferencedTypes,\n convertFieldTypeToTypeScript,\n detectUsedRefTypes,\n} from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n knownTypeName,\n narrowKnownFunctionName,\n typeGuardName,\n typesFilePath,\n unionVariantName,\n versionedTypeName,\n versionedWriteTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedTypesOutput {\n /** types_vN.ts files keyed by version number */\n readTypes: Map<number, string>;\n /** writeTypes_vN.ts files keyed by version number */\n writeTypes: Map<number, string>;\n /** types.ts re-export of latest version types under unversioned names */\n typesReExport: string;\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n if (Object.values(ir.models).some(model => model.type === \"union\")) {\n usedRefTypes.add(\"UnknownUnionVariant\");\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record interfaces\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const record = modelDef.record;\n const typeName = versionedTypeName(modelKey, version);\n\n if (record.description) {\n output += `/**\\n * ${record.description}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const field of record.fields) {\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n const optional = field.isOptional ? \"?\" : \"\";\n output += ` readonly ${field.key}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const typeName = versionedTypeName(modelKey, version);\n const discriminantField = union.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const interfaceName = unionVariantName(typeName, variantName);\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n // Look up the variant's model to check if it's a record\n const variantModel = ir.models[variantModelKey];\n if (variantModel != null && variantModel.type === \"record\") {\n const recordTypeName = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the type\n const tsType = versionedTypeName(variantModelKey, version);\n output += `export interface ${interfaceName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += ` readonly value: ${tsType};\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n const knownVariantNames = variantInterfaces.map(v => v.name);\n const unknownName = unionVariantName(typeName, UNKNOWN_UNION_VARIANT);\n output += `export type ${unknownName} = UnknownUnionVariant<\"${discriminantField}\">;\\n\\n`;\n variantInterfaces.push({ name: unknownName, discriminatorValue: UNKNOWN_UNION_VARIANT });\n\n output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // The variants this SDK knows, and a helper to narrow to them before reading variant fields.\n const knownName = knownTypeName(typeName);\n output += `export type ${knownName} = ${\n knownVariantNames.length > 0 ? knownVariantNames.join(\" | \") : \"never\"\n };\\n\\n`;\n output += \"/** Return the value if this SDK knows its variant, otherwise undefined. */\\n\";\n output += `export function ${narrowKnownFunctionName(typeName)}(\\n`;\n output += ` value: ${typeName} | undefined,\\n`;\n output += `): ${knownName} | undefined {\\n`;\n output +=\n ` return value == null || value.${discriminantField} === \"${UNKNOWN_UNION_VARIANT}\" ? undefined : value;\\n`;\n output += \"}\\n\\n\";\n\n for (const variant of variantInterfaces) {\n const guardName = typeGuardName(variant.name);\n output += `export function ${guardName}(value: ${typeName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n }\n\n return output;\n}\n\n/**\n * Generate write types for a specific schema version.\n * All fields are optional in write types.\n */\nfunction generateWriteTypesForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(ir);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const modelDef of Object.values(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n for (const field of modelDef.record.fields) {\n collectReferencedTypes(field.fieldType, version, referencedLocalTypes);\n }\n }\n\n let output = GENERATED_FILE_HEADER;\n\n if (usedRefTypes.size > 0) {\n const refTypesList = Array.from(usedRefTypes).sort().join(\", \");\n output +=\n `import type { ${refTypesList} } from \"@palantir/pack.document-schema.model-types\";\\n`;\n }\n\n if (referencedLocalTypes.size > 0) {\n const localTypesList = Array.from(referencedLocalTypes).sort().join(\", \");\n output += `import type { ${localTypesList} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record write types\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const typeName = versionedWriteTypeName(modelKey, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const field of modelDef.record.fields) {\n // All fields are optional in write types\n const tsType = convertFieldTypeToTypeScript(field.fieldType, version);\n output += ` readonly ${field.key}?: ${tsType};\\n`;\n }\n\n output += \"};\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate the types.ts re-export file that maps unversioned names to the latest version.\n */\nfunction generateTypesReExport({ ir, version }: VersionedIrEntry): string {\n const reExports: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedTypeName(modelKey, version);\n reExports.push(\n `export type { ${versioned} as ${modelKey} } from \"${typesFilePath(version)}\";`,\n );\n\n reExports.push(\n `export type { ${knownTypeName(versioned)} as ${knownTypeName(modelKey)} } from \"${\n typesFilePath(version)\n }\";`,\n `export { ${narrowKnownFunctionName(versioned)} as ${\n narrowKnownFunctionName(modelKey)\n } } from \"${typesFilePath(version)}\";`,\n );\n // Also re-export union variant types, including the Unknown case\n for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {\n const versionedVariant = unionVariantName(versioned, variantName);\n const unversionedVariant = unionVariantName(modelKey, variantName);\n reExports.push(\n `export type { ${versionedVariant} as ${unversionedVariant} } from \"${\n typesFilePath(version)\n }\";`,\n );\n }\n }\n }\n\n return GENERATED_FILE_HEADER + reExports.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Generate per-version public types and write types from an already-resolved\n * versioned IR chain.\n */\nexport function generateVersionedTypesFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, ir));\n writeTypes.set(version, generateWriteTypesForVersion(version, ir));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|