66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
#!/usr/bin/env node
|
|
import { spawnSync } from "node:child_process";
|
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const root = fileURLToPath(new URL("..", import.meta.url));
|
|
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
|
|
|
|
function run(label, command, args, options = {}) {
|
|
console.log(`==> ${label}`);
|
|
const { quiet, ...spawnOptions } = options;
|
|
const result = spawnSync(command, args, {
|
|
cwd: root,
|
|
stdio: quiet ? "pipe" : "inherit",
|
|
shell: process.platform === "win32",
|
|
...spawnOptions,
|
|
});
|
|
if (result.status !== 0) {
|
|
console.error(`Package smoke failed: ${label}`);
|
|
if (quiet) {
|
|
if (result.stdout) process.stderr.write(result.stdout);
|
|
if (result.stderr) process.stderr.write(result.stderr);
|
|
}
|
|
process.exit(result.status ?? 1);
|
|
}
|
|
}
|
|
|
|
function assertPath(path, label = path) {
|
|
const full = join(root, path);
|
|
if (!existsSync(full)) {
|
|
console.error(`Package smoke failed: missing ${label} (${path})`);
|
|
process.exit(1);
|
|
}
|
|
return full;
|
|
}
|
|
|
|
run("build compiled package", process.execPath, ["scripts/build.mjs"]);
|
|
run("AST grammar runtime packages", process.execPath, ["scripts/check-package-grammars.mjs"]);
|
|
|
|
for (const entry of pkg.files ?? []) {
|
|
assertPath(entry.replace(/\/$/, ""), `package.json files[] entry ${entry}`);
|
|
}
|
|
|
|
for (const [name, binPath] of Object.entries(pkg.bin ?? {})) {
|
|
const full = assertPath(binPath, `bin ${name}`);
|
|
const mode = statSync(full).mode;
|
|
if ((mode & 0o111) === 0) {
|
|
console.error(`Package smoke failed: bin ${name} is not executable (${binPath})`);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
assertPath("dist/index.js", "compiled main export");
|
|
assertPath("dist/index.d.ts", "compiled type export");
|
|
assertPath("dist/cli/qmd.js", "compiled CLI");
|
|
|
|
run("compiled CLI under Node", process.execPath, ["dist/cli/qmd.js", "--help"], { quiet: true });
|
|
run("package wrapper", "sh", ["bin/qmd", "--help"], { quiet: true });
|
|
|
|
if (process.env.QMD_SKIP_BUN_SMOKE === "1") {
|
|
console.log("==> compiled CLI under Bun (skipped by QMD_SKIP_BUN_SMOKE=1)");
|
|
} else {
|
|
run("compiled CLI under Bun", "bun", ["dist/cli/qmd.js", "--help"], { quiet: true });
|
|
}
|