78 lines
2.7 KiB
JavaScript
78 lines
2.7 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import YAML from "yaml";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
const repoRoot = path.resolve(__dirname, "../..");
|
|
|
|
function readWorkspacePackageManifestPaths() {
|
|
const workspacePath = path.join(repoRoot, "pnpm-workspace.yaml");
|
|
const workspace = YAML.parse(readFileSync(workspacePath, "utf8"));
|
|
const entries = Array.isArray(workspace?.packages) ? workspace.packages : [];
|
|
const manifestPaths = new Set();
|
|
|
|
for (const entry of entries) {
|
|
if (entry === "packages/*") {
|
|
const packageDirs = readdirSync(path.join(repoRoot, "packages"), { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => dirent.name);
|
|
for (const dir of packageDirs) {
|
|
const manifest = `packages/${dir}/package.json`;
|
|
if (existsSync(path.join(repoRoot, manifest))) {
|
|
manifestPaths.add(manifest);
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (entry === "plugins/examples/*") {
|
|
const exampleDirs = readdirSync(path.join(repoRoot, "plugins/examples"), { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => dirent.name);
|
|
for (const dir of exampleDirs) {
|
|
const manifest = `plugins/examples/${dir}/package.json`;
|
|
if (existsSync(path.join(repoRoot, manifest))) {
|
|
manifestPaths.add(manifest);
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
const manifest = `${entry}/package.json`;
|
|
if (existsSync(path.join(repoRoot, manifest))) {
|
|
manifestPaths.add(manifest);
|
|
}
|
|
}
|
|
|
|
return manifestPaths;
|
|
}
|
|
|
|
function readDockerfileCopiedManifestPaths() {
|
|
const dockerfile = readFileSync(path.join(repoRoot, "Dockerfile"), "utf8");
|
|
const copied = new Set();
|
|
for (const match of dockerfile.matchAll(/^COPY\s+(\S+)\s+\.\/\S+$/gm)) {
|
|
const source = match[1];
|
|
if (source.endsWith("/package.json")) {
|
|
copied.add(source);
|
|
}
|
|
}
|
|
return { copied, dockerfile };
|
|
}
|
|
|
|
test("Dockerfile builder manifest copy list covers pnpm workspace package manifests", () => {
|
|
const expected = readWorkspacePackageManifestPaths();
|
|
const { copied } = readDockerfileCopiedManifestPaths();
|
|
|
|
const missing = [...expected].filter((manifest) => !copied.has(manifest));
|
|
assert.deepEqual(missing, []);
|
|
});
|
|
|
|
test("Dockerfile no longer references removed packages/tui package.json", () => {
|
|
const { dockerfile } = readDockerfileCopiedManifestPaths();
|
|
assert.ok(!dockerfile.includes("COPY packages/tui/package.json ./packages/tui/package.json"));
|
|
});
|