@palantir/pack.document-schema.type-gen 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js +85 -0
- package/build/esm/commands/asset/__tests__/buildPrefixRewriteFetch.test.js.map +1 -0
- package/build/esm/commands/asset/assetDeployHandler.js +36 -1
- package/build/esm/commands/asset/assetDeployHandler.js.map +1 -1
- package/build/esm/commands/asset/registerAssetCommands.js +1 -1
- package/build/esm/commands/asset/registerAssetCommands.js.map +1 -1
- package/build/esm/commands/ir/irGenTypesHandler.js +49 -0
- package/build/esm/commands/ir/irGenTypesHandler.js.map +1 -0
- package/build/esm/commands/ir/registerIrCommands.js +2 -0
- package/build/esm/commands/ir/registerIrCommands.js.map +1 -1
- package/build/esm/commands/schema/registerSchemaCommands.js +2 -0
- package/build/esm/commands/schema/registerSchemaCommands.js.map +1 -1
- package/build/esm/commands/schema/schemaIrHandler.js +56 -0
- package/build/esm/commands/schema/schemaIrHandler.js.map +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/pack-docschema-api/pack-docschema-ir/recordDef.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/external-refs.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/simple-record.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateModelsFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/array-and-map-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/boolean-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/custom-discriminant.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/datetime-fields.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/simple-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-before-records.js.map +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js +1 -1
- package/build/esm/utils/ir/__tests__/__snapshots__/generateZodSchemasFromIr/union-types.js.map +1 -1
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js +27 -16
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.js.map +1 -1
- package/build/esm/utils/ir/__tests__/generateModelsFromIr.test.js +6 -24
- package/build/esm/utils/ir/__tests__/generateModelsFromIr.test.js.map +1 -1
- package/build/esm/utils/ir/__tests__/generateZodSchemasFromIr.test.js +10 -40
- package/build/esm/utils/ir/__tests__/generateZodSchemasFromIr.test.js.map +1 -1
- package/build/esm/utils/ir/convertIrToWireSchema.js +4 -2
- package/build/esm/utils/ir/convertIrToWireSchema.js.map +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js +1 -1
- package/build/esm/utils/ir/generateZodSchemasFromIr.js.map +1 -1
- package/build/esm/utils/ir/irFieldHelpers.js +383 -0
- package/build/esm/utils/ir/irFieldHelpers.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/single-version.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js +2 -0
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -0
- package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js +13 -0
- package/build/esm/utils/schema/__tests__/convertSchemaToSteps.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/fixtures.js +278 -0
- package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +53 -0
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +42 -0
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +38 -0
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +64 -0
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +60 -0
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +38 -0
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -0
- package/build/esm/utils/schema/__tests__/snapshotUtils.js +106 -0
- package/build/esm/utils/schema/__tests__/snapshotUtils.js.map +1 -0
- package/build/esm/utils/schema/convertSchemaToSteps.js +6 -0
- package/build/esm/utils/schema/convertSchemaToSteps.js.map +1 -1
- package/build/esm/utils/schema/generateIndexFromSchema.js +74 -0
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateInternalFromSchema.js +264 -0
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +172 -0
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateScopeFromSchema.js +151 -0
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateTypesFromSchema.js +20 -26
- package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +187 -0
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +153 -0
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -0
- package/build/esm/utils/schema/generateVersionsFromSchema.js +52 -0
- package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -0
- package/build/esm/utils/schema/loadSchemaModule.js +53 -0
- package/build/esm/utils/schema/loadSchemaModule.js.map +1 -0
- package/build/esm/utils/schema/resolveSchemaChain.js +104 -0
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -0
- package/build/esm/utils/schema/runtimeSchema.js +69 -0
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -0
- package/build/esm/utils/schema/writeAllSdkFiles.js +111 -0
- package/build/esm/utils/schema/writeAllSdkFiles.js.map +1 -0
- package/build/esm/utils/steps/__tests__/__snapshots__/types/arrayFields.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/customDiscriminant.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/generateTypeScriptInterfaces.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/refTypes.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleRecord.js.map +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js +1 -1
- package/build/esm/utils/steps/__tests__/__snapshots__/types/simpleSteps.js.map +1 -1
- package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js +93 -1
- package/build/esm/utils/steps/__tests__/convertStepsToIr.test.js.map +1 -1
- package/build/esm/utils/steps/convertStepsToIr.js +45 -40
- package/build/esm/utils/steps/convertStepsToIr.js.map +1 -1
- package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts +2 -0
- package/build/types/commands/asset/__tests__/buildPrefixRewriteFetch.test.d.ts.map +1 -0
- package/build/types/commands/asset/assetDeployHandler.d.ts +15 -0
- package/build/types/commands/asset/assetDeployHandler.d.ts.map +1 -1
- package/build/types/commands/asset/registerAssetCommands.d.ts.map +1 -1
- package/build/types/commands/ir/irGenTypesHandler.d.ts +8 -0
- package/build/types/commands/ir/irGenTypesHandler.d.ts.map +1 -0
- package/build/types/commands/ir/registerIrCommands.d.ts.map +1 -1
- package/build/types/commands/schema/registerSchemaCommands.d.ts.map +1 -1
- package/build/types/commands/schema/schemaIrHandler.d.ts +19 -0
- package/build/types/commands/schema/schemaIrHandler.d.ts.map +1 -0
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/recordDef.d.ts +0 -2
- package/build/types/lib/pack-docschema-api/pack-docschema-ir/recordDef.d.ts.map +1 -1
- package/build/types/utils/ir/irFieldHelpers.d.ts +36 -0
- package/build/types/utils/ir/irFieldHelpers.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts +23 -0
- package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateInternalFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateInternalFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateModelMetadataFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateModelMetadataFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateScopeFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateScopeFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionedTypesFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionedTypesFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionedZodFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionedZodFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/generateVersionsFromSchema.test.d.ts +2 -0
- package/build/types/utils/schema/__tests__/generateVersionsFromSchema.test.d.ts.map +1 -0
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts +47 -0
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts.map +1 -0
- package/build/types/utils/schema/convertSchemaToSteps.d.ts.map +1 -1
- package/build/types/utils/schema/generateIndexFromSchema.d.ts +14 -0
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateInternalFromSchema.d.ts +15 -0
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +10 -0
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateScopeFromSchema.d.ts +13 -0
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +15 -0
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +12 -0
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts +13 -0
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -0
- package/build/types/utils/schema/loadSchemaModule.d.ts +14 -0
- package/build/types/utils/schema/loadSchemaModule.d.ts.map +1 -0
- package/build/types/utils/schema/resolveSchemaChain.d.ts +39 -0
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -0
- package/build/types/utils/schema/runtimeSchema.d.ts +27 -0
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -0
- package/build/types/utils/schema/writeAllSdkFiles.d.ts +8 -0
- package/build/types/utils/schema/writeAllSdkFiles.d.ts.map +1 -0
- package/build/types/utils/steps/convertStepsToIr.d.ts +3 -3
- package/build/types/utils/steps/convertStepsToIr.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateInternalFromSchema.js","names":["GENERATED_FILE_HEADER","convertFieldTypeToDescriptor","convertFieldTypeToInternalTypeScript","convertFieldTypeToInternalZod","sortedEntries","map","Array","from","entries","sort","a","b","localeCompare","collectRecordModels","chain","allRecordModels","Map","version","ir","modelKey","modelDef","Object","models","type","has","set","allFields","steps","model","get","field","record","fields","existing","key","fieldType","isOptional","presentInVersions","Set","alwaysOptional","everOptional","add","i","length","prevEntry","currEntry","currModelDef","prevModelDef","prevFields","f","currFields","addedFields","recordUpgrades","migrations","fieldKey","annotation","derivedFrom","forwardSource","removedFields","push","size","name","addedInVersion","totalVersions","values","fieldInfo","generateInternalTypes","output","fieldName","tsType","optional","generateUpgrades","latestIr","hasRecords","hasUnions","some","m","imports","join","typeDescriptor","step","fieldMeta","d","default","undefined","JSON","stringify","union","discriminant","variantKey","variantModelKey","variants","generateInternalSchemaContent","zodType","generateInternalFromChain","resolved","internalTypes","upgrades","internalSchema"],"sources":["generateInternalFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n IFieldTypeUnion,\n IRealTimeDocumentSchema,\n} from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport {\n convertFieldTypeToDescriptor,\n convertFieldTypeToInternalTypeScript,\n convertFieldTypeToInternalZod,\n} from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain, VersionedIrEntry } from \"./resolveSchemaChain.js\";\n\nexport interface InternalTypesOutput {\n /** _internal/types.ts content */\n internalTypes: string;\n /** _internal/upgrades.ts content */\n upgrades: string;\n /** _internal/schema.ts content */\n internalSchema: string;\n}\n\n/** Collected info about all fields for a model across all versions. */\ninterface AllFieldInfo {\n fieldType: IFieldTypeUnion;\n isOptional: boolean;\n /** Versions where this field exists. */\n presentInVersions: Set<number>;\n /** Whether field is always optional. */\n alwaysOptional: boolean;\n /** Whether field is optional in at least one version. */\n everOptional: boolean;\n}\n\n/**\n * Represents an upgrade step for a model between version transitions.\n */\ninterface UpgradeStep {\n name: string;\n addedInVersion: number;\n fields: Map<string, { derivedFrom: string[]; forwardSource: string; default?: unknown }>;\n removedFields: string[];\n}\n\ninterface RecordModelInfo {\n allFields: Map<string, AllFieldInfo>;\n steps: UpgradeStep[];\n}\n\n/**\n * Helper to iterate sorted entries of a Map.\n */\nfunction sortedEntries<V>(map: Map<string, V>): [string, V][] {\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n}\n\n/**\n * Collect all record model info across all versions and compute upgrade steps.\n */\nfunction collectRecordModels(\n chain: VersionedIrEntry[],\n): Map<string, RecordModelInfo> {\n const allRecordModels = new Map<string, RecordModelInfo>();\n\n // Initialize models from all versions\n for (const { version, ir } of chain) {\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type !== \"record\") continue;\n\n if (!allRecordModels.has(modelKey)) {\n allRecordModels.set(modelKey, {\n allFields: new Map(),\n steps: [],\n });\n }\n\n const model = allRecordModels.get(modelKey)!;\n\n for (const field of modelDef.record.fields) {\n const existing = model.allFields.get(field.key);\n if (existing == null) {\n model.allFields.set(field.key, {\n fieldType: field.fieldType,\n isOptional: field.isOptional === true,\n presentInVersions: new Set([version]),\n alwaysOptional: field.isOptional === true,\n everOptional: field.isOptional === true,\n });\n } else {\n existing.presentInVersions.add(version);\n if (field.isOptional !== true) {\n existing.alwaysOptional = false;\n }\n if (field.isOptional === true) {\n existing.everOptional = true;\n }\n }\n }\n }\n }\n\n // Compute upgrade steps from version diffs\n for (let i = 1; i < chain.length; i++) {\n const prevEntry = chain[i - 1]!;\n const currEntry = chain[i]!;\n\n for (const [modelKey, currModelDef] of Object.entries(currEntry.ir.models)) {\n if (currModelDef.type !== \"record\") continue;\n\n const prevModelDef = prevEntry.ir.models[modelKey];\n if (prevModelDef == null || prevModelDef.type !== \"record\") continue;\n\n const model = allRecordModels.get(modelKey);\n if (model == null) continue;\n\n const prevFields = new Set(prevModelDef.record.fields.map(f => f.key));\n const currFields = new Set(currModelDef.record.fields.map(f => f.key));\n\n // Fields added in this version\n const addedFields = new Map<\n string,\n { derivedFrom: string[]; forwardSource: string; default?: unknown }\n >();\n const recordUpgrades = currEntry.migrations?.[modelKey];\n for (const fieldKey of currFields) {\n if (!prevFields.has(fieldKey)) {\n const annotation = recordUpgrades?.[fieldKey];\n if (annotation != null) {\n addedFields.set(fieldKey, {\n derivedFrom: [...annotation.derivedFrom],\n forwardSource: annotation.forwardSource,\n });\n } else {\n addedFields.set(fieldKey, {\n derivedFrom: [],\n forwardSource: \"() => undefined\",\n });\n }\n }\n }\n\n // Fields removed in this version\n const removedFields: string[] = [];\n for (const fieldKey of prevFields) {\n if (!currFields.has(fieldKey)) {\n removedFields.push(fieldKey);\n }\n }\n\n if (addedFields.size > 0 || removedFields.length > 0) {\n model.steps.push({\n name: `v${currEntry.version}`,\n addedInVersion: currEntry.version,\n fields: addedFields,\n removedFields,\n });\n }\n }\n }\n\n // Mark fields that are not present in ALL versions as optional in internal type\n const totalVersions = chain.length;\n for (const model of allRecordModels.values()) {\n for (const [, fieldInfo] of model.allFields) {\n if (fieldInfo.presentInVersions.size < totalVersions) {\n fieldInfo.alwaysOptional = true;\n }\n }\n }\n\n return allRecordModels;\n}\n\n/**\n * Generate _internal/types.ts content.\n */\nfunction generateInternalTypes(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += \"\\n\";\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `/** Internal representation containing all fields across all schema versions. */\\n`;\n output += `export interface ${modelKey}__Internal {\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const tsType = convertFieldTypeToInternalTypeScript(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n const optional = fieldInfo.alwaysOptional ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\n/**\n * Generate _internal/upgrades.ts content.\n */\nfunction generateUpgrades(\n allRecordModels: Map<string, RecordModelInfo>,\n latestIr: IRealTimeDocumentSchema,\n): string {\n let output = GENERATED_FILE_HEADER;\n\n const hasRecords = allRecordModels.size > 0;\n const hasUnions = Object.values(latestIr.models).some(m => m.type === \"union\");\n\n const imports: string[] = [];\n if (hasRecords) imports.push(\"UpgradeRegistry\");\n if (hasUnions) imports.push(\"UnionUpgradeRegistry\");\n\n if (imports.length > 0) {\n output += `import type { ${\n imports.join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n\\n`;\n }\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}Upgrades: UpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n\n // allFields\n output += ` allFields: {\\n`;\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n const typeDescriptor = convertFieldTypeToDescriptor(\n fieldInfo.fieldType,\n fieldInfo.isOptional,\n );\n output += ` ${fieldName}: { type: ${typeDescriptor} },\\n`;\n }\n output += ` },\\n`;\n\n // steps\n output += ` steps: [\\n`;\n for (const step of model.steps) {\n output += ` {\\n`;\n output += ` name: \"${step.name}\",\\n`;\n output += ` addedInVersion: ${step.addedInVersion},\\n`;\n output += ` fields: {\\n`;\n for (const [fieldName, fieldMeta] of step.fields) {\n output += ` ${fieldName}: {\\n`;\n output += ` derivedFrom: [${\n fieldMeta.derivedFrom.map(d => `\"${d}\"`).join(\", \")\n }],\\n`;\n output += ` forward: ${fieldMeta.forwardSource},\\n`;\n if (fieldMeta.default !== undefined) {\n output += ` default: ${JSON.stringify(fieldMeta.default)},\\n`;\n }\n output += ` },\\n`;\n }\n output += ` },\\n`;\n if (step.removedFields.length > 0) {\n output += ` removedFields: [${step.removedFields.map(f => `\"${f}\"`).join(\", \")}],\\n`;\n }\n output += ` },\\n`;\n }\n output += ` ],\\n`;\n\n output += `};\\n\\n`;\n }\n\n // Generate UnionUpgradeRegistry entries for union models\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type !== \"union\") continue;\n\n const union = modelDef.union;\n output += `export const ${modelKey}Upgrades: UnionUpgradeRegistry<\"${modelKey}\"> = {\\n`;\n output += ` modelName: \"${modelKey}\",\\n`;\n output += ` discriminant: \"${union.discriminant}\",\\n`;\n output += ` variants: {\\n`;\n for (const [variantKey, variantModelKey] of Object.entries(union.variants)) {\n output += ` \"${variantKey}\": \"${variantModelKey}\",\\n`;\n }\n output += ` },\\n`;\n output += `};\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/schema.ts content.\n */\nfunction generateInternalSchemaContent(\n allRecordModels: Map<string, RecordModelInfo>,\n): string {\n let output = GENERATED_FILE_HEADER;\n output += `import { z } from \"zod\";\\n\\n`;\n\n for (const [modelKey, model] of sortedEntries(allRecordModels)) {\n output += `export const ${modelKey}InternalSchema = z.object({\\n`;\n\n for (const [fieldName, fieldInfo] of sortedEntries(model.allFields)) {\n // Use everOptional: a field optional in ANY version must stay optional\n // in the internal schema because older documents may legitimately omit it.\n const zodType = convertFieldTypeToInternalZod(\n fieldInfo.fieldType,\n fieldInfo.alwaysOptional || fieldInfo.everOptional,\n );\n output += ` ${fieldName}: ${zodType},\\n`;\n }\n\n output += `}).passthrough();\\n\\n`;\n }\n\n return output;\n}\n\n/**\n * Generate _internal/types.ts, _internal/upgrades.ts, and _internal/schema.ts\n * from an already-resolved versioned IR chain.\n */\nexport function generateInternalFromChain(\n resolved: ResolvedIrChain,\n): InternalTypesOutput {\n const { chain } = resolved;\n const latestIr = chain[chain.length - 1]!.ir;\n\n const allRecordModels = collectRecordModels(chain);\n\n const internalTypes = generateInternalTypes(allRecordModels);\n const upgrades = generateUpgrades(allRecordModels, latestIr);\n const internalSchema = generateInternalSchemaContent(allRecordModels);\n\n return { internalTypes, upgrades, internalSchema };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { formatVariantName } from "../formatVariantName.js";
|
|
18
|
+
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
+
import { findExternalRefType } from "../ir/irFieldHelpers.js";
|
|
20
|
+
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
+
import { INTERNAL_UPGRADES_PATH, modelName, SCHEMA_REEXPORT_PATH, schemaName, TYPES_REEXPORT_PATH } from "./runtimeSchema.js";
|
|
22
|
+
function extractExternalRefFieldTypes(record) {
|
|
23
|
+
const refs = [];
|
|
24
|
+
for (const field of record.fields) {
|
|
25
|
+
const refType = findExternalRefType(field.fieldType);
|
|
26
|
+
if (refType != null) {
|
|
27
|
+
refs.push([field.key, refType]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return refs;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Generate models.ts from an already-resolved versioned IR chain.
|
|
35
|
+
*/
|
|
36
|
+
export function generateModelMetadataFromChain(resolved, minSupportedVersion) {
|
|
37
|
+
const {
|
|
38
|
+
chain
|
|
39
|
+
} = resolved;
|
|
40
|
+
const {
|
|
41
|
+
latestVersion,
|
|
42
|
+
minVersion
|
|
43
|
+
} = resolveMinVersion(chain, minSupportedVersion);
|
|
44
|
+
const latestIr = chain[chain.length - 1].ir;
|
|
45
|
+
|
|
46
|
+
// --- Generate models.ts ---
|
|
47
|
+
let output = GENERATED_FILE_HEADER;
|
|
48
|
+
|
|
49
|
+
// Collect model names for imports
|
|
50
|
+
const recordNames = [];
|
|
51
|
+
const unionNames = [];
|
|
52
|
+
const variantNames = [];
|
|
53
|
+
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
54
|
+
if (modelDef.type === "record") {
|
|
55
|
+
recordNames.push(modelKey);
|
|
56
|
+
} else if (modelDef.type === "union") {
|
|
57
|
+
unionNames.push(modelKey);
|
|
58
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
59
|
+
variantNames.push(`${modelKey}${formatVariantName(variantName)}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();
|
|
64
|
+
|
|
65
|
+
// Imports
|
|
66
|
+
const modelTypesImports = ["DocumentSchema"];
|
|
67
|
+
if (recordNames.length > 0) modelTypesImports.push("RecordModel");
|
|
68
|
+
if (unionNames.length > 0) modelTypesImports.push("UnionModel");
|
|
69
|
+
output += `import type { ${modelTypesImports.sort().join(", ")} } from "@palantir/pack.document-schema.model-types";\n`;
|
|
70
|
+
output += `import { Metadata } from "@palantir/pack.document-schema.model-types";\n`;
|
|
71
|
+
if (allModelNames.length > 0) {
|
|
72
|
+
output += `import type { ${allModelNames.join(", ")} } from "${TYPES_REEXPORT_PATH}";\n`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Schema imports
|
|
76
|
+
const schemaNames = allModelNames.map(n => schemaName(n));
|
|
77
|
+
if (schemaNames.length > 0) {
|
|
78
|
+
output += `import { ${schemaNames.join(", ")} } from "${SCHEMA_REEXPORT_PATH}";\n`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Upgrade imports (only if there are upgrades)
|
|
82
|
+
const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);
|
|
83
|
+
if (chain.length > 1 && upgradeNames.length > 0) {
|
|
84
|
+
output += `import { ${upgradeNames.join(", ")} } from "${INTERNAL_UPGRADES_PATH}";\n`;
|
|
85
|
+
}
|
|
86
|
+
output += "\n";
|
|
87
|
+
|
|
88
|
+
// Generate model constants
|
|
89
|
+
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
90
|
+
if (modelDef.type === "record") {
|
|
91
|
+
const externalRefs = extractExternalRefFieldTypes(modelDef.record);
|
|
92
|
+
const metadataFields = [];
|
|
93
|
+
if (externalRefs.length > 0) {
|
|
94
|
+
const entries = externalRefs.map(([field, type]) => ` ${field}: "${type}",`).join("\n");
|
|
95
|
+
metadataFields.push(` externalRefFieldTypes: {\n${entries}\n },`);
|
|
96
|
+
}
|
|
97
|
+
metadataFields.push(` name: "${modelKey}",`);
|
|
98
|
+
output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
|
|
99
|
+
output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
|
|
100
|
+
output += ` __type: {} as ${modelKey},\n`;
|
|
101
|
+
output += ` zodSchema: ${schemaName(modelKey)},\n`;
|
|
102
|
+
output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
|
|
103
|
+
output += `};\n\n`;
|
|
104
|
+
} else if (modelDef.type === "union") {
|
|
105
|
+
const union = modelDef.union;
|
|
106
|
+
const metadataFields = [];
|
|
107
|
+
metadataFields.push(` discriminant: "${union.discriminant}",`);
|
|
108
|
+
metadataFields.push(` name: "${modelKey}",`);
|
|
109
|
+
output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${schemaName(modelKey)}> {}\n`;
|
|
110
|
+
output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\n`;
|
|
111
|
+
output += ` __type: {} as ${modelKey},\n`;
|
|
112
|
+
output += ` zodSchema: ${schemaName(modelKey)},\n`;
|
|
113
|
+
output += ` [Metadata]: {\n${metadataFields.join("\n")}\n },\n`;
|
|
114
|
+
output += `};\n\n`;
|
|
115
|
+
|
|
116
|
+
// Generate variant models
|
|
117
|
+
for (const variantName of Object.keys(union.variants)) {
|
|
118
|
+
const formattedVariant = formatVariantName(variantName);
|
|
119
|
+
const variantTypeName = `${modelKey}${formattedVariant}`;
|
|
120
|
+
const variantMetadata = [];
|
|
121
|
+
variantMetadata.push(` discriminant: "${union.discriminant}",`);
|
|
122
|
+
variantMetadata.push(` name: "${variantTypeName}",`);
|
|
123
|
+
output += `export interface ${modelName(variantTypeName)} extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\n`;
|
|
124
|
+
output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\n`;
|
|
125
|
+
output += ` __type: {} as ${variantTypeName},\n`;
|
|
126
|
+
output += ` zodSchema: ${schemaName(variantTypeName)},\n`;
|
|
127
|
+
output += ` [Metadata]: {\n${variantMetadata.join("\n")}\n },\n`;
|
|
128
|
+
output += `};\n\n`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Generate DocumentModel
|
|
134
|
+
const modelEntries = [];
|
|
135
|
+
for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {
|
|
136
|
+
if (modelDef.type === "record") {
|
|
137
|
+
modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
|
|
138
|
+
} else if (modelDef.type === "union") {
|
|
139
|
+
modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);
|
|
140
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
141
|
+
const formattedVariant = formatVariantName(variantName);
|
|
142
|
+
const variantTypeName = `${modelKey}${formattedVariant}`;
|
|
143
|
+
modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Build upgrades map (includes both record and union entries)
|
|
149
|
+
let upgradesBlock;
|
|
150
|
+
const allUpgradeNames = [...recordNames, ...unionNames];
|
|
151
|
+
if (chain.length > 1 && allUpgradeNames.length > 0) {
|
|
152
|
+
const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join("\n");
|
|
153
|
+
upgradesBlock = ` upgrades: {\n${upgradeEntries}\n },\n`;
|
|
154
|
+
} else {
|
|
155
|
+
upgradesBlock = "";
|
|
156
|
+
}
|
|
157
|
+
output += `export const DocumentModel = {\n`;
|
|
158
|
+
output += `${modelEntries.join(",\n")},\n`;
|
|
159
|
+
output += ` [Metadata]: {\n`;
|
|
160
|
+
output += ` version: ${latestVersion},\n`;
|
|
161
|
+
if (minVersion !== latestVersion) {
|
|
162
|
+
output += ` minSupportedVersion: ${minVersion},\n`;
|
|
163
|
+
}
|
|
164
|
+
output += upgradesBlock;
|
|
165
|
+
output += ` },\n`;
|
|
166
|
+
output += `} as const satisfies DocumentSchema;\n\n`;
|
|
167
|
+
output += `export type DocumentModel = typeof DocumentModel;\n`;
|
|
168
|
+
return {
|
|
169
|
+
modelsFile: output
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=generateModelMetadataFromSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateModelMetadataFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","findExternalRefType","resolveMinVersion","INTERNAL_UPGRADES_PATH","modelName","SCHEMA_REEXPORT_PATH","schemaName","TYPES_REEXPORT_PATH","extractExternalRefFieldTypes","record","refs","field","fields","refType","fieldType","push","key","generateModelMetadataFromChain","resolved","minSupportedVersion","chain","latestVersion","minVersion","latestIr","length","ir","output","recordNames","unionNames","variantNames","modelKey","modelDef","Object","entries","models","type","variantName","keys","union","variants","allModelNames","sort","modelTypesImports","join","schemaNames","map","n","upgradeNames","externalRefs","metadataFields","discriminant","formattedVariant","variantTypeName","variantMetadata","modelEntries","upgradesBlock","allUpgradeNames","upgradeEntries","modelsFile"],"sources":["generateModelMetadataFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { IRecordDef } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { findExternalRefType } from \"../ir/irFieldHelpers.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n INTERNAL_UPGRADES_PATH,\n modelName,\n SCHEMA_REEXPORT_PATH,\n schemaName,\n TYPES_REEXPORT_PATH,\n} from \"./runtimeSchema.js\";\n\nexport interface ModelMetadataOutput {\n /** models.ts content -- DocumentModel with version metadata and upgrade references */\n modelsFile: string;\n}\n\nfunction extractExternalRefFieldTypes(\n record: IRecordDef,\n): Array<[string, string]> {\n const refs: Array<[string, string]> = [];\n for (const field of record.fields) {\n const refType = findExternalRefType(field.fieldType);\n if (refType != null) {\n refs.push([field.key, refType]);\n }\n }\n return refs;\n}\n\n/**\n * Generate models.ts from an already-resolved versioned IR chain.\n */\nexport function generateModelMetadataFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): ModelMetadataOutput {\n const { chain } = resolved;\n const { latestVersion, minVersion } = resolveMinVersion(chain, minSupportedVersion);\n const latestIr = chain[chain.length - 1]!.ir;\n\n // --- Generate models.ts ---\n let output = GENERATED_FILE_HEADER;\n\n // Collect model names for imports\n const recordNames: string[] = [];\n const unionNames: string[] = [];\n const variantNames: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n recordNames.push(modelKey);\n } else if (modelDef.type === \"union\") {\n unionNames.push(modelKey);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n variantNames.push(`${modelKey}${formatVariantName(variantName)}`);\n }\n }\n }\n\n const allModelNames = [...recordNames, ...unionNames, ...variantNames].sort();\n\n // Imports\n const modelTypesImports: string[] = [\"DocumentSchema\"];\n if (recordNames.length > 0) modelTypesImports.push(\"RecordModel\");\n if (unionNames.length > 0) modelTypesImports.push(\"UnionModel\");\n\n output += `import type { ${\n modelTypesImports.sort().join(\", \")\n } } from \"@palantir/pack.document-schema.model-types\";\\n`;\n output += `import { Metadata } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n if (allModelNames.length > 0) {\n output += `import type { ${allModelNames.join(\", \")} } from \"${TYPES_REEXPORT_PATH}\";\\n`;\n }\n\n // Schema imports\n const schemaNames = allModelNames.map(n => schemaName(n));\n if (schemaNames.length > 0) {\n output += `import { ${schemaNames.join(\", \")} } from \"${SCHEMA_REEXPORT_PATH}\";\\n`;\n }\n\n // Upgrade imports (only if there are upgrades)\n const upgradeNames = [...recordNames, ...unionNames].map(n => `${n}Upgrades`);\n if (chain.length > 1 && upgradeNames.length > 0) {\n output += `import { ${upgradeNames.join(\", \")} } from \"${INTERNAL_UPGRADES_PATH}\";\\n`;\n }\n\n output += \"\\n\";\n\n // Generate model constants\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n const externalRefs = extractExternalRefFieldTypes(modelDef.record);\n const metadataFields: string[] = [];\n\n if (externalRefs.length > 0) {\n const entries = externalRefs.map(([field, type]) => ` ${field}: \"${type}\",`).join(\n \"\\n\",\n );\n metadataFields.push(` externalRefFieldTypes: {\\n${entries}\\n },`);\n }\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends RecordModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n } else if (modelDef.type === \"union\") {\n const union = modelDef.union;\n const metadataFields: string[] = [];\n metadataFields.push(` discriminant: \"${union.discriminant}\",`);\n metadataFields.push(` name: \"${modelKey}\",`);\n\n output += `export interface ${modelName(modelKey)} extends UnionModel<${modelKey}, typeof ${\n schemaName(modelKey)\n }> {}\\n`;\n output += `export const ${modelName(modelKey)}: ${modelName(modelKey)} = {\\n`;\n output += ` __type: {} as ${modelKey},\\n`;\n output += ` zodSchema: ${schemaName(modelKey)},\\n`;\n output += ` [Metadata]: {\\n${metadataFields.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n\n // Generate variant models\n for (const variantName of Object.keys(union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n const variantMetadata: string[] = [];\n variantMetadata.push(` discriminant: \"${union.discriminant}\",`);\n variantMetadata.push(` name: \"${variantTypeName}\",`);\n\n output += `export interface ${\n modelName(variantTypeName)\n } extends UnionModel<${variantTypeName}, typeof ${schemaName(variantTypeName)}> {}\\n`;\n output += `export const ${modelName(variantTypeName)}: ${modelName(variantTypeName)} = {\\n`;\n output += ` __type: {} as ${variantTypeName},\\n`;\n output += ` zodSchema: ${schemaName(variantTypeName)},\\n`;\n output += ` [Metadata]: {\\n${variantMetadata.join(\"\\n\")}\\n },\\n`;\n output += `};\\n\\n`;\n }\n }\n }\n\n // Generate DocumentModel\n const modelEntries: string[] = [];\n for (const [modelKey, modelDef] of Object.entries(latestIr.models)) {\n if (modelDef.type === \"record\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n } else if (modelDef.type === \"union\") {\n modelEntries.push(` ${modelKey}: ${modelName(modelKey)}`);\n for (const variantName of Object.keys(modelDef.union.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const variantTypeName = `${modelKey}${formattedVariant}`;\n modelEntries.push(` ${variantTypeName}: ${modelName(variantTypeName)}`);\n }\n }\n }\n\n // Build upgrades map (includes both record and union entries)\n let upgradesBlock: string;\n const allUpgradeNames = [...recordNames, ...unionNames];\n if (chain.length > 1 && allUpgradeNames.length > 0) {\n const upgradeEntries = allUpgradeNames.map(n => ` ${n}: ${n}Upgrades,`).join(\"\\n\");\n upgradesBlock = ` upgrades: {\\n${upgradeEntries}\\n },\\n`;\n } else {\n upgradesBlock = \"\";\n }\n\n output += `export const DocumentModel = {\\n`;\n output += `${modelEntries.join(\",\\n\")},\\n`;\n output += ` [Metadata]: {\\n`;\n output += ` version: ${latestVersion},\\n`;\n if (minVersion !== latestVersion) {\n output += ` minSupportedVersion: ${minVersion},\\n`;\n }\n output += upgradesBlock;\n output += ` },\\n`;\n output += `} as const satisfies DocumentSchema;\\n\\n`;\n output += `export type DocumentModel = typeof DocumentModel;\\n`;\n\n return { modelsFile: output };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
18
|
+
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
19
|
+
import { modelName, MODELS_PATH, typesFilePath, versionedTypeName, versionedWriteTypeName, writeTypesFilePath } from "./runtimeSchema.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Generate versionedDocRef.ts from a versioned schema chain.
|
|
23
|
+
*
|
|
24
|
+
* Produces:
|
|
25
|
+
* - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>
|
|
26
|
+
* - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2
|
|
27
|
+
*
|
|
28
|
+
* Every model gets a version-specific overload on every version so that
|
|
29
|
+
* write data is always typed to the exact version, not the latest.
|
|
30
|
+
*/
|
|
31
|
+
export function generateScopeFromChain(resolved, minSupportedVersion) {
|
|
32
|
+
const {
|
|
33
|
+
chain
|
|
34
|
+
} = resolved;
|
|
35
|
+
const {
|
|
36
|
+
minVersion
|
|
37
|
+
} = resolveMinVersion(chain, minSupportedVersion);
|
|
38
|
+
|
|
39
|
+
// Filter to supported versions
|
|
40
|
+
const supportedVersions = chain.filter(v => v.version >= minVersion);
|
|
41
|
+
|
|
42
|
+
// Collect all model names from the latest IR
|
|
43
|
+
const latestIr = chain[chain.length - 1].ir;
|
|
44
|
+
const allModelNames = [];
|
|
45
|
+
for (const modelKey of Object.keys(latestIr.models)) {
|
|
46
|
+
allModelNames.push(modelKey);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Build output
|
|
50
|
+
let output = GENERATED_FILE_HEADER;
|
|
51
|
+
|
|
52
|
+
// Import model-types
|
|
53
|
+
output += `import type { DocumentRef, RecordId, RecordRef } from "@palantir/pack.document-schema.model-types";\n`;
|
|
54
|
+
|
|
55
|
+
// Import model types from models.ts
|
|
56
|
+
const modelImports = allModelNames.map(n => modelName(n));
|
|
57
|
+
const typeImportsFromModels = ["DocumentModel", ...modelImports];
|
|
58
|
+
output += `import type { ${typeImportsFromModels.join(", ")} } from "${MODELS_PATH}";\n`;
|
|
59
|
+
|
|
60
|
+
// Import per-version types
|
|
61
|
+
for (const {
|
|
62
|
+
version,
|
|
63
|
+
ir
|
|
64
|
+
} of supportedVersions) {
|
|
65
|
+
const readTypeImports = [];
|
|
66
|
+
const writeTypeImports = [];
|
|
67
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
68
|
+
if (modelDef.type === "record") {
|
|
69
|
+
readTypeImports.push(versionedTypeName(modelKey, version));
|
|
70
|
+
writeTypeImports.push(versionedWriteTypeName(modelKey, version));
|
|
71
|
+
} else if (modelDef.type === "union") {
|
|
72
|
+
readTypeImports.push(versionedTypeName(modelKey, version));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (readTypeImports.length > 0) {
|
|
76
|
+
output += `import type { ${readTypeImports.sort().join(", ")} } from "${typesFilePath(version)}";\n`;
|
|
77
|
+
}
|
|
78
|
+
if (writeTypeImports.length > 0) {
|
|
79
|
+
output += `import type { ${writeTypeImports.sort().join(", ")} } from "${writeTypesFilePath(version)}";\n`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
output += "\n";
|
|
83
|
+
|
|
84
|
+
// Generate per-version VersionedDocRef interfaces extending DocumentRef.
|
|
85
|
+
for (const {
|
|
86
|
+
version,
|
|
87
|
+
ir
|
|
88
|
+
} of supportedVersions) {
|
|
89
|
+
output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\n`;
|
|
90
|
+
output += ` readonly version: ${version};\n`;
|
|
91
|
+
|
|
92
|
+
// updateRecord overloads — record models get write types, union models get Partial<read>
|
|
93
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
94
|
+
if (modelDef.type === "record") {
|
|
95
|
+
const writeType = versionedWriteTypeName(modelKey, version);
|
|
96
|
+
output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: ${writeType}): Promise<void>;\n`;
|
|
97
|
+
} else if (modelDef.type === "union") {
|
|
98
|
+
const readType = versionedTypeName(modelKey, version);
|
|
99
|
+
output += ` updateRecord(ref: RecordRef<typeof ${modelName(modelKey)}>, data: Partial<${readType}>): Promise<void>;\n`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// setCollectionRecord overloads
|
|
104
|
+
for (const [modelKey] of Object.entries(ir.models)) {
|
|
105
|
+
const readType = versionedTypeName(modelKey, version);
|
|
106
|
+
output += ` setCollectionRecord(model: typeof ${modelName(modelKey)}, id: RecordId, data: ${readType}): Promise<void>;\n`;
|
|
107
|
+
}
|
|
108
|
+
output += `}\n\n`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Union type
|
|
112
|
+
if (supportedVersions.length === 1) {
|
|
113
|
+
output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0].version};\n`;
|
|
114
|
+
} else {
|
|
115
|
+
const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(" | ");
|
|
116
|
+
output += `export type VersionedDocRef = ${unionMembers};\n`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// asVersioned — identity cast to unlock version-specific write overloads
|
|
120
|
+
output += `\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\n`;
|
|
121
|
+
output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\n`;
|
|
122
|
+
output += ` return docRef as VersionedDocRef;\n`;
|
|
123
|
+
output += `}\n`;
|
|
124
|
+
|
|
125
|
+
// matchVersion — exhaustive version handler
|
|
126
|
+
const handlerProps = supportedVersions.map(v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`).join("\n");
|
|
127
|
+
output += `\n/**\n`;
|
|
128
|
+
output += ` * Exhaustive version handler. TypeScript enforces that every supported\n`;
|
|
129
|
+
output += ` * version has a corresponding handler -- adding a new schema version\n`;
|
|
130
|
+
output += ` * produces a compile error at every call site until handled.\n`;
|
|
131
|
+
output += ` */\n`;
|
|
132
|
+
output += `export function matchVersion<R>(\n`;
|
|
133
|
+
output += ` doc: VersionedDocRef,\n`;
|
|
134
|
+
output += ` handlers: {\n`;
|
|
135
|
+
output += handlerProps + "\n";
|
|
136
|
+
output += ` },\n`;
|
|
137
|
+
output += `): R {\n`;
|
|
138
|
+
output += ` switch (doc.version) {\n`;
|
|
139
|
+
for (const {
|
|
140
|
+
version
|
|
141
|
+
} of supportedVersions) {
|
|
142
|
+
output += ` case ${version}:\n`;
|
|
143
|
+
output += ` return handlers[${version}](doc);\n`;
|
|
144
|
+
}
|
|
145
|
+
output += ` default:\n`;
|
|
146
|
+
output += ` throw new Error(\`Unexpected document version: \${(doc as any).version}\`);\n`;
|
|
147
|
+
output += ` }\n`;
|
|
148
|
+
output += `}\n`;
|
|
149
|
+
return output;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=generateScopeFromSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromChain","resolved","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestIr","length","ir","allModelNames","modelKey","Object","keys","models","push","output","modelImports","map","n","typeImportsFromModels","join","readTypeImports","writeTypeImports","modelDef","entries","type","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest IR\n const latestIr = chain[chain.length - 1]!.ir;\n const allModelNames: string[] = [];\n for (const modelKey of Object.keys(latestIr.models)) {\n allModelNames.push(modelKey);\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, RecordId, RecordRef } from \"@palantir/pack.document-schema.model-types\";\\n`;\n\n // Import model types from models.ts\n const modelImports = allModelNames.map(n => modelName(n));\n const typeImportsFromModels = [\"DocumentModel\", ...modelImports];\n output += `import type { ${typeImportsFromModels.join(\", \")} } from \"${MODELS_PATH}\";\\n`;\n\n // Import per-version types\n for (const { version, ir } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n writeTypeImports.push(versionedWriteTypeName(modelKey, version));\n } else if (modelDef.type === \"union\") {\n readTypeImports.push(versionedTypeName(modelKey, version));\n }\n }\n\n if (readTypeImports.length > 0) {\n output += `import type { ${readTypeImports.sort().join(\", \")} } from \"${\n typesFilePath(version)\n }\";\\n`;\n }\n if (writeTypeImports.length > 0) {\n output += `import type { ${writeTypeImports.sort().join(\", \")} } from \"${\n writeTypesFilePath(version)\n }\";\\n`;\n }\n }\n\n output += \"\\n\";\n\n // Generate per-version VersionedDocRef interfaces extending DocumentRef.\n for (const { version, ir } of supportedVersions) {\n output += `export interface VersionedDocRef_v${version} extends DocumentRef<DocumentModel> {\\n`;\n output += ` readonly version: ${version};\\n`;\n\n // updateRecord overloads — record models get write types, union models get Partial<read>\n for (const [modelKey, modelDef] of Object.entries(ir.models)) {\n if (modelDef.type === \"record\") {\n const writeType = versionedWriteTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (modelDef.type === \"union\") {\n const readType = versionedTypeName(modelKey, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(modelKey)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setCollectionRecord overloads\n for (const [modelKey] of Object.entries(ir.models)) {\n const readType = versionedTypeName(modelKey, version);\n output += ` setCollectionRecord(model: typeof ${\n modelName(modelKey)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,26 +14,17 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { TypeKind as SchemaTypeKind } from "@palantir/pack.schema";
|
|
17
18
|
import { formatVariantName } from "../formatVariantName.js";
|
|
18
19
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const TypeKind = {
|
|
21
|
+
...SchemaTypeKind,
|
|
22
|
+
ANY: "any"
|
|
23
|
+
};
|
|
21
24
|
const SchemaDefKind = {
|
|
22
25
|
RECORD: "record",
|
|
23
26
|
UNION: "union"
|
|
24
27
|
};
|
|
25
|
-
const TypeKind = {
|
|
26
|
-
ANY: "any",
|
|
27
|
-
ARRAY: "array",
|
|
28
|
-
DOC_REF: "docRef",
|
|
29
|
-
DOUBLE: "double",
|
|
30
|
-
MEDIA_REF: "mediaRef",
|
|
31
|
-
OBJECT_REF: "objectRef",
|
|
32
|
-
OPTIONAL: "optional",
|
|
33
|
-
REF: "ref",
|
|
34
|
-
STRING: "string",
|
|
35
|
-
USER_REF: "userRef"
|
|
36
|
-
};
|
|
37
28
|
|
|
38
29
|
// Base type definition for schema fields
|
|
39
30
|
|
|
@@ -201,10 +192,10 @@ function convertTypeToTypeScript(fieldType, schema) {
|
|
|
201
192
|
case TypeKind.ANY:
|
|
202
193
|
return "any";
|
|
203
194
|
case TypeKind.ARRAY:
|
|
204
|
-
if (isArrayField(fieldType)) {
|
|
205
|
-
|
|
195
|
+
if (!isArrayField(fieldType)) {
|
|
196
|
+
throw new Error("Array field is missing items type");
|
|
206
197
|
}
|
|
207
|
-
return
|
|
198
|
+
return `readonly ${convertTypeToTypeScript(fieldType.items, schema)}[]`;
|
|
208
199
|
case TypeKind.DOC_REF:
|
|
209
200
|
return "DocumentRef";
|
|
210
201
|
case TypeKind.DOUBLE:
|
|
@@ -214,24 +205,27 @@ function convertTypeToTypeScript(fieldType, schema) {
|
|
|
214
205
|
case TypeKind.OBJECT_REF:
|
|
215
206
|
return "ObjectRef";
|
|
216
207
|
case TypeKind.OPTIONAL:
|
|
217
|
-
if (isOptionalField(fieldType)) {
|
|
218
|
-
|
|
208
|
+
if (!isOptionalField(fieldType)) {
|
|
209
|
+
throw new Error("Optional field is missing inner type");
|
|
219
210
|
}
|
|
220
|
-
return
|
|
211
|
+
return convertTypeToTypeScript(fieldType.item, schema);
|
|
221
212
|
case TypeKind.REF:
|
|
222
|
-
if (isRefField(fieldType)
|
|
213
|
+
if (!isRefField(fieldType)) {
|
|
214
|
+
throw new Error("Ref field is missing name or refType");
|
|
215
|
+
}
|
|
216
|
+
if (fieldType.refType === "record") {
|
|
223
217
|
const exportName = schema ? findRecordExportName(fieldType.name, schema) : null;
|
|
224
|
-
return exportName
|
|
225
|
-
} else if (isRefField(fieldType) && fieldType.refType === "union") {
|
|
226
|
-
return isRefField(fieldType) ? fieldType.name : "unknown";
|
|
218
|
+
return exportName ?? fieldType.name;
|
|
227
219
|
}
|
|
228
|
-
return
|
|
220
|
+
return fieldType.name;
|
|
229
221
|
case TypeKind.STRING:
|
|
230
222
|
return "string";
|
|
231
223
|
case TypeKind.USER_REF:
|
|
232
224
|
return "UserRef";
|
|
233
225
|
default:
|
|
234
|
-
|
|
226
|
+
{
|
|
227
|
+
throw new Error(`Unknown schema field type: ${fieldType.type}`);
|
|
228
|
+
}
|
|
235
229
|
}
|
|
236
230
|
}
|
|
237
231
|
//# sourceMappingURL=generateTypesFromSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","SchemaDefKind","RECORD","UNION","TypeKind","ANY","ARRAY","DOC_REF","DOUBLE","MEDIA_REF","OBJECT_REF","OPTIONAL","REF","STRING","USER_REF","isRecordSchema","item","type","isUnionSchema","isRefField","field","isArrayField","isOptionalField","detectUsedRefTypes","schema","refTypes","Set","scanField","items","add","Object","values","fields","variant","variants","generateTypesFromSchema","runtimeSchema","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","generateRecordInterface","unionEntries","filter","_","forEach","i","unionOutput","generateUnionType","length","record","docs","fieldName","fieldType","tsType","convertTypeToTypeScript","optional","union","variantInterfaces","discriminantField","discriminant","variantName","variantType","interfaceName","push","name","discriminatorValue","refType","recordName","findRecordExportName","map","v"],"sources":["generateTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ReturnedSchema, Schema } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\n\n// Define schema types for internal use\nconst SchemaDefKind = {\n RECORD: \"record\",\n UNION: \"union\",\n} as const;\n\nconst TypeKind = {\n ANY: \"any\",\n ARRAY: \"array\",\n DOC_REF: \"docRef\",\n DOUBLE: \"double\",\n MEDIA_REF: \"mediaRef\",\n OBJECT_REF: \"objectRef\",\n OPTIONAL: \"optional\",\n REF: \"ref\",\n STRING: \"string\",\n USER_REF: \"userRef\",\n} as const;\n\n// Base type definition for schema fields\ninterface BaseSchemaField {\n readonly type: string;\n}\n\ninterface AnyField extends BaseSchemaField {\n readonly type: typeof TypeKind.ANY;\n}\n\ninterface ArrayField extends BaseSchemaField {\n readonly type: typeof TypeKind.ARRAY;\n readonly items: SchemaField;\n}\n\ninterface DocRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOC_REF;\n}\n\ninterface DoubleField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOUBLE;\n}\n\ninterface MediaRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.MEDIA_REF;\n}\n\ninterface ObjectRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.OBJECT_REF;\n}\n\ninterface OptionalField extends BaseSchemaField {\n readonly type: typeof TypeKind.OPTIONAL;\n readonly item: SchemaField;\n}\n\ninterface RefField extends BaseSchemaField {\n readonly type: typeof TypeKind.REF;\n readonly refType: \"record\" | \"union\";\n readonly name: string;\n}\n\ninterface StringField extends BaseSchemaField {\n readonly type: typeof TypeKind.STRING;\n}\n\ninterface UserRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.USER_REF;\n}\n\ntype SchemaField =\n | AnyField\n | ArrayField\n | DocRefField\n | DoubleField\n | MediaRefField\n | ObjectRefField\n | OptionalField\n | RefField\n | StringField\n | UserRefField;\n\ninterface RuntimeSchemaRecord {\n readonly type: typeof SchemaDefKind.RECORD;\n readonly name: string;\n readonly docs?: string;\n readonly fields: Readonly<Record<string, SchemaField>>;\n readonly ref?: RefField & {\n readonly refType: \"record\";\n };\n}\n\ninterface RuntimeSchemaUnion {\n readonly type: typeof SchemaDefKind.UNION;\n readonly name?: string;\n readonly variants: Readonly<Record<string, SchemaField>>;\n readonly discriminant: string;\n readonly ref?: RefField & {\n readonly refType: \"union\";\n };\n}\n\ntype RuntimeSchemaItem = RuntimeSchemaRecord | RuntimeSchemaUnion;\ntype RuntimeSchema = Record<string, RuntimeSchemaItem>;\n\n// Type guards\nfunction isRecordSchema(item: RuntimeSchemaItem): item is RuntimeSchemaRecord {\n return item.type === SchemaDefKind.RECORD && \"name\" in item && \"fields\" in item;\n}\n\nfunction isUnionSchema(item: RuntimeSchemaItem): item is RuntimeSchemaUnion {\n return item.type === SchemaDefKind.UNION && \"variants\" in item && \"discriminant\" in item;\n}\n\nfunction isRefField(field: SchemaField): field is RefField {\n return field.type === TypeKind.REF && \"refType\" in field && \"name\" in field;\n}\n\nfunction isArrayField(field: SchemaField): field is ArrayField {\n return field.type === TypeKind.ARRAY && \"items\" in field;\n}\n\nfunction isOptionalField(field: SchemaField): field is OptionalField {\n return field.type === TypeKind.OPTIONAL && \"item\" in field;\n}\n\nfunction detectUsedRefTypes(schema: RuntimeSchema): Set<string> {\n const refTypes = new Set<string>();\n\n function scanField(field: SchemaField): void {\n switch (field.type) {\n case TypeKind.ARRAY:\n if (isArrayField(field)) {\n scanField(field.items);\n }\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentRef\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaRef\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectRef\");\n break;\n case TypeKind.OPTIONAL:\n if (isOptionalField(field)) {\n scanField(field.item);\n }\n break;\n case TypeKind.USER_REF:\n refTypes.add(\"UserRef\");\n break;\n }\n }\n\n for (const item of Object.values(schema)) {\n if (isRecordSchema(item)) {\n for (const field of Object.values(item.fields)) {\n scanField(field);\n }\n } else if (isUnionSchema(item)) {\n for (const variant of Object.values(item.variants)) {\n scanField(variant);\n }\n }\n }\n\n return refTypes;\n}\n\nexport function generateTypesFromSchema<T extends ReturnedSchema>(\n schema: Schema<T>,\n): string {\n const runtimeSchema = schema as unknown as RuntimeSchema;\n\n // Detect which ref types are used in the schema\n const usedRefTypes = detectUsedRefTypes(runtimeSchema);\n\n let output = GENERATED_FILE_HEADER;\n\n // Add conditional imports based on which ref types are used\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 // First pass: generate record interfaces\n for (const [exportName, item] of Object.entries(runtimeSchema)) {\n if (item.type === SchemaDefKind.RECORD && isRecordSchema(item)) {\n output += generateRecordInterface(item, exportName, runtimeSchema);\n output += \"\\n\";\n }\n }\n\n // Second pass: generate union types\n const unionEntries = Object.entries(runtimeSchema).filter(\n ([_, item]) => item.type === SchemaDefKind.UNION && isUnionSchema(item),\n );\n\n unionEntries.forEach(([exportName, item], i) => {\n if (isUnionSchema(item)) {\n const unionOutput = generateUnionType(item, exportName, runtimeSchema);\n if (unionOutput) {\n output += unionOutput;\n // Only add newline if not the last union\n if (i < unionEntries.length - 1) {\n output += \"\\n\";\n }\n }\n }\n });\n\n return output;\n}\n\nfunction generateRecordInterface(\n record: RuntimeSchemaRecord,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n\n if (record.docs) {\n output += `/**\\n * ${record.docs}\\n */\\n`;\n }\n\n output += `export interface ${exportName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\";\n\n return output;\n}\n\nfunction generateUnionType(\n union: RuntimeSchemaUnion,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n const discriminantField = union.discriminant;\n\n // First pass: generate variant interfaces\n for (const [variantName, variantType] of Object.entries(union.variants)) {\n const interfaceName = `${exportName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n // Find the corresponding record name in the schema\n const recordName = findRecordExportName(variantType.name, schema);\n if (recordName) {\n output += `export interface ${interfaceName} extends ${recordName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n }\n } else {\n // Handle value types\n const tsType = convertTypeToTypeScript(variantType, schema);\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 // Second pass: generate the union type\n output += `export type ${exportName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // Third pass: generate type guards\n for (let i = 0; i < variantInterfaces.length; i++) {\n const variant = variantInterfaces[i]!;\n output +=\n `export function is${variant.name}(value: ${exportName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\nfunction findRecordExportName(\n recordName: string,\n schema: RuntimeSchema,\n): string | null {\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item) && item.name === recordName) {\n return exportName;\n }\n }\n return null;\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (isArrayField(fieldType)) {\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema)}[]`;\n }\n return \"readonly unknown[]\";\n case TypeKind.DOC_REF:\n return \"DocumentRef\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaRef\";\n case TypeKind.OBJECT_REF:\n return \"ObjectRef\";\n case TypeKind.OPTIONAL:\n if (isOptionalField(fieldType)) {\n return convertTypeToTypeScript(fieldType.item, schema);\n }\n return \"unknown\";\n case TypeKind.REF:\n if (isRefField(fieldType) && fieldType.refType === \"record\") {\n const exportName = schema ? findRecordExportName(fieldType.name, schema) : null;\n return exportName || (isRefField(fieldType) ? fieldType.name : \"unknown\");\n } else if (isRefField(fieldType) && fieldType.refType === \"union\") {\n return isRefField(fieldType) ? fieldType.name : \"unknown\";\n }\n return \"unknown\";\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default:\n fieldType satisfies never;\n return \"unknown\";\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateTypesFromSchema.js","names":["TypeKind","SchemaTypeKind","formatVariantName","GENERATED_FILE_HEADER","ANY","SchemaDefKind","RECORD","UNION","isRecordSchema","item","type","isUnionSchema","isRefField","field","REF","isArrayField","ARRAY","isOptionalField","OPTIONAL","detectUsedRefTypes","schema","refTypes","Set","scanField","items","DOC_REF","add","MEDIA_REF","OBJECT_REF","USER_REF","Object","values","fields","variant","variants","generateTypesFromSchema","runtimeSchema","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","generateRecordInterface","unionEntries","filter","_","forEach","i","unionOutput","generateUnionType","length","record","docs","fieldName","fieldType","tsType","convertTypeToTypeScript","optional","union","variantInterfaces","discriminantField","discriminant","variantName","variantType","interfaceName","push","name","discriminatorValue","refType","recordName","findRecordExportName","map","v","Error","DOUBLE","STRING"],"sources":["generateTypesFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ReturnedSchema, Schema } from \"@palantir/pack.schema\";\nimport { TypeKind as SchemaTypeKind } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\n\nconst TypeKind: typeof SchemaTypeKind & { readonly ANY: \"any\" } = {\n ...SchemaTypeKind,\n ANY: \"any\",\n};\n\nconst SchemaDefKind = {\n RECORD: \"record\",\n UNION: \"union\",\n} as const;\n\n// Base type definition for schema fields\ninterface BaseSchemaField {\n readonly type: string;\n}\n\ninterface AnyField extends BaseSchemaField {\n readonly type: typeof TypeKind.ANY;\n}\n\ninterface ArrayField extends BaseSchemaField {\n readonly type: typeof TypeKind.ARRAY;\n readonly items: SchemaField;\n}\n\ninterface DocRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOC_REF;\n}\n\ninterface DoubleField extends BaseSchemaField {\n readonly type: typeof TypeKind.DOUBLE;\n}\n\ninterface MediaRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.MEDIA_REF;\n}\n\ninterface ObjectRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.OBJECT_REF;\n}\n\ninterface OptionalField extends BaseSchemaField {\n readonly type: typeof TypeKind.OPTIONAL;\n readonly item: SchemaField;\n}\n\ninterface RefField extends BaseSchemaField {\n readonly type: typeof TypeKind.REF;\n readonly refType: \"record\" | \"union\";\n readonly name: string;\n}\n\ninterface StringField extends BaseSchemaField {\n readonly type: typeof TypeKind.STRING;\n}\n\ninterface UserRefField extends BaseSchemaField {\n readonly type: typeof TypeKind.USER_REF;\n}\n\ntype SchemaField =\n | AnyField\n | ArrayField\n | DocRefField\n | DoubleField\n | MediaRefField\n | ObjectRefField\n | OptionalField\n | RefField\n | StringField\n | UserRefField;\n\ninterface RuntimeSchemaRecord {\n readonly type: typeof SchemaDefKind.RECORD;\n readonly name: string;\n readonly docs?: string;\n readonly fields: Readonly<Record<string, SchemaField>>;\n readonly ref?: RefField & {\n readonly refType: \"record\";\n };\n}\n\ninterface RuntimeSchemaUnion {\n readonly type: typeof SchemaDefKind.UNION;\n readonly name?: string;\n readonly variants: Readonly<Record<string, SchemaField>>;\n readonly discriminant: string;\n readonly ref?: RefField & {\n readonly refType: \"union\";\n };\n}\n\ntype RuntimeSchemaItem = RuntimeSchemaRecord | RuntimeSchemaUnion;\ntype RuntimeSchema = Record<string, RuntimeSchemaItem>;\n\n// Type guards\nfunction isRecordSchema(item: RuntimeSchemaItem): item is RuntimeSchemaRecord {\n return item.type === SchemaDefKind.RECORD && \"name\" in item && \"fields\" in item;\n}\n\nfunction isUnionSchema(item: RuntimeSchemaItem): item is RuntimeSchemaUnion {\n return item.type === SchemaDefKind.UNION && \"variants\" in item && \"discriminant\" in item;\n}\n\nfunction isRefField(field: SchemaField): field is RefField {\n return field.type === TypeKind.REF && \"refType\" in field && \"name\" in field;\n}\n\nfunction isArrayField(field: SchemaField): field is ArrayField {\n return field.type === TypeKind.ARRAY && \"items\" in field;\n}\n\nfunction isOptionalField(field: SchemaField): field is OptionalField {\n return field.type === TypeKind.OPTIONAL && \"item\" in field;\n}\n\nfunction detectUsedRefTypes(schema: RuntimeSchema): Set<string> {\n const refTypes = new Set<string>();\n\n function scanField(field: SchemaField): void {\n switch (field.type) {\n case TypeKind.ARRAY:\n if (isArrayField(field)) {\n scanField(field.items);\n }\n break;\n case TypeKind.DOC_REF:\n refTypes.add(\"DocumentRef\");\n break;\n case TypeKind.MEDIA_REF:\n refTypes.add(\"MediaRef\");\n break;\n case TypeKind.OBJECT_REF:\n refTypes.add(\"ObjectRef\");\n break;\n case TypeKind.OPTIONAL:\n if (isOptionalField(field)) {\n scanField(field.item);\n }\n break;\n case TypeKind.USER_REF:\n refTypes.add(\"UserRef\");\n break;\n }\n }\n\n for (const item of Object.values(schema)) {\n if (isRecordSchema(item)) {\n for (const field of Object.values(item.fields)) {\n scanField(field);\n }\n } else if (isUnionSchema(item)) {\n for (const variant of Object.values(item.variants)) {\n scanField(variant);\n }\n }\n }\n\n return refTypes;\n}\n\nexport function generateTypesFromSchema<T extends ReturnedSchema>(\n schema: Schema<T>,\n): string {\n const runtimeSchema = schema as unknown as RuntimeSchema;\n\n // Detect which ref types are used in the schema\n const usedRefTypes = detectUsedRefTypes(runtimeSchema);\n\n let output = GENERATED_FILE_HEADER;\n\n // Add conditional imports based on which ref types are used\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 // First pass: generate record interfaces\n for (const [exportName, item] of Object.entries(runtimeSchema)) {\n if (item.type === SchemaDefKind.RECORD && isRecordSchema(item)) {\n output += generateRecordInterface(item, exportName, runtimeSchema);\n output += \"\\n\";\n }\n }\n\n // Second pass: generate union types\n const unionEntries = Object.entries(runtimeSchema).filter(\n ([_, item]) => item.type === SchemaDefKind.UNION && isUnionSchema(item),\n );\n\n unionEntries.forEach(([exportName, item], i) => {\n if (isUnionSchema(item)) {\n const unionOutput = generateUnionType(item, exportName, runtimeSchema);\n if (unionOutput) {\n output += unionOutput;\n // Only add newline if not the last union\n if (i < unionEntries.length - 1) {\n output += \"\\n\";\n }\n }\n }\n });\n\n return output;\n}\n\nfunction generateRecordInterface(\n record: RuntimeSchemaRecord,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n\n if (record.docs) {\n output += `/**\\n * ${record.docs}\\n */\\n`;\n }\n\n output += `export interface ${exportName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(record.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\";\n\n return output;\n}\n\nfunction generateUnionType(\n union: RuntimeSchemaUnion,\n exportName: string,\n schema: RuntimeSchema,\n): string {\n let output = \"\";\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n const discriminantField = union.discriminant;\n\n // First pass: generate variant interfaces\n for (const [variantName, variantType] of Object.entries(union.variants)) {\n const interfaceName = `${exportName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n // Find the corresponding record name in the schema\n const recordName = findRecordExportName(variantType.name, schema);\n if (recordName) {\n output += `export interface ${interfaceName} extends ${recordName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n }\n } else {\n // Handle value types\n const tsType = convertTypeToTypeScript(variantType, schema);\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 // Second pass: generate the union type\n output += `export type ${exportName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\n\\n`;\n\n // Third pass: generate type guards\n for (let i = 0; i < variantInterfaces.length; i++) {\n const variant = variantInterfaces[i]!;\n output +=\n `export function is${variant.name}(value: ${exportName}): value is ${variant.name} {\\n`;\n output += ` return value.${discriminantField} === \"${variant.discriminatorValue}\";\\n`;\n output += \"}\\n\\n\";\n }\n\n return output;\n}\n\nfunction findRecordExportName(\n recordName: string,\n schema: RuntimeSchema,\n): string | null {\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item) && item.name === recordName) {\n return exportName;\n }\n }\n return null;\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (!isArrayField(fieldType)) {\n throw new Error(\"Array field is missing items type\");\n }\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema)}[]`;\n case TypeKind.DOC_REF:\n return \"DocumentRef\";\n case TypeKind.DOUBLE:\n return \"number\";\n case TypeKind.MEDIA_REF:\n return \"MediaRef\";\n case TypeKind.OBJECT_REF:\n return \"ObjectRef\";\n case TypeKind.OPTIONAL:\n if (!isOptionalField(fieldType)) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return convertTypeToTypeScript(fieldType.item, schema);\n case TypeKind.REF:\n if (!isRefField(fieldType)) {\n throw new Error(\"Ref field is missing name or refType\");\n }\n if (fieldType.refType === \"record\") {\n const exportName = schema ? findRecordExportName(fieldType.name, schema) : null;\n return exportName ?? fieldType.name;\n }\n return fieldType.name;\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default: {\n const _exhaustive: never = fieldType;\n throw new Error(`Unknown schema field type: ${(_exhaustive as SchemaField).type}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|