@palantir/pack.document-schema.type-gen 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +7 -0
  2. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js +1 -1
  3. package/build/esm/commands/ir/__tests__/irDeployFirstParty.test.js.map +1 -1
  4. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js +96 -0
  5. package/build/esm/commands/ir/__tests__/irUpdateSchemaHandler.test.js.map +1 -0
  6. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js +80 -0
  7. package/build/esm/commands/ir/__tests__/resolveIrInput.test.js.map +1 -1
  8. package/build/esm/commands/ir/irDeployHandler.js +6 -1
  9. package/build/esm/commands/ir/irDeployHandler.js.map +1 -1
  10. package/build/esm/commands/ir/irGenAssetHandler.js +6 -1
  11. package/build/esm/commands/ir/irGenAssetHandler.js.map +1 -1
  12. package/build/esm/commands/ir/irGenTypesHandler.js +7 -3
  13. package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -1
  14. package/build/esm/commands/ir/irUpdateSchemaHandler.js +19 -12
  15. package/build/esm/commands/ir/irUpdateSchemaHandler.js.map +1 -1
  16. package/build/esm/commands/ir/resolveIrInput.js +6 -5
  17. package/build/esm/commands/ir/resolveIrInput.js.map +1 -1
  18. package/build/esm/commands/schema/registerSchemaCommands.js +1 -1
  19. package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
  20. package/build/esm/commands/schema/schemaIrHandler.js +15 -8
  21. package/build/esm/commands/schema/schemaIrHandler.js.map +1 -1
  22. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.js.map +1 -1
  23. package/build/esm/lib/pack-docschema-api/pack-docschema-ir/unionDef.js.map +1 -1
  24. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
  25. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
  26. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
  27. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
  28. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
  29. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
  30. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
  31. package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
  32. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
  33. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
  34. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
  35. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
  36. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
  37. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
  38. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
  39. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
  40. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
  41. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
  42. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
  43. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
  44. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
  45. package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
  46. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +71 -0
  47. package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
  48. package/build/esm/utils/ir/convertIrToWireSchema.js +10 -7
  49. package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
  50. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js +1 -1
  51. package/build/esm/utils/schema/__tests__/__snapshots__/generateDocumentTypeFromSchema/with-name-and-description.js.map +1 -1
  52. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -1
  53. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
  54. package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
  55. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js +178 -0
  56. package/build/esm/utils/schema/__tests__/assertSdkNamesUnique.test.js.map +1 -0
  57. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +71 -1
  58. package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
  59. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js +122 -3
  60. package/build/esm/utils/schema/__tests__/resolveSchemaChain.test.js.map +1 -1
  61. package/build/esm/utils/schema/assertSdkNamesUnique.js +151 -0
  62. package/build/esm/utils/schema/assertSdkNamesUnique.js.map +1 -0
  63. package/build/esm/utils/schema/generateIndexFromSchema.js +3 -5
  64. package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
  65. package/build/esm/utils/schema/generateInternalFromSchema.js +42 -19
  66. package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
  67. package/build/esm/utils/schema/generateModelMetadataFromSchema.js +9 -11
  68. package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
  69. package/build/esm/utils/schema/generateScopeFromSchema.js +6 -9
  70. package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
  71. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +8 -9
  72. package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
  73. package/build/esm/utils/schema/generateVersionedZodFromSchema.js +13 -16
  74. package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
  75. package/build/esm/utils/schema/resolveSchemaChain.js +137 -21
  76. package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
  77. package/build/esm/utils/schema/runtimeSchema.js +47 -0
  78. package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
  79. package/build/esm/utils/schema/writeAllSdkFiles.js +2 -0
  80. package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -1
  81. package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
  82. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
  83. package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
  84. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
  85. package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
  86. package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
  87. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
  88. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
  89. package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
  90. package/build/esm/utils/steps/convertStepsToIr.js +30 -2
  91. package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
  92. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts +2 -0
  93. package/build/types/commands/ir/__tests__/irUpdateSchemaHandler.test.d.ts.map +1 -0
  94. package/build/types/commands/ir/irDeployHandler.d.ts +1 -1
  95. package/build/types/commands/ir/irDeployHandler.d.ts.map +1 -1
  96. package/build/types/commands/ir/irGenAssetHandler.d.ts +1 -1
  97. package/build/types/commands/ir/irGenAssetHandler.d.ts.map +1 -1
  98. package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -1
  99. package/build/types/commands/ir/irUpdateSchemaHandler.d.ts.map +1 -1
  100. package/build/types/commands/ir/resolveIrInput.d.ts +1 -0
  101. package/build/types/commands/ir/resolveIrInput.d.ts.map +1 -1
  102. package/build/types/commands/schema/schemaIrHandler.d.ts +3 -3
  103. package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -1
  104. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts +1 -0
  105. package/build/types/lib/pack-docschema-api/pack-docschema-ir/schemaMeta.d.ts.map +1 -1
  106. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts +3 -0
  107. package/build/types/lib/pack-docschema-api/pack-docschema-ir/unionDef.d.ts.map +1 -1
  108. package/build/types/utils/ir/convertIrToWireSchema.d.ts +2 -2
  109. package/build/types/utils/ir/convertIrToWireSchema.d.ts.map +1 -1
  110. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts +2 -0
  111. package/build/types/utils/schema/__tests__/assertSdkNamesUnique.test.d.ts.map +1 -0
  112. package/build/types/utils/schema/assertSdkNamesUnique.d.ts +9 -0
  113. package/build/types/utils/schema/assertSdkNamesUnique.d.ts.map +1 -0
  114. package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
  115. package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
  116. package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
  117. package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
  118. package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
  119. package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
  120. package/build/types/utils/schema/resolveSchemaChain.d.ts +24 -1
  121. package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
  122. package/build/types/utils/schema/runtimeSchema.d.ts +19 -0
  123. package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
  124. package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -1
  125. package/build/types/utils/steps/convertStepsToIr.d.ts +4 -0
  126. package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
  127. package/package.json +19 -5
  128. package/build/esm/utils/unknownVariantSuffix.js +0 -22
  129. package/build/esm/utils/unknownVariantSuffix.js.map +0 -1
  130. package/build/types/utils/unknownVariantSuffix.d.ts +0 -3
  131. package/build/types/utils/unknownVariantSuffix.d.ts.map +0 -1
