mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
feat: move color themes into a bundled themes plugin
This commit is contained in:
1 parent
d049588f7f
commit
b414b85746
20 files changed
+305
-406
No files matched your search
@@ -34,6 +34,7 @@ const OFFICIAL_IDS = [
|
||||
"alerts",
|
||||
"automations",
|
||||
"classic-layout",
|
||||
"classic-themes",
|
||||
"docker",
|
||||
"file-manager",
|
||||
"fleets",
|
||||
|
||||
@@ -35,6 +35,42 @@ function fixturePlugin(): string {
|
||||
}
|
||||
|
||||
describe("termix-plugin build", () => {
|
||||
it("builds a theme only plugin with an empty backend and no source", async () => {
|
||||
vi.spyOn(console, "log").mockImplementation(() => {});
|
||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "termix-build-"));
|
||||
cleanups.push(() => fs.rmSync(dir, { recursive: true, force: true }));
|
||||
fs.writeFileSync(
|
||||
path.join(dir, "manifest.json"),
|
||||
JSON.stringify({
|
||||
id: "theme-fixture",
|
||||
capabilities: ["ui:theme"],
|
||||
contributes: { themes: [{ id: "paper" }] },
|
||||
}),
|
||||
);
|
||||
|
||||
await build({ cwd: dir });
|
||||
|
||||
expect(
|
||||
fs.readFileSync(path.join(dir, "dist", "backend.js"), "utf8"),
|
||||
).toContain("export function activate()");
|
||||
expect(fs.existsSync(path.join(dir, "dist", "frontend.js"))).toBe(false);
|
||||
});
|
||||
|
||||
it("still needs a backend entry once a plugin holds more than themes", async () => {
|
||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "termix-build-"));
|
||||
cleanups.push(() => fs.rmSync(dir, { recursive: true, force: true }));
|
||||
fs.writeFileSync(
|
||||
path.join(dir, "manifest.json"),
|
||||
JSON.stringify({
|
||||
id: "mixed-fixture",
|
||||
capabilities: ["ui:theme", "ui:layout"],
|
||||
contributes: { themes: [{ id: "paper" }] },
|
||||
}),
|
||||
);
|
||||
|
||||
await expect(build({ cwd: dir })).rejects.toThrow("no backend entry");
|
||||
});
|
||||
|
||||
it("marks dist as ESM so Node loads backend.js without reparsing", async () => {
|
||||
vi.spyOn(console, "log").mockImplementation(() => {});
|
||||
const dir = fixturePlugin();
|
||||
|
||||
@@ -99,3 +99,48 @@ describe("termix-plugin validate themes", () => {
|
||||
expect(output).not.toContain("theme paper");
|
||||
});
|
||||
});
|
||||
|
||||
describe("termix-plugin validate layouts and capabilities", () => {
|
||||
function withManifest(extra: Record<string, unknown>) {
|
||||
const root = plugin([]);
|
||||
fs.writeFileSync(
|
||||
path.join(root, "manifest.json"),
|
||||
JSON.stringify({ id: "fixture", version: "1.0.0", ...extra }),
|
||||
);
|
||||
return root;
|
||||
}
|
||||
|
||||
it("flags ui:theme with no themes and ui:layout with no layouts", async () => {
|
||||
const output = await problems(
|
||||
withManifest({ capabilities: ["ui:theme", "ui:layout"] }),
|
||||
);
|
||||
expect(output).toContain(
|
||||
'"ui:theme" is declared but contributes.themes is empty',
|
||||
);
|
||||
expect(output).toContain(
|
||||
'"ui:layout" is declared but contributes.layouts is empty',
|
||||
);
|
||||
});
|
||||
|
||||
it("flags a layout plugin with no frontend source", async () => {
|
||||
const output = await problems(
|
||||
withManifest({
|
||||
capabilities: ["ui:layout"],
|
||||
contributes: { layouts: [{ id: "wide", label: "Wide" }] },
|
||||
}),
|
||||
);
|
||||
expect(output).toContain("contributes.layouts needs a frontend");
|
||||
});
|
||||
|
||||
it("accepts a layout plugin that has a frontend entry", async () => {
|
||||
const root = withManifest({
|
||||
capabilities: ["ui:layout"],
|
||||
contributes: { layouts: [{ id: "wide", label: "Wide" }] },
|
||||
});
|
||||
fs.mkdirSync(path.join(root, "src", "frontend"), { recursive: true });
|
||||
fs.writeFileSync(path.join(root, "src", "frontend", "index.tsx"), "");
|
||||
const output = await problems(root);
|
||||
expect(output).not.toContain("contributes.layouts needs a frontend");
|
||||
expect(output).not.toContain("is declared but");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user