/ libs / typescript / scripts / bump-ts-version.ts
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();