@@ -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 = `${typeName}${formatVariantName(variantName)}`;
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 = `${typeName}${UNKNOWN_VARIANT_SUFFIX}`;
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
- output += `export function is${variant.name}(value: ${typeName}): value is ${variant.name} {\n`;
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 formattedVariant = formatVariantName(variantName);
173
- const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
174
- reExports.push(`export type { ${versionedVariant} as ${`${modelKey}${formattedVariant}`} } from "${typesFilePath(version)}";`);
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":[]}
@@ -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 { convertFieldTypeToZodSchema } from "../ir/irFieldHelpers.js";
21
- import { UNKNOWN_VARIANT_SUFFIX } from "../unknownVariantSuffix.js";
22
20
  import { resolveMinVersion } from "./resolveSchemaChain.js";
23
- import { typesFilePath, versionedSchemaName, versionedTypeName } from "./runtimeSchema.js";
21
+ import { schemaName, typesFilePath, unionVariantName, versionedSchemaName, versionedTypeName } from "./runtimeSchema.js";
24
22
  /**
25
23
  * Generate Zod schemas for a specific schema version.
26
24
  * Uses `.passthrough()` to preserve unknown fields.
@@ -36,7 +34,7 @@ function generateZodSchemasForVersion(version, ir) {
36
34
  } else if (modelDef.type === "union") {
37
35
  typeNames.push(versionedTypeName(modelKey, version));
38
36
  for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {
39
- typeNames.push(`${versionedTypeName(modelKey, version)}${formatVariantName(variantName)}`);
37
+ typeNames.push(unionVariantName(versionedTypeName(modelKey, version), variantName));
40
38
  }
41
39
  }
42
40
  }
@@ -68,11 +66,12 @@ function generateZodSchemasForVersion(version, ir) {
68
66
  if (modelDef.type !== "union") continue;
69
67
  const union = modelDef.union;
70
68
  const discriminantField = union.discriminant;
69
+ const unionZodSchemaName = versionedSchemaName(modelKey, version);
70
+ const typeName = versionedTypeName(modelKey, version);
71
71
  const variantSchemaNames = [];
72
72
  for (const [variantName, variantModelKey] of Object.entries(union.variants)) {
73
- const formattedVariant = formatVariantName(variantName);
74
- const variantZodSchemaName = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;
75
- const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
73
+ const variantZodSchemaName = unionVariantName(unionZodSchemaName, variantName);
74
+ const variantTypeName = unionVariantName(typeName, variantName);
76
75
  variantSchemaNames.push(variantZodSchemaName);
77
76
 
78
77
  // Look up the variant's model to check if it's a record
@@ -92,15 +91,13 @@ function generateZodSchemasForVersion(version, ir) {
92
91
  output += `}) satisfies ZodType<${variantTypeName}>;\n\n`;
93
92
  }
94
93
  }
95
- const unknownSchemaName = `${versionedSchemaName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;
96
- const unknownTypeName = `${versionedTypeName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;
94
+ const unknownSchemaName = unionVariantName(unionZodSchemaName, UNKNOWN_UNION_VARIANT);
95
+ const unknownTypeName = unionVariantName(typeName, UNKNOWN_UNION_VARIANT);
97
96
  output += `export const ${unknownSchemaName} = z.object({\n`;
98
97
  output += ` ${discriminantField}: z.literal("${UNKNOWN_UNION_VARIANT}"),\n`;
99
98
  output += ` rawValue: z.unknown()\n`;
100
99
  output += `}) satisfies ZodType<${unknownTypeName}>;\n\n`;
101
100
  variantSchemaNames.push(unknownSchemaName);
102
- const unionZodSchemaName = versionedSchemaName(modelKey, version);
103
- const typeName = versionedTypeName(modelKey, version);
104
101
  output += `export const ${unionZodSchemaName} = z.discriminatedUnion("${discriminantField}", [\n ${variantSchemaNames.join(",\n ")}\n]) satisfies ZodType<${typeName}>;\n\n`;
105
102
  }
106
103
  return output;
@@ -118,16 +115,16 @@ function generateSchemaReExport({
118
115
  for (const [modelKey, modelDef] of Object.entries(ir.models)) {
119
116
  if (modelDef.type === "record") {
120
117
  const versioned = versionedSchemaName(modelKey, version);
121
- reExports.push(`export { ${versioned} as ${modelKey}Schema } from "./schema_v${version}.js";`);
118
+ reExports.push(`export { ${versioned} as ${schemaName(modelKey)} } from "./schema_v${version}.js";`);
122
119
  } else if (modelDef.type === "union") {
123
120
  const versioned = versionedSchemaName(modelKey, version);
124
- reExports.push(`export { ${versioned} as ${modelKey}Schema } from "./schema_v${version}.js";`);
121
+ reExports.push(`export { ${versioned} as ${schemaName(modelKey)} } from "./schema_v${version}.js";`);
125
122
 
126
123
  // Also re-export union variant schemas
127
124
  for (const variantName of Object.keys(modelDef.union.variants)) {
128
- const formattedVariant = formatVariantName(variantName);
129
- const versionedVariant = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;
130
- reExports.push(`export { ${versionedVariant} as ${`${modelKey}${formattedVariant}Schema`} } from "./schema_v${version}.js";`);
125
+ const versionedVariant = unionVariantName(versioned, variantName);
126
+ const unversionedVariant = schemaName(unionVariantName(modelKey, variantName));
127
+ reExports.push(`export { ${versionedVariant} as ${unversionedVariant} } from "./schema_v${version}.js";`);
131
128
  }
132
129
  }
133
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generateVersionedZodFromSchema.js","names":["UNKNOWN_UNION_VARIANT","formatVariantName","GENERATED_FILE_HEADER","convertFieldTypeToZodSchema","UNKNOWN_VARIANT_SUFFIX","resolveMinVersion","typesFilePath","versionedSchemaName","versionedTypeName","generateZodSchemasForVersion","version","ir","output","typeNames","modelKey","modelDef","Object","entries","models","type","push","variantName","keys","union","variants","length","sort","join","zodSchemaName","typeName","fieldLines","field","record","fields","zodType","fieldType","isOptional","key","discriminantField","discriminant","variantSchemaNames","variantModelKey","formattedVariant","variantZodSchemaName","variantTypeName","variantModel","recordZodSchemaName","refZodSchemaName","refTypeName","unknownSchemaName","unknownTypeName","unionZodSchemaName","generateSchemaReExport","reExports","versioned","versionedVariant","generateVersionedZodFromChain","resolved","minSupportedVersion","chain","minVersion","zodSchemas","Map","set","schemaReExport"],"sources":["generateVersionedZodFromSchema.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 { convertFieldTypeToZodSchema } from \"../ir/irFieldHelpers.js\";\nimport { UNKNOWN_VARIANT_SUFFIX } from \"../unknownVariantSuffix.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport { typesFilePath, versionedSchemaName, versionedTypeName } from \"./runtimeSchema.js\";\n\nexport interface VersionedZodOutput {\n /** schema_vN.ts files keyed by version number */\n zodSchemas: Map<number, string>;\n /** schema.ts re-export of latest version schemas under unversioned names */\n schemaReExport: string;\n}\n\n/**\n * Generate Zod schemas for a specific schema version.\n * Uses `.passthrough()` to preserve unknown fields.\n */\nfunction generateZodSchemasForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n // Collect type names for import\n const typeNames: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n typeNames.push(versionedTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n typeNames.push(versionedTypeName(modelKey, version));\n for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {\n typeNames.push(\n `${versionedTypeName(modelKey, version)}${formatVariantName(variantName)}`,\n );\n }\n }\n }\n\n output += \"import type { ZodType } from \\\"zod\\\";\\n\";\n output += \"import { z } from \\\"zod\\\";\\n\";\n\n if (typeNames.length > 0) {\n output += `import type { ${typeNames.sort().join(\", \")} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record schemas first (unions may depend on them)\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const zodSchemaName = versionedSchemaName(modelKey, version);\n const typeName = versionedTypeName(modelKey, version);\n const fieldLines: string[] = [];\n\n for (const field of modelDef.record.fields) {\n let zodType = convertFieldTypeToZodSchema(field.fieldType, version);\n if (field.isOptional) {\n zodType = `${zodType}.optional()`;\n }\n fieldLines.push(` ${field.key}: ${zodType}`);\n }\n\n output += `export const ${zodSchemaName} = z.object({\\n${\n fieldLines.join(\",\\n\")\n }\\n}).passthrough() satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n // Generate union schemas\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const discriminantField = union.discriminant;\n const variantSchemaNames: string[] = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantZodSchemaName = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;\n const variantTypeName = `${versionedTypeName(modelKey, version)}${formattedVariant}`;\n variantSchemaNames.push(variantZodSchemaName);\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 recordZodSchemaName = versionedSchemaName(variantModelKey, version);\n output += `export const ${variantZodSchemaName} = ${recordZodSchemaName}.extend({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\")\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the schema\n const refZodSchemaName = versionedSchemaName(variantModelKey, version);\n const refTypeName = versionedTypeName(variantModelKey, version);\n output += `export const ${variantZodSchemaName} = z.object({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\"),\\n`;\n output += ` value: z.lazy((): ZodType<${refTypeName}> => ${refZodSchemaName})\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n }\n }\n\n const unknownSchemaName = `${versionedSchemaName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;\n const unknownTypeName = `${versionedTypeName(modelKey, version)}${UNKNOWN_VARIANT_SUFFIX}`;\n output += `export const ${unknownSchemaName} = z.object({\\n`;\n output += ` ${discriminantField}: z.literal(\"${UNKNOWN_UNION_VARIANT}\"),\\n`;\n output += ` rawValue: z.unknown()\\n`;\n output += `}) satisfies ZodType<${unknownTypeName}>;\\n\\n`;\n variantSchemaNames.push(unknownSchemaName);\n\n const unionZodSchemaName = versionedSchemaName(modelKey, version);\n const typeName = versionedTypeName(modelKey, version);\n output +=\n `export const ${unionZodSchemaName} = z.discriminatedUnion(\"${discriminantField}\", [\\n ${\n variantSchemaNames.join(\",\\n \")\n }\\n]) satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate the schema.ts re-export file mapping unversioned names to latest version.\n */\nfunction generateSchemaReExport(\n { ir, version }: VersionedIrEntry,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const reExports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedSchemaName(modelKey, version);\n reExports.push(\n `export { ${versioned} as ${modelKey}Schema } from \"./schema_v${version}.js\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedSchemaName(modelKey, version);\n reExports.push(\n `export { ${versioned} as ${modelKey}Schema } from \"./schema_v${version}.js\";`,\n );\n\n // Also re-export union variant schemas\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedSchemaName(modelKey, version)}${formattedVariant}`;\n const unversionedVariant = `${modelKey}${formattedVariant}Schema`;\n reExports.push(\n `export { ${versionedVariant} as ${unversionedVariant} } from \"./schema_v${version}.js\";`,\n );\n }\n }\n }\n\n output += reExports.join(\"\\n\") + \"\\n\";\n\n return output;\n}\n\n/**\n * Generate per-version Zod schemas from an already-resolved versioned IR chain.\n */\nexport function generateVersionedZodFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedZodOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const zodSchemas = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n zodSchemas.set(version, generateZodSchemasForVersion(version, ir));\n }\n\n const schemaReExport = generateSchemaReExport(chain[chain.length - 1]!);\n\n return { zodSchemas, schemaReExport };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"generateVersionedZodFromSchema.js","names":["UNKNOWN_UNION_VARIANT","GENERATED_FILE_HEADER","convertFieldTypeToZodSchema","resolveMinVersion","schemaName","typesFilePath","unionVariantName","versionedSchemaName","versionedTypeName","generateZodSchemasForVersion","version","ir","output","typeNames","modelKey","modelDef","Object","entries","models","type","push","variantName","keys","union","variants","length","sort","join","zodSchemaName","typeName","fieldLines","field","record","fields","zodType","fieldType","isOptional","key","discriminantField","discriminant","unionZodSchemaName","variantSchemaNames","variantModelKey","variantZodSchemaName","variantTypeName","variantModel","recordZodSchemaName","refZodSchemaName","refTypeName","unknownSchemaName","unknownTypeName","generateSchemaReExport","reExports","versioned","versionedVariant","unversionedVariant","generateVersionedZodFromChain","resolved","minSupportedVersion","chain","minVersion","zodSchemas","Map","set","schemaReExport"],"sources":["generateVersionedZodFromSchema.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 { convertFieldTypeToZodSchema } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n schemaName,\n typesFilePath,\n unionVariantName,\n versionedSchemaName,\n versionedTypeName,\n} from \"./runtimeSchema.js\";\n\nexport interface VersionedZodOutput {\n /** schema_vN.ts files keyed by version number */\n zodSchemas: Map<number, string>;\n /** schema.ts re-export of latest version schemas under unversioned names */\n schemaReExport: string;\n}\n\n/**\n * Generate Zod schemas for a specific schema version.\n * Uses `.passthrough()` to preserve unknown fields.\n */\nfunction generateZodSchemasForVersion(\n version: number,\n ir: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n // Collect type names for import\n const typeNames: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n typeNames.push(versionedTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n typeNames.push(versionedTypeName(modelKey, version));\n for (const variantName of [...Object.keys(modelDef.union.variants), UNKNOWN_UNION_VARIANT]) {\n typeNames.push(unionVariantName(versionedTypeName(modelKey, version), variantName));\n }\n }\n }\n\n output += \"import type { ZodType } from \\\"zod\\\";\\n\";\n output += \"import { z } from \\\"zod\\\";\\n\";\n\n if (typeNames.length > 0) {\n output += `import type { ${typeNames.sort().join(\", \")} } from \"${typesFilePath(version)}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate record schemas first (unions may depend on them)\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n const zodSchemaName = versionedSchemaName(modelKey, version);\n const typeName = versionedTypeName(modelKey, version);\n const fieldLines: string[] = [];\n\n for (const field of modelDef.record.fields) {\n let zodType = convertFieldTypeToZodSchema(field.fieldType, version);\n if (field.isOptional) {\n zodType = `${zodType}.optional()`;\n }\n fieldLines.push(` ${field.key}: ${zodType}`);\n }\n\n output += `export const ${zodSchemaName} = z.object({\\n${\n fieldLines.join(\",\\n\")\n }\\n}).passthrough() satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n // Generate union schemas\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n const discriminantField = union.discriminant;\n const unionZodSchemaName = versionedSchemaName(modelKey, version);\n const typeName = versionedTypeName(modelKey, version);\n const variantSchemaNames: string[] = [];\n\n for (const [variantName, variantModelKey] of Object.entries(union.variants)) {\n const variantZodSchemaName = unionVariantName(unionZodSchemaName, variantName);\n const variantTypeName = unionVariantName(typeName, variantName);\n variantSchemaNames.push(variantZodSchemaName);\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 recordZodSchemaName = versionedSchemaName(variantModelKey, version);\n output += `export const ${variantZodSchemaName} = ${recordZodSchemaName}.extend({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\")\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n } else {\n // Non-record variant (e.g. another union): emit a value field referencing the schema\n const refZodSchemaName = versionedSchemaName(variantModelKey, version);\n const refTypeName = versionedTypeName(variantModelKey, version);\n output += `export const ${variantZodSchemaName} = z.object({\\n`;\n output += ` ${discriminantField}: z.literal(\"${variantName}\"),\\n`;\n output += ` value: z.lazy((): ZodType<${refTypeName}> => ${refZodSchemaName})\\n`;\n output += `}) satisfies ZodType<${variantTypeName}>;\\n\\n`;\n }\n }\n\n const unknownSchemaName = unionVariantName(unionZodSchemaName, UNKNOWN_UNION_VARIANT);\n const unknownTypeName = unionVariantName(typeName, UNKNOWN_UNION_VARIANT);\n output += `export const ${unknownSchemaName} = z.object({\\n`;\n output += ` ${discriminantField}: z.literal(\"${UNKNOWN_UNION_VARIANT}\"),\\n`;\n output += ` rawValue: z.unknown()\\n`;\n output += `}) satisfies ZodType<${unknownTypeName}>;\\n\\n`;\n variantSchemaNames.push(unknownSchemaName);\n\n output +=\n `export const ${unionZodSchemaName} = z.discriminatedUnion(\"${discriminantField}\", [\\n ${\n variantSchemaNames.join(\",\\n \")\n }\\n]) satisfies ZodType<${typeName}>;\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate the schema.ts re-export file mapping unversioned names to latest version.\n */\nfunction generateSchemaReExport(\n { ir, version }: VersionedIrEntry,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const reExports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const versioned = versionedSchemaName(modelKey, version);\n reExports.push(\n `export { ${versioned} as ${schemaName(modelKey)} } from \"./schema_v${version}.js\";`,\n );\n } else if (modelDef.type === \"union\") {\n const versioned = versionedSchemaName(modelKey, version);\n reExports.push(\n `export { ${versioned} as ${schemaName(modelKey)} } from \"./schema_v${version}.js\";`,\n );\n\n // Also re-export union variant schemas\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const versionedVariant = unionVariantName(versioned, variantName);\n const unversionedVariant = schemaName(unionVariantName(modelKey, variantName));\n reExports.push(\n `export { ${versionedVariant} as ${unversionedVariant} } from \"./schema_v${version}.js\";`,\n );\n }\n }\n }\n\n output += reExports.join(\"\\n\") + \"\\n\";\n\n return output;\n}\n\n/**\n * Generate per-version Zod schemas from an already-resolved versioned IR chain.\n */\nexport function generateVersionedZodFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): VersionedZodOutput {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n const zodSchemas = new Map<number, string>();\n\n for (const { version, ir } of chain) {\n if (version < minVersion) continue;\n\n zodSchemas.set(version, generateZodSchemasForVersion(version, ir));\n }\n\n const schemaReExport = generateSchemaReExport(chain[chain.length - 1]!);\n\n return { zodSchemas, schemaReExport };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,qBAAqB,QAAQ,4CAA4C;AAElF,SAASC,qBAAqB,QAAQ,2BAA2B;AACjE,SAASC,2BAA2B,QAAQ,yBAAyB;AAErE,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SACEC,UAAU,EACVC,aAAa,EACbC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB,QACZ,oBAAoB;AAS3B;AACA;AACA;AACA;AACA,SAASC,4BAA4BA,CACnCC,OAAe,EACfC,EAA2B,EACnB;EACR,IAAIC,MAAM,GAAGX,qBAAqB;;EAElC;EACA,MAAMY,SAAmB,GAAG,EAAE;EAC9B,KAAK,MAAM,CAACC,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,EAAE,CAACO,MAAM,CAAC,EAAE;IAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,QAAQ,EAAE;MAC9BN,SAAS,CAACO,IAAI,CAACZ,iBAAiB,CAACM,QAAQ,EAAEJ,OAAO,CAAC,CAAC;IACtD,CAAC,MAAM,IAAIK,QAAQ,CAACI,IAAI,KAAK,OAAO,EAAE;MACpCN,SAAS,CAACO,IAAI,CAACZ,iBAAiB,CAACM,QAAQ,EAAEJ,OAAO,CAAC,CAAC;MACpD,KAAK,MAAMW,WAAW,IAAI,CAAC,GAAGL,MAAM,CAACM,IAAI,CAACP,QAAQ,CAACQ,KAAK,CAACC,QAAQ,CAAC,EAAExB,qBAAqB,CAAC,EAAE;QAC1Fa,SAAS,CAACO,IAAI,CAACd,gBAAgB,CAACE,iBAAiB,CAACM,QAAQ,EAAEJ,OAAO,CAAC,EAAEW,WAAW,CAAC,CAAC;MACrF;IACF;EACF;EAEAT,MAAM,IAAI,yCAAyC;EACnDA,MAAM,IAAI,8BAA8B;EAExC,IAAIC,SAAS,CAACY,MAAM,GAAG,CAAC,EAAE;IACxBb,MAAM,IAAI,iBAAiBC,SAAS,CAACa,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,YAAYtB,aAAa,CAACK,OAAO,CAAC,MAAM;EAChG;EAEAE,MAAM,IAAI,IAAI;;EAEd;EACA,KAAK,MAAM,CAACE,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,EAAE,CAACO,MAAM,CAAC,EAAE;IAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,QAAQ,EAAE;IAEhC,MAAMS,aAAa,GAAGrB,mBAAmB,CAACO,QAAQ,EAAEJ,OAAO,CAAC;IAC5D,MAAMmB,QAAQ,GAAGrB,iBAAiB,CAACM,QAAQ,EAAEJ,OAAO,CAAC;IACrD,MAAMoB,UAAoB,GAAG,EAAE;IAE/B,KAAK,MAAMC,KAAK,IAAIhB,QAAQ,CAACiB,MAAM,CAACC,MAAM,EAAE;MAC1C,IAAIC,OAAO,GAAGhC,2BAA2B,CAAC6B,KAAK,CAACI,SAAS,EAAEzB,OAAO,CAAC;MACnE,IAAIqB,KAAK,CAACK,UAAU,EAAE;QACpBF,OAAO,GAAG,GAAGA,OAAO,aAAa;MACnC;MACAJ,UAAU,CAACV,IAAI,CAAC,KAAKW,KAAK,CAACM,GAAG,KAAKH,OAAO,EAAE,CAAC;IAC/C;IAEAtB,MAAM,IAAI,gBAAgBgB,aAAa,kBACrCE,UAAU,CAACH,IAAI,CAAC,KAAK,CAAC,wCACgBE,QAAQ,QAAQ;EAC1D;;EAEA;EACA,KAAK,MAAM,CAACf,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,EAAE,CAACO,MAAM,CAAC,EAAE;IAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,OAAO,EAAE;IAE/B,MAAMI,KAAK,GAAGR,QAAQ,CAACQ,KAAK;IAC5B,MAAMe,iBAAiB,GAAGf,KAAK,CAACgB,YAAY;IAC5C,MAAMC,kBAAkB,GAAGjC,mBAAmB,CAACO,QAAQ,EAAEJ,OAAO,CAAC;IACjE,MAAMmB,QAAQ,GAAGrB,iBAAiB,CAACM,QAAQ,EAAEJ,OAAO,CAAC;IACrD,MAAM+B,kBAA4B,GAAG,EAAE;IAEvC,KAAK,MAAM,CAACpB,WAAW,EAAEqB,eAAe,CAAC,IAAI1B,MAAM,CAACC,OAAO,CAACM,KAAK,CAACC,QAAQ,CAAC,EAAE;MAC3E,MAAMmB,oBAAoB,GAAGrC,gBAAgB,CAACkC,kBAAkB,EAAEnB,WAAW,CAAC;MAC9E,MAAMuB,eAAe,GAAGtC,gBAAgB,CAACuB,QAAQ,EAAER,WAAW,CAAC;MAC/DoB,kBAAkB,CAACrB,IAAI,CAACuB,oBAAoB,CAAC;;MAE7C;MACA,MAAME,YAAY,GAAGlC,EAAE,CAACO,MAAM,CAACwB,eAAe,CAAC;MAC/C,IAAIG,YAAY,IAAI,IAAI,IAAIA,YAAY,CAAC1B,IAAI,KAAK,QAAQ,EAAE;QAC1D,MAAM2B,mBAAmB,GAAGvC,mBAAmB,CAACmC,eAAe,EAAEhC,OAAO,CAAC;QACzEE,MAAM,IAAI,gBAAgB+B,oBAAoB,MAAMG,mBAAmB,aAAa;QACpFlC,MAAM,IAAI,KAAK0B,iBAAiB,gBAAgBjB,WAAW,MAAM;QACjET,MAAM,IAAI,wBAAwBgC,eAAe,QAAQ;MAC3D,CAAC,MAAM;QACL;QACA,MAAMG,gBAAgB,GAAGxC,mBAAmB,CAACmC,eAAe,EAAEhC,OAAO,CAAC;QACtE,MAAMsC,WAAW,GAAGxC,iBAAiB,CAACkC,eAAe,EAAEhC,OAAO,CAAC;QAC/DE,MAAM,IAAI,gBAAgB+B,oBAAoB,iBAAiB;QAC/D/B,MAAM,IAAI,KAAK0B,iBAAiB,gBAAgBjB,WAAW,OAAO;QAClET,MAAM,IAAI,+BAA+BoC,WAAW,QAAQD,gBAAgB,KAAK;QACjFnC,MAAM,IAAI,wBAAwBgC,eAAe,QAAQ;MAC3D;IACF;IAEA,MAAMK,iBAAiB,GAAG3C,gBAAgB,CAACkC,kBAAkB,EAAExC,qBAAqB,CAAC;IACrF,MAAMkD,eAAe,GAAG5C,gBAAgB,CAACuB,QAAQ,EAAE7B,qBAAqB,CAAC;IACzEY,MAAM,IAAI,gBAAgBqC,iBAAiB,iBAAiB;IAC5DrC,MAAM,IAAI,KAAK0B,iBAAiB,gBAAgBtC,qBAAqB,OAAO;IAC5EY,MAAM,IAAI,2BAA2B;IACrCA,MAAM,IAAI,wBAAwBsC,eAAe,QAAQ;IACzDT,kBAAkB,CAACrB,IAAI,CAAC6B,iBAAiB,CAAC;IAE1CrC,MAAM,IACJ,gBAAgB4B,kBAAkB,4BAA4BF,iBAAiB,WAC7EG,kBAAkB,CAACd,IAAI,CAAC,OAAO,CAAC,0BACRE,QAAQ,QAAQ;EAC9C;EAEA,OAAOjB,MAAM;AACf;;AAEA;AACA;AACA;AACA,SAASuC,sBAAsBA,CAC7B;EAAExC,EAAE;EAAED;AAA0B,CAAC,EACzB;EACR,IAAIE,MAAM,GAAGX,qBAAqB;EAElC,MAAMmD,SAAmB,GAAG,EAAE;EAE9B,KAAK,MAAM,CAACtC,QAAQ,EAAEC,QAAQ,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,EAAE,CAACO,MAAM,CAAC,EAAE;IAC5D,IAAIH,QAAQ,CAACI,IAAI,KAAK,QAAQ,EAAE;MAC9B,MAAMkC,SAAS,GAAG9C,mBAAmB,CAACO,QAAQ,EAAEJ,OAAO,CAAC;MACxD0C,SAAS,CAAChC,IAAI,CACZ,YAAYiC,SAAS,OAAOjD,UAAU,CAACU,QAAQ,CAAC,sBAAsBJ,OAAO,OAC/E,CAAC;IACH,CAAC,MAAM,IAAIK,QAAQ,CAACI,IAAI,KAAK,OAAO,EAAE;MACpC,MAAMkC,SAAS,GAAG9C,mBAAmB,CAACO,QAAQ,EAAEJ,OAAO,CAAC;MACxD0C,SAAS,CAAChC,IAAI,CACZ,YAAYiC,SAAS,OAAOjD,UAAU,CAACU,QAAQ,CAAC,sBAAsBJ,OAAO,OAC/E,CAAC;;MAED;MACA,KAAK,MAAMW,WAAW,IAAIL,MAAM,CAACM,IAAI,CAACP,QAAQ,CAACQ,KAAK,CAACC,QAAQ,CAAC,EAAE;QAC9D,MAAM8B,gBAAgB,GAAGhD,gBAAgB,CAAC+C,SAAS,EAAEhC,WAAW,CAAC;QACjE,MAAMkC,kBAAkB,GAAGnD,UAAU,CAACE,gBAAgB,CAACQ,QAAQ,EAAEO,WAAW,CAAC,CAAC;QAC9E+B,SAAS,CAAChC,IAAI,CACZ,YAAYkC,gBAAgB,OAAOC,kBAAkB,sBAAsB7C,OAAO,OACpF,CAAC;MACH;IACF;EACF;EAEAE,MAAM,IAAIwC,SAAS,CAACzB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;EAErC,OAAOf,MAAM;AACf;;AAEA;AACA;AACA;AACA,OAAO,SAAS4C,6BAA6BA,CAC3CC,QAAyB,EACzBC,mBAA4B,EACR;EACpB,MAAM;IAAEC;EAAM,CAAC,GAAGF,QAAQ;EAC1B,MAAM;IAAEG;EAAW,CAAC,GAAGzD,iBAAiB,CAACwD,KAAK,EAAED,mBAAmB,CAAC;EAEpE,MAAMG,UAAU,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAE5C,KAAK,MAAM;IAAEpD,OAAO;IAAEC;EAAG,CAAC,IAAIgD,KAAK,EAAE;IACnC,IAAIjD,OAAO,GAAGkD,UAAU,EAAE;IAE1BC,UAAU,CAACE,GAAG,CAACrD,OAAO,EAAED,4BAA4B,CAACC,OAAO,EAAEC,EAAE,CAAC,CAAC;EACpE;EAEA,MAAMqD,cAAc,GAAGb,sBAAsB,CAACQ,KAAK,CAACA,KAAK,CAAClC,MAAM,GAAG,CAAC,CAAE,CAAC;EAEvE,OAAO;IAAEoC,UAAU;IAAEG;EAAe,CAAC;AACvC","ignoreList":[]}
@@ -21,20 +21,38 @@ import { convertSchemaToIr } from "../steps/convertStepsToIr.js";
21
21
 
