Files
2026-07-13 12:23:53 +08:00

116 lines
4.9 KiB
JavaScript

// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
import * as dotenv from "dotenv";
import * as path from "path";
import * as fs from "fs";
import { execSync } from "child_process";
import "zx/globals";
dotenv.config({ path: "./.perspectiverc", quiet: true });
process.env.FORCE_COLOR = true;
/**
* Calls `path.resolve` on each of the input path arguments, then removes the
* path if it exists.
*
* @param {string} dirs paths to clean.
* @example
* clean("a/b/c"); // Cleans this dir
* clean("a/b/c", "d/e/f"); // Cleans both dirs
*/
export function clean(...dirs) {
for (const dir of dirs) {
const resolved = path.resolve(dir);
if (fs.existsSync(resolved)) {
fs.rmSync(resolved, { recursive: true, force: true });
}
}
}
/**
* Returns the value after this command-line flag, or `true` if it is the last
* arg. This makes it easy to null-pun for boolean flags, and capture the
* argument for argument-providing flags, and respect quotes and parens, in
* one function. Can be used as a template literal - not sure why, 2 less
* characters?
*
* @param {string} flag The command line flag name. Returns all arguments if
* this param is `undefined`.
* @returns {string} The next argument after this flag in the command args, or
* `true.
* @example
* console.assert(getarg`--debug`);
*/
export function getarg(flag, ...args) {
if (Array.isArray(flag)) {
flag = flag.map((x, i) => x + (args[i] || "")).join("");
}
const argv = process.argv.slice(2);
if (flag) {
const index = argv.indexOf(flag);
if (index > -1) {
const next = argv[index + 1];
if (next) {
return next;
} else {
return true;
}
}
} else {
return argv
.map(function (arg) {
return "'" + arg.replace(/'/g, "'\\''") + "'";
})
.join(" ");
}
}
export function get_scope() {
const package_venn = (process.env.PACKAGE || "").split(",").reduce(
(acc, x) => {
if (x.startsWith("!")) {
acc.exclude.push(x);
} else if (x != "") {
acc.include.push(x);
}
return acc;
},
{ include: [], exclude: [] },
);
let packages;
if (package_venn.include.length === 0) {
packages = JSON.parse($.sync`pnpm m ls --json --depth=-1`.toString())
.filter((x) => x.name !== undefined)
.map((x) => x.name.replace("@perspective-dev/", ""))
.filter((x) => package_venn.exclude.indexOf(`!${x}`) === -1);
} else {
packages = package_venn.include.filter(
(x) => package_venn.exclude.indexOf(`!${x}`) === -1,
);
}
return packages;
}
export const run_with_scope = async function run_recursive(strings, ...args) {
let scope = get_scope();
const cmd = strings[0].split(" ")[0];
const filters = scope.map((x) => `--filter ${x} --if-present`).join(" ");
execSync(`pnpm run --sequential --recursive ${filters} ${cmd}`, {
stdio: "inherit",
});
};