bump-ts-version.ts
1 /** 2 * CLI script to bump the version of MLflow TypeScript libraries. 3 * 4 * This script updates the version in: 5 * - libs/typescript/core/package.json 6 * - libs/typescript/integrations/openai/package.json (version and peerDependencies) 7 */ 8 9 import { readFileSync, writeFileSync, existsSync } from 'fs'; 10 import { join } from 'path'; 11 12 // list of packages that contain `@mlflow/core` in peerDependencies 13 const INTEGRATION_PACKAGES = ['openai', 'anthropic', 'gemini', 'vercel']; 14 15 interface PackageJson { 16 name: string; 17 version: string; 18 peerDependencies?: Record<string, string>; 19 [key: string]: any; 20 } 21 22 function bumpVersion(version: string): void { 23 // Define paths to package.json files 24 const tsRoot = process.cwd(); 25 const corePackagePath = join(tsRoot, 'core', 'package.json'); 26 27 // Validate that files exist 28 if (!existsSync(corePackagePath)) { 29 console.error(`Error: ${corePackagePath} does not exist`); 30 process.exit(1); 31 } 32 33 for (const packageName of INTEGRATION_PACKAGES) { 34 const packagePath = join(tsRoot, 'integrations', packageName, 'package.json'); 35 if (!existsSync(packagePath)) { 36 console.error(`Error: ${packagePath} does not exist`); 37 process.exit(1); 38 } 39 } 40 41 // Validate version format (semver with optional prerelease) 42 // Matches: X.Y.Z or X.Y.Z-rc.0 or X.Y.Z-beta.1 etc. 43 const semverPattern = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/; 44 if (!semverPattern.test(version)) { 45 console.error( 46 `Error: Invalid version format '${version}'. Expected format: X.Y.Z or X.Y.Z-rc.0`, 47 ); 48 process.exit(1); 49 } 50 51 // Update core package.json 52 console.log(`Updating core/package.json...`); 53 const corePackageText = readFileSync(corePackagePath, 'utf-8'); 54 const corePackage: PackageJson = JSON.parse(corePackageText); 55 56 const oldCoreVersion = corePackage.version; 57 corePackage.version = version; 58 59 writeFileSync(corePackagePath, JSON.stringify(corePackage, null, 2) + '\n', 'utf-8'); 60 console.log(` ✓ Updated version: ${oldCoreVersion} → ${version}`); 61 62 for (const packageName of INTEGRATION_PACKAGES) { 63 const packagePath = join(tsRoot, 'integrations', packageName, 'package.json'); 64 console.log(`Updating integrations/${packageName}/package.json...`); 65 const packageText = readFileSync(packagePath, 'utf-8'); 66 const packageJson: PackageJson = JSON.parse(packageText); 67 68 const oldVersion = packageJson.version; 69 packageJson.version = version; 70 71 writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8'); 72 console.log(` ✓ Updated version: ${oldVersion} → ${version}`); 73 74 if (packageJson.peerDependencies && '@mlflow/core' in packageJson.peerDependencies) { 75 const oldPeerDep = packageJson.peerDependencies['@mlflow/core']; 76 packageJson.peerDependencies['@mlflow/core'] = `^${version}`; 77 writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8'); 78 console.log(` ✓ Updated peerDependency @mlflow/core: ${oldPeerDep} → ^${version}`); 79 } 80 } 81 82 console.log(`\n✅ Successfully bumped TypeScript library versions to ${version}`); 83 } 84 85 function main(): void { 86 const args = process.argv.slice(2); 87 88 // Parse arguments 89 let version: string | null = null; 90 91 for (let i = 0; i < args.length; i++) { 92 if (args[i] === '--version') { 93 if (i + 1 < args.length) { 94 version = args[i + 1]; 95 i++; 96 } else { 97 console.error('Error: --version requires a value'); 98 process.exit(1); 99 } 100 } else if (args[i] === '--help' || args[i] === '-h') { 101 console.log('Usage: tsx scripts/bump-ts-version.ts --version <version>'); 102 console.log('\nBump the version of MLflow TypeScript libraries'); 103 console.log('\nOptions:'); 104 console.log(' --version <version> Version to bump to (e.g., 0.1.2, 0.2.0, or 1.0.0-rc.0)'); 105 console.log(' --help, -h Show this help message'); 106 process.exit(0); 107 } 108 } 109 110 if (!version) { 111 console.error('Error: --version is required'); 112 console.log('\nUsage: tsx scripts/bump-ts-version.ts --version <version>'); 113 process.exit(1); 114 } 115 116 bumpVersion(version); 117 } 118 119 main();