22
22
  /** Serialized migrations keyed by `[recordModelName][fieldName]`. */
23
23
 
24
+ export function getEntryMinorVersion(entry) {
25
+ return entry.minorVersion ?? 0;
26
+ }
27
+ export function formatSchemaVersion(major, minor) {
28
+ return minor > 0 ? `${major}.${minor}` : `${major}`;
29
+ }
30
+ function formatEntryVersion(entry) {
31
+ return formatSchemaVersion(entry.version, getEntryMinorVersion(entry));
32
+ }
33
+ function getSchemaMinorVersion(schema) {
34
+ return schema.type === "versioned" ? schema.minorVersion ?? 0 : 0;
35
+ }
24
36
  function collectVersionedIrChain(input, identity) {
25
37
  const schemas = collectSchemaDefinitions(input);
26
38
  const provenances = deriveProvenance(schemas);
27
- return schemas.map((schema, index) => ({
28
- version: schema.version,
29
- ir: convertSchemaToIr(schema.models, {
39
+ return schemas.map((schema, index) => {
40
+ const minorVersion = getSchemaMinorVersion(schema);
41
+ return {
30
42
  version: schema.version,
31
- name: identity.name,
32
- description: identity.description
33
- }, provenances[index]),
34
- ...(schema.type === "versioned" ? {
35
- migrations: serializeMigrations(schema.migrations)
36
- } : {})
37
- }));
43
+ ...(minorVersion > 0 ? {
44
+ minorVersion
45
+ } : {}),
46
+ ir: convertSchemaToIr(schema.models, {
47
+ version: schema.version,
48
+ name: identity.name,
49
+ description: identity.description
50
+ }, provenances[index]),
51
+ ...(schema.type === "versioned" ? {
52
+ migrations: serializeMigrations(schema.migrations)
53
+ } : {})
54
+ };
55
+ });
38
56
  }
