diff --git a/common/changes/@typespec/migrate/fix-migrate_2023-04-21-18-02.json b/common/changes/@typespec/migrate/fix-migrate_2023-04-21-18-02.json new file mode 100644 index 00000000000..8a22e4cc708 --- /dev/null +++ b/common/changes/@typespec/migrate/fix-migrate_2023-04-21-18-02.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/migrate", + "comment": "Fix resolution of tsp version", + "type": "none" + } + ], + "packageName": "@typespec/migrate" +} \ No newline at end of file diff --git a/packages/migrate/src/cli.ts b/packages/migrate/src/cli.ts index bbdd47f1217..34e90dee61d 100644 --- a/packages/migrate/src/cli.ts +++ b/packages/migrate/src/cli.ts @@ -18,7 +18,7 @@ import { findTypeSpecFiles } from "./utils.js"; interface Options { path: string; - tspVersion: string; + tspVersion?: string; } async function main() { @@ -34,35 +34,27 @@ async function main() { .option("tspVersion", { alias: "t", describe: - "Specifies the TypeSpec compiler version used by the input. Defaults to the version of the compiler package in package.json.", + "Specifies the TypeSpec compiler version used by the input(Version you want to upgrade from). Defaults to the version of the compiler package in package.json.", type: "string", - default: "", }) .help().argv; const PackageJsonFile = "package.json"; - if (cliOptions.tspVersion.length === 0) { + if (cliOptions.tspVersion === undefined) { // Locate current package.json const pkgFile = resolvePath(cliOptions.path, PackageJsonFile); - const packageJson: NodePackage = JSON.parse(await readFile(pkgFile, "utf-8")); - - // Locate current compiler version - const CadlCompiler = "@cadl-lang/compiler"; - const TypeSpecCompiler = "@typespec/compiler"; - if ( - packageJson?.devDependencies !== undefined && - packageJson?.devDependencies[CadlCompiler] !== undefined - ) { - cliOptions.tspVersion = packageJson.devDependencies[CadlCompiler]; - } else if ( - packageJson?.devDependencies !== undefined && - packageJson?.devDependencies[TypeSpecCompiler] !== undefined - ) { - cliOptions.tspVersion = packageJson.devDependencies[TypeSpecCompiler]; - } else { - console.error("Unable to find TypeSpec compiler version in package.json."); - return; + const packageJson = await readPackageJson(pkgFile); + if (packageJson) { + cliOptions.tspVersion = lookupExistingVersion(packageJson); } + // Locate current compiler version + } + + if (cliOptions.tspVersion === undefined) { + console.error( + "Couldn't resolve TypeSpec compiler version to upgrade from. Use `--tspVersion` flag to specify it. (e.g. `--tspVersion=0.42.0` to upgrade from version 0.42.0)" + ); + process.exit(1); } if (!fs.existsSync(cliOptions.path)) { @@ -127,6 +119,31 @@ async function main() { } } +async function readPackageJson(pkgFile: string): Promise { + try { + return JSON.parse(await readFile(pkgFile, "utf-8")); + } catch (e) { + return undefined; + } +} +function lookupExistingVersion(packageJson: NodePackage) { + const CadlCompiler = "@cadl-lang/compiler"; + const TypeSpecCompiler = "@typespec/compiler"; + + const depKinds = ["devDependencies", "peerDependencies", "dependencies"] as const; + for (const depKind of depKinds) { + const deps = packageJson[depKind]; + if (deps === undefined) { + continue; + } + const found = deps[CadlCompiler] ?? deps[TypeSpecCompiler]; + if (found) { + return found; + } + } + return undefined; +} + main().catch((e) => { // eslint-disable-next-line no-console console.error(e);