From 65ce04da32df7aa5e7e1183b942e9bc5cbd6ebb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 21:19:13 +0000 Subject: [PATCH 1/2] Bump mermaid from 11.17.2 to 12.1.0 Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 11.17.2 to 12.1.0. - [Release notes](https://github.com/mermaid-js/mermaid/releases) - [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.17.2...mermaid@12.1.0) --- updated-dependencies: - dependency-name: mermaid dependency-version: 12.1.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 111 +++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 81 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index c78e775d03..2258c3eb33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "lucide": "1.55.0", "markdown-it": "15.0.2", "markdown-it-anchor": "10.0.0", - "mermaid": "11.17.2", + "mermaid": "12.1.0", "pagefind": "1.5.2", "playwright": "^1.63.0", "tsx": "4.23.15", @@ -47,10 +47,45 @@ "dev": true, "license": "MIT" }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-13.2.0.tgz", + "integrity": "sha512-bA9dvWlhAUcHkNwU+8w9yiUxJPlj/Lm3VqS7MD+NbIR/7LmpNLuK/AWNFdCo/T3SK5ND0/UHf3IJvl/Jn/i6yg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "13.2.0", + "@chevrotain/types": "13.2.0" + } + }, + "node_modules/@chevrotain/gast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-13.2.0.tgz", + "integrity": "sha512-bCARdAsG+eEbOveSXcOAC7pVxA04I1ionzeMOwIYf5NX7SaS7zgn4Dgug2BSqoL+iyKeMNSorQjsFSHJHsCNwg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "13.2.0" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-13.2.0.tgz", + "integrity": "sha512-kxpUkLtiaK09ph+dib+Yvm+3sWSnuwlo25gqfKRgTPNmF6H7uW4gVkMjaRdtnN783S9sM6vUNWh9CsxYX4QwKw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/@chevrotain/types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", - "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-13.2.0.tgz", + "integrity": "sha512-7qrYHRlKfWf2AvBfJi5eVOrKAkbxvMFsy/iIHTGIiApNcEecCaVIdR+mIQhyCBsTDJxBz4JWXHMo6krbhR9hVg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-13.2.0.tgz", + "integrity": "sha512-SzKYY68rseOrb9KILVzPsl6SjkQtdWw01SRGB5aCVI5kFcHltQsOYV3JB0Ffst72DgkvHCyDQ0NLwxtmCCf97Q==", "dev": true, "license": "Apache-2.0" }, @@ -554,13 +589,16 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz", - "integrity": "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-2.0.1.tgz", + "integrity": "sha512-j37dj/h6p6pots1L7pLPPNuABEEu9WP4OYg9pW1g+nYG331j0+3canE9OagtYdytYvdSAMG+2fKU5cxep6LgjA==", "dev": true, "license": "MIT", "dependencies": { - "@chevrotain/types": "~11.1.2" + "@chevrotain/types": "~13.2.0" + }, + "engines": { + "node": ">=22.12.0" } }, "node_modules/@openclaw/carapace": { @@ -1468,6 +1506,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chevrotain": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-13.2.0.tgz", + "integrity": "sha512-GTouk5YzgBxlTPCaDn5q0q2EJKkrYmnPF+HmF8v0Qo4r3iyPG7HJivkN1wthCXZcm3sIcZFpGTRovLPNdJNRCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "13.2.0", + "@chevrotain/gast": "13.2.0", + "@chevrotain/regexp-to-ast": "13.2.0", + "@chevrotain/types": "13.2.0", + "@chevrotain/utils": "13.2.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", @@ -2205,6 +2260,13 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==", + "dev": true, + "license": "EPL-2.0" + }, "node_modules/entities": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", @@ -2425,16 +2487,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastdom": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastdom/-/fastdom-1.0.12.tgz", - "integrity": "sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==", - "dev": true, - "license": "MIT", - "dependencies": { - "strictdom": "^1.0.1" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -3022,17 +3074,18 @@ "license": "MIT" }, "node_modules/mermaid": { - "version": "11.17.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.17.2.tgz", - "integrity": "sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-12.1.0.tgz", + "integrity": "sha512-wlVCp+8eTupfCeeFvoZNNiTuHrvag0P2jz/ILgb/f/6jkVokUefOcujefi8qUe/j2asHiSePncVsz/xzzA80LQ==", "dev": true, "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.1.2", "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.2.1", + "@mermaid-js/parser": "^2.0.1", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", + "chevrotain": "~13.2.0", "cytoscape": "^3.34.0", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", @@ -3040,9 +3093,9 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.21", - "dompurify": "^3.3.3", + "dompurify": "^3.4.12", + "elkjs": "^0.9.3", "es-toolkit": "^1.45.1", - "fastdom": "1.0.12", "katex": "^0.16.47", "khroma": "^2.1.0", "marked": "^16.3.0", @@ -3050,6 +3103,9 @@ "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + }, + "engines": { + "node": ">=22.12.0" } }, "node_modules/micromark": { @@ -4003,13 +4059,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/strictdom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz", - "integrity": "sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==", - "dev": true, - "license": "MIT" - }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", diff --git a/package.json b/package.json index 7a3f0d1449..140883fc89 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lucide": "1.55.0", "markdown-it": "15.0.2", "markdown-it-anchor": "10.0.0", - "mermaid": "11.17.2", + "mermaid": "12.1.0", "pagefind": "1.5.2", "playwright": "^1.63.0", "tsx": "4.23.15", From 0484b34c96f4b27e88615bbb538db81cd2325dd2 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Fri, 16 Oct 2026 11:50:24 +0800 Subject: [PATCH 2/2] test(docs): assert diagram rendering and cleanup by SVG identity --- scripts/docs-site/visual-smoke.mjs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/docs-site/visual-smoke.mjs b/scripts/docs-site/visual-smoke.mjs index 1bcc2ec399..fb15aa873c 100644 --- a/scripts/docs-site/visual-smoke.mjs +++ b/scripts/docs-site/visual-smoke.mjs @@ -539,7 +539,8 @@ async function expectMermaidDiagrams(page) { ["flowchart LR", "Rendered"], ["stateDiagram-v2", "Complete"], ]) { - const svg = page.locator('.oc-mermaid.is-rendered[data-mermaid*="' + source + '"] svg').first(); + // Expand controls contain SVG icons too; the direct child is the rendered diagram. + const svg = page.locator('.oc-mermaid.is-rendered[data-mermaid*="' + source + '"] > svg').first(); await svg.waitFor({ state: "visible", timeout: 10000 }); if (!(await svg.textContent()).includes(label)) { throw new Error(source + " rendered without its expected labels"); @@ -566,11 +567,11 @@ async function checkMermaid() { try { await page.goto(base + "/__elements", { waitUntil: "networkidle" }); await checkMermaidContent(page); - const before = await page.locator(".oc-mermaid.is-rendered svg").evaluateAll((svgs) => svgs.map((svg) => svg.id)); + const before = await page.locator(".oc-mermaid.is-rendered > svg").evaluateAll((svgs) => svgs.map((svg) => svg.id)); const theme = await page.locator("html").getAttribute("data-theme"); await page.locator(".header-row [data-theme-toggle]").click(); await page.waitForFunction(({ ids, previousTheme }) => { - const svgs = [...document.querySelectorAll(".oc-mermaid.is-rendered svg")]; + const svgs = [...document.querySelectorAll(".oc-mermaid.is-rendered > svg")]; return document.documentElement.dataset.theme !== previousTheme && svgs.length === ids.length && svgs.every((svg, i) => svg.id !== ids[i]); }, { ids: before, previousTheme: theme }); @@ -627,6 +628,7 @@ async function checkMermaidContent(page) { } await page.locator("[data-mermaid-expand]").first().click(); await page.locator("[data-mermaid-overlay].open").waitFor({ state: "visible" }); + await page.locator("[data-mermaid-overlay-canvas] svg").waitFor({ state: "visible", timeout: 10000 }); await page.evaluate(() => history.pushState({ docs: true }, "", `${location.pathname}#fixture-components`)); await page.goBack(); await page.locator("[data-mermaid-overlay].open").waitFor({ state: "hidden" }); @@ -642,6 +644,7 @@ async function checkMermaidContent(page) { } await page.locator("[data-mermaid-expand]").first().click(); await page.locator("[data-mermaid-overlay].open").waitFor({ state: "visible" }); + await page.locator("[data-mermaid-overlay-canvas] svg").waitFor({ state: "visible", timeout: 10000 }); await page.keyboard.press("Meta+K"); if (await page.locator(".search-modal.open").count()) { throw new Error("mermaid overlay allowed the search shortcut"); @@ -655,10 +658,12 @@ async function checkMermaidContent(page) { throw new Error(`mermaid overlay did not close on Escape: ${JSON.stringify(mermaidOverlayClose)}`); } await page.locator(".oc-mermaid.is-error pre code").first().waitFor({ state: "visible", timeout: 10000 }); + // Mermaid 12 reports the parser error; render IDs detect artifacts independent of that wording. const mermaidErrorLeak = await page.evaluate(() => ({ bodyText: document.body.innerText.includes("Syntax error in text"), leakedSvg: [...document.querySelectorAll("svg")] - .some((svg) => !svg.closest("[data-mermaid]") && svg.textContent?.includes("Syntax error in text")), + .some((svg) => !svg.closest("[data-mermaid]") + && (svg.id.startsWith("oc_mermaid_") || svg.textContent?.includes("Syntax error in text"))), })); if (mermaidErrorLeak.bodyText || mermaidErrorLeak.leakedSvg) { throw new Error(`mermaid error artifact leaked into shell: ${JSON.stringify(mermaidErrorLeak)}`);