<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Improves reliability and correctness of `bin/` maintenance scripts used for local development and CI. ## Behavioral fixes - **Exit codes**: `test_integration.js` exits with code 1 when `--suite` names an unknown suite; `test_unit.js` uses a non-zero fallback (`-1`) when the coverage or mocha child process has no status; `esbuild_all.mjs` exits non-zero if any parallel esbuild child fails. - **Repo root**: `setup-full.mjs` resolves the repository root one directory above `bin/` (was incorrectly using `bin/` as root). - **esbuild_all**: Propagates child build failures instead of always exiting 0. - **Integration suites**: When `--suite` is omitted, all configured Playwright suites (core + addons) run; when provided, only the matching suite runs. - **test_unit.js**: Declares the `files` filter variable so file arguments from `npm run test-unit` work without a ReferenceError. - **test_mousemodes.js**: Uses the correct cursor-home CSI (`ESC [ H`) when clearing the menu screen. - **Cleanup**: Removes debug logging from the test-unit coverage path; adds a missing semicolon after the suite regex match. ## Affected scripts - `bin/test_integration.js` - `bin/test_unit.js` - `bin/esbuild_all.mjs` - `bin/setup-full.mjs` - `bin/test_mousemodes.js` ## Testing - Syntax-checked affected scripts with `node --check` - Verified `node bin/test_integration.js --suite=unknown` exits 1 with an error message - `npm run lint-changes` (no TypeScript files changed) <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-94b28f5d-740c-4cb6-8cd9-40f35bc6086c"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-94b28f5d-740c-4cb6-8cd9-40f35bc6086c"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div>
57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
// @ts-check
|
|
|
|
import { spawn } from "child_process";
|
|
import { readdir } from "fs/promises";
|
|
import { argv } from "process";
|
|
|
|
/** @type {{cp: import("child_process").ChildProcessByStdio<any, any, any>, name: string}[]} */
|
|
const jobs = [];
|
|
|
|
// Core job
|
|
jobs.push(createJob('xterm', []));
|
|
|
|
// Addon jobs
|
|
const addons = (await readdir('addons')).filter(e => e.startsWith('addon-')).map(e => e.replace('addon-', ''));
|
|
for (const addon of addons) {
|
|
jobs.push(createJob(`xterm-addon-${addon}`, [`--addon=${addon}`]));
|
|
}
|
|
|
|
// Demo job - This requires the others to be built so it's not included when building all
|
|
// jobs.push(createJob('demo-client', [`--demo-client`]));
|
|
|
|
const codes = await Promise.all(jobs.map(job => {
|
|
return new Promise(r => {
|
|
job.cp.on('exit', code => {
|
|
log(`Finished \x1b[32m${job.name}\x1b[0m${code ? ' \x1b[31mwith errors\x1b[0m' : ''}`);
|
|
r(code ?? 1);
|
|
});
|
|
});
|
|
}));
|
|
if (codes.some(code => code !== 0)) {
|
|
process.exit(1);
|
|
}
|
|
|
|
/**
|
|
* @param {string} message
|
|
*/
|
|
function log(message) {
|
|
console.info(`[\x1b[2m${new Date().toLocaleTimeString('en-GB')}\x1b[0m] ${message}`);
|
|
}
|
|
|
|
/**
|
|
* @param {string} name
|
|
* @param {string[]} extraArgs
|
|
*/
|
|
function createJob(name, extraArgs) {
|
|
log(`Starting \x1b[32m${name}\x1b[0m...`);
|
|
const args = [
|
|
'bin/esbuild.mjs',
|
|
...extraArgs,
|
|
...argv
|
|
];
|
|
return {
|
|
name,
|
|
cp: spawn('node', args, { stdio: ["inherit", "inherit", "inherit"] })
|
|
};
|
|
}
|