39
57
  function collectSchemaDefinitions(input) {
40
58
  const schemas = [];
@@ -49,40 +67,88 @@ function collectSchemaDefinitions(input) {
49
67
 
50
68
  /**
51
69
  * Build field/model provenance by walking the version chain from oldest to
52
- * newest. The first version where a model key or record field appears is the
53
- * version stamped into IR metadata.
70
+ * newest. The first version (major and minor) where a model key or record field
71
+ * appears is the version stamped into IR metadata.
54
72
  */
55
73
  function deriveProvenance(schemas) {
56
74
  const firstModelVersions = new Map();
57
75
  const firstFieldVersions = new Map();
76
+ const firstVariantVersions = new Map();
58
77
  return schemas.map(schema => {
78
+ const currentVersion = {
79
+ major: schema.version,
80
+ minor: getSchemaMinorVersion(schema)
81
+ };
59
82
  const modelVersions = {};
83
+ const modelMinorVersions = {};
60
84
  const fieldVersions = {};
85
+ const fieldMinorVersions = {};
86
+ const variantVersions = {};
87
+ const variantMinorVersions = {};
61
88
  for (const [modelKey, modelDef] of Object.entries(schema.models)) {
62
89
  if (!firstModelVersions.has(modelKey)) {
63
- firstModelVersions.set(modelKey, schema.version);
90
+ firstModelVersions.set(modelKey, currentVersion);
91
+ }
92
+ const modelVersion = firstModelVersions.get(modelKey);
93
+ modelVersions[modelKey] = modelVersion.major;
94
+ if (modelVersion.minor > 0) {
95
+ modelMinorVersions[modelKey] = modelVersion.minor;
96
+ }
97
+ if (modelDef.type === "union") {
98
+ let variantVersionsForModel = firstVariantVersions.get(modelKey);
99
+ if (variantVersionsForModel == null) {
100
+ variantVersionsForModel = new Map();
101
+ firstVariantVersions.set(modelKey, variantVersionsForModel);
102
+ }
103
+ const variants = {};
104
+ const minorVariants = {};
105
+ for (const variantName of Object.keys(modelDef.variants)) {
106
+ if (!variantVersionsForModel.has(variantName)) {
107
+ variantVersionsForModel.set(variantName, currentVersion);
108
+ }
109
+ const variantVersion = variantVersionsForModel.get(variantName);
110
+ variants[variantName] = variantVersion.major;
111
+ if (variantVersion.minor > 0) {
112
+ minorVariants[variantName] = variantVersion.minor;
113
+ }
114
+ }
115
+ variantVersions[modelKey] = variants;
116
+ if (Object.keys(minorVariants).length > 0) {
117
+ variantMinorVersions[modelKey] = minorVariants;
118
+ }
119
+ continue;
64
120
  }
65
- modelVersions[modelKey] = firstModelVersions.get(modelKey);
66
- if (modelDef.type !== "record") continue;
67
121
  let fieldVersionsForModel = firstFieldVersions.get(modelKey);
68
122
  if (fieldVersionsForModel == null) {
69
123
  fieldVersionsForModel = new Map();
70
124
  firstFieldVersions.set(modelKey, fieldVersionsForModel);
71
125
  }
72
126
  const fields = {};
127
+ const minorFields = {};
73
128
  for (const fieldKey of Object.keys(modelDef.fields)) {
74
129
  if (!fieldVersionsForModel.has(fieldKey)) {
75
- fieldVersionsForModel.set(fieldKey, schema.version);
130
+ fieldVersionsForModel.set(fieldKey, currentVersion);
131
+ }
132
+ const fieldVersion = fieldVersionsForModel.get(fieldKey);
133
+ fields[fieldKey] = fieldVersion.major;
134
+ if (fieldVersion.minor > 0) {
135
+ minorFields[fieldKey] = fieldVersion.minor;
76
136
  }
77
- fields[fieldKey] = fieldVersionsForModel.get(fieldKey);
78
137
  }
79
138
  if (Object.keys(fields).length > 0) {
80
139
  fieldVersions[modelKey] = fields;
81
140
  }
141
+ if (Object.keys(minorFields).length > 0) {
142
+ fieldMinorVersions[modelKey] = minorFields;
143
+ }
82
144
  }
83
145
  return {
84
146
  fieldVersions,
85
147
  modelVersions,
148
+ fieldMinorVersions,
149
+ modelMinorVersions,
150
+ variantVersions,
151
+ variantMinorVersions,
86
152
  deprecations: "deprecations" in schema ? schema.deprecations : undefined
87
153
  };
88
154
  });
@@ -114,7 +180,7 @@ export function resolveMinVersion(chain, minSupportedVersion) {
114
180
  }
115
181
  const latestVersion = chain[chain.length - 1].version;
116
182
  if (minSupportedVersion != null && !chain.some(c => c.version === minSupportedVersion)) {
117
- throw new Error(`minSupportedVersion ${minSupportedVersion} is not in the schema chain ` + `(available versions: ${chain.map(c => c.version).join(", ")})`);
183
+ throw new Error(`minSupportedVersion ${minSupportedVersion} is not in the schema chain ` + `(available versions: ${chain.map(formatEntryVersion).join(", ")})`);
118
184
  }
119
185
  return {
120
186
  latestVersion,
@@ -125,10 +191,13 @@ function capVersionedIrChain(chain, maxVersion) {
125
191
  if (maxVersion == null) {
126
192
  return chain;
127
193
  }
128
- if (!chain.some(c => c.version === maxVersion)) {
129
- throw new Error(`maxVersion ${maxVersion} is not in the schema chain ` + `(available versions: ${chain.map(c => c.version).join(", ")})`);
194
+ const maxIndex = chain.findIndex(c => c.version === maxVersion.major && getEntryMinorVersion(c) === maxVersion.minor);
195
+ if (maxIndex === -1) {
196
+ throw new Error(`maxVersion ${formatSchemaVersion(maxVersion.major, maxVersion.minor)} is not in the schema chain ` + `(available versions: ${chain.map(formatEntryVersion).join(", ")})`);
130
197
  }
131
- return chain.filter(c => c.version <= maxVersion);
198
+
199
+ // The chain is in version order, so everything up to the match is at or below it.
200
+ return chain.slice(0, maxIndex + 1);
132
201
  }
133
202
 
134
203
  /**
@@ -190,6 +259,47 @@ export function stripDeprecatedFieldsForSdk(chain) {
190
259
  });
191
260
  }
192
261
 
262
+ /**
263
+ * Merge each major's minor versions into one entry, for generating SDK types.
264
+ *
265
+ * E.g. 3.0, 3.1 and 3.2 become one `3` entry that uses 3.2's IR, so `ShapeBox_v3` has every 3.x
266
+ * field. Migrations from all three are kept, because each lives only on the version that added it.
267
+ */
268
+ export function collapseChainToMajors(chain) {
269
+ const collapsed = [];
270
+ for (const entry of chain) {
271
+ const previous = collapsed[collapsed.length - 1];
272
+ const migrations = previous?.version === entry.version ? mergeMigrations(previous.migrations, entry.migrations) : entry.migrations;
273
+ const collapsedEntry = {
274
+ version: entry.version,
275
+ ir: entry.ir,
276
+ ...(migrations != null ? {
277
+ migrations
278
+ } : {})
279
+ };
280
+ if (previous?.version === entry.version) {
281
+ collapsed[collapsed.length - 1] = collapsedEntry;
282
+ } else {
283
+ collapsed.push(collapsedEntry);
284
+ }
285
+ }
286
+ return collapsed;
287
+ }
288
+ function mergeMigrations(base, override) {
289
+ if (base == null) return override;
290
+ if (override == null) return base;
291
+ const result = {
292
+ ...base
293
+ };
294
+ for (const [modelKey, fields] of Object.entries(override)) {
295
+ result[modelKey] = {
296
+ ...result[modelKey],
297
+ ...fields
298
+ };
299
+ }
300
+ return result;
301
+ }
302
+
193
303
  /**
194
304
  * True if the chain has any field that requires a runtime upgrade function.
195
305
  * Drives whether the generated SDK emits `DocumentModel` as a factory
@@ -202,6 +312,7 @@ export function stripDeprecatedFieldsForSdk(chain) {
202
312
  * app must supply a zero-arg thunk; `undefined` is not a legal value.
203
313
  *
204
314
  * Optional additive fields don't trigger it; the lens leaves them alone.
315
+ * Pass every version (`stepChain`), so a required field added in a minor, like `title` in 3.2, counts.
205
316
  */
206
317
  export function chainNeedsUpgradeFns(chain) {
207
318
  for (let i = 1; i < chain.length; i++) {
@@ -223,4 +334,9 @@ export function chainNeedsUpgradeFns(chain) {
223
334
  }
224
335
  return false;
225
336
  }
337
+
338
+ /** Upgrade function key for a step: `v2` for 2.0, `v2_1` for 2.1. Must match the key `applyReadLens` builds. */
339
+ export function upgradeStepKey(major, minor) {
340
+ return minor > 0 ? `v${major}_${minor}` : `v${major}`;
341
+ }
226
342
  //# sourceMappingURL=resolveSchemaChain.js.map