116 lines
4.9 KiB
JavaScript
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",
|
|
});
|
|
};
|