Release Diagram Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 12:11:46 +02:00
parent b78f20f66a
commit f128568e4e
24 changed files with 599 additions and 77 deletions
+1 -1
View File
@@ -74,6 +74,6 @@ test("PWA theme, offline reload, and headers", async ({
const manifest = await request.get("/deep/nested/diagram/toolbox-app.json");
await expect(manifest.json()).resolves.toMatchObject({
id: "de.add-ideas.diagram-tools",
version: "0.1.0",
version: "0.2.0",
});
});
+18
View File
@@ -0,0 +1,18 @@
import { expect, test } from "@playwright/test";
test("keeps the primary workspace inside a narrow viewport", async ({
page,
}) => {
await page.goto("/deep/nested/diagram/");
await expect(page.locator("main").first()).toBeVisible();
await expect(
page.locator("main .loading, main .workbench-loading"),
).toHaveCount(0);
const widths = await page.evaluate(() => ({
content: document.documentElement.scrollWidth,
viewport: document.documentElement.clientWidth,
}));
expect(widths.viewport).toBeLessThanOrEqual(430);
expect(widths.content).toBeLessThanOrEqual(widths.viewport + 1);
});
+41 -2
View File
@@ -23,9 +23,29 @@ describe("diagram grammar", () => {
parseDiagram("classDiagram\nclass A\nA : +field\nA <|-- B").nodes[0]
?.members,
).toEqual(["+field"]);
expect(parseDiagram("stateDiagram-v2\nIdle --> Ready : go").mode).toBe(
"state",
const state = parseDiagram(
'stateDiagram-v2\n[*] --> Idle\nstate "Working" as Ready\nIdle --> Ready : go\nReady --> [*]',
);
expect(state.mode).toBe("state");
expect(state.diagnostics).toEqual([]);
expect(state.edges.map((edge) => edge.label)).toContain("go");
expect(state.nodes.map((node) => node.id)).toEqual([
"__start",
"Idle",
"Ready",
"__end",
]);
});
it("supports bounded class member blocks and reports unclosed blocks", () => {
const diagram = parseDiagram(
"classDiagram\nclass Account {\n +String id\n +close()\n}\nAccount --> Ledger",
);
expect(diagram.diagnostics).toEqual([]);
expect(diagram.nodes[0]?.members).toEqual(["+String id", "+close()"]);
expect(
parseDiagram("classDiagram\nclass Account {\n +String id").diagnostics[0]
?.message,
).toMatch(/no closing/iu);
});
it("diagnoses directives without executing", () => {
const d = parseDiagram(
@@ -34,4 +54,23 @@ describe("diagram grammar", () => {
expect(d.diagnostics).toHaveLength(2);
expect(renderSvg(d)).not.toContain("bad.test");
});
it("supports ER attributes, mind maps, timelines and sequence notes", () => {
const er = parseDiagram(
"erDiagram\nUSER {\n string id PK\n}\nUSER ||--o{ ORDER : places",
);
expect(er.mode).toBe("er");
expect(er.nodes.find((node) => node.id === "USER")?.members).toEqual([
"string id PK",
]);
expect(er.edges[0]?.label).toContain("places");
expect(parseDiagram("mindmap\n Root\n Child").edges).toHaveLength(1);
expect(
parseDiagram("timeline\nsection Build\n2026 : Release").nodes,
).toHaveLength(2);
expect(
parseDiagram(
"sequenceDiagram\nparticipant A\nparticipant B\nNote over A,B: inert",
).edges[0],
).toMatchObject({ arrow: false, dashed: true });
});
});