29 lines
1.1 KiB
JavaScript
29 lines
1.1 KiB
JavaScript
// S1 has no live enforcement: the source must not reach the filesystem, a
|
|
// process, the network or the clock. This reads the package's own source text.
|
|
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
const SRC = path.join(import.meta.dirname, "..", "src");
|
|
const FORBIDDEN = [
|
|
/\bfrom\s+["'](node:)?(fs|fs\/promises|child_process|net|http|https|dgram|tls|worker_threads|os)["']/,
|
|
/\bimport\s*\(/,
|
|
/\brequire\s*\(/,
|
|
/\bprocess\./,
|
|
/\bDate\.now\b/,
|
|
/\bnew Date\b/,
|
|
/\bperformance\.now\b/,
|
|
/\bset(Timeout|Interval|Immediate)\b/,
|
|
];
|
|
|
|
test("src reads no file, process, network or clock", () => {
|
|
const files = fs.readdirSync(SRC).filter((f) => f.endsWith(".mjs"));
|
|
assert.deepEqual(files.sort(), ["errors.mjs", "index.mjs", "pressure.mjs", "rules.mjs"]);
|
|
for (const f of files) {
|
|
const body = fs.readFileSync(path.join(SRC, f), "utf8");
|
|
for (const re of FORBIDDEN) assert.doesNotMatch(body, re, `${f} matches ${re}`);
|
|
for (const m of body.matchAll(/\bfrom\s+["']([^"']+)["']/g)) assert.match(m[1], /^\.\/[a-z]+\.mjs$/, `${f} imports ${m[1]}`);
|
|
}
|
|
});
|