12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/env node
- // * The entry point of the CLI
- // @ts-check
- import chalk from "chalk";
- import { spawnSync } from "child_process";
- import fs from "fs";
- import { cloneDeep } from "lodash-es";
- import semver from "semver";
- import { fileURLToPath } from "url";
- const highlightVersion = (version) => chalk.black.bgYellow(`v${version}`);
- const packageJsonPath = fileURLToPath(
- new URL("../package.json", import.meta.url)
- );
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
- const requiredNodeVersionRange = packageJson.engines?.node || ">=20";
- // Extract the major version from the start of the range
- const requiredNodeVersion = semver.major(
- semver.minVersion(requiredNodeVersionRange) ?? "20"
- );
- const currentNodeVersion = process.versions.node;
- // Last supported version of the CLI for Node.js v18
- const lastSupportedVersion = "0.11.1";
- if (!semver.satisfies(currentNodeVersion, requiredNodeVersionRange)) {
- console.error(
- `${chalk.greenBright("Hoppscotch CLI")} requires Node.js ${highlightVersion(requiredNodeVersion)} or higher and you're on Node.js ${highlightVersion(currentNodeVersion)}.`
- );
- console.error(
- `\nIf you prefer staying on Node.js ${highlightVersion("18")}, you can install the last supported version of the CLI:\n` +
- `${chalk.green(`npm install -g @hoppscotch/cli@${lastSupportedVersion}`)}`
- );
- process.exit(1);
- }
- // Dynamically importing the module after the Node.js version check prevents errors due to unrecognized APIs in older Node.js versions
- const { cli } = await import("../dist/index.js");
- // As per isolated-vm documentation, we need to supply `--no-node-snapshot` for node >= 20
- // src: https://github.com/laverdet/isolated-vm?tab=readme-ov-file#requirements
- if (!process.execArgv.includes("--no-node-snapshot")) {
- const argCopy = cloneDeep(process.argv);
- // Replace first argument with --no-node-snapshot
- // We can get argv[0] from process.argv0
- argCopy[0] = "--no-node-snapshot";
- const result = spawnSync(process.argv0, argCopy, { stdio: "inherit" });
- // Exit with the same status code as the spawned process
- process.exit(result.status ?? 0);
- } else {
- cli(process.argv);
- }
|