62 lines
2.1 KiB
JavaScript
Executable File
62 lines
2.1 KiB
JavaScript
Executable File
#!/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);
|
|
}
|