36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
|
|
import assert from "node:assert/strict";
|
||
|
|
import { readFile, readdir } from "node:fs/promises";
|
||
|
|
import test from "node:test";
|
||
|
|
|
||
|
|
const uiDirectory = new URL("../src/components/ui/", import.meta.url);
|
||
|
|
const appStylesheet = new URL("../src/styles/app.css", import.meta.url);
|
||
|
|
|
||
|
|
test("UI primitives do not depend on page, Host or domain modules", async () => {
|
||
|
|
const files = (await readdir(uiDirectory)).filter(
|
||
|
|
(name) => name.endsWith(".ts") || name.endsWith(".tsx"),
|
||
|
|
);
|
||
|
|
|
||
|
|
for (const file of files) {
|
||
|
|
const source = await readFile(new URL(file, uiDirectory), "utf8");
|
||
|
|
const imports = [...source.matchAll(/from\s+["']([^"']+)["']/g)].map((match) => match[1]);
|
||
|
|
|
||
|
|
for (const specifier of imports) {
|
||
|
|
assert.doesNotMatch(
|
||
|
|
specifier,
|
||
|
|
/(?:^|\/)(?:feedback|host|layout|pages|sdk|services)(?:\/|$)|\/lib\/(?:api|model|view-state)$/,
|
||
|
|
`${file} must remain business-independent: ${specifier}`,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test("global stylesheet does not own component variants", async () => {
|
||
|
|
const source = await readFile(appStylesheet, "utf8");
|
||
|
|
|
||
|
|
assert.doesNotMatch(
|
||
|
|
source,
|
||
|
|
/@layer\s+components/,
|
||
|
|
"component classes and variants belong beside their Solid components",
|
||
|
|
);
|
||
|
|
});
|