@palantir/pack.document-schema.type-gen 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/assetUpdateSchemaHandler.js +84 -0
- package/build/esm/commands/asset/assetUpdateSchemaHandler.js.map +1 -0
- package/build/esm/commands/asset/registerAssetCommands.js +3 -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 -2
- 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 +0 -6
- package/build/esm/index.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 +23 -0
- package/build/esm/utils/ir/__tests__/convertIrToWireSchema.test.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.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/three-version-chain.js.map +1 -1
- package/build/esm/utils/schema/__tests__/__snapshots__/generateVersionsFromSchema/two-version.js.map +1 -1
- package/build/esm/utils/schema/__tests__/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 +78 -13
- package/build/esm/utils/schema/__tests__/fixtures.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js +19 -7
- package/build/esm/utils/schema/__tests__/generateInternalFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js +12 -7
- package/build/esm/utils/schema/__tests__/generateModelMetadataFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js +6 -5
- package/build/esm/utils/schema/__tests__/generateScopeFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js +19 -10
- package/build/esm/utils/schema/__tests__/generateVersionedTypesFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js +15 -10
- package/build/esm/utils/schema/__tests__/generateVersionedZodFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js +6 -5
- package/build/esm/utils/schema/__tests__/generateVersionsFromSchema.test.js.map +1 -1
- package/build/esm/utils/schema/__tests__/snapshotUtils.js +3 -0
- package/build/esm/utils/schema/__tests__/snapshotUtils.js.map +1 -1
- 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 +21 -14
- package/build/esm/utils/schema/generateIndexFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateInternalFromSchema.js +202 -191
- package/build/esm/utils/schema/generateInternalFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js +89 -80
- package/build/esm/utils/schema/generateModelMetadataFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateScopeFromSchema.js +29 -33
- package/build/esm/utils/schema/generateScopeFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateTypesFromSchema.js +9 -1
- package/build/esm/utils/schema/generateTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js +61 -155
- package/build/esm/utils/schema/generateVersionedTypesFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js +58 -94
- package/build/esm/utils/schema/generateVersionedZodFromSchema.js.map +1 -1
- package/build/esm/utils/schema/generateVersionsFromSchema.js +7 -5
- package/build/esm/utils/schema/generateVersionsFromSchema.js.map +1 -1
- 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 +68 -9
- package/build/esm/utils/schema/resolveSchemaChain.js.map +1 -1
- package/build/esm/utils/schema/runtimeSchema.js +3 -27
- package/build/esm/utils/schema/runtimeSchema.js.map +1 -1
- package/build/esm/utils/schema/writeAllSdkFiles.js +113 -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 +43 -35
- 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/assetUpdateSchemaHandler.d.ts +12 -0
- package/build/types/commands/asset/assetUpdateSchemaHandler.d.ts.map +1 -0
- 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 -6
- package/build/types/index.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 +10 -1
- package/build/types/utils/schema/__tests__/fixtures.d.ts.map +1 -1
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts +2 -0
- package/build/types/utils/schema/__tests__/snapshotUtils.d.ts.map +1 -1
- package/build/types/utils/schema/convertSchemaToSteps.d.ts.map +1 -1
- package/build/types/utils/schema/generateIndexFromSchema.d.ts +5 -3
- package/build/types/utils/schema/generateIndexFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateInternalFromSchema.d.ts +6 -7
- package/build/types/utils/schema/generateInternalFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts +3 -8
- package/build/types/utils/schema/generateModelMetadataFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateScopeFromSchema.d.ts +2 -2
- package/build/types/utils/schema/generateScopeFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts +4 -7
- package/build/types/utils/schema/generateVersionedTypesFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts +3 -7
- package/build/types/utils/schema/generateVersionedZodFromSchema.d.ts.map +1 -1
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts +3 -3
- package/build/types/utils/schema/generateVersionsFromSchema.d.ts.map +1 -1
- 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 +29 -8
- package/build/types/utils/schema/resolveSchemaChain.d.ts.map +1 -1
- package/build/types/utils/schema/runtimeSchema.d.ts +2 -32
- package/build/types/utils/schema/runtimeSchema.d.ts.map +1 -1
- 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 +4 -4
- package/build/esm/commands/schema/schemaGenTypesHandler.js +0 -147
- package/build/esm/commands/schema/schemaGenTypesHandler.js.map +0 -1
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts +0 -8
- package/build/types/commands/schema/schemaGenTypesHandler.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveSchemaChain","isRecordSchema","isUnionSchema","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromSchema","schema","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestSchema","length","allModelNames","exportName","item","Object","entries","push","output","modelImports","map","n","typeImportsFromModels","join","versionSchema","readTypeImports","writeTypeImports","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 type { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport {\n isRecordSchema,\n isUnionSchema,\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 generateScopeFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): string {\n const { chain, minVersion } = resolveSchemaChain(schema, 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 schema\n const latestSchema = chain[chain.length - 1]!.schema;\n const allModelNames: string[] = [];\n for (const [exportName, item] of Object.entries(latestSchema)) {\n if (isRecordSchema(item) || isUnionSchema(item)) {\n allModelNames.push(exportName);\n }\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, schema: versionSchema } of supportedVersions) {\n const readTypeImports: string[] = [];\n const writeTypeImports: string[] = [];\n\n for (const [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item)) {\n readTypeImports.push(versionedTypeName(exportName, version));\n writeTypeImports.push(versionedWriteTypeName(exportName, version));\n } else if (isUnionSchema(item)) {\n readTypeImports.push(versionedTypeName(exportName, 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 // 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 for (const { version, schema: versionSchema } 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 [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item)) {\n const writeType = versionedWriteTypeName(exportName, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(exportName)\n }>, data: ${writeType}): Promise<void>;\\n`;\n } else if (isUnionSchema(item)) {\n const readType = versionedTypeName(exportName, version);\n output += ` updateRecord(ref: RecordRef<typeof ${\n modelName(exportName)\n }>, data: Partial<${readType}>): Promise<void>;\\n`;\n }\n }\n\n // setCollectionRecord overloads\n for (const [exportName, item] of Object.entries(versionSchema)) {\n if (isRecordSchema(item) || isUnionSchema(item)) {\n const readType = versionedTypeName(exportName, version);\n output += ` setCollectionRecord(model: typeof ${\n modelName(exportName)\n }, id: RecordId, data: ${readType}): Promise<void>;\\n`;\n }\n }\n\n output += `}\\n\\n`;\n }\n\n // Union type\n if (supportedVersions.length === 1) {\n output += `export type VersionedDocRef = VersionedDocRef_v${supportedVersions[0]!.version};\\n`;\n } else {\n const unionMembers = supportedVersions.map(v => `VersionedDocRef_v${v.version}`).join(\" | \");\n output += `export type VersionedDocRef = ${unionMembers};\\n`;\n }\n\n // asVersioned — identity cast to unlock version-specific write overloads\n output += `\\n/** Narrow a DocumentRef to a version-discriminated type for type-safe writes. */\\n`;\n output += `export function asVersioned(docRef: DocumentRef<DocumentModel>): VersionedDocRef {\\n`;\n output += ` return docRef as VersionedDocRef;\\n`;\n output += `}\\n`;\n\n // matchVersion — exhaustive version handler\n const handlerProps = supportedVersions.map(\n v => ` readonly ${v.version}: (doc: VersionedDocRef_v${v.version}) => R;`,\n ).join(\"\\n\");\n\n output += `\\n/**\\n`;\n output += ` * Exhaustive version handler. TypeScript enforces that every supported\\n`;\n output += ` * version has a corresponding handler -- adding a new schema version\\n`;\n output += ` * produces a compile error at every call site until handled.\\n`;\n output += ` */\\n`;\n output += `export function matchVersion<R>(\\n`;\n output += ` doc: VersionedDocRef,\\n`;\n output += ` handlers: {\\n`;\n output += handlerProps + \"\\n\";\n output += ` },\\n`;\n output += `): R {\\n`;\n output += ` switch (doc.version) {\\n`;\n for (const { version } of supportedVersions) {\n output += ` case ${version}:\\n`;\n output += ` return handlers[${version}](doc);\\n`;\n }\n output += ` default:\\n`;\n output += ` throw new Error(\\`Unexpected document version: \\${(doc as any).version}\\`);\\n`;\n output += ` }\\n`;\n output += `}\\n`;\n\n return output;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateScopeFromSchema.js","names":["GENERATED_FILE_HEADER","resolveMinVersion","modelName","MODELS_PATH","typesFilePath","versionedTypeName","versionedWriteTypeName","writeTypesFilePath","generateScopeFromChain","resolved","minSupportedVersion","chain","minVersion","supportedVersions","filter","v","version","latestIr","length","ir","allModelNames","modelKey","Object","keys","models","push","output","modelImports","map","n","typeImportsFromModels","join","readTypeImports","writeTypeImports","modelDef","entries","type","sort","writeType","readType","unionMembers","handlerProps"],"sources":["generateScopeFromSchema.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { ResolvedIrChain } from \"./resolveSchemaChain.js\";\nimport { resolveMinVersion } from \"./resolveSchemaChain.js\";\nimport {\n modelName,\n MODELS_PATH,\n typesFilePath,\n versionedTypeName,\n versionedWriteTypeName,\n writeTypesFilePath,\n} from \"./runtimeSchema.js\";\n\n/**\n * Generate versionedDocRef.ts from a versioned schema chain.\n *\n * Produces:\n * - Per-version VersionedDocRef_vN interfaces extending DocumentRef<DocumentModel>\n * - Union type VersionedDocRef = VersionedDocRef_v1 | VersionedDocRef_v2\n *\n * Every model gets a version-specific overload on every version so that\n * write data is always typed to the exact version, not the latest.\n */\nexport function generateScopeFromChain(\n resolved: ResolvedIrChain,\n minSupportedVersion?: number,\n): string {\n const { chain } = resolved;\n const { minVersion } = resolveMinVersion(chain, minSupportedVersion);\n\n // Filter to supported versions\n const supportedVersions = chain.filter(v => v.version >= minVersion);\n\n // Collect all model names from the latest IR\n const latestIr = chain[chain.length - 1]!.ir;\n const allModelNames: string[] = [];\n for (const modelKey of Object.keys(latestIr.models)) {\n allModelNames.push(modelKey);\n }\n\n // Build output\n let output = GENERATED_FILE_HEADER;\n\n // Import model-types\n output +=\n `import type { DocumentRef, 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,9 +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
|
+
const TypeKind = {
|
|
21
|
+
...SchemaTypeKind,
|
|
22
|
+
ANY: "any"
|
|
23
|
+
};
|
|
24
|
+
const SchemaDefKind = {
|
|
25
|
+
RECORD: "record",
|
|
26
|
+
UNION: "union"
|
|
27
|
+
};
|
|
20
28
|
|
|
21
29
|
// Base type definition for schema fields
|
|
22
30
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","SchemaDefKind","TypeKind","isRecordSchema","item","type","RECORD","isUnionSchema","UNION","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","ANY","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 { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport { SchemaDefKind, TypeKind } from \"./runtimeSchema.js\";\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":[]}
|
|
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":[]}
|
|
@@ -16,110 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
import { formatVariantName } from "../formatVariantName.js";
|
|
18
18
|
import { GENERATED_FILE_HEADER } from "../generatedFileHeader.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
const refTypes = new Set();
|
|
23
|
-
function scanField(field) {
|
|
24
|
-
switch (field.type) {
|
|
25
|
-
case TypeKind.ARRAY:
|
|
26
|
-
if (field.items) scanField(field.items);
|
|
27
|
-
break;
|
|
28
|
-
case TypeKind.DOC_REF:
|
|
29
|
-
refTypes.add("DocumentRef");
|
|
30
|
-
break;
|
|
31
|
-
case TypeKind.MEDIA_REF:
|
|
32
|
-
refTypes.add("MediaRef");
|
|
33
|
-
break;
|
|
34
|
-
case TypeKind.OBJECT_REF:
|
|
35
|
-
refTypes.add("ObjectRef");
|
|
36
|
-
break;
|
|
37
|
-
case TypeKind.OPTIONAL:
|
|
38
|
-
if (field.item) scanField(field.item);
|
|
39
|
-
break;
|
|
40
|
-
case TypeKind.USER_REF:
|
|
41
|
-
refTypes.add("UserRef");
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
for (const item of Object.values(schema)) {
|
|
46
|
-
if (isRecordSchema(item)) {
|
|
47
|
-
for (const f of Object.values(item.fields)) {
|
|
48
|
-
scanField(f);
|
|
49
|
-
}
|
|
50
|
-
} else if (isUnionSchema(item)) {
|
|
51
|
-
for (const v of Object.values(item.variants)) {
|
|
52
|
-
scanField(v);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return refTypes;
|
|
57
|
-
}
|
|
58
|
-
function collectReferencedTypes(fieldType, schema, version, out) {
|
|
59
|
-
switch (fieldType.type) {
|
|
60
|
-
case TypeKind.ARRAY:
|
|
61
|
-
if (fieldType.items) collectReferencedTypes(fieldType.items, schema, version, out);
|
|
62
|
-
break;
|
|
63
|
-
case TypeKind.OPTIONAL:
|
|
64
|
-
if (fieldType.item) collectReferencedTypes(fieldType.item, schema, version, out);
|
|
65
|
-
break;
|
|
66
|
-
case TypeKind.REF:
|
|
67
|
-
{
|
|
68
|
-
const name = fieldType.refType === "record" ? findRecordExportName(fieldType.name, schema) ?? fieldType.name : fieldType.name;
|
|
69
|
-
if (name == null) {
|
|
70
|
-
throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);
|
|
71
|
-
}
|
|
72
|
-
out.add(versionedTypeName(name, version));
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function convertTypeToTypeScript(fieldType, schema, version) {
|
|
78
|
-
switch (fieldType.type) {
|
|
79
|
-
case TypeKind.ANY:
|
|
80
|
-
return "any";
|
|
81
|
-
case TypeKind.ARRAY:
|
|
82
|
-
if (fieldType.items == null) {
|
|
83
|
-
throw new Error("Array field is missing items type");
|
|
84
|
-
}
|
|
85
|
-
return `readonly ${convertTypeToTypeScript(fieldType.items, schema, version)}[]`;
|
|
86
|
-
case TypeKind.BOOLEAN:
|
|
87
|
-
return "boolean";
|
|
88
|
-
case TypeKind.DOC_REF:
|
|
89
|
-
return "DocumentRef";
|
|
90
|
-
case TypeKind.DOUBLE:
|
|
91
|
-
return "number";
|
|
92
|
-
case TypeKind.MEDIA_REF:
|
|
93
|
-
return "MediaRef";
|
|
94
|
-
case TypeKind.OBJECT_REF:
|
|
95
|
-
return "ObjectRef";
|
|
96
|
-
case TypeKind.OPTIONAL:
|
|
97
|
-
if (fieldType.item == null) {
|
|
98
|
-
throw new Error("Optional field is missing inner type");
|
|
99
|
-
}
|
|
100
|
-
return convertTypeToTypeScript(fieldType.item, schema, version);
|
|
101
|
-
case TypeKind.REF:
|
|
102
|
-
{
|
|
103
|
-
const name = fieldType.refType === "record" && schema != null ? findRecordExportName(fieldType.name, schema) ?? fieldType.name : fieldType.name;
|
|
104
|
-
if (name == null) {
|
|
105
|
-
throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);
|
|
106
|
-
}
|
|
107
|
-
return version != null ? versionedTypeName(name, version) : name;
|
|
108
|
-
}
|
|
109
|
-
case TypeKind.STRING:
|
|
110
|
-
return "string";
|
|
111
|
-
case TypeKind.USER_REF:
|
|
112
|
-
return "UserRef";
|
|
113
|
-
default:
|
|
114
|
-
throw new Error(`Unknown schema field type: ${fieldType.type}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
19
|
+
import { collectReferencedTypes, convertFieldTypeToTypeScript, detectUsedRefTypes } from "../ir/irFieldHelpers.js";
|
|
20
|
+
import { resolveMinVersion } from "./resolveSchemaChain.js";
|
|
21
|
+
import { typesFilePath, versionedTypeName, versionedWriteTypeName } from "./runtimeSchema.js";
|
|
118
22
|
/**
|
|
119
23
|
* Generate read types for a specific schema version.
|
|
120
24
|
*/
|
|
121
|
-
function generateReadTypesForVersion(version,
|
|
122
|
-
const usedRefTypes = detectUsedRefTypes(
|
|
25
|
+
function generateReadTypesForVersion(version, ir) {
|
|
26
|
+
const usedRefTypes = detectUsedRefTypes(ir);
|
|
123
27
|
let output = GENERATED_FILE_HEADER;
|
|
124
28
|
if (usedRefTypes.size > 0) {
|
|
125
29
|
const refTypesList = Array.from(usedRefTypes).sort().join(", ");
|
|
@@ -128,42 +32,46 @@ function generateReadTypesForVersion(version, schema) {
|
|
|
128
32
|
output += "\n";
|
|
129
33
|
|
|
130
34
|
// Generate record interfaces
|
|
131
|
-
for (const [
|
|
132
|
-
if (
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
35
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
36
|
+
if (modelDef.type !== "record") continue;
|
|
37
|
+
const record = modelDef.record;
|
|
38
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
39
|
+
if (record.description) {
|
|
40
|
+
output += `/**\n * ${record.description}\n */\n`;
|
|
136
41
|
}
|
|
137
42
|
output += `export interface ${typeName} {\n`;
|
|
138
|
-
for (const
|
|
139
|
-
const tsType =
|
|
140
|
-
const optional =
|
|
141
|
-
output += ` readonly ${
|
|
43
|
+
for (const field of record.fields) {
|
|
44
|
+
const tsType = convertFieldTypeToTypeScript(field.fieldType, version);
|
|
45
|
+
const optional = field.isOptional ? "?" : "";
|
|
46
|
+
output += ` readonly ${field.key}${optional}: ${tsType};\n`;
|
|
142
47
|
}
|
|
143
48
|
output += "}\n\n";
|
|
144
49
|
}
|
|
145
50
|
|
|
146
51
|
// Generate union types
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const typeName = versionedTypeName(
|
|
151
|
-
const discriminantField =
|
|
52
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
53
|
+
if (modelDef.type !== "union") continue;
|
|
54
|
+
const union = modelDef.union;
|
|
55
|
+
const typeName = versionedTypeName(modelKey, version);
|
|
56
|
+
const discriminantField = union.discriminant;
|
|
152
57
|
const variantInterfaces = [];
|
|
153
|
-
for (const [variantName,
|
|
58
|
+
for (const [variantName, variantModelKey] of Object.entries(union.variants)) {
|
|
154
59
|
const interfaceName = `${typeName}${formatVariantName(variantName)}`;
|
|
155
60
|
variantInterfaces.push({
|
|
156
61
|
name: interfaceName,
|
|
157
62
|
discriminatorValue: variantName
|
|
158
63
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
64
|
+
|
|
65
|
+
// Look up the variant's model to check if it's a record
|
|
66
|
+
const variantModel = ir.models[variantModelKey];
|
|
67
|
+
if (variantModel != null && variantModel.type === "record") {
|
|
68
|
+
const recordTypeName = versionedTypeName(variantModelKey, version);
|
|
162
69
|
output += `export interface ${interfaceName} extends ${recordTypeName} {\n`;
|
|
163
70
|
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
164
71
|
output += "}\n\n";
|
|
165
72
|
} else {
|
|
166
|
-
|
|
73
|
+
// Non-record variant (e.g. another union): emit a value field referencing the type
|
|
74
|
+
const tsType = versionedTypeName(variantModelKey, version);
|
|
167
75
|
output += `export interface ${interfaceName} {\n`;
|
|
168
76
|
output += ` readonly ${discriminantField}: "${variantName}";\n`;
|
|
169
77
|
output += ` readonly value: ${tsType};\n`;
|
|
@@ -184,15 +92,15 @@ function generateReadTypesForVersion(version, schema) {
|
|
|
184
92
|
* Generate write types for a specific schema version.
|
|
185
93
|
* All fields are optional in write types.
|
|
186
94
|
*/
|
|
187
|
-
function generateWriteTypesForVersion(version,
|
|
188
|
-
const usedRefTypes = detectUsedRefTypes(
|
|
95
|
+
function generateWriteTypesForVersion(version, ir) {
|
|
96
|
+
const usedRefTypes = detectUsedRefTypes(ir);
|
|
189
97
|
|
|
190
98
|
// Collect referenced schema-local types (refs to other records/unions)
|
|
191
99
|
const referencedLocalTypes = new Set();
|
|
192
|
-
for (const
|
|
193
|
-
if (
|
|
194
|
-
for (const
|
|
195
|
-
collectReferencedTypes(fieldType,
|
|
100
|
+
for (const modelDef of Object.values(ir.models)) {
|
|
101
|
+
if (modelDef.type !== "record") continue;
|
|
102
|
+
for (const field of modelDef.record.fields) {
|
|
103
|
+
collectReferencedTypes(field.fieldType, version, referencedLocalTypes);
|
|
196
104
|
}
|
|
197
105
|
}
|
|
198
106
|
let output = GENERATED_FILE_HEADER;
|
|
@@ -207,14 +115,14 @@ function generateWriteTypesForVersion(version, schema) {
|
|
|
207
115
|
output += "\n";
|
|
208
116
|
|
|
209
117
|
// Generate record write types
|
|
210
|
-
for (const [
|
|
211
|
-
if (
|
|
212
|
-
const typeName = versionedWriteTypeName(
|
|
118
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
119
|
+
if (modelDef.type !== "record") continue;
|
|
120
|
+
const typeName = versionedWriteTypeName(modelKey, version);
|
|
213
121
|
output += `export type ${typeName} = {\n`;
|
|
214
|
-
for (const
|
|
122
|
+
for (const field of modelDef.record.fields) {
|
|
215
123
|
// All fields are optional in write types
|
|
216
|
-
const tsType =
|
|
217
|
-
output += ` readonly ${
|
|
124
|
+
const tsType = convertFieldTypeToTypeScript(field.fieldType, version);
|
|
125
|
+
output += ` readonly ${field.key}?: ${tsType};\n`;
|
|
218
126
|
}
|
|
219
127
|
output += "};\n\n";
|
|
220
128
|
}
|
|
@@ -225,23 +133,23 @@ function generateWriteTypesForVersion(version, schema) {
|
|
|
225
133
|
* Generate the types.ts re-export file that maps unversioned names to the latest version.
|
|
226
134
|
*/
|
|
227
135
|
function generateTypesReExport({
|
|
228
|
-
|
|
136
|
+
ir,
|
|
229
137
|
version
|
|
230
138
|
}) {
|
|
231
139
|
const reExports = [];
|
|
232
|
-
for (const [
|
|
233
|
-
if (
|
|
234
|
-
const versioned = versionedTypeName(
|
|
235
|
-
reExports.push(`export type { ${versioned} as ${
|
|
236
|
-
} else if (
|
|
237
|
-
const versioned = versionedTypeName(
|
|
238
|
-
reExports.push(`export type { ${versioned} as ${
|
|
140
|
+
for (const [modelKey, modelDef] of Object.entries(ir.models)) {
|
|
141
|
+
if (modelDef.type === "record") {
|
|
142
|
+
const versioned = versionedTypeName(modelKey, version);
|
|
143
|
+
reExports.push(`export type { ${versioned} as ${modelKey} } from "${typesFilePath(version)}";`);
|
|
144
|
+
} else if (modelDef.type === "union") {
|
|
145
|
+
const versioned = versionedTypeName(modelKey, version);
|
|
146
|
+
reExports.push(`export type { ${versioned} as ${modelKey} } from "${typesFilePath(version)}";`);
|
|
239
147
|
|
|
240
148
|
// Also re-export union variant types
|
|
241
|
-
for (const variantName of Object.keys(
|
|
149
|
+
for (const variantName of Object.keys(modelDef.union.variants)) {
|
|
242
150
|
const formattedVariant = formatVariantName(variantName);
|
|
243
|
-
const versionedVariant = `${versionedTypeName(
|
|
244
|
-
reExports.push(`export type { ${versionedVariant} as ${`${
|
|
151
|
+
const versionedVariant = `${versionedTypeName(modelKey, version)}${formattedVariant}`;
|
|
152
|
+
reExports.push(`export type { ${versionedVariant} as ${`${modelKey}${formattedVariant}`} } from "${typesFilePath(version)}";`);
|
|
245
153
|
}
|
|
246
154
|
}
|
|
247
155
|
}
|
|
@@ -249,27 +157,25 @@ function generateTypesReExport({
|
|
|
249
157
|
}
|
|
250
158
|
|
|
251
159
|
/**
|
|
252
|
-
* Generate per-version public types and write types from
|
|
253
|
-
*
|
|
254
|
-
* @param schema - The schema, initial or versioned
|
|
255
|
-
* @param minSupportedVersion - Minimum version to generate types for (defaults to latest)
|
|
256
|
-
* @returns Object containing generated code for each output file
|
|
160
|
+
* Generate per-version public types and write types from an already-resolved
|
|
161
|
+
* versioned IR chain.
|
|
257
162
|
*/
|
|
258
|
-
export function
|
|
163
|
+
export function generateVersionedTypesFromChain(resolved, minSupportedVersion) {
|
|
164
|
+
const {
|
|
165
|
+
chain
|
|
166
|
+
} = resolved;
|
|
259
167
|
const {
|
|
260
|
-
chain,
|
|
261
|
-
latestVersion,
|
|
262
168
|
minVersion
|
|
263
|
-
} =
|
|
169
|
+
} = resolveMinVersion(chain, minSupportedVersion);
|
|
264
170
|
const readTypes = new Map();
|
|
265
171
|
const writeTypes = new Map();
|
|
266
172
|
for (const {
|
|
267
173
|
version,
|
|
268
|
-
|
|
174
|
+
ir
|
|
269
175
|
} of chain) {
|
|
270
176
|
if (version < minVersion) continue;
|
|
271
|
-
readTypes.set(version, generateReadTypesForVersion(version,
|
|
272
|
-
writeTypes.set(version, generateWriteTypesForVersion(version,
|
|
177
|
+
readTypes.set(version, generateReadTypesForVersion(version, ir));
|
|
178
|
+
writeTypes.set(version, generateWriteTypesForVersion(version, ir));
|
|
273
179
|
}
|
|
274
180
|
const typesReExport = generateTypesReExport(chain[chain.length - 1]);
|
|
275
181
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","resolveSchemaChain","findRecordExportName","isRecordSchema","isUnionSchema","TypeKind","typesFilePath","versionedTypeName","versionedWriteTypeName","detectUsedRefTypes","schema","refTypes","Set","scanField","field","type","ARRAY","items","DOC_REF","add","MEDIA_REF","OBJECT_REF","OPTIONAL","item","USER_REF","Object","values","f","fields","v","variants","collectReferencedTypes","fieldType","version","out","REF","name","refType","Error","convertTypeToTypeScript","ANY","BOOLEAN","DOUBLE","STRING","generateReadTypesForVersion","usedRefTypes","output","size","refTypesList","Array","from","sort","join","exportName","entries","typeName","docs","fieldName","tsType","optional","unionEntries","filter","_","discriminantField","discriminant","variantInterfaces","variantName","variantType","interfaceName","push","discriminatorValue","recordExport","recordTypeName","map","variant","generateWriteTypesForVersion","referencedLocalTypes","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromSchema","minSupportedVersion","chain","latestVersion","minVersion","readTypes","Map","writeTypes","versionSchema","set","typesReExport","length"],"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 type { SchemaDefinition } from \"@palantir/pack.schema\";\nimport { formatVariantName } from \"../formatVariantName.js\";\nimport { GENERATED_FILE_HEADER } from \"../generatedFileHeader.js\";\nimport type { VersionedSchemaEntry } from \"./resolveSchemaChain.js\";\nimport { resolveSchemaChain } from \"./resolveSchemaChain.js\";\nimport type { RuntimeSchema, SchemaField } from \"./runtimeSchema.js\";\nimport {\n findRecordExportName,\n isRecordSchema,\n isUnionSchema,\n TypeKind,\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\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 (field.items) scanField(field.items);\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 (field.item) scanField(field.item);\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 f of Object.values(item.fields)) {\n scanField(f);\n }\n } else if (isUnionSchema(item)) {\n for (const v of Object.values(item.variants)) {\n scanField(v);\n }\n }\n }\n\n return refTypes;\n}\n\nfunction collectReferencedTypes(\n fieldType: SchemaField,\n schema: RuntimeSchema,\n version: number,\n out: Set<string>,\n): void {\n switch (fieldType.type) {\n case TypeKind.ARRAY:\n if (fieldType.items) collectReferencedTypes(fieldType.items, schema, version, out);\n break;\n case TypeKind.OPTIONAL:\n if (fieldType.item) collectReferencedTypes(fieldType.item, schema, version, out);\n break;\n case TypeKind.REF: {\n const name = fieldType.refType === \"record\"\n ? findRecordExportName(fieldType.name!, schema) ?? fieldType.name\n : fieldType.name;\n if (name == null) {\n throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);\n }\n out.add(versionedTypeName(name, version));\n break;\n }\n }\n}\n\nfunction convertTypeToTypeScript(\n fieldType: SchemaField,\n schema?: RuntimeSchema,\n version?: number,\n): string {\n switch (fieldType.type) {\n case TypeKind.ANY:\n return \"any\";\n case TypeKind.ARRAY:\n if (fieldType.items == null) {\n throw new Error(\"Array field is missing items type\");\n }\n return `readonly ${convertTypeToTypeScript(fieldType.items, schema, version)}[]`;\n case TypeKind.BOOLEAN:\n return \"boolean\";\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 (fieldType.item == null) {\n throw new Error(\"Optional field is missing inner type\");\n }\n return convertTypeToTypeScript(fieldType.item, schema, version);\n case TypeKind.REF: {\n const name = fieldType.refType === \"record\" && schema != null\n ? findRecordExportName(fieldType.name!, schema) ?? fieldType.name\n : fieldType.name;\n if (name == null) {\n throw new Error(`Could not find name for ref: ${fieldType.type}:${fieldType.refType}`);\n }\n return version != null ? versionedTypeName(name, version) : name;\n }\n case TypeKind.STRING:\n return \"string\";\n case TypeKind.USER_REF:\n return \"UserRef\";\n default:\n throw new Error(`Unknown schema field type: ${fieldType.type}`);\n }\n}\n\n/**\n * Generate read types for a specific schema version.\n */\nfunction generateReadTypesForVersion(\n version: number,\n schema: RuntimeSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(schema);\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 [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n const typeName = versionedTypeName(exportName, version);\n\n if (item.docs) {\n output += `/**\\n * ${item.docs}\\n */\\n`;\n }\n\n output += `export interface ${typeName} {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n const tsType = convertTypeToTypeScript(fieldType, schema, version);\n const optional = fieldType.type === TypeKind.OPTIONAL ? \"?\" : \"\";\n output += ` readonly ${fieldName}${optional}: ${tsType};\\n`;\n }\n\n output += \"}\\n\\n\";\n }\n\n // Generate union types\n const unionEntries = Object.entries(schema).filter(\n ([_, item]) => isUnionSchema(item),\n );\n\n for (const [exportName, item] of unionEntries) {\n if (!isUnionSchema(item)) continue;\n\n const typeName = versionedTypeName(exportName, version);\n const discriminantField = item.discriminant;\n const variantInterfaces: Array<{ name: string; discriminatorValue: string }> = [];\n\n for (const [variantName, variantType] of Object.entries(item.variants)) {\n const interfaceName = `${typeName}${formatVariantName(variantName)}`;\n variantInterfaces.push({ name: interfaceName, discriminatorValue: variantName });\n\n if (variantType.type === TypeKind.REF && variantType.refType === \"record\") {\n const recordExport = findRecordExportName(variantType.name!, schema);\n const recordTypeName = recordExport\n ? versionedTypeName(recordExport, version)\n : variantType.name!;\n output += `export interface ${interfaceName} extends ${recordTypeName} {\\n`;\n output += ` readonly ${discriminantField}: \"${variantName}\";\\n`;\n output += \"}\\n\\n\";\n } else {\n const tsType = convertTypeToTypeScript(variantType, schema, 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 output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\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 schema: RuntimeSchema,\n): string {\n const usedRefTypes = detectUsedRefTypes(schema);\n\n // Collect referenced schema-local types (refs to other records/unions)\n const referencedLocalTypes = new Set<string>();\n for (const item of Object.values(schema)) {\n if (!isRecordSchema(item)) continue;\n for (const fieldType of Object.values(item.fields)) {\n collectReferencedTypes(fieldType, schema, 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 [exportName, item] of Object.entries(schema)) {\n if (!isRecordSchema(item)) continue;\n\n const typeName = versionedWriteTypeName(exportName, version);\n\n output += `export type ${typeName} = {\\n`;\n\n for (const [fieldName, fieldType] of Object.entries(item.fields)) {\n // All fields are optional in write types\n const tsType = convertTypeToTypeScript(fieldType, schema, version);\n output += ` readonly ${fieldName}?: ${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({ schema, version }: VersionedSchemaEntry): string {\n const reExports: string[] = [];\n for (const [exportName, item] of Object.entries(schema)) {\n if (isRecordSchema(item)) {\n const versioned = versionedTypeName(exportName, version);\n reExports.push(\n `export type { ${versioned} as ${exportName} } from \"${typesFilePath(version)}\";`,\n );\n } else if (isUnionSchema(item)) {\n const versioned = versionedTypeName(exportName, version);\n reExports.push(\n `export type { ${versioned} as ${exportName} } from \"${typesFilePath(version)}\";`,\n );\n\n // Also re-export union variant types\n for (const variantName of Object.keys(item.variants)) {\n const formattedVariant = formatVariantName(variantName);\n const versionedVariant = `${versionedTypeName(exportName, version)}${formattedVariant}`;\n const unversionedVariant = `${exportName}${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 a schema with version chain.\n *\n * @param schema - The schema, initial or versioned\n * @param minSupportedVersion - Minimum version to generate types for (defaults to latest)\n * @returns Object containing generated code for each output file\n */\nexport function generateVersionedTypesFromSchema(\n schema: SchemaDefinition,\n minSupportedVersion?: number,\n): VersionedTypesOutput {\n const { chain, latestVersion, minVersion } = resolveSchemaChain(schema, minSupportedVersion);\n\n const readTypes = new Map<number, string>();\n const writeTypes = new Map<number, string>();\n\n for (const { version, schema: versionSchema } of chain) {\n if (version < minVersion) continue;\n\n readTypes.set(version, generateReadTypesForVersion(version, versionSchema));\n writeTypes.set(version, generateWriteTypesForVersion(version, versionSchema));\n }\n\n const typesReExport = generateTypesReExport(chain[chain.length - 1]!);\n\n return { readTypes, writeTypes, typesReExport };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"generateVersionedTypesFromSchema.js","names":["formatVariantName","GENERATED_FILE_HEADER","collectReferencedTypes","convertFieldTypeToTypeScript","detectUsedRefTypes","resolveMinVersion","typesFilePath","versionedTypeName","versionedWriteTypeName","generateReadTypesForVersion","version","ir","usedRefTypes","output","size","refTypesList","Array","from","sort","join","modelKey","modelDef","Object","entries","models","type","record","typeName","description","field","fields","tsType","fieldType","optional","isOptional","key","union","discriminantField","discriminant","variantInterfaces","variantName","variantModelKey","variants","interfaceName","push","name","discriminatorValue","variantModel","recordTypeName","map","v","variant","generateWriteTypesForVersion","referencedLocalTypes","Set","values","localTypesList","generateTypesReExport","reExports","versioned","keys","formattedVariant","versionedVariant","generateVersionedTypesFromChain","resolved","minSupportedVersion","chain","minVersion","readTypes","Map","writeTypes","set","typesReExport","length"],"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 type { IRealTimeDocumentSchema } from \"../../lib/pack-docschema-api/pack-docschema-ir/index.js\";\nimport { formatVariantName } from \"../formatVariantName.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 { typesFilePath, versionedTypeName, versionedWriteTypeName } 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\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 output += `export type ${typeName} = ${variantInterfaces.map(v => v.name).join(\" | \")};\\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 // Also re-export union variant types\n for (const variantName of Object.keys(modelDef.union.variants)) {\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":"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","ignoreList":[]}
|