diff --git a/.changeset/add-vert-tag-bar-chart.md b/.changeset/add-vert-tag-bar-chart.md new file mode 100644 index 000000000..4ab74059c --- /dev/null +++ b/.changeset/add-vert-tag-bar-chart.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +feat: Add Vertical Line To Gantt Plot At Specified Time diff --git a/.changeset/eleven-wolves-deny.md b/.changeset/eleven-wolves-deny.md new file mode 100644 index 000000000..76bb69ec5 --- /dev/null +++ b/.changeset/eleven-wolves-deny.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +chore: Convert StateDB into TypeScript diff --git a/.changeset/gold-shoes-camp.md b/.changeset/gold-shoes-camp.md new file mode 100644 index 000000000..3018e7381 --- /dev/null +++ b/.changeset/gold-shoes-camp.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: Remove incorrect `style="undefined;"` attributes in some Mermaid diagrams diff --git a/.changeset/honest-trees-dress.md b/.changeset/honest-trees-dress.md new file mode 100644 index 000000000..054f1bedb --- /dev/null +++ b/.changeset/honest-trees-dress.md @@ -0,0 +1,7 @@ +--- +'@mermaid-js/mermaid-zenuml': patch +--- + +chore: bump minimum ZenUML version to 3.23.28 + +commit: 9d06d8f31e7f12af9e9e092214f907f2dc93ad75 diff --git a/.changeset/neat-moose-compare.md b/.changeset/neat-moose-compare.md new file mode 100644 index 000000000..98a064789 --- /dev/null +++ b/.changeset/neat-moose-compare.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +feat: Add support for styling Journey Diagram title (color, font-family, and font-size) diff --git a/.changeset/proud-seahorses-wash.md b/.changeset/proud-seahorses-wash.md new file mode 100644 index 000000000..8b844b679 --- /dev/null +++ b/.changeset/proud-seahorses-wash.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +FontAwesome icons can now be embedded as SVGs in flowcharts if they are registered via `mermaid.registerIconPacks`. diff --git a/.changeset/sad-mails-accept.md b/.changeset/sad-mails-accept.md new file mode 100644 index 000000000..11dd69d8d --- /dev/null +++ b/.changeset/sad-mails-accept.md @@ -0,0 +1,6 @@ +--- +'mermaid': patch +'@mermaid-js/parser': patch +--- + +Refactor grammar so that title don't break Architecture Diagrams diff --git a/.changeset/sixty-deer-tell.md b/.changeset/sixty-deer-tell.md new file mode 100644 index 000000000..fd48d2aea --- /dev/null +++ b/.changeset/sixty-deer-tell.md @@ -0,0 +1,5 @@ +--- +'mermaid': major +--- + +fix: allow sequence diagram arrows with a trailing colon but no message diff --git a/.changeset/soft-readers-tan.md b/.changeset/soft-readers-tan.md new file mode 100644 index 000000000..ec3fa97af --- /dev/null +++ b/.changeset/soft-readers-tan.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +feat: Dynamically Render Data Labels Within Bar Charts diff --git a/.changeset/ten-lamps-trade.md b/.changeset/ten-lamps-trade.md new file mode 100644 index 000000000..991a70daf --- /dev/null +++ b/.changeset/ten-lamps-trade.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: allow colons in events diff --git a/.changeset/yellow-mirrors-change.md b/.changeset/yellow-mirrors-change.md new file mode 100644 index 000000000..09a766104 --- /dev/null +++ b/.changeset/yellow-mirrors-change.md @@ -0,0 +1,7 @@ +--- +'@mermaid-js/mermaid-zenuml': patch +--- + +fix(zenuml): limit `peerDependencies` to Mermaid v10 and v11 + +commit: 0ad44c12feead9d20c6a870a49327ada58d6e657 diff --git a/.cspell/code-terms.txt b/.cspell/code-terms.txt index f4862006f..285b66365 100644 --- a/.cspell/code-terms.txt +++ b/.cspell/code-terms.txt @@ -53,7 +53,6 @@ frontmatter funs gantt GENERICTYPE -getBoundarys grammr graphtype halign diff --git a/.cspell/libraries.txt b/.cspell/libraries.txt index 185d284f7..feee10fd1 100644 --- a/.cspell/libraries.txt +++ b/.cspell/libraries.txt @@ -26,6 +26,7 @@ dompurify elkjs fcose fontawesome +Fonticons Forgejo Foswiki Gitea diff --git a/.esbuild/build.ts b/.esbuild/build.ts index 423e8f047..05002cb16 100644 --- a/.esbuild/build.ts +++ b/.esbuild/build.ts @@ -34,6 +34,19 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => { { ...iifeOptions, minify: true, metafile: shouldVisualize } ); } + if (entryName === 'mermaid-zenuml') { + const iifeOptions: MermaidBuildOptions = { + ...commonOptions, + format: 'iife', + globalName: 'mermaid-zenuml', + }; + buildConfigs.push( + // mermaid-zenuml.js + { ...iifeOptions }, + // mermaid-zenuml.min.js + { ...iifeOptions, minify: true, metafile: shouldVisualize } + ); + } const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option)))); diff --git a/.esbuild/util.ts b/.esbuild/util.ts index 6d6d1d59b..dde0352af 100644 --- a/.esbuild/util.ts +++ b/.esbuild/util.ts @@ -58,6 +58,7 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { format, minify, options: { name, file, packageName }, + globalName = 'mermaid', } = options; const external: string[] = ['require', 'fs', 'path']; const outFileName = getFileName(name, options); @@ -68,6 +69,7 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { }, metafile, minify, + globalName, logLevel: 'info', chunkNames: `chunks/${outFileName}/[name]-[hash]`, define: { @@ -89,11 +91,12 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { if (format === 'iife') { output.format = 'iife'; output.splitting = false; - output.globalName = '__esbuild_esm_mermaid'; + const originalGlobalName = output.globalName ?? 'mermaid'; + output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`; // Workaround for removing the .default access in esbuild IIFE. // https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396 output.footer = { - js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;', + js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`, }; output.outExtension = { '.js': '.js' }; } else { diff --git a/.github/ISSUE_TEMPLATE/theme_proposal.yml b/.github/ISSUE_TEMPLATE/theme_proposal.yml index da4fddbec..2e55b71d6 100644 --- a/.github/ISSUE_TEMPLATE/theme_proposal.yml +++ b/.github/ISSUE_TEMPLATE/theme_proposal.yml @@ -29,7 +29,7 @@ body: label: Colors description: |- A detailed list of the different colour values to use. - A list of currently used variable names can be found [here](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table) + See the [list of currently used variable names](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table) placeholder: |- - background: #f4f4f4 - primaryColor: #fff4dd diff --git a/.github/lychee.toml b/.github/lychee.toml index 5070c3d50..b4e8ba0fb 100644 --- a/.github/lychee.toml +++ b/.github/lychee.toml @@ -46,11 +46,13 @@ exclude = [ # Drupal 403 "https://(www.)?drupal.org", -# Swimm returns 404, eventhough the link is valid +# Swimm returns 404, even though the link is valid "https://docs.swimm.io", # Timeout -"https://huehive.co" +"https://huehive.co", +"https://foswiki.org", +"https://www.gnu.org", ] # Exclude all private IPs from checking. diff --git a/.github/stale.yml b/.github/stale.yml index 30c4ca4a0..94a16dfbd 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -15,5 +15,5 @@ markComment: > If you are still interested in this issue and it is still relevant you can comment to revive it. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: > - This issue has been been automatically closed due to a lack of activity. + This issue has been automatically closed due to a lack of activity. This is done to maintain a clean list of issues that the community is interested in developing. diff --git a/.github/workflows/e2e-applitools.yml b/.github/workflows/e2e-applitools.yml index 9c357a581..dd97b49e1 100644 --- a/.github/workflows/e2e-applitools.yml +++ b/.github/workflows/e2e-applitools.yml @@ -45,13 +45,15 @@ jobs: - if: ${{ env.USE_APPLI }} name: Notify applitools of new batch # Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html - run: curl -L -d '' -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH" env: # e.g. mermaid-js/mermaid/my-branch APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }} APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }} APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }} APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com' + uses: wei/curl@012398a392d02480afa2720780031f8621d5f94c + with: + args: -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH" - name: Cypress run uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 diff --git a/.github/workflows/e2e-timings.yml b/.github/workflows/e2e-timings.yml index b51557b69..ca78d0b3a 100644 --- a/.github/workflows/e2e-timings.yml +++ b/.github/workflows/e2e-timings.yml @@ -11,6 +11,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }} permissions: contents: write + pull-requests: write jobs: timings: @@ -29,6 +30,7 @@ jobs: uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 with: runTests: false + - name: Cypress run uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 id: cypress @@ -44,15 +46,25 @@ jobs: SPLIT: 1 SPLIT_INDEX: 0 SPLIT_FILE: 'cypress/timings.json' - - name: Commit changes - uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 + + - name: Compare timings + id: compare + run: | + OUTPUT=$(pnpm tsx scripts/compare-timings.ts) + echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY + + echo "output<> $GITHUB_OUTPUT + echo "$OUTPUT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Commit and create pull request + uses: peter-evans/create-pull-request@3b1f4bffdc97d7b055dd96732d7348e585ad2c4e with: - add: 'cypress/timings.json' - author_name: 'github-actions[bot]' - author_email: '41898282+github-actions[bot]@users.noreply.github.com' - message: 'chore: update E2E timings' - - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 - with: - branch: release-promotion + add-paths: | + cypress/timings.json + commit-message: 'chore: update E2E timings' + branch: update-timings title: Update E2E Timings + body: ${{ steps.compare.outputs.output }} + delete-branch: true + sign-commits: true diff --git a/CHANGELOG.md b/CHANGELOG.md index ede5e19ad..8a4c0a414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -256,7 +256,7 @@ mermaid.run({ - Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502) - logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501) - How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500) -- Mermaid neutral style style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499) +- Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499) - Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495) - Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493) - Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490) @@ -833,7 +833,7 @@ mermaid.run({ - Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic)) - Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime)) - Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic)) -- Github buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic)) +- GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic)) - Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic)) ## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05) @@ -1002,4 +1002,4 @@ mermaid.run({ ## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16) -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ +\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator)_ diff --git a/README.md b/README.md index 2fca46b25..760ce0f25 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Try Live Editor previews of future releases: Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out! +Banner for "The Official Guide to Mermaid.js" book ## Table of content @@ -451,7 +451,7 @@ For public sites, it can be precarious to retrieve text from users on the intern As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security. -_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ +_Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ ## Reporting vulnerabilities diff --git a/README.zh-CN.md b/README.zh-CN.md index e5b20caed..cd44e56b6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -43,13 +43,13 @@ Mermaid **感谢所有参与进来提交 PR,解答疑问的人们! 🙏** -Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out! +Banner for "The Official Guide to Mermaid.js" book ## 关于 Mermaid -Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 +Mermaid 是一个基于 JavaScript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 > Doc-Rot 是 Mermaid 致力于解决的一个难题。 diff --git a/cypress/integration/other/interaction.spec.js b/cypress/integration/other/interaction.spec.js index 857141b5b..e57701fd9 100644 --- a/cypress/integration/other/interaction.spec.js +++ b/cypress/integration/other/interaction.spec.js @@ -20,7 +20,7 @@ describe('Interaction', () => { }); it('Graph: should handle a click on a node with a bound url', () => { - // When there is a URL, cy.contains selects the a tag instead of the span. The .node is a child of a, so we have to use find instead of parent. + // When there is a URL, `cy.contains()` selects the `a` tag instead of the `span` tag. The .node is a child of `a`, so we have to use `find()` instead of `parent`. cy.contains('URLTest1').find('.node').click(); cy.location().should(({ href }) => { expect(href).to.eq('http://localhost:9000/empty.html'); @@ -146,7 +146,7 @@ describe('Interaction', () => { }); }); - describe('Interaction - security level other, missspelling', () => { + describe('Interaction - security level other, misspelling', () => { beforeEach(() => { cy.visit('http://localhost:9000/click_security_other.html'); }); diff --git a/cypress/integration/rendering/architecture.spec.ts b/cypress/integration/rendering/architecture.spec.ts index 25326ff80..997a6654e 100644 --- a/cypress/integration/rendering/architecture.spec.ts +++ b/cypress/integration/rendering/architecture.spec.ts @@ -19,6 +19,25 @@ describe.skip('architecture diagram', () => { ` ); }); + it('should render a simple architecture diagram with titleAndAccessibilities', () => { + imgSnapshotTest( + `architecture-beta + title Simple Architecture Diagram + accTitle: Accessibility Title + accDescr: Accessibility Description + group api(cloud)[API] + + service db(database)[Database] in api + service disk1(disk)[Storage] in api + service disk2(disk)[Storage] in api + service server(server)[Server] in api + + db:L -- R:server + disk1:T -- B:server + disk2:T -- B:db + ` + ); + }); it('should render an architecture diagram with groups within groups', () => { imgSnapshotTest( `architecture-beta @@ -172,7 +191,7 @@ describe.skip('architecture diagram', () => { ); }); - it('should render an architecture diagram with a resonable height', () => { + it('should render an architecture diagram with a reasonable height', () => { imgSnapshotTest( `architecture-beta group federated(cloud)[Federated Environment] diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js index f5d5103e8..589a30fde 100644 --- a/cypress/integration/rendering/block.spec.js +++ b/cypress/integration/rendering/block.spec.js @@ -14,7 +14,7 @@ describe('Block diagram', () => { ); }); - it('BL2: should handle colums statement in sub-blocks', () => { + it('BL2: should handle columns statement in sub-blocks', () => { imgSnapshotTest( `block-beta id1["Hello"] @@ -30,7 +30,7 @@ describe('Block diagram', () => { ); }); - it('BL3: should align block widths and handle colums statement in sub-blocks', () => { + it('BL3: should align block widths and handle columns statement in sub-blocks', () => { imgSnapshotTest( `block-beta block @@ -46,7 +46,7 @@ describe('Block diagram', () => { ); }); - it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => { + it('BL4: should align block widths and handle columns statements in deeper sub-blocks then 1 level', () => { imgSnapshotTest( `block-beta columns 1 @@ -66,7 +66,7 @@ describe('Block diagram', () => { ); }); - it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => { + it('BL5: should align block widths and handle columns statements in deeper sub-blocks then 1 level (alt)', () => { imgSnapshotTest( `block-beta columns 1 @@ -236,7 +236,7 @@ describe('Block diagram', () => { ); }); - it('BL17: width alignment - blocks shold be equal in width', () => { + it('BL17: width alignment - blocks should be equal in width', () => { imgSnapshotTest( `block-beta A("This is the text") diff --git a/cypress/integration/rendering/classDiagram.spec.js b/cypress/integration/rendering/classDiagram.spec.js index a98a359ed..e7d201b5d 100644 --- a/cypress/integration/rendering/classDiagram.spec.js +++ b/cypress/integration/rendering/classDiagram.spec.js @@ -429,7 +429,7 @@ describe('Class diagram', () => { classDiagram class \`This\nTitle\nHas\nMany\nNewlines\` { +String Also - -Stirng Many + -String Many #int Members +And() -Many() @@ -443,7 +443,7 @@ describe('Class diagram', () => { classDiagram class \`This\nTitle\nHas\nMany\nNewlines\` { +String Also - -Stirng Many + -String Many #int Members +And() -Many() @@ -459,7 +459,7 @@ describe('Class diagram', () => { namespace testingNamespace { class \`This\nTitle\nHas\nMany\nNewlines\` { +String Also - -Stirng Many + -String Many #int Members +And() -Many() diff --git a/cypress/integration/rendering/flowchart-elk.spec.js b/cypress/integration/rendering/flowchart-elk.spec.js index c31df1181..27af2c40c 100644 --- a/cypress/integration/rendering/flowchart-elk.spec.js +++ b/cypress/integration/rendering/flowchart-elk.spec.js @@ -208,13 +208,13 @@ describe('Flowchart ELK', () => { `flowchart-elk TB internet nat - routeur + router lb1 lb2 compute1 compute2 subgraph project - routeur + router nat subgraph subnet1 compute1 @@ -225,8 +225,8 @@ describe('Flowchart ELK', () => { lb2 end end - internet --> routeur - routeur --> subnet1 & subnet2 + internet --> router + router --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet `, { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } @@ -443,7 +443,7 @@ flowchart-elk TD { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } ); }); - it('63-elk: title on subgraphs should be themable', () => { + it('63-elk: title on subgraphs should be themeable', () => { imgSnapshotTest( ` %%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%% diff --git a/cypress/integration/rendering/flowchart-icon.spec.js b/cypress/integration/rendering/flowchart-icon.spec.js new file mode 100644 index 000000000..a76e8aabd --- /dev/null +++ b/cypress/integration/rendering/flowchart-icon.spec.js @@ -0,0 +1,28 @@ +import { imgSnapshotTest } from '../../helpers/util.ts'; + +const themes = ['default', 'forest', 'dark', 'base', 'neutral']; + +describe('when rendering flowchart with icons', () => { + for (const theme of themes) { + it(`should render icons from fontawesome library on theme ${theme}`, () => { + imgSnapshotTest( + `flowchart TD + A("fab:fa-twitter Twitter") --> B("fab:fa-facebook Facebook") + B --> C("fa:fa-coffee Coffee") + C --> D("fa:fa-car Car") + D --> E("fab:fa-github GitHub") + `, + { theme } + ); + }); + + it(`should render registered icons on theme ${theme}`, () => { + imgSnapshotTest( + `flowchart TD + A("fa:fa-bell Bell") + `, + { theme } + ); + }); + } +}); diff --git a/cypress/integration/rendering/flowchart-v2.spec.js b/cypress/integration/rendering/flowchart-v2.spec.js index 4322500df..97fc1ecbd 100644 --- a/cypress/integration/rendering/flowchart-v2.spec.js +++ b/cypress/integration/rendering/flowchart-v2.spec.js @@ -99,7 +99,7 @@ describe('Flowchart v2', () => { const style = svg.attr('style'); expect(style).to.match(/^max-width: [\d.]+px;$/); const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join('')); - expect(maxWidthValue).to.be.within(417 * 0.95, 417 * 1.05); + expect(maxWidthValue).to.be.within(440 * 0.95, 440 * 1.05); }); }); it('8: should render a flowchart when useMaxWidth is false', () => { @@ -118,7 +118,7 @@ describe('Flowchart v2', () => { const width = parseFloat(svg.attr('width')); // use within because the absolute value can be slightly different depending on the environment ±5% // expect(height).to.be.within(446 * 0.95, 446 * 1.05); - expect(width).to.be.within(417 * 0.95, 417 * 1.05); + expect(width).to.be.within(440 * 0.95, 440 * 1.05); expect(svg).to.not.have.attr('style'); }); }); @@ -198,13 +198,13 @@ describe('Flowchart v2', () => { `flowchart TB internet nat - routeur + router lb1 lb2 compute1 compute2 subgraph project - routeur + router nat subgraph subnet1 compute1 @@ -215,8 +215,8 @@ describe('Flowchart v2', () => { lb2 end end - internet --> routeur - routeur --> subnet1 & subnet2 + internet --> router + router --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet `, { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } @@ -433,7 +433,7 @@ flowchart TD { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } ); }); - it('63: title on subgraphs should be themable', () => { + it('63: title on subgraphs should be themeable', () => { imgSnapshotTest( ` %%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%% @@ -699,7 +699,7 @@ A --> B { flowchart: { titleTopMargin: 10 } } ); }); - it('3192: It should be possieble to render flowcharts with invisible edges', () => { + it('3192: It should be possible to render flowcharts with invisible edges', () => { imgSnapshotTest( `--- title: Simple flowchart with invisible edges @@ -1076,11 +1076,11 @@ end ); }); }); - describe('New @ sytax for node metadata edge cases', () => { + describe('New @ syntax for node metadata edge cases', () => { it('should be possible to use @ syntax to add labels on multi nodes', () => { imgSnapshotTest( `flowchart TB - n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"} + n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"} `, {} ); @@ -1088,7 +1088,7 @@ end it('should be possible to use @ syntax to add labels with trail spaces and &', () => { imgSnapshotTest( `flowchart TB - n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"} + n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"} `, {} ); @@ -1097,8 +1097,8 @@ end imgSnapshotTest( `flowchart TB n2["label for n2"] - n4@{ label: "labe for n4"} - n5@{ label: "labe for n5"} + n4@{ label: "label for n4"} + n5@{ label: "label for n5"} `, {} ); diff --git a/cypress/integration/rendering/flowchart.spec.js b/cypress/integration/rendering/flowchart.spec.js index 7b986cd2f..40713ac4e 100644 --- a/cypress/integration/rendering/flowchart.spec.js +++ b/cypress/integration/rendering/flowchart.spec.js @@ -934,4 +934,43 @@ graph TD } ); }); + it('68: should honor subgraph direction when inheritDir is false', () => { + imgSnapshotTest( + ` + %%{init: {"flowchart": { "inheritDir": false }}}%% + flowchart TB + direction LR + subgraph A + direction TB + a --> b + end + subgraph B + c --> d + end + `, + { + fontFamily: 'courier', + } + ); + }); + + it('69: should inherit global direction when inheritDir is true', () => { + imgSnapshotTest( + ` + %%{init: {"flowchart": { "inheritDir": true }}}%% + flowchart TB + direction LR + subgraph A + direction TB + a --> b + end + subgraph B + c --> d + end + `, + { + fontFamily: 'courier', + } + ); + }); }); diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js index a0c2dbcb9..2cc67918c 100644 --- a/cypress/integration/rendering/gantt.spec.js +++ b/cypress/integration/rendering/gantt.spec.js @@ -117,7 +117,7 @@ describe('Gantt diagram', () => { {} ); }); - it('should FAIL redering a gantt chart for issue #1060 with invalid date', () => { + it('should FAIL rendering a gantt chart for issue #1060 with invalid date', () => { imgSnapshotTest( ` gantt @@ -358,6 +358,23 @@ describe('Gantt diagram', () => { ); }); + it('should render a gantt diagram with a vert tag', () => { + imgSnapshotTest( + ` + gantt + title A Gantt Diagram + dateFormat ss + axisFormat %Ss + + section Section + A task : a1, 00, 6s + Milestone : vert, 01, + section Another + Task in sec : 06, 3s + another task : 3s + ` + ); + }); it('should render a gantt diagram with tick is 2 milliseconds', () => { imgSnapshotTest( ` @@ -573,7 +590,7 @@ describe('Gantt diagram', () => { ` ); }); - it('should render a gantt diagram exculding friday and saturday', () => { + it('should render a gantt diagram excluding friday and saturday', () => { imgSnapshotTest( `gantt title A Gantt Diagram @@ -584,7 +601,7 @@ describe('Gantt diagram', () => { A task :a1, 2024-02-28, 10d` ); }); - it('should render a gantt diagram exculding saturday and sunday', () => { + it('should render a gantt diagram excluding saturday and sunday', () => { imgSnapshotTest( `gantt title A Gantt Diagram @@ -671,7 +688,7 @@ describe('Gantt diagram', () => { title Gantt Digram dateFormat YYYY-MM-DD section Section - ;A task with a semiclon :a1, 2014-01-01, 30d + ;A task with a semicolon :a1, 2014-01-01, 30d Another task :after a1 , 20d section Another Task in sec :2014-01-12 , 12d diff --git a/cypress/integration/rendering/gitGraph.spec.js b/cypress/integration/rendering/gitGraph.spec.js index 249febd08..42dc57439 100644 --- a/cypress/integration/rendering/gitGraph.spec.js +++ b/cypress/integration/rendering/gitGraph.spec.js @@ -11,7 +11,7 @@ describe('Git Graph diagram', () => { {} ); }); - it('2: should render a simple gitgraph with commit on main branch with Id', () => { + it('2: should render a simple gitgraph with commit on main branch with id', () => { imgSnapshotTest( `gitGraph commit id: "One" @@ -253,7 +253,7 @@ describe('Git Graph diagram', () => { ` gitGraph checkout main - %% Make sure to manually set the ID of all commits, for consistent visual tests + %% Make sure to manually set the id of all commits, for consistent visual tests commit id: "1-abcdefg" checkout main branch branch1 @@ -343,7 +343,7 @@ gitGraph {} ); }); - it('16: should render a simple gitgraph with commit on main branch with Id | Vertical Branch', () => { + it('16: should render a simple gitgraph with commit on main branch with id | Vertical Branch', () => { imgSnapshotTest( `gitGraph TB: commit id: "One" @@ -585,7 +585,7 @@ gitGraph ` gitGraph TB: checkout main - %% Make sure to manually set the ID of all commits, for consistent visual tests + %% Make sure to manually set the id of all commits, for consistent visual tests commit id: "1-abcdefg" checkout main branch branch1 @@ -1024,7 +1024,7 @@ gitGraph TB: {} ); }); - it('51: should render a simple gitgraph with commit on main branch with Id | Vertical Branch - Bottom-to-top', () => { + it('51: should render a simple gitgraph with commit on main branch with id | Vertical Branch - Bottom-to-top', () => { imgSnapshotTest( `gitGraph BT: commit id: "One" @@ -1266,7 +1266,7 @@ gitGraph TB: ` gitGraph BT: checkout main - %% Make sure to manually set the ID of all commits, for consistent visual tests + %% Make sure to manually set the id of all commits, for consistent visual tests commit id: "1-abcdefg" checkout main branch branch1 @@ -1491,7 +1491,7 @@ gitGraph TB: ` gitGraph switch main - %% Make sure to manually set the ID of all commits, for consistent visual tests + %% Make sure to manually set the id of all commits, for consistent visual tests commit id: "1-abcdefg" switch main branch branch1 diff --git a/cypress/integration/rendering/journey.spec.js b/cypress/integration/rendering/journey.spec.js index d8bef6d1b..70d5574b8 100644 --- a/cypress/integration/rendering/journey.spec.js +++ b/cypress/integration/rendering/journey.spec.js @@ -63,4 +63,199 @@ section Checkout from website { journey: { useMaxWidth: false } } ); }); + + it('should initialize with a left margin of 150px for user journeys', () => { + renderGraph( + ` + --- + config: + journey: + maxLabelWidth: 320 + --- + journey + title User Journey Example + section Onboarding + Sign Up: 5: + Browse Features: 3: + Use Core Functionality: 4: + section Engagement + Browse Features: 3 + Use Core Functionality: 4 + `, + { journey: { useMaxWidth: true } } + ); + + let diagramStartX; + + cy.contains('foreignobject', 'Sign Up').then(($diagram) => { + diagramStartX = parseFloat($diagram.attr('x')); + expect(diagramStartX).to.be.closeTo(150, 2); + }); + }); + + it('should maintain sufficient space between legend and diagram when legend labels are longer', () => { + renderGraph( + `journey + title Web hook life cycle + section Darkoob + Make preBuilt:5: Darkoob user + register slug : 5: Darkoob userf deliberately increasing the size of this label to check if distance between legend and diagram is maintained + Map slug to a Prebuilt Job:5: Darkoob user + section External Service + set Darkoob slug as hook for an Event : 5 : admin Exjjjnjjjj qwerty + listen to the events : 5 : External Service + call darkoob endpoint : 5 : External Service + section Darkoob + check for inputs : 5 : DarkoobAPI + run the prebuilt job : 5 : DarkoobAPI + `, + { journey: { useMaxWidth: true } } + ); + + let LabelEndX, diagramStartX; + + // Get right edge of the legend + cy.contains('tspan', 'Darkoob userf').then((textBox) => { + const bbox = textBox[0].getBBox(); + LabelEndX = bbox.x + bbox.width; + }); + + // Get left edge of the diagram + cy.contains('foreignobject', 'Make preBuilt').then((rect) => { + diagramStartX = parseFloat(rect.attr('x')); + }); + + // Assert right edge of the diagram is greater than or equal to the right edge of the label + cy.then(() => { + expect(diagramStartX).to.be.gte(LabelEndX); + }); + }); + + it('should wrap a single long word with hyphenation', () => { + renderGraph( + ` + --- + config: + journey: + maxLabelWidth: 100 + --- + journey + title Long Word Test + section Test + VeryLongWord: 5: Supercalifragilisticexpialidocious + `, + { journey: { useMaxWidth: true } } + ); + + // Verify that the line ends with a hyphen, indicating proper hyphenation for words exceeding maxLabelWidth. + cy.get('tspan').then((tspans) => { + const hasHyphen = [...tspans].some((t) => t.textContent.trim().endsWith('-')); + return expect(hasHyphen).to.be.true; + }); + }); + + it('should wrap text on whitespace without adding hyphens', () => { + renderGraph( + ` + --- + config: + journey: + maxLabelWidth: 200 + --- + journey + title Whitespace Test + section Test + TextWithSpaces: 5: Gustavo Fring is played by Giancarlo Esposito and is a character in Breaking Bad. + `, + { journey: { useMaxWidth: true } } + ); + + // Verify that none of the text spans end with a hyphen. + cy.get('tspan').each(($el) => { + const text = $el.text(); + expect(text.trim()).not.to.match(/-$/); + }); + }); + + it('should wrap long labels into multiple lines, keep them under max width, and maintain margins', () => { + renderGraph( + ` + --- + config: + journey: + maxLabelWidth: 320 + --- + journey + title User Journey Example + section Onboarding + Sign Up: 5: This is a long label that will be split into multiple lines to test the wrapping functionality + Browse Features: 3: This is another long label that will be split into multiple lines to test the wrapping functionality + Use Core Functionality: 4: This is yet another long label that will be split into multiple lines to test the wrapping functionality + section Engagement + Browse Features: 3 + Use Core Functionality: 4 + `, + { journey: { useMaxWidth: true } } + ); + + let diagramStartX, maxLineWidth; + + // Get the diagram's left edge x-coordinate + cy.contains('foreignobject', 'Sign Up') + .then(($diagram) => { + diagramStartX = parseFloat($diagram.attr('x')); + }) + .then(() => { + cy.get('text.legend').then(($lines) => { + // Check that there are multiple lines + expect($lines.length).to.be.equal(9); + + // Check that all lines are under the maxLabelWidth + $lines.each((index, el) => { + const bbox = el.getBBox(); + expect(bbox.width).to.be.lte(320); + maxLineWidth = Math.max(maxLineWidth || 0, bbox.width); + }); + + /** The expected margin between the diagram and the legend is 150px, as defined by + * conf.leftMargin in user-journey-config.js + */ + expect(diagramStartX - maxLineWidth).to.be.closeTo(150, 2); + }); + }); + }); + + it('should correctly render the user journey diagram title with the specified styling', () => { + renderGraph( + `--- +config: + journey: + titleColor: "#2900A5" + titleFontFamily: "Times New Roman" + titleFontSize: "5rem" +--- + +journey + title User Journey Example + section Onboarding + Sign Up: 5: John, Shahir + Complete Profile: 4: John + section Engagement + Browse Features: 3: John + Use Core Functionality: 4: John + section Retention + Revisit Application: 5: John + Invite Friends: 3: John + + size: 2rem + ` + ); + + cy.get('text').contains('User Journey Example').as('title'); + cy.get('@title').then(($title) => { + expect($title).to.have.attr('fill', '#2900A5'); + expect($title).to.have.attr('font-family', 'Times New Roman'); + expect($title).to.have.attr('font-size', '5rem'); + }); + }); }); diff --git a/cypress/integration/rendering/kanban.spec.ts b/cypress/integration/rendering/kanban.spec.ts index 6293776d6..0ff564cc6 100644 --- a/cypress/integration/rendering/kanban.spec.ts +++ b/cypress/integration/rendering/kanban.spec.ts @@ -62,7 +62,7 @@ describe('Kanban diagram', () => { {} ); }); - it('6: should handle assigments', () => { + it('6: should handle assignments', () => { imgSnapshotTest( `kanban id1[Todo] @@ -118,7 +118,7 @@ kanban docs[Create Documentation] docs[Create Blog about the new diagram] id7[In progress] - id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.] + id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.] id8[Design grammar]@{ assigned: 'knsv' } id9[Ready for deploy] id10[Ready for test] diff --git a/cypress/integration/rendering/mindmap.spec.ts b/cypress/integration/rendering/mindmap.spec.ts index a77459f58..731f861ee 100644 --- a/cypress/integration/rendering/mindmap.spec.ts +++ b/cypress/integration/rendering/mindmap.spec.ts @@ -146,7 +146,7 @@ root shouldHaveRoot ); }); - it('text shouhld wrap with icon', () => { + it('text should wrap with icon', () => { imgSnapshotTest( `mindmap root diff --git a/cypress/integration/rendering/pie.spec.ts b/cypress/integration/rendering/pie.spec.ts index 4a1d774c0..171a83057 100644 --- a/cypress/integration/rendering/pie.spec.ts +++ b/cypress/integration/rendering/pie.spec.ts @@ -64,7 +64,7 @@ describe('pie chart', () => { }); }); - it('should render a pie diagram when textPosition is setted', () => { + it('should render a pie diagram when textPosition is set', () => { imgSnapshotTest( `pie "Dogs": 50 diff --git a/cypress/integration/rendering/quadrantChart.spec.js b/cypress/integration/rendering/quadrantChart.spec.js index 4830db656..3a1e768aa 100644 --- a/cypress/integration/rendering/quadrantChart.spec.js +++ b/cypress/integration/rendering/quadrantChart.spec.js @@ -45,7 +45,7 @@ describe('Quadrant Chart', () => { {} ); }); - it('should able to render y-axix on right side', () => { + it('should able to render y-axis on right side', () => { imgSnapshotTest( ` %%{init: {"quadrantChart": {"yAxisPosition": "right"}}}%% @@ -61,7 +61,7 @@ describe('Quadrant Chart', () => { {} ); }); - it('should able to render x-axix on bottom', () => { + it('should able to render x-axis on bottom', () => { imgSnapshotTest( ` %%{init: {"quadrantChart": {"xAxisPosition": "bottom"}}}%% @@ -77,7 +77,7 @@ describe('Quadrant Chart', () => { {} ); }); - it('should able to render x-axix on bottom and y-axis on right', () => { + it('should able to render x-axis on bottom and y-axis on right', () => { imgSnapshotTest( ` %%{init: {"quadrantChart": {"xAxisPosition": "bottom", "yAxisPosition": "right"}}}%% diff --git a/cypress/integration/rendering/stateDiagram-v2.spec.js b/cypress/integration/rendering/stateDiagram-v2.spec.js index 606a1a3f5..83190dbc7 100644 --- a/cypress/integration/rendering/stateDiagram-v2.spec.js +++ b/cypress/integration/rendering/stateDiagram-v2.spec.js @@ -138,8 +138,8 @@ describe('State diagram', () => { imgSnapshotTest( ` stateDiagram-v2 - State1: This a a single line description - State2: This a a multi line description + State1: This a single line description + State2: This a multi line description State2: here comes the multi part [*] --> State1 State1 --> State2 @@ -345,7 +345,7 @@ stateDiagram } ); }); - it('v2 width of compond state should grow with title if title is wider', () => { + it('v2 width of compound state should grow with title if title is wider', () => { imgSnapshotTest( ` stateDiagram-v2 @@ -402,8 +402,8 @@ stateDiagram-v2 ` stateDiagram-v2 MyState - note left of MyState : I am a leftie - note right of MyState : I am a rightie + note left of MyState : I am a lefty + note right of MyState : I am a righty `, { logLevel: 0, @@ -552,7 +552,7 @@ style AState fill:#636,border:1px solid red,color:white; { logLevel: 0, fontFamily: 'courier' } ); }); - it(' should let styles take preceedence over classes', () => { + it(' should let styles take precedence over classes', () => { imgSnapshotTest( ` stateDiagram-v2 @@ -565,7 +565,7 @@ style AState fill:#636,border:1px solid red,color:white; { logLevel: 0, fontFamily: 'courier' } ); }); - it(' should allow styles to take effect in stubgraphs', () => { + it(' should allow styles to take effect in subgraphs', () => { imgSnapshotTest( ` stateDiagram diff --git a/cypress/integration/rendering/stateDiagram.spec.js b/cypress/integration/rendering/stateDiagram.spec.js index 9be1f2322..b4c5fa8c1 100644 --- a/cypress/integration/rendering/stateDiagram.spec.js +++ b/cypress/integration/rendering/stateDiagram.spec.js @@ -129,8 +129,8 @@ describe('State diagram', () => { imgSnapshotTest( ` stateDiagram - State1: This a a single line description - State2: This a a multi line description + State1: This a single line description + State2: This a multi line description State2: here comes the multi part [*] --> State1 State1 --> State2 diff --git a/cypress/integration/rendering/timeline.spec.ts b/cypress/integration/rendering/timeline.spec.ts index c748b54d3..dc6fab364 100644 --- a/cypress/integration/rendering/timeline.spec.ts +++ b/cypress/integration/rendering/timeline.spec.ts @@ -7,7 +7,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter `, {} @@ -35,7 +35,7 @@ describe('Timeline diagram', () => { section Stone Age 7600 BC : Britain's oldest known house was built in Orkney, Scotland 6000 BC : Sea levels rise and Britain becomes an island.
The people who live here are hunter-gatherers. - section Broze Age + section Bronze Age 2300 BC : People arrive from Europe and settle in Britain.
They bring farming and metalworking. : New styles of pottery and ways of burying the dead appear. 2200 BC : The last major building works are completed at Stonehenge.
People now bury their dead in stone circles. @@ -51,7 +51,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter `, {} @@ -68,7 +68,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -84,7 +84,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -101,7 +101,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -118,7 +118,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -135,7 +135,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -152,7 +152,7 @@ describe('Timeline diagram', () => { title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram diff --git a/cypress/integration/rendering/xyChart.spec.js b/cypress/integration/rendering/xyChart.spec.js index 1245760e8..a582355e8 100644 --- a/cypress/integration/rendering/xyChart.spec.js +++ b/cypress/integration/rendering/xyChart.spec.js @@ -179,6 +179,7 @@ describe('XY Chart', () => { axisLineWidth: 5 chartOrientation: horizontal plotReservedSpacePercent: 60 + showDataLabel: true --- xychart-beta title "Sales Revenue" @@ -315,4 +316,516 @@ describe('XY Chart', () => { ); cy.get('svg'); }); + + it('should render vertical bar chart with labels', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] + y-axis "Revenue (in $)" 4000 --> 11000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] + `, + {} + ); + }); + + it('should render horizontal bar chart with labels', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] + y-axis "Revenue (in $)" 4000 --> 11000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] + `, + {} + ); + }); + + it('should render vertical bar chart without labels by default', () => { + imgSnapshotTest( + ` + xychart-beta + title "Sales Revenue" + x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] + y-axis "Revenue (in $)" 4000 --> 11000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] + `, + {} + ); + }); + + it('should render horizontal bar chart without labels by default', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + chartOrientation: horizontal + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] + y-axis "Revenue (in $)" 4000 --> 11000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] + `, + {} + ); + }); + + it('should render multiple bar plots vertically with labels correctly', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Multiple Bar Plots" + x-axis Categories [A, B, C] + y-axis "Values" 0 --> 100 + bar [10, 50, 90] + `, + {} + ); + }); + + it('should render multiple bar plots horizontally with labels correctly', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Multiple Bar Plots" + x-axis Categories [A, B, C] + y-axis "Values" 0 --> 100 + bar [10, 50, 90] + `, + {} + ); + }); + + it('should render a single bar with label for a vertical xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Single Bar Chart" + x-axis Categories [A] + y-axis "Value" 0 --> 100 + bar [75] + `, + {} + ); + }); + + it('should render a single bar with label for a horizontal xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Single Bar Chart" + x-axis Categories [A] + y-axis "Value" 0 --> 100 + bar [75] + `, + {} + ); + }); + + it('should render negative and decimal values with correct labels for vertical xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Decimal and Negative Values" + x-axis Categories [A, B, C] + y-axis -10 --> 10 + bar [ -2.5, 0.75, 5.1 ] + `, + {} + ); + }); + + it('should render negative and decimal values with correct labels for horizontal xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Decimal and Negative Values" + x-axis Categories [A, B, C] + y-axis -10 --> 10 + bar [ -2.5, 0.75, 5.1 ] + `, + {} + ); + }); + + it('should render data labels within each bar in the vertical xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan,b,c] + y-axis "Revenue (in $)" 4000 --> 12000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + // Check horizontal alignment (within tolerance) + expect(textProps.x + textProps.width / 2).to.be.closeTo( + barProps.x + barProps.width / 2, + 5 + ); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + }); + }); + }); + }); + + it('should render data labels within each bar in the horizontal xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan,b,c] + y-axis "Revenue (in $)" 4000 --> 12000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + expect(textProps.y + textProps.height / 2).to.be.closeTo( + barProps.y + barProps.height / 2, + 5 + ); + }); + }); + }); + }); + + it('should render data labels within each bar in the vertical xy-chart with a lot of bars of different sizes', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s] + y-axis "Revenue (in $)" 4000 --> 12000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + // Check horizontal alignment (within tolerance) + expect(textProps.x + textProps.width / 2).to.be.closeTo( + barProps.x + barProps.width / 2, + 5 + ); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + }); + }); + }); + }); + + it('should render data labels within each bar in the horizontal xy-chart with a lot of bars of different sizes', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s] + y-axis "Revenue (in $)" 4000 --> 12000 + bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + expect(textProps.y + textProps.height / 2).to.be.closeTo( + barProps.y + barProps.height / 2, + 5 + ); + }); + }); + }); + }); + + it('should render data labels correctly for a bar in the vertical xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan] + y-axis "Revenue (in $)" 3000 --> 12000 + bar [4000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + // Check horizontal alignment (within tolerance) + expect(textProps.x + textProps.width / 2).to.be.closeTo( + barProps.x + barProps.width / 2, + 5 + ); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + }); + }); + }); + }); + + it('should render data labels correctly for a bar in the horizontal xy-chart', () => { + imgSnapshotTest( + ` + --- + config: + xyChart: + showDataLabel: true + chartOrientation: horizontal + --- + xychart-beta + title "Sales Revenue" + x-axis Months [jan] + y-axis "Revenue (in $)" 3000 --> 12000 + bar [4000] + `, + {} + ); + + cy.get('g.bar-plot-0').within(() => { + cy.get('rect').each(($rect, index) => { + // Extract bar properties + const barProps = { + x: parseFloat($rect.attr('x')), + y: parseFloat($rect.attr('y')), + width: parseFloat($rect.attr('width')), + height: parseFloat($rect.attr('height')), + }; + + // Get the text element corresponding to this bar by index. + cy.get('text') + .eq(index) + .then(($text) => { + const bbox = $text[0].getBBox(); + const textProps = { + x: bbox.x, + y: bbox.y, + width: bbox.width, + height: bbox.height, + }; + + // Verify that the text label is positioned within the boundaries of the bar. + expect(textProps.x).to.be.greaterThan(barProps.x); + expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); + + expect(textProps.y).to.be.greaterThan(barProps.y); + expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); + expect(textProps.y + textProps.height / 2).to.be.closeTo( + barProps.y + barProps.height / 2, + 5 + ); + }); + }); + }); + }); }); diff --git a/cypress/platform/ashish2.html b/cypress/platform/ashish2.html index 351dcabc2..30584295d 100644 --- a/cypress/platform/ashish2.html +++ b/cypress/platform/ashish2.html @@ -60,7 +60,7 @@
  timeline
         title My day
-        section section with no tasks
+        section Section with no tasks
         section Go to work at the dog office
           1930 : first step : second step is a long step
                : third step
@@ -70,18 +70,18 @@
           1960 : India fights poverty, looses war to China and gets nuclear weapons from USA and USSR
           1970 : Green Revolution comes to india
         section Another section with no tasks
-          I am a big big big tasks
-          I am not so big tasks
+          I am a very, very big task
+          I am not so big task
     
  timeline
         title MermaidChart 2023 Timeline
         section 2023 Q1 
Release Personal Tier - Buttet 1 : sub-point 1a : sub-point 1b + Bullet 1 : sub-point 1a : sub-point 1b : sub-point 1c Bullet 2 : sub-point 2a : sub-point 2b section 2023 Q2
Release XYZ Tier - Buttet 3 : sub-point
3a : sub-point 3b + Bullet 3 : sub-point
3a : sub-point 3b : sub-point 3c Bullet 4 : sub-point 4a : sub-point 4b @@ -93,7 +93,7 @@ section Stone Age 7600 BC : Britain's oldest known house was built in Orkney, Scotland 6000 BC : Sea levels rise and Britain becomes an island. The people who live here are hunter-gatherers. - section Broze Age + section Bronze Age 2300 BC : People arrive from Europe and settle in Britain. They bring farming and metalworking. : New styles of pottery and ways of burying the dead appear. 2200 BC : The last major building works are completed at Stonehenge. People now bury their dead in stone circles. @@ -106,7 +106,7 @@ title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google : Pixar - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008s : Instagram @@ -122,7 +122,7 @@ title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google : Pixar - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008s : Instagram @@ -139,7 +139,7 @@ title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008 : Instagram @@ -152,7 +152,7 @@ title History of Social Media Platform 2002 : LinkedIn 2004 : Facebook : Google - 2005 : Youtube + 2005 : YouTube 2006 : Twitter 2007 : Tumblr 2008s : Instagram diff --git a/cypress/platform/class.html b/cypress/platform/class.html index edf74e1b6..b649d1184 100644 --- a/cypress/platform/class.html +++ b/cypress/platform/class.html @@ -37,7 +37,7 @@ +String owner +BigDecimal balance +deposit(amount) bool - +withdrawl(amount) int + +withdrawal(amount) int } cssClass "BankAccount" customCss @@ -56,7 +56,7 @@ classE o-- classF : aggregation +String owner +BigDecimal balance +deposit(amount) bool - +withdrawl(amount) int + +withdrawal(amount) int } Class01~T~ <|-- AveryLongClass : Cool Class03~T~ *-- Class04~T~ diff --git a/cypress/platform/click_security_other.html b/cypress/platform/click_security_other.html index 11fd806ec..e9a4b2da5 100644 --- a/cypress/platform/click_security_other.html +++ b/cypress/platform/click_security_other.html @@ -77,7 +77,7 @@ document.getElementsByTagName('body')[0].appendChild(div); } - mermaid.initialize({ startOnLoad: true, securityLevel: 'strct', logLevel: 1 }); + mermaid.initialize({ startOnLoad: true, securityLevel: 'strict_', logLevel: 1 }); diff --git a/cypress/platform/current.html b/cypress/platform/current.html index 365986c02..6502fe1e8 100644 --- a/cypress/platform/current.html +++ b/cypress/platform/current.html @@ -31,7 +31,7 @@ flowchart BT subgraph S1 sub1 -->sub2 end subgraph S2 sub4 end S1 --> S2 sub1 --> sub4
- sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had preivously + sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be Bob->>Alice: I'm short though
@@ -61,9 +61,9 @@ #quot;elit#quot;."}}
- flowchart TB internet nat routeur lb1 lb2 compute1 compute2 subgraph project routeur nat - subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> routeur - routeur --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet + flowchart TB internet nat router lb1 lb2 compute1 compute2 subgraph project router nat + subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> router + router --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet
flowchart TD subgraph one[One] subgraph sub_one[Sub One] _sub_one end end subgraph two[Two] diff --git a/cypress/platform/e2e.html b/cypress/platform/e2e.html index d80caf7a4..465fbfbf5 100644 --- a/cypress/platform/e2e.html +++ b/cypress/platform/e2e.html @@ -7,7 +7,7 @@ rel="stylesheet" /> + + + +
+
+              erDiagram
+              CAR ||--o{ NAMED-DRIVER : allows
+              CAR ::: Pine {
+                  string registrationNumber PK "Primary Key
Unique registration number" + string make "Car make
e.g., Toyota" + string model "Model of the car
e.g., Corolla" + string[] parts "List of parts
Stored as array" + } + PERSON ||--o{ NAMED-DRIVER : is + PERSON ::: someclass { + string driversLicense PK "The license #
Primary Key" + string(99) firstName "Only 99 characters
are allowed
e.g., Smith" + string lastName "Last name of person
e.g., Smith" + string phone UK "Unique phone number
Used for contact" + int age "Age of the person
Must be numeric" + } + NAMED-DRIVER { + string carRegistrationNumber PK, FK, UK, PK "Foreign key to CAR
Also part of PK" + string driverLicence PK, FK "Foreign key to PERSON
Also part of PK" + } + MANUFACTURER only one to zero or more CAR : makesx +
+
+
+                  erDiagram
+                  _**testẽζ➕Ø😀㌕ぼ**_ {
+                    *__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
+                    string last*Name*
+                    string __phone__ UK
+                    *string(99)~T~~~~~~* firstName "Only __99__ 
characters are a
llowed dsfsdfsdfsdfs" + int _age_ + } +
+
+ + + + diff --git a/demos/quadrantchart.html b/demos/quadrantchart.html index 7b6291742..aec759d86 100644 --- a/demos/quadrantchart.html +++ b/demos/quadrantchart.html @@ -22,7 +22,7 @@ y-axis Not Important --> important quadrant-1 Plan quadrant-2 Do - quadrant-3 Deligate + quadrant-3 Delegate quadrant-4 Delete
diff --git a/docs/community/contributing.md b/docs/community/contributing.md index b545d03b0..596b26430 100644 --- a/docs/community/contributing.md +++ b/docs/community/contributing.md @@ -497,14 +497,14 @@ This is a danger alert ### Navigation -If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes to **topbar**. +If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes for **topbar**. ### Build Docs -The content of `/docs` folder is built with Github Actions. +The content of `/docs` folder is built with GitHub Actions. > **Warning** -> So as to allow automatic compilation of documentation pages you have to enable Github Actions on your fork first +> So as to allow automatic compilation of documentation pages you have to enable GitHub Actions on your fork first ## Submit your pull request diff --git a/docs/config/accessibility.md b/docs/config/accessibility.md index c7ca26ede..8ff105594 100644 --- a/docs/config/accessibility.md +++ b/docs/config/accessibility.md @@ -251,12 +251,12 @@ Here is the HTML generated for the SVG element: _(Note that some of the SVG attr ``` -##### Gitgraph +##### GitGraph ```mermaid-example gitGraph - accTitle: My Gitgraph Accessibility Title - accDescr: My Gitgraph Accessibility Description + accTitle: My GitGraph Accessibility Title + accDescr: My GitGraph Accessibility Description commit commit @@ -273,8 +273,8 @@ Here is the HTML generated for the SVG element: _(Note that some of the SVG attr ```mermaid gitGraph - accTitle: My Gitgraph Accessibility Title - accDescr: My Gitgraph Accessibility Description + accTitle: My GitGraph Accessibility Title + accDescr: My GitGraph Accessibility Description commit commit diff --git a/docs/config/setup/defaultConfig/variables/configKeys.md b/docs/config/setup/defaultConfig/variables/configKeys.md index 4687ad8bc..4aa7405e1 100644 --- a/docs/config/setup/defaultConfig/variables/configKeys.md +++ b/docs/config/setup/defaultConfig/variables/configKeys.md @@ -12,4 +12,4 @@ > `const` **configKeys**: `Set`<`string`> -Defined in: [packages/mermaid/src/defaultConfig.ts:274](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L274) +Defined in: [packages/mermaid/src/defaultConfig.ts:278](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L278) diff --git a/docs/config/theming.md b/docs/config/theming.md index 088d9e755..7a67937a1 100644 --- a/docs/config/theming.md +++ b/docs/config/theming.md @@ -8,7 +8,7 @@ Dynamic and integrated theme configuration was introduced in Mermaid version 8.7.0. -Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, the `init` directive is used. +Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, frontmatter config is used. ## Available Themes @@ -37,30 +37,24 @@ mermaid.initialize({ ## Diagram-specific Themes -To customize the theme of an individual diagram, use the `init` directive. +To customize the theme of an individual diagram, use frontmatter config. -Example of `init` directive setting the `theme` to `forest`: +Example of frontmatter config setting the `theme` to `forest`: ```mermaid-example -%%{init: {'theme':'forest'}}%% +--- +config: + theme: 'forest' +--- graph TD a --> b ``` ```mermaid -%%{init: {'theme':'forest'}}%% - graph TD - a --> b -``` - -```mermaid-example -%%{init: {'theme':'forest'}}%% - graph TD - a --> b -``` - -```mermaid -%%{init: {'theme':'forest'}}%% +--- +config: + theme: 'forest' +--- graph TD a --> b ``` @@ -69,30 +63,28 @@ Example of `init` directive setting the `theme` to `forest`: ## Customizing Themes with `themeVariables` -To make a custom theme, modify `themeVariables` via `init`. +To make a custom theme, modify `themeVariables` via frontmatter config. You will need to use the [base](#available-themes) theme as it is the only modifiable theme. -| Parameter | Description | Type | Properties | -| -------------- | ------------------------------------ | ------ | ----------------------------------------------------------------------------------- | -| themeVariables | Modifiable with the `init` directive | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) | +| Parameter | Description | Type | Properties | +| -------------- | ---------------------------------- | ------ | ----------------------------------------------------------------------------------- | +| themeVariables | Modifiable with frontmatter config | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) | -Example of modifying `themeVariables` using the `init` directive: +Example of modifying `themeVariables` using frontmatter config: ```mermaid-example -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% +--- +config: + theme: 'base' + themeVariables: + primaryColor: '#BB2528' + primaryTextColor: '#fff' + primaryBorderColor: '#7C0000' + lineColor: '#F8B229' + secondaryColor: '#006100' + tertiaryColor: '#fff' +--- graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} @@ -110,79 +102,17 @@ Example of modifying `themeVariables` using the `init` directive: ``` ```mermaid -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% - graph TD - A[Christmas] -->|Get money| B(Go shopping) - B --> C{Let me think} - B --> G[/Another/] - C ==>|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[fa:fa-car Car] - subgraph section - C - D - E - F - G - end -``` - -```mermaid-example -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% - graph TD - A[Christmas] -->|Get money| B(Go shopping) - B --> C{Let me think} - B --> G[/Another/] - C ==>|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[fa:fa-car Car] - subgraph section - C - D - E - F - G - end -``` - -```mermaid -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% +--- +config: + theme: 'base' + themeVariables: + primaryColor: '#BB2528' + primaryTextColor: '#fff' + primaryBorderColor: '#7C0000' + lineColor: '#F8B229' + secondaryColor: '#006100' + tertiaryColor: '#fff' +--- graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} @@ -211,7 +141,7 @@ The theming engine will only recognize hex colors and not color names. So, the v | -------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | darkMode | false | Affects how derived colors are calculated. Set value to `true` for dark mode. | | background | #f4f4f4 | Used to calculate color for items that should either be background colored or contrasting to the background | -| fontFamily | trebuchet ms, verdana, arial | | +| fontFamily | trebuchet ms, verdana, arial | Font family for diagram text | | fontSize | 16px | Font size in pixels | | primaryColor | #fff4dd | Color to be used as background in nodes, other colors will be derived from this | | primaryTextColor | calculated from darkMode #ddd/#333 | Color to be used as text color in nodes using `primaryColor` | diff --git a/docs/ecosystem/integrations-community.md b/docs/ecosystem/integrations-community.md index 1dbfab8b3..27cf22ee1 100644 --- a/docs/ecosystem/integrations-community.md +++ b/docs/ecosystem/integrations-community.md @@ -40,6 +40,7 @@ To add an integration to this list, see the [Integrations - create page](./integ - [Mermaid Charts & Diagrams for Jira](https://marketplace.atlassian.com/apps/1224537/) - [Mermaid for Jira Cloud - Draw UML diagrams easily](https://marketplace.atlassian.com/apps/1223053/mermaid-for-jira-cloud-draw-uml-diagrams-easily?hosting=cloud&tab=overview) - [CloudScript.io Mermaid Addon](https://marketplace.atlassian.com/apps/1219878/cloudscript-io-mermaid-addon?hosting=cloud&tab=overview) + - [Mermaid plus for Confluence](https://marketplace.atlassian.com/apps/1236814/mermaid-plus-for-confluence?hosting=cloud&tab=overview) - [Azure Devops](https://learn.microsoft.com/en-us/azure/devops/project/wiki/markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) ✅ - [Deepdwn](https://billiam.itch.io/deepdwn) ✅ - [Doctave](https://www.doctave.com/) ✅ @@ -114,6 +115,8 @@ Content Management Systems/Enterprise Content Management - [Grav CMS](https://getgrav.org/) - [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams) - [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter) +- [Tiki](https://tiki.org) + - [Tracker Entity Relationship Diagram](https://doc.tiki.org/Tracker-Entity-Relationship-Diagram) - [VitePress](https://vitepress.vuejs.org/) - [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/) - [VuePress](https://vuepress.vuejs.org/) @@ -267,7 +270,5 @@ Communication tools and platforms - [reveal.js-mermaid-plugin](https://github.com/ludwick/reveal.js-mermaid-plugin) - [Reveal CK](https://github.com/jedcn/reveal-ck) - [reveal-ck-mermaid-plugin](https://github.com/tmtm/reveal-ck-mermaid-plugin) -- [mermaid-isomorphic](https://github.com/remcohaszing/mermaid-isomorphic) -- [mermaid-server: Generate diagrams using a HTTP request](https://github.com/TomWright/mermaid-server) diff --git a/docs/intro/index.md b/docs/intro/index.md index 0b9ace410..06a408268 100644 --- a/docs/intro/index.md +++ b/docs/intro/index.md @@ -49,7 +49,7 @@ For a more detailed introduction to Mermaid and some of its more basic uses, loo 🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/contributing.md) | 🔌 [Plug-Ins](../ecosystem/integrations-community.md) -> 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/mermaid-js/mermaid/issues/866). +> 🖖 Keep a steady pulse: [mermaid needs more Collaborators](https://github.com/mermaid-js/mermaid/issues/866). :trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/#nominees) in the category "The most exciting use of technology"!!!** @@ -437,7 +437,7 @@ For public sites, it can be precarious to retrieve text from users on the intern As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing JavaScript in the code from being executed. This is a great step forward for better security. -_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ +_Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ ## Reporting vulnerabilities diff --git a/docs/intro/syntax-reference.md b/docs/intro/syntax-reference.md index b671aa390..fb07692d5 100644 --- a/docs/intro/syntax-reference.md +++ b/docs/intro/syntax-reference.md @@ -14,7 +14,11 @@ Diagram Examples can be found in the [Mermaid Live Editor](https://mermaid.live) ## Syntax Structure -One would notice that all **Diagrams definitions begin** with a declaration of the **diagram type**, followed by the definitions of the diagram and its contents. This declaration notifies the parser which kind of diagram the code is supposed to generate. +One would notice that all **Diagrams definitions begin** with a declaration of the **diagram type**, followed by the definitions of the diagram and its contents. This declaration notifies the parser which kind of diagram the code is supposed to generate. The only exception to this a [Frontmatter](#frontmatter-for-diagram-code) configuration. + +Line comments can ignore anything on the line after '%% '. + +Unknown words and misspellings will break a diagram, while parameters silently fail. **Example** : The code below is for an Entity Relationship Diagram, specified by the `erDiagram` declaration. What follows is the definition of the different `Entities` represented in it. @@ -72,10 +76,50 @@ The following are the most commonly used methods, and they are all tied to Merma Here you can edit certain values to change the behavior and appearance of the diagram. +Each of these techniques are functionally equivalent, but better for different deployments. + ### [The initialize() call](./getting-started.md#_3-calling-the-javascript-api) Used when Mermaid is called via an API, or through a ` ``` -You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. +You can also refer the [implementation in the live editor](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. Not Urgent y-axis Not Important --> "Important ❤" @@ -159,7 +166,14 @@ quadrantChart ``` ```mermaid -%%{init: {"quadrantChart": {"chartWidth": 400, "chartHeight": 400}, "themeVariables": {"quadrant1TextFill": "#ff0000"} }}%% +--- +config: + quadrantChart: + chartWidth: 400 + chartHeight: 400 + themeVariables: + quadrant1TextFill: "ff0000" +--- quadrantChart x-axis Urgent --> Not Urgent y-axis Not Important --> "Important ❤" @@ -178,7 +192,7 @@ Points can either be styled directly or with defined shared classes ```md Point A: [0.9, 0.0] radius: 12 Point B: [0.8, 0.1] color: #ff3300, radius: 10 -Point C: [0.7, 0.2] radius: 25, color: #00ff33, stroke-color: #10f0f0 +Point C: [0.7, 0.2] radius: 25, color: #00ff33, stroke-color: #10f0f0 Point D: [0.6, 0.3] radius: 15, stroke-color: #00ff0f, stroke-width: 5px ,color: #ff33f0 ``` diff --git a/docs/syntax/radar.md b/docs/syntax/radar.md index f8eabf3e6..bc19d85da 100644 --- a/docs/syntax/radar.md +++ b/docs/syntax/radar.md @@ -177,7 +177,15 @@ Please refer to the [configuration](/config/schema-docs/config-defs-radar-diagra > **Note** > The default values for these variables depend on the theme used. To override the default values, set the desired values in the themeVariables section of the configuration: -> %%{init: {"themeVariables": {"cScale0": "#FF0000", "cScale1": "#00FF00"}} }%% +> +> --- +> +> config: +> themeVariables: +> cScale0: "#FF0000" +> cScale1: "#00FF00" +> +> --- Radar charts support the color scales `cScale${i}` where `i` is a number from `0` to the theme's maximum number of colors in its color scale. Usually, the maximum number of colors is `12`. @@ -191,7 +199,15 @@ Radar charts support the color scales `cScale${i}` where `i` is a number from `0 > **Note** > Specific variables for radar resides inside the `radar` key. To set the radar style options, use this syntax. -> %%{init: {"themeVariables": {"radar": {"axisColor": "#FF0000"}} } }%% +> +> --- +> +> config: +> themeVariables: +> radar: +> axisColor: "#FF0000" +> +> --- | Property | Description | Default Value | | -------------------- | ---------------------------- | ------------- | diff --git a/docs/syntax/requirementDiagram.md b/docs/syntax/requirementDiagram.md index 4dd7d16d9..36420d9b9 100644 --- a/docs/syntax/requirementDiagram.md +++ b/docs/syntax/requirementDiagram.md @@ -50,7 +50,7 @@ There are three types of components to a requirement diagram: requirement, eleme The grammar for defining each is defined below. Words denoted in angle brackets, such as ``, are enumerated keywords that have options elaborated in a table. `user_defined_...` is use in any place where user input is expected. -An important note on user text: all input can be surrounded in quotes or not. For example, both `Id: "here is an example"` and `Id: here is an example` are both valid. However, users must be careful with unquoted input. The parser will fail if another keyword is detected. +An important note on user text: all input can be surrounded in quotes or not. For example, both `id: "here is an example"` and `id: here is an example` are both valid. However, users must be careful with unquoted input. The parser will fail if another keyword is detected. ### Requirement diff --git a/docs/syntax/stateDiagram.md b/docs/syntax/stateDiagram.md index e532678f0..c9ca956f2 100644 --- a/docs/syntax/stateDiagram.md +++ b/docs/syntax/stateDiagram.md @@ -278,7 +278,7 @@ stateDiagram-v2 } ``` -_You can not define transitions between internal states belonging to different composite states_ +_You cannot define transitions between internal states belonging to different composite states_ ## Choice diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md index 4f055a56d..cbebbcd11 100644 --- a/docs/syntax/timeline.md +++ b/docs/syntax/timeline.md @@ -234,7 +234,13 @@ mermaid.initialize({ let us look at same example, where we have disabled the multiColor option. ```mermaid-example - %%{init: { 'logLevel': 'debug', 'theme': 'base', 'timeline': {'disableMulticolor': true}}}%% +--- +config: + logLevel: 'debug' + theme: 'base' + timeline: + disableMulticolor: true +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -245,7 +251,13 @@ let us look at same example, where we have disabled the multiColor option. ``` ```mermaid - %%{init: { 'logLevel': 'debug', 'theme': 'base', 'timeline': {'disableMulticolor': true}}}%% +--- +config: + logLevel: 'debug' + theme: 'base' + timeline: + disableMulticolor: true +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -269,11 +281,17 @@ Example: Now let's override the default values for the `cScale0` to `cScale2` variables: ```mermaid-example - %%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': { - 'cScale0': '#ff0000', 'cScaleLabel0': '#ffffff', - 'cScale1': '#00ff00', - 'cScale2': '#0000ff', 'cScaleLabel2': '#ffffff' - } } }%% +--- +config: + logLevel: 'debug' + theme: 'default' + themeVariables: + cScale0: '#ff0000' + cScaleLabel0: '#ffffff' + cScale1: '#00ff00' + cScale2: '#0000ff' + cScaleLabel2: '#ffffff' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -287,11 +305,17 @@ Now let's override the default values for the `cScale0` to `cScale2` variables: ``` ```mermaid - %%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': { - 'cScale0': '#ff0000', 'cScaleLabel0': '#ffffff', - 'cScale1': '#00ff00', - 'cScale2': '#0000ff', 'cScaleLabel2': '#ffffff' - } } }%% +--- +config: + logLevel: 'debug' + theme: 'default' + themeVariables: + cScale0: '#ff0000' + cScaleLabel0: '#ffffff' + cScale1: '#00ff00' + cScale2: '#0000ff' + cScaleLabel2: '#ffffff' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -308,7 +332,7 @@ See how the colors are changed to the values specified in the theme variables. ## Themes -Mermaid supports a bunch of pre-defined themes which you can use to find the right one for you. PS: you can actually override an existing theme's variable to get your own custom theme going. Learn more about theming your diagram [here](../config/theming.md). +Mermaid supports a bunch of pre-defined themes which you can use to find the right one for you. PS: you can actually override an existing theme's variable to get your own custom theme going. Learn more about [theming your diagram](../config/theming.md). The following are the different pre-defined theme options: @@ -324,7 +348,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Base Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'base' } }%% +--- +config: + logLevel: 'debug' + theme: 'base' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -337,7 +365,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ``` ```mermaid -%%{init: { 'logLevel': 'debug', 'theme': 'base' } }%% +--- +config: + logLevel: 'debug' + theme: 'base' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -352,7 +384,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Forest Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%% +--- +config: + logLevel: 'debug' + theme: 'forest' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -365,7 +401,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ``` ```mermaid -%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%% +--- +config: + logLevel: 'debug' + theme: 'forest' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -380,7 +420,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Dark Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'dark' } }%% +--- +config: + logLevel: 'debug' + theme: 'dark' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -393,7 +437,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ``` ```mermaid -%%{init: { 'logLevel': 'debug', 'theme': 'dark' } }%% +--- +config: + logLevel: 'debug' + theme: 'dark' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -408,7 +456,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Default Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'default' } }%% +--- +config: + logLevel: 'debug' + theme: 'default' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -421,7 +473,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ``` ```mermaid -%%{init: { 'logLevel': 'debug', 'theme': 'default' } }%% +--- +config: + logLevel: 'debug' + theme: 'default' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -436,7 +492,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Neutral Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%% +--- +config: + logLevel: 'debug' + theme: 'neutral' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -449,7 +509,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ``` ```mermaid -%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%% +--- +config: + logLevel: 'debug' + theme: 'neutral' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -473,4 +537,4 @@ You can use this method to add mermaid including the timeline diagram to a web p ``` -You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. +You can also refer the [implementation in the live editor](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/docs/syntax/xyChart.md b/docs/syntax/xyChart.md index 7197b984d..dd64f742d 100644 --- a/docs/syntax/xyChart.md +++ b/docs/syntax/xyChart.md @@ -107,17 +107,18 @@ xychart-beta ## Chart Configurations -| Parameter | Description | Default value | -| ------------------------ | ---------------------------------------------- | :-----------: | -| width | Width of the chart | 700 | -| height | Height of the chart | 500 | -| titlePadding | Top and Bottom padding of the title | 10 | -| titleFontSize | Title font size | 20 | -| showTitle | Title to be shown or not | true | -| xAxis | xAxis configuration | AxisConfig | -| yAxis | yAxis configuration | AxisConfig | -| chartOrientation | 'vertical' or 'horizontal' | 'vertical' | -| plotReservedSpacePercent | Minimum space plots will take inside the chart | 50 | +| Parameter | Description | Default value | +| ------------------------ | ------------------------------------------------------------- | :-----------: | +| width | Width of the chart | 700 | +| height | Height of the chart | 500 | +| titlePadding | Top and Bottom padding of the title | 10 | +| titleFontSize | Title font size | 20 | +| showTitle | Title to be shown or not | true | +| xAxis | xAxis configuration | AxisConfig | +| yAxis | yAxis configuration | AxisConfig | +| chartOrientation | 'vertical' or 'horizontal' | 'vertical' | +| plotReservedSpacePercent | Minimum space plots will take inside the chart | 50 | +| showDataLabel | Should show the value corresponding to the bar within the bar | false | ### AxisConfig @@ -137,9 +138,16 @@ xychart-beta ## Chart Theme Variables -> **Note** -> Themes for xychart resides inside xychart attribute so to set the variables use this syntax -> %%{init: { "themeVariables": {"xyChart": {"titleColor": "#ff0000"} } }}%% +Themes for xychart resides inside xychart attribute so to set the variables use this syntax: + +```yaml +--- +config: + themeVariables: + xyChart: + titleColor: '#ff0000' +--- +``` | Parameter | Description | | ---------------- | --------------------------------------------------------- | @@ -163,6 +171,7 @@ config: xyChart: width: 900 height: 600 + showDataLabel: true themeVariables: xyChart: titleColor: "#ff0000" @@ -181,6 +190,7 @@ config: xyChart: width: 900 height: 600 + showDataLabel: true themeVariables: xyChart: titleColor: "#ff0000" diff --git a/package.json b/package.json index c2901ca06..e5197c2eb 100644 --- a/package.json +++ b/package.json @@ -64,12 +64,12 @@ }, "devDependencies": { "@applitools/eyes-cypress": "^3.44.9", - "@argos-ci/cypress": "^3.2.0", + "@argos-ci/cypress": "^4.0.3", "@changesets/changelog-github": "^0.5.1", "@changesets/cli": "^2.27.12", - "@cspell/eslint-plugin": "^8.8.4", + "@cspell/eslint-plugin": "^8.19.3", "@cypress/code-coverage": "^3.12.49", - "@eslint/js": "^9.4.0", + "@eslint/js": "^9.25.1", "@rollup/plugin-typescript": "^12.1.2", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", @@ -83,7 +83,7 @@ "@vitest/spy": "^3.0.6", "@vitest/ui": "^3.0.6", "ajv": "^8.17.1", - "chokidar": "^3.6.0", + "chokidar": "^4.0.3", "concurrently": "^9.1.2", "cors": "^2.8.5", "cpy-cli": "^5.0.0", @@ -93,19 +93,19 @@ "cypress-image-snapshot": "^4.0.1", "cypress-split": "^1.24.14", "esbuild": "^0.25.0", - "eslint": "^9.20.1", - "eslint-config-prettier": "^10.0.0", - "eslint-plugin-cypress": "^4.1.0", + "eslint": "^9.25.1", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-cypress": "^4.3.0", "eslint-plugin-html": "^8.1.2", - "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-jsdoc": "^50.0.1", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-jsdoc": "^50.6.9", "eslint-plugin-json": "^4.0.1", "eslint-plugin-lodash": "^8.0.0", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-tsdoc": "^0.4.0", - "eslint-plugin-unicorn": "^58.0.0", - "express": "^4.19.2", + "eslint-plugin-unicorn": "^59.0.0", + "express": "^5.1.0", "globals": "^16.0.0", "globby": "^14.0.2", "husky": "^9.1.7", @@ -126,7 +126,7 @@ "tslib": "^2.8.1", "tsx": "^4.7.3", "typescript": "~5.7.3", - "typescript-eslint": "^8.24.1", + "typescript-eslint": "^8.31.1", "vite": "^6.1.1", "vite-plugin-istanbul": "^7.0.0", "vitest": "^3.0.6" diff --git a/packages/mermaid-example-diagram/src/exampleDiagramRenderer.js b/packages/mermaid-example-diagram/src/exampleDiagramRenderer.js index 9b3854aaf..b24a3a237 100644 --- a/packages/mermaid-example-diagram/src/exampleDiagramRenderer.js +++ b/packages/mermaid-example-diagram/src/exampleDiagramRenderer.js @@ -3,7 +3,7 @@ import { select } from 'd3'; import { log, getConfig, setupGraphViewbox } from './mermaidUtils.js'; /** - * Draws a an info picture in the tag with id: id based on the graph definition in text. + * Draws an info picture in the tag with id: id based on the graph definition in text. * * @param {any} text * @param {any} id diff --git a/packages/mermaid-layout-elk/README.md b/packages/mermaid-layout-elk/README.md index c32803292..ab3289d6e 100644 --- a/packages/mermaid-layout-elk/README.md +++ b/packages/mermaid-layout-elk/README.md @@ -54,7 +54,7 @@ mermaid.registerLayoutLoaders(elkLayouts); ```html diff --git a/packages/mermaid-layout-elk/src/render.ts b/packages/mermaid-layout-elk/src/render.ts index 59b97c557..4d124c04f 100644 --- a/packages/mermaid-layout-elk/src/render.ts +++ b/packages/mermaid-layout-elk/src/render.ts @@ -143,7 +143,7 @@ export const render = async ( height: node.height, }; if (node.isGroup) { - log.debug('Id abc88 subgraph = ', node.id, node.x, node.y, node.labelData); + log.debug('id abc88 subgraph = ', node.id, node.x, node.y, node.labelData); const subgraphEl = subgraphsEl.insert('g').attr('class', 'subgraph'); // TODO use faster way of cloning const clusterNode = JSON.parse(JSON.stringify(node)); @@ -152,10 +152,10 @@ export const render = async ( clusterNode.width = Math.max(clusterNode.width, node.labelData.width); await insertCluster(subgraphEl, clusterNode); - log.debug('Id (UIO)= ', node.id, node.width, node.shape, node.labels); + log.debug('id (UIO)= ', node.id, node.width, node.shape, node.labels); } else { log.info( - 'Id NODE = ', + 'id NODE = ', node.id, node.x, node.y, @@ -653,7 +653,7 @@ export const render = async ( return res; } else { - // Intersection onn sides of rect + // Intersection on sides of rect if (insidePoint.x < outsidePoint.x) { r = outsidePoint.x - w - x; } else { @@ -713,7 +713,7 @@ export const render = async ( // check if point is inside the boundary rect if (!outsideNode(bounds, point) && !isInside) { // First point inside the rect found - // Calc the intersection coord between the point anf the last point outside the rect + // Calc the intersection coord between the point and the last point outside the rect let inter; if (isDiamond) { diff --git a/packages/mermaid/CHANGELOG.md b/packages/mermaid/CHANGELOG.md index 0c8f66aca..b57b83b6a 100644 --- a/packages/mermaid/CHANGELOG.md +++ b/packages/mermaid/CHANGELOG.md @@ -110,7 +110,7 @@ ### Patch Changes - [#5849](https://github.com/mermaid-js/mermaid/pull/5849) [`6c5b7ce`](https://github.com/mermaid-js/mermaid/commit/6c5b7ce9f41c0fbd59fe03dbefc8418d97697f0a) Thanks [@ReneLombard](https://github.com/ReneLombard)! - Fixed an issue when the mermaid classdiagram crashes when adding a . to the namespace. - Forexample + For example ```mermaid diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 4725fde4f..7f8230229 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -78,7 +78,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", - "dompurify": "^3.2.4", + "dompurify": "^3.2.5", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", diff --git a/packages/mermaid/scripts/create-types-from-json-schema.mts b/packages/mermaid/scripts/create-types-from-json-schema.mts index 1f6015bce..4ffc73f4f 100644 --- a/packages/mermaid/scripts/create-types-from-json-schema.mts +++ b/packages/mermaid/scripts/create-types-from-json-schema.mts @@ -85,7 +85,7 @@ function validateSchema(jsonSchema: unknown): asserts jsonSchema is JSONSchemaTy * * @param mermaidConfigSchema - The input JSON Schema. */ -async function generateTypescript(mermaidConfigSchema: JSONSchemaType) { +async function generateTypeScript(mermaidConfigSchema: JSONSchemaType) { /** * Replace all usages of `allOf` with `extends`. * @@ -108,13 +108,13 @@ async function generateTypescript(mermaidConfigSchema: JSONSchemaType`. + * In the future, we should make the input to Mermaid `Partial`. * * @todo TODO: Remove this function when Mermaid releases a new breaking change. * @param schema - The input schema. @@ -197,7 +197,7 @@ async function main() { validateSchema(configJsonSchema); // Generate types from JSON Schema - await generateTypescript(configJsonSchema); + await generateTypeScript(configJsonSchema); } main().catch((error) => { diff --git a/packages/mermaid/src/accessibility.spec.ts b/packages/mermaid/src/accessibility.spec.ts index 42b821abf..f5998c475 100644 --- a/packages/mermaid/src/accessibility.spec.ts +++ b/packages/mermaid/src/accessibility.spec.ts @@ -109,7 +109,7 @@ describe('accessibility', () => { describe('with a11y description', () => { const a11yDesc = 'a11y description'; - it('shold set aria-labelledby to the title id inserted as a child', () => { + it('should set aria-labelledby to the title id inserted as a child', () => { expectAriaLabelledByItTitleId(fauxSvgNode, a11yTitle, a11yDesc, givenId); }); diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index 638847547..8cd451c16 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -290,11 +290,17 @@ export interface FlowchartDiagramConfig extends BaseDiagramConfig { /** * Width of nodes where text is wrapped. * - * When using markdown strings the text ius wrapped automatically, this + * When using markdown strings the text is wrapped automatically, this * value sets the max width of a text before it continues on a new line. * */ wrappingWidth?: number; + /** + * If true, subgraphs without explicit direction will inherit the global graph direction + * (e.g., LR, TB, RL, BT). Defaults to false to preserve legacy layout behavior. + * + */ + inheritDir?: boolean; } /** * This interface was referenced by `MermaidConfig`'s JSON-Schema @@ -559,6 +565,10 @@ export interface JourneyDiagramConfig extends BaseDiagramConfig { * Margin between actors */ leftMargin?: number; + /** + * Maximum width of actor labels + */ + maxLabelWidth?: number; /** * Width of actor boxes */ @@ -617,6 +627,18 @@ export interface JourneyDiagramConfig extends BaseDiagramConfig { actorColours?: string[]; sectionFills?: string[]; sectionColours?: string[]; + /** + * Color of the title text in Journey Diagrams + */ + titleColor?: string; + /** + * Font family to be used for the title text in Journey Diagrams + */ + titleFontFamily?: string; + /** + * Font size to be used for the title text in Journey Diagrams + */ + titleFontSize?: string; } /** * This interface was referenced by `MermaidConfig`'s JSON-Schema @@ -935,6 +957,10 @@ export interface XYChartConfig extends BaseDiagramConfig { * Top and bottom space from the chart title */ titlePadding?: number; + /** + * Should show the value corresponding to the bar within the bar + */ + showDataLabel?: boolean; /** * Should show the chart title */ diff --git a/packages/mermaid/src/dagre-wrapper/GraphObjects.md b/packages/mermaid/src/dagre-wrapper/GraphObjects.md index 4620adeec..b90ce6931 100644 --- a/packages/mermaid/src/dagre-wrapper/GraphObjects.md +++ b/packages/mermaid/src/dagre-wrapper/GraphObjects.md @@ -22,7 +22,7 @@ flowchart C1 --> C2 ``` -The new nodes C1 and C2 are a special type of nodes, clusterNodes. ClusterNodes have have the nodes in the cluster including the cluster attached in a graph object. +The new nodes C1 and C2 are a special type of nodes, clusterNodes. ClusterNodes have the nodes in the cluster including the cluster attached in a graph object. When rendering this diagram it is being rendered recursively. The diagram is rendered by the dagre-mermaid:render function which in turn will be used to render the node C1 and the node C2. The result of those renderings will be inserted as nodes in the "root" diagram. With this recursive approach it would be possible to have different layout direction for each cluster. @@ -32,7 +32,7 @@ When rendering this diagram it is being rendered recursively. The diagram is ren _Data for a clusterNode_ -When a cluster has edges to or from some of its nodes leading outside the cluster the approach of recursive rendering can not be used as the layout of the graph needs to take responsibility for nodes outside of the cluster. +When a cluster has edges to or from some of its nodes leading outside the cluster the approach of recursive rendering cannot be used as the layout of the graph needs to take responsibility for nodes outside of the cluster. ```mermaid flowchart @@ -53,7 +53,7 @@ Of these two approaches the top one renders better and is used when possible. Wh # Graph objects and their properties -Explains the representation of various objects used to render the flow charts and what the properties mean. This ofc from the perspective of the dagre-wrapper. +Explains the representation of various objects used to render the flow charts and what the properties mean. This is from the perspective of the dagre-wrapper. ## node @@ -100,13 +100,13 @@ double_arrow_point arrow_circle double_arrow_circle -Lets try to make these types semantic free so that diagram type semantics does not find its way in to this more generic layer. +Lets try to make these types semantic free so that diagram type semantics does not find its way into this more generic layer. Required edgeData for proper rendering: | property | description | | ---------- | -------------------------------------------------------------------- | -| id | Id of the edge | +| id | ID of the edge | | arrowHead | overlap between arrowHead and arrowType? | | arrowType | overlap between arrowHead and arrowType? | | style | | diff --git a/packages/mermaid/src/dagre-wrapper/clusters.js b/packages/mermaid/src/dagre-wrapper/clusters.js index 2c7746876..4103c48f3 100644 --- a/packages/mermaid/src/dagre-wrapper/clusters.js +++ b/packages/mermaid/src/dagre-wrapper/clusters.js @@ -7,7 +7,7 @@ import { getConfig } from '../diagram-api/diagramAPI.js'; import { evaluate } from '../diagrams/common/common.js'; import { getSubGraphTitleMargins } from '../utils/subGraphTitleMargins.js'; -const rect = (parent, node) => { +const rect = async (parent, node) => { log.info('Creating subgraph rect for ', node.id, node); const siteConfig = getConfig(); @@ -31,7 +31,9 @@ const rect = (parent, node) => { const text = node.labelType === 'markdown' ? createText(label, node.labelText, { style: node.labelStyle, useHtmlLabels }, siteConfig) - : label.node().appendChild(createLabel(node.labelText, node.labelStyle, undefined, true)); + : label + .node() + .appendChild(await createLabel(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label let bbox = text.getBBox(); @@ -129,7 +131,7 @@ const noteGroup = (parent, node) => { return shapeSvg; }; -const roundedWithTitle = (parent, node) => { +const roundedWithTitle = async (parent, node) => { const siteConfig = getConfig(); // Add outer g element @@ -144,7 +146,7 @@ const roundedWithTitle = (parent, node) => { const text = label .node() - .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true)); + .appendChild(await createLabel(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label let bbox = text.getBBox(); @@ -236,13 +238,13 @@ const shapes = { rect, roundedWithTitle, noteGroup, divider }; let clusterElems = {}; -export const insertCluster = (elem, node) => { +export const insertCluster = async (elem, node) => { log.trace('Inserting cluster'); const shape = node.shape || 'rect'; - clusterElems[node.id] = shapes[shape](elem, node); + clusterElems[node.id] = await shapes[shape](elem, node); }; -export const getClusterTitleWidth = (elem, node) => { - const label = createLabel(node.labelText, node.labelStyle, undefined, true); +export const getClusterTitleWidth = async (elem, node) => { + const label = await createLabel(node.labelText, node.labelStyle, undefined, true); elem.node().appendChild(label); const width = label.getBBox().width; elem.node().removeChild(label); diff --git a/packages/mermaid/src/dagre-wrapper/createLabel.js b/packages/mermaid/src/dagre-wrapper/createLabel.js index d2b59b5a9..467eed260 100644 --- a/packages/mermaid/src/dagre-wrapper/createLabel.js +++ b/packages/mermaid/src/dagre-wrapper/createLabel.js @@ -44,7 +44,7 @@ function addHtmlLabel(node) { * @param isNode * @deprecated svg-util/createText instead */ -const createLabel = (_vertexText, style, isTitle, isNode) => { +const createLabel = async (_vertexText, style, isTitle, isNode) => { let vertexText = _vertexText || ''; if (typeof vertexText === 'object') { vertexText = vertexText[0]; @@ -53,9 +53,10 @@ const createLabel = (_vertexText, style, isTitle, isNode) => { // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that? vertexText = vertexText.replace(/\\n|\n/g, '
'); log.debug('vertexText' + vertexText); + const label = await replaceIconSubstring(decodeEntities(vertexText)); const node = { isNode, - label: replaceIconSubstring(decodeEntities(vertexText)), + label, labelStyle: style.replace('fill:', 'color:'), }; let vertexNode = addHtmlLabel(node); diff --git a/packages/mermaid/src/dagre-wrapper/edges.js b/packages/mermaid/src/dagre-wrapper/edges.js index 1a72328e8..5a97e5b63 100644 --- a/packages/mermaid/src/dagre-wrapper/edges.js +++ b/packages/mermaid/src/dagre-wrapper/edges.js @@ -17,7 +17,7 @@ export const clear = () => { terminalLabels = {}; }; -export const insertEdgeLabel = (elem, edge) => { +export const insertEdgeLabel = async (elem, edge) => { const config = getConfig(); const useHtmlLabels = evaluate(config.flowchart.htmlLabels); // Create the actual text element @@ -33,7 +33,7 @@ export const insertEdgeLabel = (elem, edge) => { }, config ) - : createLabel(edge.label, edge.labelStyle); + : await createLabel(edge.label, edge.labelStyle); // Create outer g, edgeLabel, this will be positioned after graph layout const edgeLabel = elem.insert('g').attr('class', 'edgeLabel'); @@ -63,7 +63,7 @@ export const insertEdgeLabel = (elem, edge) => { let fo; if (edge.startLabelLeft) { // Create the actual text element - const startLabelElement = createLabel(edge.startLabelLeft, edge.labelStyle); + const startLabelElement = await createLabel(edge.startLabelLeft, edge.labelStyle); const startEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals'); const inner = startEdgeLabelLeft.insert('g').attr('class', 'inner'); fo = inner.node().appendChild(startLabelElement); @@ -77,7 +77,7 @@ export const insertEdgeLabel = (elem, edge) => { } if (edge.startLabelRight) { // Create the actual text element - const startLabelElement = createLabel(edge.startLabelRight, edge.labelStyle); + const startLabelElement = await createLabel(edge.startLabelRight, edge.labelStyle); const startEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals'); const inner = startEdgeLabelRight.insert('g').attr('class', 'inner'); fo = startEdgeLabelRight.node().appendChild(startLabelElement); @@ -93,7 +93,7 @@ export const insertEdgeLabel = (elem, edge) => { } if (edge.endLabelLeft) { // Create the actual text element - const endLabelElement = createLabel(edge.endLabelLeft, edge.labelStyle); + const endLabelElement = await createLabel(edge.endLabelLeft, edge.labelStyle); const endEdgeLabelLeft = elem.insert('g').attr('class', 'edgeTerminals'); const inner = endEdgeLabelLeft.insert('g').attr('class', 'inner'); fo = inner.node().appendChild(endLabelElement); @@ -110,7 +110,7 @@ export const insertEdgeLabel = (elem, edge) => { } if (edge.endLabelRight) { // Create the actual text element - const endLabelElement = createLabel(edge.endLabelRight, edge.labelStyle); + const endLabelElement = await createLabel(edge.endLabelRight, edge.labelStyle); const endEdgeLabelRight = elem.insert('g').attr('class', 'edgeTerminals'); const inner = endEdgeLabelRight.insert('g').attr('class', 'inner'); @@ -279,7 +279,7 @@ export const intersection = (node, outsidePoint, insidePoint) => { return res; } else { - // Intersection onn sides of rect + // Intersection on sides of rect if (insidePoint.x < outsidePoint.x) { r = outsidePoint.x - w - x; } else { @@ -324,7 +324,7 @@ const cutPathAtIntersect = (_points, boundaryNode) => { // check if point is inside the boundary rect if (!outsideNode(boundaryNode, point) && !isInside) { // First point inside the rect found - // Calc the intersection coord between the point anf the last point outside the rect + // Calc the intersection coord between the point and the last point outside the rect const inter = intersection(boundaryNode, lastPointOutside, point); // // Check case where the intersection is the same as the last point diff --git a/packages/mermaid/src/dagre-wrapper/edges.spec.js b/packages/mermaid/src/dagre-wrapper/edges.spec.js index 9b2772ecd..dfe4c7901 100644 --- a/packages/mermaid/src/dagre-wrapper/edges.spec.js +++ b/packages/mermaid/src/dagre-wrapper/edges.spec.js @@ -30,7 +30,7 @@ describe('Graphlib decorations', () => { expect(int.x).toBeCloseTo(192.4609375); expect(int.y).toBeCloseTo(145.15711441743503); }); - it('case 3 - intersection on top of box outside point greater then inside point', function () { + it('case 3 - intersection on top of box outside point greater than inside point', function () { const o = { x: 157, y: 39 }; const i = { x: 104, y: 105 }; const node2 = { @@ -44,7 +44,7 @@ describe('Graphlib decorations', () => { expect(int.y).toBeCloseTo(76); // expect(int.y).toBeCloseTo(67.833) }); - it('case 4 - intersection on top of box inside point greater then inside point', function () { + it('case 4 - intersection on top of box inside point greater than inside point', function () { const o = { x: 144, y: 38 }; const i = { x: 198, y: 105 }; const node2 = { diff --git a/packages/mermaid/src/dagre-wrapper/index.js b/packages/mermaid/src/dagre-wrapper/index.js index 86ae7e284..f000dbe01 100644 --- a/packages/mermaid/src/dagre-wrapper/index.js +++ b/packages/mermaid/src/dagre-wrapper/index.js @@ -120,7 +120,7 @@ const recursiveRender = async (_elem, graph, diagramType, id, parentCluster, sit // Move the nodes to the correct place let diff = 0; const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig); - sortNodesByHierarchy(graph).forEach(function (v) { + for (const v of sortNodesByHierarchy(graph)) { const node = graph.node(v); log.info('Position ' + v + ': ' + JSON.stringify(graph.node(v))); log.info( @@ -141,14 +141,14 @@ const recursiveRender = async (_elem, graph, diagramType, id, parentCluster, sit // A cluster in the non-recursive way // positionCluster(node); node.height += subGraphTitleTotalMargin; - insertCluster(clusters, node); + await insertCluster(clusters, node); clusterDb[node.id].node = node; } else { node.y += subGraphTitleTotalMargin / 2; positionNode(node); } } - }); + } // Move the edge labels to the correct place after layout graph.edges().forEach(function (e) { diff --git a/packages/mermaid/src/dagre-wrapper/mermaid-graphlib.js b/packages/mermaid/src/dagre-wrapper/mermaid-graphlib.js index ef0c2caa7..3873f8f81 100644 --- a/packages/mermaid/src/dagre-wrapper/mermaid-graphlib.js +++ b/packages/mermaid/src/dagre-wrapper/mermaid-graphlib.js @@ -351,7 +351,7 @@ export const extractor = (graph, depth) => { return; } // For clusters without incoming and/or outgoing edges, create a new cluster-node - // containing the nodes and edges in the custer in a new graph + // containing the nodes and edges in the cluster in a new graph // for (let i = 0;) let nodes = graph.nodes(); let hasChildren = false; diff --git a/packages/mermaid/src/dagre-wrapper/nodes.js b/packages/mermaid/src/dagre-wrapper/nodes.js index 2677fd785..24dd5610f 100644 --- a/packages/mermaid/src/dagre-wrapper/nodes.js +++ b/packages/mermaid/src/dagre-wrapper/nodes.js @@ -553,7 +553,7 @@ function applyNodePropertyBorders(rect, borders, totalWidth, totalHeight) { rect.attr('stroke-dasharray', strokeDashArray.join(' ')); } -const rectWithTitle = (parent, node) => { +const rectWithTitle = async (parent, node) => { // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes); let classes; @@ -586,7 +586,7 @@ const rectWithTitle = (parent, node) => { } log.info('Label text abc79', title, text2, typeof text2 === 'object'); - const text = label.node().appendChild(createLabel(title, node.labelStyle, true, true)); + const text = label.node().appendChild(await createLabel(title, node.labelStyle, true, true)); let bbox = { width: 0, height: 0 }; if (evaluate(getConfig().flowchart.htmlLabels)) { const div = text.children[0]; @@ -601,7 +601,12 @@ const rectWithTitle = (parent, node) => { const descr = label .node() .appendChild( - createLabel(textRows.join ? textRows.join('
') : textRows, node.labelStyle, true, true) + await createLabel( + textRows.join ? textRows.join('
') : textRows, + node.labelStyle, + true, + true + ) ); if (evaluate(getConfig().flowchart.htmlLabels)) { @@ -876,7 +881,7 @@ const end = (parent, node) => { return shapeSvg; }; -const class_box = (parent, node) => { +const class_box = async (parent, node) => { const halfPadding = node.padding / 2; const rowPadding = 4; const lineHeight = 8; @@ -910,7 +915,7 @@ const class_box = (parent, node) => { : ''; const interfaceLabel = labelContainer .node() - .appendChild(createLabel(interfaceLabelText, node.labelStyle, true, true)); + .appendChild(await createLabel(interfaceLabelText, node.labelStyle, true, true)); let interfaceBBox = interfaceLabel.getBBox(); if (evaluate(getConfig().flowchart.htmlLabels)) { const div = interfaceLabel.children[0]; @@ -935,7 +940,7 @@ const class_box = (parent, node) => { } const classTitleLabel = labelContainer .node() - .appendChild(createLabel(classTitleString, node.labelStyle, true, true)); + .appendChild(await createLabel(classTitleString, node.labelStyle, true, true)); select(classTitleLabel).attr('class', 'classTitle'); let classTitleBBox = classTitleLabel.getBBox(); if (evaluate(getConfig().flowchart.htmlLabels)) { @@ -950,7 +955,7 @@ const class_box = (parent, node) => { maxWidth = classTitleBBox.width; } const classAttributes = []; - node.classData.members.forEach((member) => { + node.classData.members.forEach(async (member) => { const parsedInfo = member.getDisplayDetails(); let parsedText = parsedInfo.displayText; if (getConfig().flowchart.htmlLabels) { @@ -959,7 +964,7 @@ const class_box = (parent, node) => { const lbl = labelContainer .node() .appendChild( - createLabel( + await createLabel( parsedText, parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle, true, @@ -984,7 +989,7 @@ const class_box = (parent, node) => { maxHeight += lineHeight; const classMethods = []; - node.classData.methods.forEach((member) => { + node.classData.methods.forEach(async (member) => { const parsedInfo = member.getDisplayDetails(); let displayText = parsedInfo.displayText; if (getConfig().flowchart.htmlLabels) { @@ -993,7 +998,7 @@ const class_box = (parent, node) => { const lbl = labelContainer .node() .appendChild( - createLabel( + await createLabel( displayText, parsedInfo.cssStyle ? parsedInfo.cssStyle : node.labelStyle, true, diff --git a/packages/mermaid/src/dagre-wrapper/shapes/util.js b/packages/mermaid/src/dagre-wrapper/shapes/util.js index 1d0d2d77e..cbe683604 100644 --- a/packages/mermaid/src/dagre-wrapper/shapes/util.js +++ b/packages/mermaid/src/dagre-wrapper/shapes/util.js @@ -48,7 +48,12 @@ export const labelHelper = async (parent, node, _classes, isNode) => { ); } else { text = textNode.appendChild( - createLabel(sanitizeText(decodeEntities(labelText), config), node.labelStyle, false, isNode) + await createLabel( + sanitizeText(decodeEntities(labelText), config), + node.labelStyle, + false, + isNode + ) ); } // Get the size of the label diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts index 2e4e20f50..11ff581c1 100644 --- a/packages/mermaid/src/defaultConfig.ts +++ b/packages/mermaid/src/defaultConfig.ts @@ -71,6 +71,10 @@ const config: RequiredDeep = { fontWeight: this.personFontWeight, }; }, + flowchart: { + ...defaultConfigJson.flowchart, + inheritDir: false, // default to legacy behavior + }, external_personFont: function () { return { diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts index 4517ff622..3ec2d861f 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts @@ -9,7 +9,7 @@ describe('diagram-orchestration', () => { expect(detectType('graph TD; A-->B')).toBe('flowchart'); }); - describe('proper diagram types should be detetced', () => { + describe('proper diagram types should be detected', () => { beforeAll(() => { addDiagrams(); }); diff --git a/packages/mermaid/src/diagram.spec.ts b/packages/mermaid/src/diagram.spec.ts index 873fada14..8e7759d6d 100644 --- a/packages/mermaid/src/diagram.spec.ts +++ b/packages/mermaid/src/diagram.spec.ts @@ -85,7 +85,7 @@ describe('diagram detection', () => { ); }); - test('should consider entity codes when present in diagram defination', async () => { + test('should consider entity codes when present in diagram definition', async () => { const diagram = await Diagram.fromText(`sequenceDiagram A->>B: I #9829; you! B->>A: I #9829; you #infin; times more!`); diff --git a/packages/mermaid/src/diagrams/architecture/architecture.spec.ts b/packages/mermaid/src/diagrams/architecture/architecture.spec.ts new file mode 100644 index 000000000..d0405d025 --- /dev/null +++ b/packages/mermaid/src/diagrams/architecture/architecture.spec.ts @@ -0,0 +1,70 @@ +import { it, describe, expect } from 'vitest'; +import { db } from './architectureDb.js'; +import { parser } from './architectureParser.js'; + +const { + clear, + getDiagramTitle, + getAccTitle, + getAccDescription, + getServices, + getGroups, + getEdges, + getJunctions, +} = db; + +describe('architecture diagrams', () => { + beforeEach(() => { + clear(); + }); + + describe('architecture diagram definitions', () => { + it('should handle the architecture keyword', async () => { + const str = `architecture-beta`; + await expect(parser.parse(str)).resolves.not.toThrow(); + }); + + it('should handle a simple radar definition', async () => { + const str = `architecture-beta + service db + `; + await expect(parser.parse(str)).resolves.not.toThrow(); + }); + }); + + describe('should handle TitleAndAccessibilities', () => { + it('should handle title on the first line', async () => { + const str = `architecture-beta title Simple Architecture Diagram`; + await expect(parser.parse(str)).resolves.not.toThrow(); + expect(getDiagramTitle()).toBe('Simple Architecture Diagram'); + }); + + it('should handle title on another line', async () => { + const str = `architecture-beta + title Simple Architecture Diagram + `; + await expect(parser.parse(str)).resolves.not.toThrow(); + expect(getDiagramTitle()).toBe('Simple Architecture Diagram'); + }); + + it('should handle accessibility title and description', async () => { + const str = `architecture-beta + accTitle: Accessibility Title + accDescr: Accessibility Description + `; + await expect(parser.parse(str)).resolves.not.toThrow(); + expect(getAccTitle()).toBe('Accessibility Title'); + expect(getAccDescription()).toBe('Accessibility Description'); + }); + + it('should handle multiline accessibility description', async () => { + const str = `architecture-beta + accDescr { + Accessibility Description + } + `; + await expect(parser.parse(str)).resolves.not.toThrow(); + expect(getAccDescription()).toBe('Accessibility Description'); + }); + }); +}); diff --git a/packages/mermaid/src/diagrams/architecture/architectureDb.ts b/packages/mermaid/src/diagrams/architecture/architectureDb.ts index 2174ebe19..c7bd64e21 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureDb.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureDb.ts @@ -1,6 +1,6 @@ import type { ArchitectureDiagramConfig } from '../../config.type.js'; import DEFAULT_CONFIG from '../../defaultConfig.js'; -import { getConfig } from '../../diagram-api/diagramAPI.js'; +import { getConfig as commonGetConfig } from '../../config.js'; import type { D3Element } from '../../types.js'; import { ImperativeState } from '../../utils/imperativeState.js'; import { @@ -33,6 +33,7 @@ import { isArchitectureService, shiftPositionByArchitectureDirectionPair, } from './architectureTypes.js'; +import { cleanAndMerge } from '../../utils.js'; const DEFAULT_ARCHITECTURE_CONFIG: Required = DEFAULT_CONFIG.architecture; @@ -316,6 +317,14 @@ const setElementForId = (id: string, element: D3Element) => { }; const getElementById = (id: string) => state.records.elements[id]; +const getConfig = (): Required => { + const config = cleanAndMerge({ + ...DEFAULT_ARCHITECTURE_CONFIG, + ...commonGetConfig().architecture, + }); + return config; +}; + export const db: ArchitectureDB = { clear, setDiagramTitle, @@ -324,6 +333,7 @@ export const db: ArchitectureDB = { getAccTitle, setAccDescription, getAccDescription, + getConfig, addService, getServices, @@ -348,9 +358,5 @@ export const db: ArchitectureDB = { export function getConfigField( field: T ): Required[T] { - const arch = getConfig().architecture; - if (arch?.[field]) { - return arch[field] as Required[T]; - } - return DEFAULT_ARCHITECTURE_CONFIG[field]; + return getConfig()[field]; } diff --git a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts index 768c174b0..9479e5108 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts @@ -500,6 +500,8 @@ function layoutArchitecture( } export const draw: DrawDefinition = async (text, id, _version, diagObj: Diagram) => { + // TODO: Add title support for architecture diagrams + const db = diagObj.db as ArchitectureDB; const services = db.getServices(); diff --git a/packages/mermaid/src/diagrams/architecture/architectureTypes.ts b/packages/mermaid/src/diagrams/architecture/architectureTypes.ts index a7af33ca7..c61df11ff 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureTypes.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureTypes.ts @@ -1,4 +1,4 @@ -import type { DiagramDB } from '../../diagram-api/types.js'; +import type { DiagramDBBase } from '../../diagram-api/types.js'; import type { ArchitectureDiagramConfig } from '../../config.type.js'; import type { D3Element } from '../../types.js'; import type cytoscape from 'cytoscape'; @@ -242,7 +242,7 @@ export interface ArchitectureEdge
{ title?: string; } -export interface ArchitectureDB extends DiagramDB { +export interface ArchitectureDB extends DiagramDBBase { clear: () => void; addService: (service: Omit) => void; getServices: () => ArchitectureService[]; diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts index 7f44a5f19..a00e935ac 100644 --- a/packages/mermaid/src/diagrams/block/layout.ts +++ b/packages/mermaid/src/diagrams/block/layout.ts @@ -77,7 +77,7 @@ function setBlockSizes(block: Block, db: BlockDB, siblingWidth = 0, siblingHeigh block?.size?.x, 'block width =', block?.size, - 'sieblingWidth', + 'siblingWidth', siblingWidth ); if (!block?.size?.width) { @@ -141,7 +141,7 @@ function setBlockSizes(block: Block, db: BlockDB, siblingWidth = 0, siblingHeigh // If maxWidth if (width < siblingWidth) { log.debug( - `Detected to small siebling: abc95 ${block.id} sieblingWidth ${siblingWidth} sieblingHeight ${siblingHeight} width ${width}` + `Detected to small sibling: abc95 ${block.id} siblingWidth ${siblingWidth} siblingHeight ${siblingHeight} width ${width}` ); width = siblingWidth; height = siblingHeight; diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts index 1bb8691c1..4bf3290d8 100644 --- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts +++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts @@ -3,7 +3,7 @@ import block from './block.jison'; import db from '../blockDB.js'; describe('Block diagram', function () { - describe('when parsing an block diagram graph it should handle > ', function () { + describe('when parsing a block diagram graph it should handle > ', function () { beforeEach(function () { block.parser.yy = db; block.parser.yy.clear(); @@ -125,7 +125,7 @@ describe('Block diagram', function () { const blocks = db.getBlocks(); expect(blocks.length).toBe(1); }); - it('a diagram withput column statements', () => { + it('a diagram without column statements', () => { const str = `block-beta block1["Block 1"] `; diff --git a/packages/mermaid/src/diagrams/block/styles.ts b/packages/mermaid/src/diagrams/block/styles.ts index bdc7614a1..1a092142d 100644 --- a/packages/mermaid/src/diagrams/block/styles.ts +++ b/packages/mermaid/src/diagrams/block/styles.ts @@ -1,4 +1,5 @@ import * as khroma from 'khroma'; +import { getIconStyles } from '../globalStyles.js'; /** Returns the styles given options */ export interface BlockChartStyleOptions { @@ -142,6 +143,7 @@ const getStyles = (options: BlockChartStyleOptions) => font-size: 18px; fill: ${options.textColor}; } + ${getIconStyles()} `; export default getStyles; diff --git a/packages/mermaid/src/diagrams/c4/c4Db.js b/packages/mermaid/src/diagrams/c4/c4Db.js index 70248fcc4..db17da9ff 100644 --- a/packages/mermaid/src/diagrams/c4/c4Db.js +++ b/packages/mermaid/src/diagrams/c4/c4Db.js @@ -705,6 +705,7 @@ export const getBoundaries = function (parentBoundary) { } }; +// cspell:ignore getBoundarys /** * @deprecated Use {@link getBoundaries} instead */ diff --git a/packages/mermaid/src/diagrams/c4/c4Renderer.js b/packages/mermaid/src/diagrams/c4/c4Renderer.js index 58dd808fd..87211b24f 100644 --- a/packages/mermaid/src/diagrams/c4/c4Renderer.js +++ b/packages/mermaid/src/diagrams/c4/c4Renderer.js @@ -542,7 +542,7 @@ function drawInsideBoundary( ); } parentBoundaryAlias = currentBoundary.alias; - let nextCurrentBoundaries = diagObj.db.getBoundarys(parentBoundaryAlias); + let nextCurrentBoundaries = diagObj.db.getBoundaries(parentBoundaryAlias); if (nextCurrentBoundaries.length > 0) { // draw boundary inside currentBoundary @@ -622,7 +622,7 @@ export const draw = function (_text, id, _version, diagObj) { globalBoundaryMaxY = conf.diagramMarginY; const title = diagObj.db.getTitle(); - let currentBoundaries = diagObj.db.getBoundarys(''); + let currentBoundaries = diagObj.db.getBoundaries(''); // switch (c4type) { // case 'C4Context': drawInsideBoundary(diagram, '', screenBounds, currentBoundaries, diagObj); diff --git a/packages/mermaid/src/diagrams/c4/parser/c4Boundary.spec.js b/packages/mermaid/src/diagrams/c4/parser/c4Boundary.spec.js index f43f00748..20735eeb0 100644 --- a/packages/mermaid/src/diagrams/c4/parser/c4Boundary.spec.js +++ b/packages/mermaid/src/diagrams/c4/parser/c4Boundary.spec.js @@ -21,7 +21,7 @@ System(SystemAA, "Internet Banking System") const yy = c4.parser.yy; - const boundaries = yy.getBoundarys(); + const boundaries = yy.getBoundaries(); expect(boundaries.length).toBe(2); const boundary = boundaries[1]; @@ -49,7 +49,7 @@ ${macroName}(b1, "BankBoundary") { System(SystemAA, "Internet Banking System") }`); - expect(c4.parser.yy.getBoundarys()[1]).toMatchObject({ + expect(c4.parser.yy.getBoundaries()[1]).toMatchObject({ alias: 'b1', }); }); @@ -60,7 +60,7 @@ ${macroName}(b1, "BankBoundary") { System(SystemAA, "Internet Banking System") }`); - expect(c4.parser.yy.getBoundarys()[1]).toMatchObject({ + expect(c4.parser.yy.getBoundaries()[1]).toMatchObject({ label: { text: 'BankBoundary', }, @@ -73,7 +73,7 @@ ${macroName}(b1, "", "company") { System(SystemAA, "Internet Banking System") }`); - expect(c4.parser.yy.getBoundarys()[1]).toMatchObject({ + expect(c4.parser.yy.getBoundaries()[1]).toMatchObject({ type: { text: 'company' }, }); }); @@ -84,7 +84,7 @@ ${macroName}(b1, $link="https://github.com/mermaidjs") { System(SystemAA, "Internet Banking System") }`); - expect(c4.parser.yy.getBoundarys()[1]).toMatchObject({ + expect(c4.parser.yy.getBoundaries()[1]).toMatchObject({ label: { text: { link: 'https://github.com/mermaidjs', @@ -99,7 +99,7 @@ ${macroName}(b1, $tags="tag1,tag2") { System(SystemAA, "Internet Banking System") }`); - expect(c4.parser.yy.getBoundarys()[1]).toMatchObject({ + expect(c4.parser.yy.getBoundaries()[1]).toMatchObject({ label: { text: { tags: 'tag1,tag2', diff --git a/packages/mermaid/src/diagrams/c4/svgDraw.js b/packages/mermaid/src/diagrams/c4/svgDraw.js index 6bff267f6..5cd8998ae 100644 --- a/packages/mermaid/src/diagrams/c4/svgDraw.js +++ b/packages/mermaid/src/diagrams/c4/svgDraw.js @@ -111,7 +111,7 @@ export const drawRels = (elem, rels, conf) => { }; /** - * Draws an boundary in the diagram + * Draws a boundary in the diagram * * @param {any} elem - The diagram we'll draw to. * @param {any} boundary - The boundary to draw. diff --git a/packages/mermaid/src/diagrams/class/classDb.ts b/packages/mermaid/src/diagrams/class/classDb.ts index b2c3c944c..82ddcf09b 100644 --- a/packages/mermaid/src/diagrams/class/classDb.ts +++ b/packages/mermaid/src/diagrams/class/classDb.ts @@ -99,7 +99,7 @@ export class ClassDB implements DiagramDB { /** * Function called by parser when a node definition has been found. * - * @param id - Id of the class to add + * @param id - ID of the class to add * @public */ public addClass(_id: string) { @@ -524,7 +524,7 @@ export class ClassDB implements DiagramDB { /** * Function called by parser when a namespace definition has been found. * - * @param id - Id of the namespace to add + * @param id - ID of the namespace to add * @public */ public addNamespace(id: string) { @@ -553,8 +553,8 @@ export class ClassDB implements DiagramDB { /** * Function called by parser when a namespace definition has been found. * - * @param id - Id of the namespace to add - * @param classNames - Ids of the class to add + * @param id - ID of the namespace to add + * @param classNames - IDs of the class to add * @public */ public addClassesToNamespace(id: string, classNames: string[]) { diff --git a/packages/mermaid/src/diagrams/class/classDiagram.spec.ts b/packages/mermaid/src/diagrams/class/classDiagram.spec.ts index 35a37f903..7c88f2e41 100644 --- a/packages/mermaid/src/diagrams/class/classDiagram.spec.ts +++ b/packages/mermaid/src/diagrams/class/classDiagram.spec.ts @@ -138,7 +138,7 @@ describe('given a basic class diagram, ', function () { expect(relations[0].title).toBe('manages'); }); - it('should handle backquoted class names', function () { + it('should handle backticked class names', function () { const str = 'classDiagram\n' + 'class `Car`'; parser.parse(str); @@ -1207,7 +1207,7 @@ describe('given a class diagram with relationships, ', function () { parser.parse(str); }); - it('should handle backquoted class name', function () { + it('should handle backticked class name', function () { const str = 'classDiagram\n' + '`Class1` <|-- Class02\n' + diff --git a/packages/mermaid/src/diagrams/class/styles.js b/packages/mermaid/src/diagrams/class/styles.js index 4a888a265..ef22e28d1 100644 --- a/packages/mermaid/src/diagrams/class/styles.js +++ b/packages/mermaid/src/diagrams/class/styles.js @@ -1,3 +1,5 @@ +import { getIconStyles } from '../globalStyles.js'; + const getStyles = (options) => `g.classGroup text { fill: ${options.nodeBorder || options.classText}; @@ -157,6 +159,7 @@ g.classGroup line { font-size: 18px; fill: ${options.textColor}; } + ${getIconStyles()} `; export default getStyles; diff --git a/packages/mermaid/src/diagrams/common/common.spec.ts b/packages/mermaid/src/diagrams/common/common.spec.ts index 9af244406..3c7e0fdb8 100644 --- a/packages/mermaid/src/diagrams/common/common.spec.ts +++ b/packages/mermaid/src/diagrams/common/common.spec.ts @@ -28,7 +28,7 @@ describe('when securityLevel is antiscript, all script must be removed', () => { it('should remove all javascript urls', () => { compareRemoveScript( `This is a clean link + clean link - and me too`, + and me too`, `This is a clean link + clean link and me too` ); diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js index de602530c..fd1d2a9e5 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js @@ -40,7 +40,7 @@ describe('when parsing ER diagram it...', function () { allowed.forEach((allowedChar) => { const singleOccurrence = `Blo${allowedChar}rf`; const repeatedOccurrence = `Blo${allowedChar}${allowedChar}rf`; - const cannontStartWith = `${allowedChar}Blorf`; + const cannotStartWith = `${allowedChar}Blorf`; const endsWith = `Blorf${allowedChar}`; it(`${singleOccurrence} fails if not surrounded by quotes`, function () { @@ -73,7 +73,7 @@ describe('when parsing ER diagram it...', function () { expect(entities.has(name)).toBe(true); }); - it(`"${cannontStartWith}" cannot start with the character`, function () { + it(`"${cannotStartWith}" cannot start with the character`, function () { const name = repeatedOccurrence; expect(() => { erDiagram.parser.parse(`erDiagram\n "${name}"\n`); @@ -969,13 +969,13 @@ describe('when parsing ER diagram it...', function () { expect(rels[0].roleA).toBe(''); }); - it('should allow an non-empty quoted label', function () { + it('should allow a non-empty quoted label', function () { erDiagram.parser.parse('erDiagram\nCUSTOMER ||--|{ ORDER : "places"'); const rels = erDb.getRelationships(); expect(rels[0].roleA).toBe('places'); }); - it('should allow an non-empty unquoted label', function () { + it('should allow a non-empty unquoted label', function () { erDiagram.parser.parse('erDiagram\nCUSTOMER ||--|{ ORDER : places'); const rels = erDb.getRelationships(); expect(rels[0].roleA).toBe('places'); diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts index de926f294..65f8c4a05 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts @@ -315,11 +315,11 @@ You have to call mermaid.initialize.` log.info('addLink', _start, _end, id); - // for a group syntax like A e1@--> B & C, only the first edge should have an the userDefined id + // for a group syntax like A e1@--> B & C, only the first edge should have a userDefined id // the rest of the edges should have auto generated ids for (const start of _start) { for (const end of _end) { - //use the id only for last node in _start and and first node in _end + //use the id only for last node in _start and first node in _end const isLastStart = start === _start[_start.length - 1]; const isFirstEnd = end === _end[0]; if (isLastStart && isFirstEnd) { @@ -651,7 +651,8 @@ You have to call mermaid.initialize.` const prims: any = { boolean: {}, number: {}, string: {} }; const objs: any[] = []; - let dir; // = undefined; direction.trim(); + let dir: string | undefined; + const nodeList = a.filter(function (item) { const type = typeof item; if (item.stmt && item.stmt === 'dir') { @@ -670,7 +671,16 @@ You have to call mermaid.initialize.` return { nodeList, dir }; }; - const { nodeList, dir } = uniq(list.flat()); + const result = uniq(list.flat()); + const nodeList = result.nodeList; + let dir = result.dir; + const flowchartConfig = getConfig().flowchart ?? {}; + dir = + dir ?? + (flowchartConfig.inheritDir + ? (this.getDirection() ?? (getConfig() as any).direction ?? undefined) + : undefined); + if (this.version === 'gen-1') { for (let i = 0; i < nodeList.length; i++) { nodeList[i] = this.lookUpDomId(nodeList[i]); @@ -681,6 +691,7 @@ You have to call mermaid.initialize.` title = title || ''; title = this.sanitizeText(title); this.subCount = this.subCount + 1; + const subGraph = { id: id, nodes: nodeList, diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-huge.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-huge.spec.js index e512ba86a..5c4bc0d07 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-huge.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-huge.spec.js @@ -14,7 +14,7 @@ describe('[Text] when parsing', () => { describe('it should handle huge files', function () { // skipped because this test takes like 2 minutes or more! - it.skip('it should handlehuge diagrams', function () { + it.skip('it should handle huge diagrams', function () { const nodes = ('A-->B;B-->A;'.repeat(415) + 'A-->B;').repeat(57) + 'A-->B;B-->A;'.repeat(275); flow.parser.parse(`graph LR;${nodes}`); diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-interactions.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-interactions.spec.js index 1b75803af..d45c7d4dc 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-interactions.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-interactions.spec.js @@ -36,7 +36,7 @@ describe('[Interactions] when parsing', () => { expect(flowDb.setClickEvent).toHaveBeenCalledWith('A', 'callback'); }); - it('should be possible to use click to a callback with toolip', function () { + it('should be possible to use click to a callback with tooltip', function () { spyOn(flowDb, 'setClickEvent'); spyOn(flowDb, 'setTooltip'); const res = flow.parser.parse('graph TD\nA-->B\nclick A callback "tooltip"'); @@ -48,7 +48,7 @@ describe('[Interactions] when parsing', () => { expect(flowDb.setTooltip).toHaveBeenCalledWith('A', 'tooltip'); }); - it('should be possible to use click to a click and call callback with toolip', function () { + it('should be possible to use click to a click and call callback with tooltip', function () { spyOn(flowDb, 'setClickEvent'); spyOn(flowDb, 'setTooltip'); const res = flow.parser.parse('graph TD\nA-->B\nclick A call callback() "tooltip"'); diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-md-string.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-md-string.spec.js index 18bf42a21..b7d3a8c73 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-md-string.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-md-string.spec.js @@ -12,7 +12,7 @@ describe('parsing a flow chart with markdown strings', function () { flow.parser.yy.clear(); }); - it('mardown formatting in nodes and labels', function () { + it('markdown formatting in nodes and labels', function () { const res = flow.parser.parse(`flowchart A["\`The cat in **the** hat\`"]-- "\`The *bat* in the chat\`" -->B["The dog in the hog"] -- "The rat in the mat" -->C;`); @@ -37,7 +37,7 @@ A["\`The cat in **the** hat\`"]-- "\`The *bat* in the chat\`" -->B["The dog in t expect(edges[1].text).toBe('The rat in the mat'); expect(edges[1].labelType).toBe('string'); }); - it('mardown formatting in subgraphs', function () { + it('markdown formatting in subgraphs', function () { const res = flow.parser.parse(`flowchart LR subgraph "One" a("\`The **cat** diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-node-data.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-node-data.spec.js index 60620d8b2..0aeccd776 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-node-data.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-node-data.spec.js @@ -124,7 +124,7 @@ describe('when parsing directions', function () { expect(data4Layout.nodes[0].label).toEqual('D'); }); - it('should be forgiving with many spaces before teh end', function () { + it('should be forgiving with many spaces before the end', function () { const res = flow.parser.parse(`flowchart TB D@{ shape: rounded }`); @@ -197,7 +197,7 @@ describe('when parsing directions', function () { expect(data4Layout.nodes[0].shape).toEqual('squareRect'); expect(data4Layout.nodes[0].label).toEqual('This is }'); }); - it('should error on non-existent shape', function () { + it('should error on nonexistent shape', function () { expect(() => { flow.parser.parse(`flowchart TB A@{ shape: this-shape-does-not-exist } @@ -293,14 +293,14 @@ describe('when parsing directions', function () { it('should be possible to use @ syntax to add labels on multi nodes', function () { const res = flow.parser.parse(`flowchart TB - n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"} + n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"} `); const data4Layout = flow.parser.yy.getData(); expect(data4Layout.nodes.length).toBe(3); expect(data4Layout.nodes[0].label).toEqual('label for n2'); - expect(data4Layout.nodes[1].label).toEqual('labe for n4'); - expect(data4Layout.nodes[2].label).toEqual('labe for n5'); + expect(data4Layout.nodes[1].label).toEqual('label for n4'); + expect(data4Layout.nodes[2].label).toEqual('label for n5'); }); it('should be possible to use @ syntax to add labels on multi nodes with edge/link', function () { @@ -403,13 +403,13 @@ describe('when parsing directions', function () { it.skip('should be possible to use @ syntax to add labels with trail spaces', function () { const res = flow.parser.parse( `flowchart TB - n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"} ` + n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"} ` ); const data4Layout = flow.parser.yy.getData(); expect(data4Layout.nodes.length).toBe(3); expect(data4Layout.nodes[0].label).toEqual('label for n2'); - expect(data4Layout.nodes[1].label).toEqual('labe for n4'); - expect(data4Layout.nodes[2].label).toEqual('labe for n5'); + expect(data4Layout.nodes[1].label).toEqual('label for n4'); + expect(data4Layout.nodes[2].label).toEqual('label for n5'); }); }); diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-text.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-text.spec.js index 606414a11..a4ffab87e 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-text.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-text.spec.js @@ -429,7 +429,7 @@ describe('[Text] when parsing', () => { expect(vert.get('C').text).toBe('Начало'); }); - it('should handle backslask', function () { + it('should handle backslash', function () { const res = flow.parser.parse('graph TD;A-->C(c:\\windows);'); const vert = flow.parser.yy.getVertices(); @@ -596,7 +596,7 @@ describe('[Text] when parsing', () => { expect(() => flow.parser.parse(str)).toThrowError("got 'STR'"); }); - it('should throw error for nested quoatation marks', function () { + it('should throw error for nested quotation marks', function () { const str = 'graph TD; A["This is a "()" in text"];'; expect(() => flow.parser.parse(str)).toThrowError("Expecting 'SQE'"); diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-vertice-chaining.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-vertice-chaining.spec.js index 5a560b7dd..32cbcee2b 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-vertice-chaining.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-vertice-chaining.spec.js @@ -57,7 +57,7 @@ describe('when parsing flowcharts', function () { expect(edges[1].type).toBe('arrow_point'); expect(edges[1].text).toBe(''); }); - it('should multiple vertices in link statement in the begining', function () { + it('should multiple vertices in link statement in the beginning', function () { const res = flow.parser.parse(` graph TD A-->B & C; diff --git a/packages/mermaid/src/diagrams/flowchart/styles.ts b/packages/mermaid/src/diagrams/flowchart/styles.ts index ade9613fb..d0717190c 100644 --- a/packages/mermaid/src/diagrams/flowchart/styles.ts +++ b/packages/mermaid/src/diagrams/flowchart/styles.ts @@ -1,5 +1,6 @@ // import khroma from 'khroma'; import * as khroma from 'khroma'; +import { getIconStyles } from '../globalStyles.js'; /** Returns the styles given options */ export interface FlowChartStyleOptions { @@ -177,6 +178,7 @@ const getStyles = (options: FlowChartStyleOptions) => } text-align: center; } + ${getIconStyles()} `; export default getStyles; diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js index 15c7fab97..3ae55fb25 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.js +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js @@ -33,7 +33,7 @@ let sections = []; let tasks = []; let currentSection = ''; let displayMode = ''; -const tags = ['active', 'done', 'crit', 'milestone']; +const tags = ['active', 'done', 'crit', 'milestone', 'vert']; let funs = []; let inclusiveEndDates = false; let topAxis = false; @@ -422,7 +422,7 @@ const compileData = function (prevTask, dataStr) { const task = {}; - // Get tags like active, done, crit and milestone + // Get tags like active, done, crit, milestone, and vert getTaskTags(data, task, tags); for (let i = 0; i < data.length; i++) { @@ -470,7 +470,7 @@ const parseData = function (prevTaskId, dataStr) { const task = {}; - // Get tags like active, done, crit and milestone + // Get tags like active, done, crit, milestone, and vert getTaskTags(data, task, tags); for (let i = 0; i < data.length; i++) { @@ -538,6 +538,7 @@ export const addTask = function (descr, data) { rawTask.done = taskInfo.done; rawTask.crit = taskInfo.crit; rawTask.milestone = taskInfo.milestone; + rawTask.vert = taskInfo.vert; rawTask.order = lastOrder; lastOrder++; @@ -570,6 +571,7 @@ export const addTaskOrg = function (descr, data) { newTask.done = taskInfo.done; newTask.crit = taskInfo.crit; newTask.milestone = taskInfo.milestone; + newTask.vert = taskInfo.vert; lastTask = newTask; tasks.push(newTask); }; diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts index 6f2c8c1af..d2d38e86d 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts @@ -219,7 +219,7 @@ describe('when using the ganttDb', function () { ganttDb.addTask('test3', 'id3,after id2,7d'); ganttDb.addTask('test4', 'id4,2019-02-01,2019-02-20'); // Fixed endTime ganttDb.addTask('test5', 'id5,after id4,1d'); - ganttDb.addSection('full ending taks on last day'); + ganttDb.addSection('full ending task on last day'); ganttDb.addTask('test6', 'id6,2019-02-13,2d'); ganttDb.addTask('test7', 'id7,after id6,1d'); diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js index a10eb100f..f5c8c2e38 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js +++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js @@ -231,10 +231,11 @@ export const draw = function (text, id, version, diagObj) { * @param w */ function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w) { + // Sort theArray so that tasks with `vert` come last + theArray.sort((a, b) => (a.vert === b.vert ? 0 : a.vert ? 1 : -1)); // Get unique task orders. Required to draw the background rects when display mode is compact. const uniqueTaskOrderIds = [...new Set(theArray.map((item) => item.order))]; const uniqueTasks = uniqueTaskOrderIds.map((id) => theArray.find((item) => item.order === id)); - // Draw background rects covering the entire width of the graph, these form the section rows. svg .append('g') @@ -259,7 +260,8 @@ export const draw = function (text, id, version, diagObj) { } } return 'section section0'; - }); + }) + .enter(); // Draw the rects representing the tasks const rectangles = svg.append('g').selectAll('rect').data(theArray).enter(); @@ -289,15 +291,26 @@ export const draw = function (text, id, version, diagObj) { .attr('y', function (d, i) { // Ignore the incoming i value and use our order instead i = d.order; + if (d.vert) { + return conf.gridLineStartPadding; + } return i * theGap + theTopPad; }) .attr('width', function (d) { if (d.milestone) { return theBarHeight; } + if (d.vert) { + return 0.08 * theBarHeight; + } return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime); }) - .attr('height', theBarHeight) + .attr('height', function (d) { + if (d.vert) { + return taskArray.length * (conf.barHeight + conf.barGap) + conf.barHeight * 2; + } + return theBarHeight; + }) .attr('transform-origin', function (d, i) { // Ignore the incoming i value and use our order instead i = d.order; @@ -354,6 +367,9 @@ export const draw = function (text, id, version, diagObj) { if (d.milestone) { taskClass = ' milestone ' + taskClass; } + if (d.vert) { + taskClass = ' vert ' + taskClass; + } taskClass += secNum; @@ -377,10 +393,13 @@ export const draw = function (text, id, version, diagObj) { let endX = timeScale(d.renderEndTime || d.endTime); if (d.milestone) { startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight; - } - if (d.milestone) { endX = startX + theBarHeight; } + + if (d.vert) { + return timeScale(d.startTime) + theSidePad; + } + const textWidth = this.getBBox().width; // Check id text width > width of rectangle @@ -396,6 +415,9 @@ export const draw = function (text, id, version, diagObj) { }) .attr('y', function (d, i) { // Ignore the incoming i value and use our order instead + if (d.vert) { + return conf.gridLineStartPadding + taskArray.length * (conf.barHeight + conf.barGap) + 60; + } i = d.order; return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad; }) @@ -406,6 +428,7 @@ export const draw = function (text, id, version, diagObj) { if (d.milestone) { endX = startX + theBarHeight; } + const textWidth = this.getBBox().width; let classStr = ''; @@ -445,6 +468,10 @@ export const draw = function (text, id, version, diagObj) { taskType += ' milestoneText'; } + if (d.vert) { + taskType += ' vertText'; + } + // Check id text width > width of rectangle if (textWidth > endX - startX) { if (endX + textWidth + 1.5 * conf.leftPadding > w) { @@ -467,7 +494,7 @@ export const draw = function (text, id, version, diagObj) { const securityLevel = getConfig().securityLevel; - // Wrap the tasks in an a tag for working links without javascript + // Wrap the tasks in a tag for working links without javascript if (securityLevel === 'sandbox') { let sandboxElement; sandboxElement = select('#i' + id); diff --git a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison index f2333ff84..d4c26eff6 100644 --- a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison +++ b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison @@ -46,7 +46,7 @@ line was introduced with 'click'. /* ---interactivity command--- 'call' adds a callback to the specified task. 'call' can only be specified when -the line was introdcued with 'click'. +the line was introduced with 'click'. 'call ()' attaches the function 'callbackname' with the specified arguments to the task that was specified by 'click'. Function arguments are optional: 'call ()' simply executes 'callbackname' without any arguments. diff --git a/packages/mermaid/src/diagrams/gantt/styles.js b/packages/mermaid/src/diagrams/gantt/styles.js index 5b53a1b07..776083a9c 100644 --- a/packages/mermaid/src/diagrams/gantt/styles.js +++ b/packages/mermaid/src/diagrams/gantt/styles.js @@ -237,6 +237,16 @@ const getStyles = (options) => fill: ${options.taskTextDarkColor} !important; } + .vert { + stroke: ${options.vertLineColor}; + } + + .vertText { + font-size: 15px; + text-anchor: middle; + fill: ${options.vertLineColor} !important; + } + .activeCritText0, .activeCritText1, .activeCritText2, diff --git a/packages/mermaid/src/diagrams/git/gitGraph.spec.ts b/packages/mermaid/src/diagrams/git/gitGraph.spec.ts index 900460dca..fed21dd19 100644 --- a/packages/mermaid/src/diagrams/git/gitGraph.spec.ts +++ b/packages/mermaid/src/diagrams/git/gitGraph.spec.ts @@ -471,7 +471,7 @@ describe('when parsing a gitGraph', function () { it('should handle a gitGraph commit with custom type,tag, msg, commit id,', async () => { const str = `gitGraph: commit type:REVERSE tag: "test tag" msg: "test msg" id: "1111" - + `; await parser.parse(str); @@ -1232,7 +1232,7 @@ describe('when parsing a gitGraph', function () { expect(true).toBe(false); } catch (e: any) { expect(e.message).toBe( - 'Incorrect usage of "merge". Commit with id:1-111 already exists, use different custom Id' + 'Incorrect usage of "merge". Commit with id:1-111 already exists, use different custom id' ); } }); @@ -1255,7 +1255,7 @@ describe('when parsing a gitGraph', function () { it('should throw error when trying to merge branch which has no commits', async () => { const str = `gitGraph branch test1 - + checkout main commit merge test1 diff --git a/packages/mermaid/src/diagrams/git/gitGraphAst.ts b/packages/mermaid/src/diagrams/git/gitGraphAst.ts index 44597e9d7..36595eb51 100644 --- a/packages/mermaid/src/diagrams/git/gitGraphAst.ts +++ b/packages/mermaid/src/diagrams/git/gitGraphAst.ts @@ -222,7 +222,7 @@ export const merge = (mergeDB: MergeDB): void => { const error: any = new Error( 'Incorrect usage of "merge". Commit with id:' + customId + - ' already exists, use different custom Id' + ' already exists, use different custom id' ); error.hash = { text: `merge ${otherBranch} ${customId} ${overrideType} ${customTags?.join(' ')}`, diff --git a/packages/mermaid/src/diagrams/globalStyles.ts b/packages/mermaid/src/diagrams/globalStyles.ts new file mode 100644 index 000000000..01d3ea175 --- /dev/null +++ b/packages/mermaid/src/diagrams/globalStyles.ts @@ -0,0 +1,15 @@ +export const getIconStyles = () => ` + /* Font Awesome icon styling - consolidated */ + .label-icon { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -0.125em; + } + + .node .label-icon path { + fill: currentColor; + stroke: revert; + stroke-width: revert; + } +`; diff --git a/packages/mermaid/src/diagrams/info/infoRenderer.ts b/packages/mermaid/src/diagrams/info/infoRenderer.ts index a8314eb72..7e79fc3b1 100644 --- a/packages/mermaid/src/diagrams/info/infoRenderer.ts +++ b/packages/mermaid/src/diagrams/info/infoRenderer.ts @@ -4,7 +4,7 @@ import { selectSvgElement } from '../../rendering-util/selectSvgElement.js'; import { configureSvgSize } from '../../setupGraphViewbox.js'; /** - * Draws a an info picture in the tag with id: id based on the graph definition in text. + * Draws an info picture in the tag with id: id based on the graph definition in text. * * @param text - The text of the diagram. * @param id - The id of the diagram which will be used as a DOM element id. diff --git a/packages/mermaid/src/diagrams/kanban/kanban.spec.ts b/packages/mermaid/src/diagrams/kanban/kanban.spec.ts index 58fdab0e6..3f4f5ab27 100644 --- a/packages/mermaid/src/diagrams/kanban/kanban.spec.ts +++ b/packages/mermaid/src/diagrams/kanban/kanban.spec.ts @@ -11,7 +11,7 @@ describe('when parsing a kanban ', function () { kanban.yy.clear(); setLogLevel('trace'); }); - describe('hiearchy', function () { + describe('hierarchy', function () { it('KNBN-1 should handle a simple root definition abc122', function () { const str = `kanban root`; @@ -21,7 +21,7 @@ describe('when parsing a kanban ', function () { expect(sections.length).toEqual(1); expect(sections[0].label).toEqual('root'); }); - it('KNBN-2 should handle a hierachial kanban definition', function () { + it('KNBN-2 should handle a hierarchical kanban definition', function () { const str = `kanban root child1 @@ -56,7 +56,7 @@ describe('when parsing a kanban ', function () { expect(sections[0].label).toEqual('root'); }); - it('KNBN-4 should not dsitinguis between deeper hierachial levels in thr kanban definition', function () { + it('KNBN-4 should not distinguish between deeper hierarchical levels in the kanban definition', function () { const str = `kanban root child1 diff --git a/packages/mermaid/src/diagrams/kanban/styles.ts b/packages/mermaid/src/diagrams/kanban/styles.ts index 8b40224b2..a324fbc10 100644 --- a/packages/mermaid/src/diagrams/kanban/styles.ts +++ b/packages/mermaid/src/diagrams/kanban/styles.ts @@ -1,6 +1,7 @@ // @ts-expect-error Incorrect khroma types import { darken, lighten, isDark } from 'khroma'; import type { DiagramStylesProvider } from '../../diagram-api/types.js'; +import { getIconStyles } from '../globalStyles.js'; const genSections: DiagramStylesProvider = (options) => { let sections = ''; @@ -105,5 +106,6 @@ const getStyles: DiagramStylesProvider = (options) => dominant-baseline: middle; text-align: center; } + ${getIconStyles()} `; export default getStyles; diff --git a/packages/mermaid/src/diagrams/mindmap/mindmap.spec.ts b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.ts index 2d67fc600..d4f2d316e 100644 --- a/packages/mermaid/src/diagrams/mindmap/mindmap.spec.ts +++ b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.ts @@ -10,7 +10,7 @@ describe('when parsing a mindmap ', function () { mindmap.yy.clear(); setLogLevel('trace'); }); - describe('hiearchy', function () { + describe('hierarchy', function () { it('MMP-1 should handle a simple root definition abc122', function () { const str = `mindmap root`; @@ -19,7 +19,7 @@ describe('when parsing a mindmap ', function () { // console.log('Time for checks', mindmap.yy.getMindmap().descr); expect(mindmap.yy.getMindmap().descr).toEqual('root'); }); - it('MMP-2 should handle a hierachial mindmap definition', function () { + it('MMP-2 should handle a hierarchical mindmap definition', function () { const str = `mindmap root child1 @@ -43,7 +43,7 @@ describe('when parsing a mindmap ', function () { expect(mindmap.yy.getMindmap().descr).toEqual('root'); }); - it('MMP-4 should handle a deeper hierachial mindmap definition', function () { + it('MMP-4 should handle a deeper hierarchical mindmap definition', function () { const str = `mindmap root child1 diff --git a/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts b/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts index 5bfa20392..708b3cc28 100644 --- a/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts +++ b/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts @@ -149,7 +149,7 @@ function positionNodes(db: MindmapDB, cy: cytoscape.Core) { data.y = node.position().y; positionNode(db, data); const el = db.getElementById(data.nodeId); - log.info('Id:', id, 'Position: (', node.position().x, ', ', node.position().y, ')', data); + log.info('id:', id, 'Position: (', node.position().x, ', ', node.position().y, ')', data); el.attr( 'transform', `translate(${node.position().x - data.width / 2}, ${node.position().y - data.height / 2})` diff --git a/packages/mermaid/src/diagrams/quadrant-chart/parser/quadrant.jison.spec.ts b/packages/mermaid/src/diagrams/quadrant-chart/parser/quadrant.jison.spec.ts index bf1d1f2ec..f1957679b 100644 --- a/packages/mermaid/src/diagrams/quadrant-chart/parser/quadrant.jison.spec.ts +++ b/packages/mermaid/src/diagrams/quadrant-chart/parser/quadrant.jison.spec.ts @@ -160,20 +160,20 @@ describe('Testing quadrantChart jison file', () => { }); it('should be able to parse quadrant3 text', () => { - let str = 'quadrantChart\nquadrant-3 deligate'; + let str = 'quadrantChart\nquadrant-3 delegate'; expect(parserFnConstructor(str)).not.toThrow(); - expect(mockDB.setQuadrant3Text).toHaveBeenCalledWith({ text: 'deligate', type: 'text' }); + expect(mockDB.setQuadrant3Text).toHaveBeenCalledWith({ text: 'delegate', type: 'text' }); clearMocks(); - str = 'QuadRantChart \n QuaDrant-3 Deligate '; + str = 'QuadRantChart \n QuaDrant-3 Delegate '; expect(parserFnConstructor(str)).not.toThrow(); - expect(mockDB.setQuadrant3Text).toHaveBeenCalledWith({ text: 'Deligate ', type: 'text' }); + expect(mockDB.setQuadrant3Text).toHaveBeenCalledWith({ text: 'Delegate ', type: 'text' }); clearMocks(); - str = 'QuadRantChart \n QuaDrant-3 "Deligate(* +=[❤"'; + str = 'QuadRantChart \n QuaDrant-3 "Delegate(* +=[❤"'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setQuadrant3Text).toHaveBeenCalledWith({ - text: 'Deligate(* +=[❤', + text: 'Delegate(* +=[❤', type: 'text', }); }); diff --git a/packages/mermaid/src/diagrams/radar/radar.spec.ts b/packages/mermaid/src/diagrams/radar/radar.spec.ts index 5e5f444c6..3a506c69e 100644 --- a/packages/mermaid/src/diagrams/radar/radar.spec.ts +++ b/packages/mermaid/src/diagrams/radar/radar.spec.ts @@ -1,11 +1,9 @@ import { it, describe, expect } from 'vitest'; import { db } from './db.js'; import { parser } from './parser.js'; -import { renderer, relativeRadius, closedRoundCurve } from './renderer.js'; +import { relativeRadius, closedRoundCurve } from './renderer.js'; import { Diagram } from '../../Diagram.js'; import mermaidAPI from '../../mermaidAPI.js'; -import { a } from 'vitest/dist/chunks/suite.qtkXWc6R.js'; -import { buildRadarStyleOptions } from './styles.js'; const { clear, diff --git a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison index 11b39d232..d2e81df5f 100644 --- a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison +++ b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison @@ -84,7 +84,8 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili \-\-[x] return 'DOTTED_CROSS'; \-[\)] return 'SOLID_POINT'; \-\-[\)] return 'DOTTED_POINT'; -":"(?:(?:no)?wrap:)?[^#\n;]+ return 'TXT'; +":"(?:(?:no)?wrap:)?[^#\n;]* return 'TXT'; +":" return 'TXT'; "+" return '+'; "-" return '-'; <> return 'NEWLINE'; diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js index b21052ea6..c3b8c2b4a 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js @@ -2022,4 +2022,20 @@ describe('sequence db class', () => { expect(Object.hasOwn(sequenceDb, fun)).toBe(true); } }); + // This test verifies that messages with a colon but no content (e.g., "Alice->>Bob:") + // are correctly parsed as valid messages with an empty string as the message content. + + it('should parse a message with a trailing colon but no content', async () => { + const diagram = await Diagram.fromText(` +sequenceDiagram +Alice->>Bob: +Bob->>Alice:Got it! +`); + + const messages = diagram.db.getMessages(); + expect(messages.length).toBe(2); + expect(messages[0].message).toBe(''); + expect(messages[0].from).toBe('Alice'); + expect(messages[0].to).toBe('Bob'); + }); }); diff --git a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts index 389171d3c..84bb15b15 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts +++ b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts @@ -232,7 +232,7 @@ interface NoteModel { } /** - * Draws an note in the diagram with the attached line + * Draws a note in the diagram with the attached line * * @param elem - The diagram to draw to. * @param noteModel - Note model options. diff --git a/packages/mermaid/src/diagrams/sequence/svgDraw.spec.js b/packages/mermaid/src/diagrams/sequence/svgDraw.spec.js index c17bf0f1a..b11eba01c 100644 --- a/packages/mermaid/src/diagrams/sequence/svgDraw.spec.js +++ b/packages/mermaid/src/diagrams/sequence/svgDraw.spec.js @@ -55,7 +55,7 @@ describe('svgDraw', function () { expect(rect.attr).toHaveBeenCalledWith('ry', '10'); expect(rect.attr).toHaveBeenCalledWith('class', 'unitTestRectangleClass'); }); - it('should not add the class attribute if a class isn`t provided', () => { + it('should not add the class attribute if a class is not provided', () => { const svg = MockD3('svg'); svgDraw.drawRect(svg, { x: 10, diff --git a/packages/mermaid/src/diagrams/state/dataFetcher.js b/packages/mermaid/src/diagrams/state/dataFetcher.ts similarity index 84% rename from packages/mermaid/src/diagrams/state/dataFetcher.js rename to packages/mermaid/src/diagrams/state/dataFetcher.ts index 921544ff2..f38084899 100644 --- a/packages/mermaid/src/diagrams/state/dataFetcher.js +++ b/packages/mermaid/src/diagrams/state/dataFetcher.ts @@ -1,3 +1,4 @@ +import type { MermaidConfig } from '../../config.type.js'; import { getConfig } from '../../diagram-api/diagramAPI.js'; import { log } from '../../logger.js'; import common from '../common/common.js'; @@ -33,9 +34,10 @@ import { STMT_RELATION, STMT_STATE, } from './stateCommon.js'; +import type { Edge, NodeData, StateStmt, Stmt, StyleClass } from './stateDb.js'; // List of nodes created from the parsed diagram statement items -let nodeDb = new Map(); +const nodeDb = new Map(); let graphItemCount = 0; // used to construct ids, etc. @@ -43,18 +45,27 @@ let graphItemCount = 0; // used to construct ids, etc. * Create a standard string for the dom ID of an item. * If a type is given, insert that before the counter, preceded by the type spacer * - * @param itemId - * @param counter - * @param {string | null} type - * @param typeSpacer - * @returns {string} */ -export function stateDomId(itemId = '', counter = 0, type = '', typeSpacer = DOMID_TYPE_SPACER) { +export function stateDomId( + itemId = '', + counter = 0, + type: string | null = '', + typeSpacer = DOMID_TYPE_SPACER +) { const typeStr = type !== null && type.length > 0 ? `${typeSpacer}${type}` : ''; return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`; } -const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, look, classes) => { +const setupDoc = ( + parentParsedItem: StateStmt | undefined, + doc: Stmt[], + diagramStates: Map, + nodes: NodeData[], + edges: Edge[], + altFlag: boolean, + look: MermaidConfig['look'], + classes: Map +) => { // graphItemCount = 0; log.trace('items', doc); doc.forEach((item) => { @@ -95,7 +106,7 @@ const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, l arrowTypeEnd: 'arrow_barb', style: G_EDGE_STYLE, labelStyle: '', - label: common.sanitizeText(item.description, getConfig()), + label: common.sanitizeText(item.description ?? '', getConfig()), arrowheadStyle: G_EDGE_ARROWHEADSTYLE, labelpos: G_EDGE_LABELPOS, labelType: G_EDGE_LABELTYPE, @@ -115,11 +126,10 @@ const setupDoc = (parentParsedItem, doc, diagramStates, nodes, edges, altFlag, l * Get the direction from the statement items. * Look through all of the documents (docs) in the parsedItems * Because is a _document_ direction, the default direction is not necessarily the same as the overall default _diagram_ direction. - * @param {object[]} parsedItem - the parsed statement item to look through - * @param [defaultDir] - the direction to use if none is found - * @returns {string} + * @param parsedItem - the parsed statement item to look through + * @param defaultDir - the direction to use if none is found */ -const getDir = (parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => { +const getDir = (parsedItem: { doc?: Stmt[] }, defaultDir = DEFAULT_NESTED_DOC_DIR) => { let dir = defaultDir; if (parsedItem.doc) { for (const parsedItemDoc of parsedItem.doc) { @@ -131,7 +141,11 @@ const getDir = (parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => { return dir; }; -function insertOrUpdateNode(nodes, nodeData, classes) { +function insertOrUpdateNode( + nodes: NodeData[], + nodeData: NodeData, + classes: Map +) { if (!nodeData.id || nodeData.id === '' || nodeData.id === '') { return; } @@ -143,9 +157,9 @@ function insertOrUpdateNode(nodes, nodeData, classes) { } nodeData.cssClasses.split(' ').forEach((cssClass) => { - if (classes.get(cssClass)) { - const classDef = classes.get(cssClass); - nodeData.cssCompiledStyles = [...nodeData.cssCompiledStyles, ...classDef.styles]; + const classDef = classes.get(cssClass); + if (classDef) { + nodeData.cssCompiledStyles = [...(nodeData.cssCompiledStyles ?? []), ...classDef.styles]; } }); } @@ -162,31 +176,30 @@ function insertOrUpdateNode(nodes, nodeData, classes) { * If there aren't any or if dbInfoItem isn't defined, return an empty string. * Else create 1 string from the list of classes found * - * @param {undefined | null | object} dbInfoItem - * @returns {string} */ -function getClassesFromDbInfo(dbInfoItem) { +function getClassesFromDbInfo(dbInfoItem?: StateStmt): string { return dbInfoItem?.classes?.join(' ') ?? ''; } -function getStylesFromDbInfo(dbInfoItem) { +function getStylesFromDbInfo(dbInfoItem?: StateStmt): string[] { return dbInfoItem?.styles ?? []; } export const dataFetcher = ( - parent, - parsedItem, - diagramStates, - nodes, - edges, - altFlag, - look, - classes + parent: StateStmt | undefined, + parsedItem: StateStmt, + diagramStates: Map, + nodes: NodeData[], + edges: Edge[], + altFlag: boolean, + look: MermaidConfig['look'], + classes: Map ) => { const itemId = parsedItem.id; const dbState = diagramStates.get(itemId); const classStr = getClassesFromDbInfo(dbState); const style = getStylesFromDbInfo(dbState); + const config = getConfig(); log.info('dataFetcher parsedItem', parsedItem, dbState, style); @@ -207,13 +220,13 @@ export const dataFetcher = ( nodeDb.set(itemId, { id: itemId, shape, - description: common.sanitizeText(itemId, getConfig()), + description: common.sanitizeText(itemId, config), cssClasses: `${classStr} ${CSS_DIAGRAM_STATE}`, cssStyles: style, }); } - const newNode = nodeDb.get(itemId); + const newNode = nodeDb.get(itemId)!; // Save data for description and group so that for instance a statement without description overwrites // one with description @todo TODO What does this mean? If important, add a test for it @@ -225,7 +238,7 @@ export const dataFetcher = ( newNode.shape = SHAPE_STATE_WITH_DESC; newNode.description.push(parsedItem.description); } else { - if (newNode.description?.length > 0) { + if (newNode.description?.length && newNode.description.length > 0) { // if there is a description already transform it to an array newNode.shape = SHAPE_STATE_WITH_DESC; if (newNode.description === itemId) { @@ -239,7 +252,7 @@ export const dataFetcher = ( newNode.description = parsedItem.description; } } - newNode.description = common.sanitizeTextOrArray(newNode.description, getConfig()); + newNode.description = common.sanitizeTextOrArray(newNode.description, config); } // If there's only 1 description entry, just use a regular state shape @@ -262,7 +275,7 @@ export const dataFetcher = ( } // This is what will be added to the graph - const nodeData = { + const nodeData: NodeData = { labelStyle: '', shape: newNode.shape, label: newNode.description, @@ -294,19 +307,19 @@ export const dataFetcher = ( if (parsedItem.note) { // Todo: set random id - const noteData = { + const noteData: NodeData = { labelStyle: '', shape: SHAPE_NOTE, label: parsedItem.note.text, cssClasses: CSS_DIAGRAM_NOTE, // useHtmlLabels: false, cssStyles: [], - cssCompilesStyles: [], + cssCompiledStyles: [], id: itemId + NOTE_ID + '-' + graphItemCount, domId: stateDomId(itemId, graphItemCount, NOTE), type: newNode.type, isGroup: newNode.type === 'group', - padding: getConfig().flowchart.padding, + padding: config.flowchart?.padding, look, position: parsedItem.note.position, }; diff --git a/packages/mermaid/src/diagrams/state/id-cache.js b/packages/mermaid/src/diagrams/state/id-cache.js deleted file mode 100644 index 875dc62b0..000000000 --- a/packages/mermaid/src/diagrams/state/id-cache.js +++ /dev/null @@ -1,16 +0,0 @@ -const idCache = {}; - -export const set = (key, val) => { - idCache[key] = val; -}; - -export const get = (k) => idCache[k]; -export const keys = () => Object.keys(idCache); -export const size = () => keys().length; - -export default { - get, - set, - keys, - size, -}; diff --git a/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison b/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison index 80008b545..ffc086157 100644 --- a/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison +++ b/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison @@ -3,7 +3,7 @@ * (c) 2014-2021 Knut Sveidqvist * MIT license. * - * Based on js sequence diagrams jison grammr + * Based on js sequence diagrams jison grammar * https://bramp.github.io/js-sequence-diagrams/ * (c) 2012-2013 Andrew Brampton (bramp.net) * Simplified BSD license. diff --git a/packages/mermaid/src/diagrams/state/shapes.js b/packages/mermaid/src/diagrams/state/shapes.js index b18b4ca0e..419d2a76e 100644 --- a/packages/mermaid/src/diagrams/state/shapes.js +++ b/packages/mermaid/src/diagrams/state/shapes.js @@ -1,5 +1,4 @@ import { line, curveBasis } from 'd3'; -import idCache from './id-cache.js'; import { StateDB } from './stateDb.js'; import utils from '../../utils.js'; import common from '../common/common.js'; @@ -38,7 +37,7 @@ export const drawDivider = (g) => .attr('y2', 0); /** - * Draws a an end state as a black circle + * Draws an end state as a black circle * * @param {any} g * @param {any} stateDef @@ -137,7 +136,7 @@ export const drawDescrState = (g, stateDef) => { /** Adds the creates a box around the existing content and adds a panel for the id on top of the content. */ /** - * Function that creates an title row and a frame around a substate for a composite state diagram. + * Function that creates a title row and a frame around a substate for a composite state diagram. * The function returns a new d3 svg object with updated width and height properties; * * @param {any} g The d3 svg object for the substate to framed @@ -405,8 +404,6 @@ export const drawState = function (elem, stateDef) { stateInfo.width = stateBox.width + 2 * getConfig().state.padding; stateInfo.height = stateBox.height + 2 * getConfig().state.padding; - idCache.set(id, stateInfo); - // stateCnt++; return stateInfo; }; diff --git a/packages/mermaid/src/diagrams/state/stateCommon.ts b/packages/mermaid/src/diagrams/state/stateCommon.ts index 2902ce6b0..b1de78405 100644 --- a/packages/mermaid/src/diagrams/state/stateCommon.ts +++ b/packages/mermaid/src/diagrams/state/stateCommon.ts @@ -13,6 +13,10 @@ export const STMT_DIRECTION = 'dir'; // parsed statement type for a state export const STMT_STATE = 'state'; + +// parsed statement type for a root +export const STMT_ROOT = 'root'; + // parsed statement type for a relation export const STMT_RELATION = 'relation'; // parsed statement type for a classDef diff --git a/packages/mermaid/src/diagrams/state/stateDb.js b/packages/mermaid/src/diagrams/state/stateDb.js deleted file mode 100644 index 5314260ed..000000000 --- a/packages/mermaid/src/diagrams/state/stateDb.js +++ /dev/null @@ -1,736 +0,0 @@ -import { getConfig } from '../../diagram-api/diagramAPI.js'; -import { log } from '../../logger.js'; -import { generateId } from '../../utils.js'; -import common from '../common/common.js'; -import { - clear as commonClear, - getAccDescription, - getAccTitle, - getDiagramTitle, - setAccDescription, - setAccTitle, - setDiagramTitle, -} from '../common/commonDb.js'; -import { dataFetcher, reset as resetDataFetching } from './dataFetcher.js'; -import { getDir } from './stateRenderer-v3-unified.js'; - -import { - DEFAULT_DIAGRAM_DIRECTION, - DEFAULT_STATE_TYPE, - DIVIDER_TYPE, - STMT_APPLYCLASS, - STMT_CLASSDEF, - STMT_DIRECTION, - STMT_RELATION, - STMT_STATE, - STMT_STYLEDEF, -} from './stateCommon.js'; - -const START_NODE = '[*]'; -const START_TYPE = 'start'; -const END_NODE = START_NODE; -const END_TYPE = 'end'; - -const COLOR_KEYWORD = 'color'; -const FILL_KEYWORD = 'fill'; -const BG_FILL = 'bgFill'; -const STYLECLASS_SEP = ','; - -/** - * Returns a new list of classes. - * In the future, this can be replaced with a class common to all diagrams. - * ClassDef information = { id: id, styles: [], textStyles: [] } - * - * @returns {Map} - */ -function newClassesList() { - return new Map(); -} - -const newDoc = () => { - return { - /** @type {{ id1: string, id2: string, relationTitle: string }[]} */ - relations: [], - states: new Map(), - documents: {}, - }; -}; - -const clone = (o) => JSON.parse(JSON.stringify(o)); - -export class StateDB { - /** - * @param {1 | 2} version - v1 renderer or v2 renderer. - */ - constructor(version) { - this.clear(); - - this.links = new Map(); - - this.version = version; - - // Needed for JISON since it only supports direct properties - this.setRootDoc = this.setRootDoc.bind(this); - this.getDividerId = this.getDividerId.bind(this); - this.setDirection = this.setDirection.bind(this); - this.trimColon = this.trimColon.bind(this); - } - - /** - * @private - * @type {1 | 2} - */ - version; - - /** - * @private - * @type {Array} - */ - nodes = []; - /** - * @private - * @type {Array} - */ - edges = []; - - /** - * @private - * @type {Array} - */ - rootDoc = []; - /** - * @private - * @type {Map} - */ - classes = newClassesList(); // style classes defined by a classDef - - /** - * @private - * @type {Object} - */ - documents = { - root: newDoc(), - }; - - /** - * @private - * @type {Object} - */ - currentDocument = this.documents.root; - /** - * @private - * @type {number} - */ - startEndCount = 0; - /** - * @private - * @type {number} - */ - dividerCnt = 0; - /** - * @private - * @type {Map} - */ - links = new Map(); - - static relationType = { - AGGREGATION: 0, - EXTENSION: 1, - COMPOSITION: 2, - DEPENDENCY: 3, - }; - - setRootDoc(o) { - log.info('Setting root doc', o); - // rootDoc = { id: 'root', doc: o }; - this.rootDoc = o; - if (this.version === 1) { - this.extract(o); - } else { - this.extract(this.getRootDocV2()); - } - } - - getRootDoc() { - return this.rootDoc; - } - - /** - * @private - * @param {Object} parent - * @param {Object} node - * @param {boolean} first - */ - docTranslator(parent, node, first) { - if (node.stmt === STMT_RELATION) { - this.docTranslator(parent, node.state1, true); - this.docTranslator(parent, node.state2, false); - } else { - if (node.stmt === STMT_STATE) { - if (node.id === '[*]') { - node.id = first ? parent.id + '_start' : parent.id + '_end'; - node.start = first; - } else { - // This is just a plain state, not a start or end - node.id = node.id.trim(); - } - } - - if (node.doc) { - const doc = []; - // Check for concurrency - let currentDoc = []; - let i; - for (i = 0; i < node.doc.length; i++) { - if (node.doc[i].type === DIVIDER_TYPE) { - const newNode = clone(node.doc[i]); - newNode.doc = clone(currentDoc); - doc.push(newNode); - currentDoc = []; - } else { - currentDoc.push(node.doc[i]); - } - } - - // If any divider was encountered - if (doc.length > 0 && currentDoc.length > 0) { - const newNode = { - stmt: STMT_STATE, - id: generateId(), - type: 'divider', - doc: clone(currentDoc), - }; - doc.push(clone(newNode)); - node.doc = doc; - } - - node.doc.forEach((docNode) => this.docTranslator(node, docNode, true)); - } - } - } - - /** - * @private - */ - getRootDocV2() { - this.docTranslator({ id: 'root' }, { id: 'root', doc: this.rootDoc }, true); - return { id: 'root', doc: this.rootDoc }; - // Here - } - - /** - * Convert all of the statements (stmts) that were parsed into states and relationships. - * This is done because a state diagram may have nested sections, - * where each section is a 'document' and has its own set of statements. - * Ex: the section within a fork has its own statements, and incoming and outgoing statements - * refer to the fork as a whole (document). - * See the parser grammar: the definition of a document is a document then a 'line', where a line can be a statement. - * This will push the statement into the list of statements for the current document. - * @private - * @param _doc - */ - extract(_doc) { - // const res = { states: [], relations: [] }; - let doc; - if (_doc.doc) { - doc = _doc.doc; - } else { - doc = _doc; - } - // let doc = root.doc; - // if (!doc) { - // doc = root; - // } - log.info(doc); - this.clear(true); - - log.info('Extract initial document:', doc); - - doc.forEach((item) => { - log.warn('Statement', item.stmt); - switch (item.stmt) { - case STMT_STATE: - this.addState( - item.id.trim(), - item.type, - item.doc, - item.description, - item.note, - item.classes, - item.styles, - item.textStyles - ); - break; - case STMT_RELATION: - this.addRelation(item.state1, item.state2, item.description); - break; - case STMT_CLASSDEF: - this.addStyleClass(item.id.trim(), item.classes); - break; - case STMT_STYLEDEF: - { - const ids = item.id.trim().split(','); - const styles = item.styleClass.split(','); - ids.forEach((id) => { - let foundState = this.getState(id); - if (foundState === undefined) { - const trimmedId = id.trim(); - this.addState(trimmedId); - foundState = this.getState(trimmedId); - } - foundState.styles = styles.map((s) => s.replace(/;/g, '')?.trim()); - }); - } - break; - case STMT_APPLYCLASS: - this.setCssClass(item.id.trim(), item.styleClass); - break; - case 'click': - this.addLink(item.id, item.url, item.tooltip); - break; - } - }); - - const diagramStates = this.getStates(); - const config = getConfig(); - const look = config.look; - - resetDataFetching(); - dataFetcher( - undefined, - this.getRootDocV2(), - diagramStates, - this.nodes, - this.edges, - true, - look, - this.classes - ); - this.nodes.forEach((node) => { - if (Array.isArray(node.label)) { - // add the rest as description - node.description = node.label.slice(1); - if (node.isGroup && node.description.length > 0) { - throw new Error( - 'Group nodes can only have label. Remove the additional description for node [' + - node.id + - ']' - ); - } - // add first description as label - node.label = node.label[0]; - } - }); - } - - /** - * Function called by parser when a node definition has been found. - * - * @param {null | string} id - * @param {null | string} type - * @param {null | string} doc - * @param {null | string | string[]} descr - description for the state. Can be a string or a list or strings - * @param {null | string} note - * @param {null | string | string[]} classes - class styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 class, convert it to an array of that 1 class. - * @param {null | string | string[]} styles - styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 style, convert it to an array of that 1 style. - * @param {null | string | string[]} textStyles - text styles to apply to this state. Can be a string (1 text test) or an array of text styles. If it's just 1 text style, convert it to an array of that 1 text style. - */ - addState( - id, - type = DEFAULT_STATE_TYPE, - doc = null, - descr = null, - note = null, - classes = null, - styles = null, - textStyles = null - ) { - const trimmedId = id?.trim(); - // add the state if needed - if (!this.currentDocument.states.has(trimmedId)) { - log.info('Adding state ', trimmedId, descr); - this.currentDocument.states.set(trimmedId, { - id: trimmedId, - descriptions: [], - type, - doc, - note, - classes: [], - styles: [], - textStyles: [], - }); - } else { - if (!this.currentDocument.states.get(trimmedId).doc) { - this.currentDocument.states.get(trimmedId).doc = doc; - } - if (!this.currentDocument.states.get(trimmedId).type) { - this.currentDocument.states.get(trimmedId).type = type; - } - } - - if (descr) { - log.info('Setting state description', trimmedId, descr); - if (typeof descr === 'string') { - this.addDescription(trimmedId, descr.trim()); - } - - if (typeof descr === 'object') { - descr.forEach((des) => this.addDescription(trimmedId, des.trim())); - } - } - - if (note) { - const doc2 = this.currentDocument.states.get(trimmedId); - doc2.note = note; - doc2.note.text = common.sanitizeText(doc2.note.text, getConfig()); - } - - if (classes) { - log.info('Setting state classes', trimmedId, classes); - const classesList = typeof classes === 'string' ? [classes] : classes; - classesList.forEach((cssClass) => this.setCssClass(trimmedId, cssClass.trim())); - } - - if (styles) { - log.info('Setting state styles', trimmedId, styles); - const stylesList = typeof styles === 'string' ? [styles] : styles; - stylesList.forEach((style) => this.setStyle(trimmedId, style.trim())); - } - - if (textStyles) { - log.info('Setting state styles', trimmedId, styles); - const textStylesList = typeof textStyles === 'string' ? [textStyles] : textStyles; - textStylesList.forEach((textStyle) => this.setTextStyle(trimmedId, textStyle.trim())); - } - } - - clear(saveCommon) { - this.nodes = []; - this.edges = []; - this.documents = { - root: newDoc(), - }; - this.currentDocument = this.documents.root; - - // number of start and end nodes; used to construct ids - this.startEndCount = 0; - this.classes = newClassesList(); - if (!saveCommon) { - this.links = new Map(); - commonClear(); - } - } - - getState(id) { - return this.currentDocument.states.get(id); - } - getStates() { - return this.currentDocument.states; - } - logDocuments() { - log.info('Documents = ', this.documents); - } - getRelations() { - return this.currentDocument.relations; - } - - /** - * If the id is a start node ( [*] ), then return a new id constructed from - * the start node name and the current start node count. - * else return the given id - * - * @param {string} id - * @returns {string} - the id (original or constructed) - * @private - */ - startIdIfNeeded(id = '') { - let fixedId = id; - if (id === START_NODE) { - this.startEndCount++; - fixedId = `${START_TYPE}${this.startEndCount}`; - } - return fixedId; - } - - /** - * If the id is a start node ( [*] ), then return the start type ('start') - * else return the given type - * - * @param {string} id - * @param {string} type - * @returns {string} - the type that should be used - * @private - */ - startTypeIfNeeded(id = '', type = DEFAULT_STATE_TYPE) { - return id === START_NODE ? START_TYPE : type; - } - - /** - * If the id is an end node ( [*] ), then return a new id constructed from - * the end node name and the current start_end node count. - * else return the given id - * - * @param {string} id - * @returns {string} - the id (original or constructed) - * @private - */ - endIdIfNeeded(id = '') { - let fixedId = id; - if (id === END_NODE) { - this.startEndCount++; - fixedId = `${END_TYPE}${this.startEndCount}`; - } - return fixedId; - } - - /** - * If the id is an end node ( [*] ), then return the end type - * else return the given type - * - * @param {string} id - * @param {string} type - * @returns {string} - the type that should be used - * @private - */ - endTypeIfNeeded(id = '', type = DEFAULT_STATE_TYPE) { - return id === END_NODE ? END_TYPE : type; - } - - /** - * - * @param item1 - * @param item2 - * @param relationTitle - */ - addRelationObjs(item1, item2, relationTitle) { - let id1 = this.startIdIfNeeded(item1.id.trim()); - let type1 = this.startTypeIfNeeded(item1.id.trim(), item1.type); - let id2 = this.startIdIfNeeded(item2.id.trim()); - let type2 = this.startTypeIfNeeded(item2.id.trim(), item2.type); - - this.addState( - id1, - type1, - item1.doc, - item1.description, - item1.note, - item1.classes, - item1.styles, - item1.textStyles - ); - this.addState( - id2, - type2, - item2.doc, - item2.description, - item2.note, - item2.classes, - item2.styles, - item2.textStyles - ); - - this.currentDocument.relations.push({ - id1, - id2, - relationTitle: common.sanitizeText(relationTitle, getConfig()), - }); - } - - /** - * Add a relation between two items. The items may be full objects or just the string id of a state. - * - * @param {string | object} item1 - * @param {string | object} item2 - * @param {string} title - */ - addRelation(item1, item2, title) { - if (typeof item1 === 'object') { - this.addRelationObjs(item1, item2, title); - } else { - const id1 = this.startIdIfNeeded(item1.trim()); - const type1 = this.startTypeIfNeeded(item1); - const id2 = this.endIdIfNeeded(item2.trim()); - const type2 = this.endTypeIfNeeded(item2); - - this.addState(id1, type1); - this.addState(id2, type2); - this.currentDocument.relations.push({ - id1, - id2, - title: common.sanitizeText(title, getConfig()), - }); - } - } - - addDescription(id, descr) { - const theState = this.currentDocument.states.get(id); - const _descr = descr.startsWith(':') ? descr.replace(':', '').trim() : descr; - theState.descriptions.push(common.sanitizeText(_descr, getConfig())); - } - - cleanupLabel(label) { - if (label.substring(0, 1) === ':') { - return label.substr(2).trim(); - } else { - return label.trim(); - } - } - - getDividerId() { - this.dividerCnt++; - return 'divider-id-' + this.dividerCnt; - } - - /** - * Adds a clickable link to a state. - * @param {string} stateId - * @param {string} url - * @param {string} tooltip - */ - addLink(stateId, url, tooltip = '') { - this.links.set(stateId, { url, tooltip }); - log.warn('Adding link', stateId, url, tooltip); - } - - /** - * Get all registered links. - * @returns {Map} - */ - getLinks() { - return this.links; - } - - /** - * Called when the parser comes across a (style) class definition - * @example classDef my-style fill:#f96; - * - * @param {string} id - the id of this (style) class - * @param {string | null} styleAttributes - the string with 1 or more style attributes (each separated by a comma) - */ - addStyleClass(id, styleAttributes = '') { - // create a new style class object with this id - if (!this.classes.has(id)) { - this.classes.set(id, { id: id, styles: [], textStyles: [] }); // This is a classDef - } - const foundClass = this.classes.get(id); - if (styleAttributes !== undefined && styleAttributes !== null) { - styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => { - // remove any trailing ; - const fixedAttrib = attrib.replace(/([^;]*);/, '$1').trim(); - - // replace some style keywords - if (RegExp(COLOR_KEYWORD).exec(attrib)) { - const newStyle1 = fixedAttrib.replace(FILL_KEYWORD, BG_FILL); - const newStyle2 = newStyle1.replace(COLOR_KEYWORD, FILL_KEYWORD); - foundClass.textStyles.push(newStyle2); - } - foundClass.styles.push(fixedAttrib); - }); - } - } - - /** - * Return all of the style classes - * @returns {{} | any | classes} - */ - getClasses() { - return this.classes; - } - - /** - * Add a (style) class or css class to a state with the given id. - * If the state isn't already in the list of known states, add it. - * Might be called by parser when a style class or CSS class should be applied to a state - * - * @param {string | string[]} itemIds The id or a list of ids of the item(s) to apply the css class to - * @param {string} cssClassName CSS class name - */ - setCssClass(itemIds, cssClassName) { - itemIds.split(',').forEach((id) => { - let foundState = this.getState(id); - if (foundState === undefined) { - const trimmedId = id.trim(); - this.addState(trimmedId); - foundState = this.getState(trimmedId); - } - foundState.classes.push(cssClassName); - }); - } - - /** - * Add a style to a state with the given id. - * @example style stateId fill:#f9f,stroke:#333,stroke-width:4px - * where 'style' is the keyword - * stateId is the id of a state - * the rest of the string is the styleText (all of the attributes to be applied to the state) - * - * @param itemId The id of item to apply the style to - * @param styleText - the text of the attributes for the style - */ - setStyle(itemId, styleText) { - const item = this.getState(itemId); - if (item !== undefined) { - item.styles.push(styleText); - } - } - - /** - * Add a text style to a state with the given id - * - * @param itemId The id of item to apply the css class to - * @param cssClassName CSS class name - */ - setTextStyle(itemId, cssClassName) { - const item = this.getState(itemId); - if (item !== undefined) { - item.textStyles.push(cssClassName); - } - } - - /** - * Finds the direction statement in the root document. - * @private - * @returns {{ value: string } | undefined} - the direction statement if present - */ - getDirectionStatement() { - return this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); - } - - getDirection() { - return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION; - } - - setDirection(dir) { - const doc = this.getDirectionStatement(); - if (doc) { - doc.value = dir; - } else { - this.rootDoc.unshift({ stmt: STMT_DIRECTION, value: dir }); - } - } - - trimColon(str) { - return str && str[0] === ':' ? str.substr(1).trim() : str.trim(); - } - - getData() { - const config = getConfig(); - return { - nodes: this.nodes, - edges: this.edges, - other: {}, - config, - direction: getDir(this.getRootDocV2()), - }; - } - - getConfig() { - return getConfig().state; - } - getAccTitle = getAccTitle; - setAccTitle = setAccTitle; - getAccDescription = getAccDescription; - setAccDescription = setAccDescription; - setDiagramTitle = setDiagramTitle; - getDiagramTitle = getDiagramTitle; -} diff --git a/packages/mermaid/src/diagrams/state/stateDb.ts b/packages/mermaid/src/diagrams/state/stateDb.ts new file mode 100644 index 000000000..853a0e22f --- /dev/null +++ b/packages/mermaid/src/diagrams/state/stateDb.ts @@ -0,0 +1,693 @@ +import { getConfig } from '../../diagram-api/diagramAPI.js'; +import { log } from '../../logger.js'; +import { generateId } from '../../utils.js'; +import common from '../common/common.js'; +import { + clear as commonClear, + getAccDescription, + getAccTitle, + getDiagramTitle, + setAccDescription, + setAccTitle, + setDiagramTitle, +} from '../common/commonDb.js'; +import { dataFetcher, reset as resetDataFetcher } from './dataFetcher.js'; +import { getDir } from './stateRenderer-v3-unified.js'; +import { + DEFAULT_DIAGRAM_DIRECTION, + DEFAULT_STATE_TYPE, + DIVIDER_TYPE, + STMT_APPLYCLASS, + STMT_CLASSDEF, + STMT_RELATION, + STMT_ROOT, + STMT_DIRECTION, + STMT_STATE, + STMT_STYLEDEF, +} from './stateCommon.js'; +import type { MermaidConfig } from '../../config.type.js'; + +const CONSTANTS = { + START_NODE: '[*]', + START_TYPE: 'start', + END_NODE: '[*]', + END_TYPE: 'end', + COLOR_KEYWORD: 'color', + FILL_KEYWORD: 'fill', + BG_FILL: 'bgFill', + STYLECLASS_SEP: ',', +} as const; + +interface BaseStmt { + stmt: 'applyClass' | 'classDef' | 'dir' | 'relation' | 'state' | 'style' | 'root' | 'default'; +} + +interface ApplyClassStmt extends BaseStmt { + stmt: 'applyClass'; + id: string; + styleClass: string; +} + +interface ClassDefStmt extends BaseStmt { + stmt: 'classDef'; + id: string; + classes: string; +} + +interface DirectionStmt extends BaseStmt { + stmt: 'dir'; + value: 'TB' | 'BT' | 'RL' | 'LR'; +} + +interface RelationStmt extends BaseStmt { + stmt: 'relation'; + state1: StateStmt; + state2: StateStmt; + description?: string; +} + +export interface StateStmt extends BaseStmt { + stmt: 'state' | 'default'; + id: string; + type: 'default' | 'fork' | 'join' | 'choice' | 'divider' | 'start' | 'end'; + description?: string; + descriptions?: string[]; + doc?: Stmt[]; + note?: Note; + start?: boolean; + classes?: string[]; + styles?: string[]; + textStyles?: string[]; +} + +interface StyleStmt extends BaseStmt { + stmt: 'style'; + id: string; + styleClass: string; +} + +export interface RootStmt { + id: 'root'; + stmt: 'root'; + doc?: Stmt[]; +} + +interface Note { + position?: 'left of' | 'right of'; + text: string; +} + +export type Stmt = + | ApplyClassStmt + | ClassDefStmt + | DirectionStmt + | RelationStmt + | StateStmt + | StyleStmt + | RootStmt; + +interface DiagramEdge { + id1: string; + id2: string; + relationTitle?: string; +} + +interface Document { + relations: DiagramEdge[]; + states: Map; + documents: Record; +} + +export interface StyleClass { + id: string; + styles: string[]; + textStyles: string[]; +} + +export interface NodeData { + labelStyle?: string; + shape: string; + label?: string | string[]; + cssClasses: string; + cssCompiledStyles?: string[]; + cssStyles: string[]; + id: string; + dir?: string; + domId?: string; + type?: string; + isGroup?: boolean; + padding?: number; + rx?: number; + ry?: number; + look?: MermaidConfig['look']; + parentId?: string; + centerLabel?: boolean; + position?: string; + description?: string | string[]; +} + +export interface Edge { + id: string; + start: string; + end: string; + arrowhead: string; + arrowTypeEnd: string; + style: string; + labelStyle: string; + label?: string; + arrowheadStyle: string; + labelpos: string; + labelType: string; + thickness: string; + classes: string; + look: MermaidConfig['look']; +} + +/** + * Returns a new list of classes. + * In the future, this can be replaced with a class common to all diagrams. + * ClassDef information = \{ id: id, styles: [], textStyles: [] \} + */ +const newClassesList = (): Map => new Map(); +const newDoc = (): Document => ({ + relations: [], + states: new Map(), + documents: {}, +}); +const clone = (o: T): T => JSON.parse(JSON.stringify(o)); + +export class StateDB { + private nodes: NodeData[] = []; + private edges: Edge[] = []; + private rootDoc: Stmt[] = []; + private classes = newClassesList(); + private documents = { root: newDoc() }; + private currentDocument = this.documents.root; + private startEndCount = 0; + private dividerCnt = 0; + + static readonly relationType = { + AGGREGATION: 0, + EXTENSION: 1, + COMPOSITION: 2, + DEPENDENCY: 3, + } as const; + + constructor(private version: 1 | 2) { + this.clear(); + // Bind methods used by JISON + this.setRootDoc = this.setRootDoc.bind(this); + this.getDividerId = this.getDividerId.bind(this); + this.setDirection = this.setDirection.bind(this); + this.trimColon = this.trimColon.bind(this); + } + + /** + * Convert all of the statements (stmts) that were parsed into states and relationships. + * This is done because a state diagram may have nested sections, + * where each section is a 'document' and has its own set of statements. + * Ex: the section within a fork has its own statements, and incoming and outgoing statements + * refer to the fork as a whole (document). + * See the parser grammar: the definition of a document is a document then a 'line', where a line can be a statement. + * This will push the statement into the list of statements for the current document. + */ + extract(statements: Stmt[] | { doc: Stmt[] }) { + this.clear(true); + for (const item of Array.isArray(statements) ? statements : statements.doc) { + switch (item.stmt) { + case STMT_STATE: + this.addState(item.id.trim(), item.type, item.doc, item.description, item.note); + break; + case STMT_RELATION: + this.addRelation(item.state1, item.state2, item.description); + break; + case STMT_CLASSDEF: + this.addStyleClass(item.id.trim(), item.classes); + break; + case STMT_STYLEDEF: + this.handleStyleDef(item); + break; + case STMT_APPLYCLASS: + this.setCssClass(item.id.trim(), item.styleClass); + break; + } + } + const diagramStates = this.getStates(); + const config = getConfig(); + + resetDataFetcher(); + dataFetcher( + undefined, + this.getRootDocV2() as StateStmt, + diagramStates, + this.nodes, + this.edges, + true, + config.look, + this.classes + ); + + // Process node labels + for (const node of this.nodes) { + if (!Array.isArray(node.label)) { + continue; + } + + node.description = node.label.slice(1); + if (node.isGroup && node.description.length > 0) { + throw new Error( + `Group nodes can only have label. Remove the additional description for node [${node.id}]` + ); + } + node.label = node.label[0]; + } + } + + private handleStyleDef(item: StyleStmt) { + const ids = item.id.trim().split(','); + const styles = item.styleClass.split(','); + + for (const id of ids) { + let state = this.getState(id); + if (!state) { + const trimmedId = id.trim(); + this.addState(trimmedId); + state = this.getState(trimmedId); + } + if (state) { + state.styles = styles.map((s) => s.replace(/;/g, '')?.trim()); + } + } + } + + setRootDoc(o: Stmt[]) { + log.info('Setting root doc', o); + this.rootDoc = o; + if (this.version === 1) { + this.extract(o); + } else { + this.extract(this.getRootDocV2()); + } + } + + docTranslator(parent: RootStmt | StateStmt, node: Stmt, first: boolean) { + if (node.stmt === STMT_RELATION) { + this.docTranslator(parent, node.state1, true); + this.docTranslator(parent, node.state2, false); + return; + } + + if (node.stmt === STMT_STATE) { + if (node.id === CONSTANTS.START_NODE) { + node.id = parent.id + (first ? '_start' : '_end'); + node.start = first; + } else { + // This is just a plain state, not a start or end + node.id = node.id.trim(); + } + } + + if ((node.stmt !== STMT_ROOT && node.stmt !== STMT_STATE) || !node.doc) { + return; + } + + const doc = []; + // Check for concurrency + let currentDoc = []; + for (const stmt of node.doc) { + if ((stmt as StateStmt).type === DIVIDER_TYPE) { + const newNode = clone(stmt as StateStmt); + newNode.doc = clone(currentDoc); + doc.push(newNode); + currentDoc = []; + } else { + currentDoc.push(stmt); + } + } + + // If any divider was encountered + if (doc.length > 0 && currentDoc.length > 0) { + const newNode = { + stmt: STMT_STATE, + id: generateId(), + type: 'divider', + doc: clone(currentDoc), + } satisfies StateStmt; + doc.push(clone(newNode)); + node.doc = doc; + } + + node.doc.forEach((docNode) => this.docTranslator(node, docNode, true)); + } + + private getRootDocV2() { + this.docTranslator( + { id: STMT_ROOT, stmt: STMT_ROOT }, + { id: STMT_ROOT, stmt: STMT_ROOT, doc: this.rootDoc }, + true + ); + return { id: STMT_ROOT, doc: this.rootDoc }; + } + + /** + * Function called by parser when a node definition has been found. + * + * @param descr - description for the state. Can be a string or a list or strings + * @param classes - class styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 class, convert it to an array of that 1 class. + * @param styles - styles to apply to this state. Can be a string (1 style) or an array of styles. If it's just 1 style, convert it to an array of that 1 style. + * @param textStyles - text styles to apply to this state. Can be a string (1 text test) or an array of text styles. If it's just 1 text style, convert it to an array of that 1 text style. + */ + addState( + id: string, + type: StateStmt['type'] = DEFAULT_STATE_TYPE, + doc: Stmt[] | undefined = undefined, + descr: string | string[] | undefined = undefined, + note: Note | undefined = undefined, + classes: string | string[] | undefined = undefined, + styles: string | string[] | undefined = undefined, + textStyles: string | string[] | undefined = undefined + ) { + const trimmedId = id?.trim(); + if (!this.currentDocument.states.has(trimmedId)) { + log.info('Adding state ', trimmedId, descr); + this.currentDocument.states.set(trimmedId, { + stmt: STMT_STATE, + id: trimmedId, + descriptions: [], + type, + doc, + note, + classes: [], + styles: [], + textStyles: [], + }); + } else { + const state = this.currentDocument.states.get(trimmedId); + if (!state) { + throw new Error(`State not found: ${trimmedId}`); + } + if (!state.doc) { + state.doc = doc; + } + if (!state.type) { + state.type = type; + } + } + + if (descr) { + log.info('Setting state description', trimmedId, descr); + const descriptions = Array.isArray(descr) ? descr : [descr]; + descriptions.forEach((des) => this.addDescription(trimmedId, des.trim())); + } + + if (note) { + const doc2 = this.currentDocument.states.get(trimmedId); + if (!doc2) { + throw new Error(`State not found: ${trimmedId}`); + } + doc2.note = note; + doc2.note.text = common.sanitizeText(doc2.note.text, getConfig()); + } + + if (classes) { + log.info('Setting state classes', trimmedId, classes); + const classesList = Array.isArray(classes) ? classes : [classes]; + classesList.forEach((cssClass) => this.setCssClass(trimmedId, cssClass.trim())); + } + + if (styles) { + log.info('Setting state styles', trimmedId, styles); + const stylesList = Array.isArray(styles) ? styles : [styles]; + stylesList.forEach((style) => this.setStyle(trimmedId, style.trim())); + } + + if (textStyles) { + log.info('Setting state styles', trimmedId, styles); + const textStylesList = Array.isArray(textStyles) ? textStyles : [textStyles]; + textStylesList.forEach((textStyle) => this.setTextStyle(trimmedId, textStyle.trim())); + } + } + + clear(saveCommon?: boolean) { + this.nodes = []; + this.edges = []; + this.documents = { root: newDoc() }; + this.currentDocument = this.documents.root; + + // number of start and end nodes; used to construct ids + this.startEndCount = 0; + this.classes = newClassesList(); + if (!saveCommon) { + commonClear(); + } + } + + getState(id: string) { + return this.currentDocument.states.get(id); + } + + getStates() { + return this.currentDocument.states; + } + + logDocuments() { + log.info('Documents = ', this.documents); + } + + getRelations() { + return this.currentDocument.relations; + } + + /** + * If the id is a start node ( [*] ), then return a new id constructed from + * the start node name and the current start node count. + * else return the given id + */ + startIdIfNeeded(id = '') { + if (id === CONSTANTS.START_NODE) { + this.startEndCount++; + return `${CONSTANTS.START_TYPE}${this.startEndCount}`; + } + return id; + } + + /** + * If the id is a start node ( [*] ), then return the start type ('start') + * else return the given type + */ + startTypeIfNeeded(id = '', type: StateStmt['type'] = DEFAULT_STATE_TYPE) { + return id === CONSTANTS.START_NODE ? CONSTANTS.START_TYPE : type; + } + + /** + * If the id is an end node ( [*] ), then return a new id constructed from + * the end node name and the current start_end node count. + * else return the given id + */ + endIdIfNeeded(id = '') { + if (id === CONSTANTS.END_NODE) { + this.startEndCount++; + return `${CONSTANTS.END_TYPE}${this.startEndCount}`; + } + return id; + } + + /** + * If the id is an end node ( [*] ), then return the end type + * else return the given type + * + */ + endTypeIfNeeded(id = '', type: StateStmt['type'] = DEFAULT_STATE_TYPE) { + return id === CONSTANTS.END_NODE ? CONSTANTS.END_TYPE : type; + } + + addRelationObjs(item1: StateStmt, item2: StateStmt, relationTitle = '') { + const id1 = this.startIdIfNeeded(item1.id.trim()); + const type1 = this.startTypeIfNeeded(item1.id.trim(), item1.type); + const id2 = this.startIdIfNeeded(item2.id.trim()); + const type2 = this.startTypeIfNeeded(item2.id.trim(), item2.type); + this.addState( + id1, + type1, + item1.doc, + item1.description, + item1.note, + item1.classes, + item1.styles, + item1.textStyles + ); + this.addState( + id2, + type2, + item2.doc, + item2.description, + item2.note, + item2.classes, + item2.styles, + item2.textStyles + ); + this.currentDocument.relations.push({ + id1, + id2, + relationTitle: common.sanitizeText(relationTitle, getConfig()), + }); + } + + /** + * Add a relation between two items. The items may be full objects or just the string id of a state. + */ + addRelation(item1: string | StateStmt, item2: string | StateStmt, title?: string) { + if (typeof item1 === 'object' && typeof item2 === 'object') { + this.addRelationObjs(item1, item2, title); + } else if (typeof item1 === 'string' && typeof item2 === 'string') { + const id1 = this.startIdIfNeeded(item1.trim()); + const type1 = this.startTypeIfNeeded(item1); + const id2 = this.endIdIfNeeded(item2.trim()); + const type2 = this.endTypeIfNeeded(item2); + + this.addState(id1, type1); + this.addState(id2, type2); + this.currentDocument.relations.push({ + id1, + id2, + relationTitle: title ? common.sanitizeText(title, getConfig()) : undefined, + }); + } + } + + addDescription(id: string, descr: string) { + const theState = this.currentDocument.states.get(id); + const _descr = descr.startsWith(':') ? descr.replace(':', '').trim() : descr; + theState?.descriptions?.push(common.sanitizeText(_descr, getConfig())); + } + + cleanupLabel(label: string) { + return label.startsWith(':') ? label.slice(2).trim() : label.trim(); + } + + getDividerId() { + this.dividerCnt++; + return `divider-id-${this.dividerCnt}`; + } + + /** + * Called when the parser comes across a (style) class definition + * @example classDef my-style fill:#f96; + * + * @param id - the id of this (style) class + * @param styleAttributes - the string with 1 or more style attributes (each separated by a comma) + */ + addStyleClass(id: string, styleAttributes = '') { + // create a new style class object with this id + if (!this.classes.has(id)) { + this.classes.set(id, { id, styles: [], textStyles: [] }); + } + const foundClass = this.classes.get(id); + if (styleAttributes && foundClass) { + styleAttributes.split(CONSTANTS.STYLECLASS_SEP).forEach((attrib) => { + const fixedAttrib = attrib.replace(/([^;]*);/, '$1').trim(); + if (RegExp(CONSTANTS.COLOR_KEYWORD).exec(attrib)) { + const newStyle1 = fixedAttrib.replace(CONSTANTS.FILL_KEYWORD, CONSTANTS.BG_FILL); + const newStyle2 = newStyle1.replace(CONSTANTS.COLOR_KEYWORD, CONSTANTS.FILL_KEYWORD); + foundClass.textStyles.push(newStyle2); + } + foundClass.styles.push(fixedAttrib); + }); + } + } + + getClasses() { + return this.classes; + } + + /** + * Add a (style) class or css class to a state with the given id. + * If the state isn't already in the list of known states, add it. + * Might be called by parser when a style class or CSS class should be applied to a state + * + * @param itemIds - The id or a list of ids of the item(s) to apply the css class to + * @param cssClassName - CSS class name + */ + setCssClass(itemIds: string, cssClassName: string) { + itemIds.split(',').forEach((id) => { + let foundState = this.getState(id); + if (!foundState) { + const trimmedId = id.trim(); + this.addState(trimmedId); + foundState = this.getState(trimmedId); + } + foundState?.classes?.push(cssClassName); + }); + } + + /** + * Add a style to a state with the given id. + * @example style stateId fill:#f9f,stroke:#333,stroke-width:4px + * where 'style' is the keyword + * stateId is the id of a state + * the rest of the string is the styleText (all of the attributes to be applied to the state) + * + * @param itemId - The id of item to apply the style to + * @param styleText - the text of the attributes for the style + */ + setStyle(itemId: string, styleText: string) { + this.getState(itemId)?.styles?.push(styleText); + } + + /** + * Add a text style to a state with the given id + * + * @param itemId - The id of item to apply the css class to + * @param cssClassName - CSS class name + */ + setTextStyle(itemId: string, cssClassName: string) { + this.getState(itemId)?.textStyles?.push(cssClassName); + } + + /** + * Finds the direction statement in the root document. + * @returns the direction statement if present + */ + private getDirectionStatement() { + return this.rootDoc.find((doc): doc is DirectionStmt => doc.stmt === STMT_DIRECTION); + } + + getDirection() { + return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION; + } + + setDirection(dir: DirectionStmt['value']) { + const doc = this.getDirectionStatement(); + if (doc) { + doc.value = dir; + } else { + this.rootDoc.unshift({ stmt: STMT_DIRECTION, value: dir }); + } + } + + trimColon(str: string) { + return str.startsWith(':') ? str.slice(1).trim() : str.trim(); + } + + getData() { + const config = getConfig(); + return { + nodes: this.nodes, + edges: this.edges, + other: {}, + config, + direction: getDir(this.getRootDocV2()), + }; + } + + getConfig() { + return getConfig().state; + } + + getAccTitle = getAccTitle; + setAccTitle = setAccTitle; + getAccDescription = getAccDescription; + setAccDescription = setAccDescription; + setDiagramTitle = setDiagramTitle; + getDiagramTitle = getDiagramTitle; +} diff --git a/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js b/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js index a79e44d5d..35fdd4579 100644 --- a/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js +++ b/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js @@ -5,6 +5,7 @@ import { StateDB } from './stateDb.js'; describe('state diagram V2, ', function () { // TODO - these examples should be put into ./parser/stateDiagram.spec.js describe('when parsing an info graph it', function () { + /** @type {StateDB} */ let stateDb; beforeEach(function () { stateDb = new StateDB(2); @@ -347,6 +348,20 @@ describe('state diagram V2, ', function () { `; parser.parse(str); + expect(stateDb.getState('Active').note).toMatchInlineSnapshot(` + { + "position": "left of", + "text": "this is a short
note", + } + `); + expect(stateDb.getState('Inactive').note).toMatchInlineSnapshot(` + { + "position": "right of", + "text": "A note can also + be defined on + several lines", + } + `); }); it('should handle multiline notes with different line breaks', function () { const str = `stateDiagram-v2 @@ -357,6 +372,12 @@ describe('state diagram V2, ', function () { `; parser.parse(str); + expect(stateDb.getStates().get('State1').note).toMatchInlineSnapshot(` + { + "position": "right of", + "text": "Line1
Line2
Line3
Line4
Line5", + } + `); }); it('should handle floating notes', function () { const str = `stateDiagram-v2 @@ -367,15 +388,14 @@ describe('state diagram V2, ', function () { parser.parse(str); }); it('should handle floating notes', function () { - const str = `stateDiagram-v2\n + const str = `stateDiagram-v2 state foo note "This is a floating note" as N1 `; - parser.parse(str); }); it('should handle notes for composite (nested) states', function () { - const str = `stateDiagram-v2\n + const str = `stateDiagram-v2 [*] --> NotShooting state "Not Shooting State" as NotShooting { @@ -390,6 +410,12 @@ describe('state diagram V2, ', function () { `; parser.parse(str); + expect(stateDb.getState('NotShooting').note).toMatchInlineSnapshot(` + { + "position": "right of", + "text": "This is a note on a composite state", + } + `); }); it('A composite state should be able to link to itself', () => { diff --git a/packages/mermaid/src/diagrams/timeline/parser/timeline.jison b/packages/mermaid/src/diagrams/timeline/parser/timeline.jison index 89bfd06f4..0fac8bd33 100644 --- a/packages/mermaid/src/diagrams/timeline/parser/timeline.jison +++ b/packages/mermaid/src/diagrams/timeline/parser/timeline.jison @@ -29,7 +29,7 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili "section"\s[^:\n]+ return 'section'; // event starting with "==>" keyword -":"\s[^:\n]+ return 'event'; +":"\s(?:[^:\n]|":"(?!\s))+ return 'event'; [^#:\n]+ return 'period'; diff --git a/packages/mermaid/src/diagrams/timeline/timeline.spec.js b/packages/mermaid/src/diagrams/timeline/timeline.spec.js index a7005cada..92af504c3 100644 --- a/packages/mermaid/src/diagrams/timeline/timeline.spec.js +++ b/packages/mermaid/src/diagrams/timeline/timeline.spec.js @@ -30,7 +30,7 @@ describe('when parsing a timeline ', function () { }); }); - it('should handle a two section and two coressponding tasks', function () { + it('should handle a two section and two corresponding tasks', function () { let str = `timeline section abc-123 task1 @@ -75,6 +75,30 @@ describe('when parsing a timeline ', function () { }); }); + it('should handle a section, and task and its events including markdown link', function () { + let str = `timeline + section abc-123 + task1: [event1](http://example.com) + task2: event2: event3 + `; + timeline.parse(str); + expect(timelineDB.getSections()[0]).to.deep.equal('abc-123'); + timelineDB.getTasks().forEach((t) => { + switch (t.task.trim()) { + case 'task1': + expect(t.events).to.deep.equal(['[event1](http://example.com)']); + break; + + case 'task2': + expect(t.events).to.deep.equal(['event2', 'event3']); + break; + + default: + break; + } + }); + }); + it('should handle a section, and task and its multi line events', function () { let str = `timeline section abc-123 diff --git a/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts b/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts index 13eb31a02..e0b22d026 100644 --- a/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts +++ b/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts @@ -13,15 +13,17 @@ export const setConf = function (cnf) { }; const actors = {}; +let maxWidth = 0; /** @param diagram - The diagram to draw to. */ function drawActorLegend(diagram) { const conf = getConfig().journey; - // Draw the actors + const maxLabelWidth = conf.maxLabelWidth; + maxWidth = 0; let yPos = 60; + Object.keys(actors).forEach((person) => { const colour = actors[person].color; - const circleData = { cx: 20, cy: yPos, @@ -32,25 +34,97 @@ function drawActorLegend(diagram) { }; svgDraw.drawCircle(diagram, circleData); - const labelData = { - x: 40, - y: yPos + 7, - fill: '#666', - text: person, - textMargin: conf.boxTextMargin | 5, - }; - svgDraw.drawText(diagram, labelData); + // First, measure the full text width without wrapping. + let measureText = diagram.append('text').attr('visibility', 'hidden').text(person); + const fullTextWidth = measureText.node().getBoundingClientRect().width; + measureText.remove(); - yPos += 20; + let lines = []; + + // If the text is naturally within the max width, use it as a single line. + if (fullTextWidth <= maxLabelWidth) { + lines = [person]; + } else { + // Otherwise, wrap the text using the knuth-plass algorithm. + const words = person.split(' '); // Split the text into words. + let currentLine = ''; + measureText = diagram.append('text').attr('visibility', 'hidden'); + + words.forEach((word) => { + // check the width of the line with the new word. + const testLine = currentLine ? `${currentLine} ${word}` : word; + measureText.text(testLine); + const textWidth = measureText.node().getBoundingClientRect().width; + + if (textWidth > maxLabelWidth) { + // If adding the new word exceeds max width, push the current line. + if (currentLine) { + lines.push(currentLine); + } + currentLine = word; // Start a new line with the current word. + + // If the word itself is too long, break it with a hyphen. + measureText.text(word); + if (measureText.node().getBoundingClientRect().width > maxLabelWidth) { + let brokenWord = ''; + for (const char of word) { + brokenWord += char; + measureText.text(brokenWord + '-'); + if (measureText.node().getBoundingClientRect().width > maxLabelWidth) { + // Push the broken part with a hyphen. + lines.push(brokenWord.slice(0, -1) + '-'); + brokenWord = char; + } + } + currentLine = brokenWord; + } + } else { + // If the line with the new word fits, add the new word to the current line. + currentLine = testLine; + } + }); + + // Push the last line. + if (currentLine) { + lines.push(currentLine); + } + measureText.remove(); // Remove the text element used for measuring. + } + + lines.forEach((line, index) => { + const labelData = { + x: 40, + y: yPos + 7 + index * 20, + fill: '#666', + text: line, + textMargin: conf.boxTextMargin ?? 5, + }; + + // Draw the text and measure the width. + const textElement = svgDraw.drawText(diagram, labelData); + const lineWidth = textElement.node().getBoundingClientRect().width; + + // Use conf.leftMargin as the initial spacing baseline, + // but expand maxWidth if the line is wider. + if (lineWidth > maxWidth && lineWidth > conf.leftMargin - lineWidth) { + maxWidth = lineWidth; + } + }); + + yPos += Math.max(20, lines.length * 20); }); } + // TODO: Cleanup? const conf = getConfig().journey; -const LEFT_MARGIN = conf.leftMargin; +let leftMargin = 0; export const draw = function (text, id, version, diagObj) { - const conf = getConfig().journey; + const configObject = getConfig(); + const titleColor = configObject.journey.titleColor; + const titleFontSize = configObject.journey.titleFontSize; + const titleFontFamily = configObject.journey.titleFontFamily; - const securityLevel = getConfig().securityLevel; + const securityLevel = configObject.securityLevel; // Handle root and Document for when rendering in sandbox mode let sandboxElement; if (securityLevel === 'sandbox') { @@ -84,7 +158,8 @@ export const draw = function (text, id, version, diagObj) { }); drawActorLegend(diagram); - bounds.insert(0, 0, LEFT_MARGIN, Object.keys(actors).length * 50); + leftMargin = conf.leftMargin + maxWidth; + bounds.insert(0, 0, leftMargin, Object.keys(actors).length * 50); drawTasks(diagram, tasks, 0); const box = bounds.getBounds(); @@ -92,23 +167,25 @@ export const draw = function (text, id, version, diagObj) { diagram .append('text') .text(title) - .attr('x', LEFT_MARGIN) - .attr('font-size', '4ex') + .attr('x', leftMargin) + .attr('font-size', titleFontSize) .attr('font-weight', 'bold') - .attr('y', 25); + .attr('y', 25) + .attr('fill', titleColor) + .attr('font-family', titleFontFamily); } const height = box.stopy - box.starty + 2 * conf.diagramMarginY; - const width = LEFT_MARGIN + box.stopx + 2 * conf.diagramMarginX; + const width = leftMargin + box.stopx + 2 * conf.diagramMarginX; configureSvgSize(diagram, height, width, conf.useMaxWidth); // Draw activity line diagram .append('line') - .attr('x1', LEFT_MARGIN) + .attr('x1', leftMargin) .attr('y1', conf.height * 4) // One section head + one task + margins - .attr('x2', width - LEFT_MARGIN - 4) // Subtract stroke width so arrow point is retained + .attr('x2', width - leftMargin - 4) // Subtract stroke width so arrow point is retained .attr('y2', conf.height * 4) .attr('stroke-width', 4) .attr('stroke', 'black') @@ -234,7 +311,7 @@ export const drawTasks = function (diagram, tasks, verticalPos) { } const section = { - x: i * conf.taskMargin + i * conf.width + LEFT_MARGIN, + x: i * conf.taskMargin + i * conf.width + leftMargin, y: 50, text: task.section, fill, @@ -258,7 +335,7 @@ export const drawTasks = function (diagram, tasks, verticalPos) { }, {}); // Add some rendering data to the object - task.x = i * conf.taskMargin + i * conf.width + LEFT_MARGIN; + task.x = i * conf.taskMargin + i * conf.width + leftMargin; task.y = taskPos; task.width = conf.diagramMarginX; task.height = conf.diagramMarginY; diff --git a/packages/mermaid/src/diagrams/user-journey/styles.js b/packages/mermaid/src/diagrams/user-journey/styles.js index a0528294f..ebfb5658d 100644 --- a/packages/mermaid/src/diagrams/user-journey/styles.js +++ b/packages/mermaid/src/diagrams/user-journey/styles.js @@ -1,3 +1,5 @@ +import { getIconStyles } from '../globalStyles.js'; + const getStyles = (options) => `.label { font-family: ${options.fontFamily}; @@ -131,6 +133,7 @@ const getStyles = (options) => .actor-5 { ${options.actor5 ? `fill: ${options.actor5}` : ''}; } + ${getIconStyles()} `; export default getStyles; diff --git a/packages/mermaid/src/diagrams/xychart/chartBuilder/interfaces.ts b/packages/mermaid/src/diagrams/xychart/chartBuilder/interfaces.ts index 3d188895f..5f6f862ee 100644 --- a/packages/mermaid/src/diagrams/xychart/chartBuilder/interfaces.ts +++ b/packages/mermaid/src/diagrams/xychart/chartBuilder/interfaces.ts @@ -93,6 +93,7 @@ export interface XYChartConfig { titleFontSize: number; titlePadding: number; showTitle: boolean; + showDataLabel: boolean; xAxis: XYChartAxisConfig; yAxis: XYChartAxisConfig; chartOrientation: 'vertical' | 'horizontal'; diff --git a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts index 2c2c0b4b9..d7de15f66 100644 --- a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts +++ b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts @@ -128,7 +128,7 @@ describe('Testing xychart jison file', () => { expect(mockDB.setXAxisRangeData).toHaveBeenCalledWith(45.5, 0.34); }); - it('parse x-axis without axisname and range data', () => { + it('parse x-axis without axis name and range data', () => { const str = 'xychart-beta \nx-axis 45.5 --> 1.34 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ @@ -154,7 +154,7 @@ describe('Testing xychart jison file', () => { ]); }); - it('parse x-axis without axisname and category data', () => { + it('parse x-axis without axis name and category data', () => { const str = 'xychart-beta \nx-axis [ "cat1" , cat2a ] \n '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ @@ -244,7 +244,7 @@ describe('Testing xychart jison file', () => { expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setYAxisRangeData).toHaveBeenCalledWith(45.5, 33); }); - it('parse y-axis without axisname with range data', () => { + it('parse y-axis without axis name with range data', () => { const str = 'xychart-beta \ny-axis 45.5 --> 33 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: '', type: 'text' }); diff --git a/packages/mermaid/src/diagrams/xychart/xychartDb.ts b/packages/mermaid/src/diagrams/xychart/xychartDb.ts index fb2435df2..9ad7cd420 100644 --- a/packages/mermaid/src/diagrams/xychart/xychartDb.ts +++ b/packages/mermaid/src/diagrams/xychart/xychartDb.ts @@ -195,6 +195,10 @@ function getChartConfig() { return xyChartConfig; } +function getXYChartData() { + return xyChartData; +} + const clear = function () { commonClear(); plotIndex = 0; @@ -226,4 +230,5 @@ export default { setTmpSVGG, getChartThemeConfig, getChartConfig, + getXYChartData, }; diff --git a/packages/mermaid/src/diagrams/xychart/xychartRenderer.ts b/packages/mermaid/src/diagrams/xychart/xychartRenderer.ts index 1f4d36e8a..b86c8556e 100644 --- a/packages/mermaid/src/diagrams/xychart/xychartRenderer.ts +++ b/packages/mermaid/src/diagrams/xychart/xychartRenderer.ts @@ -14,6 +14,7 @@ export const draw = (txt: string, id: string, _version: string, diagObj: Diagram const db = diagObj.db as typeof XYChartDB; const themeConfig = db.getChartThemeConfig(); const chartConfig = db.getChartConfig(); + const labelData = db.getXYChartData().plots[0].data.map((data) => data[1]); function getDominantBaseLine(horizontalPos: TextVerticalPos) { return horizontalPos === 'top' ? 'text-before-edge' : 'middle'; } @@ -49,6 +50,16 @@ export const draw = (txt: string, id: string, _version: string, diagObj: Diagram const groups: Record = {}; + interface BarItem { + data: { + x: number; + y: number; + width: number; + height: number; + }; + label: string; + } + function getGroup(gList: string[]) { let elem = group; let prefix = ''; @@ -87,6 +98,113 @@ export const draw = (txt: string, id: string, _version: string, diagObj: Diagram .attr('fill', (data) => data.fill) .attr('stroke', (data) => data.strokeFill) .attr('stroke-width', (data) => data.strokeWidth); + + if (chartConfig.showDataLabel) { + if (chartConfig.chartOrientation === 'horizontal') { + // Factor to approximate each character's width. + const charWidthFactor = 0.7; + + // Filter out bars that have zero width or height. + const validItems = shape.data + .map((d, i) => ({ data: d, label: labelData[i].toString() })) + .filter((item) => item.data.width > 0 && item.data.height > 0); + + // Helper function to check if the text fits horizontally with a 10px right margin. + function fitsHorizontally(item: BarItem, fontSize: number): boolean { + const { data, label } = item; + // Approximate the text width. + const textWidth: number = fontSize * label.length * charWidthFactor; + // The available width is the bar's width minus a 10px right margin. + return textWidth <= data.width - 10; + } + + // For each valid bar, start with an initial candidate font size (70% of the bar's height), + // then reduce it until the text fits horizontally. + const candidateFontSizes = validItems.map((item) => { + const { data } = item; + let fontSize = data.height * 0.7; + // Decrease fontSize until the text fits horizontally. + while (!fitsHorizontally(item, fontSize) && fontSize > 0) { + fontSize -= 1; + } + return fontSize; + }); + + // Choose the smallest candidate font size across all valid bars for uniformity. + const uniformFontSize = Math.floor(Math.min(...candidateFontSizes)); + + shapeGroup + .selectAll('text') + .data(validItems) + .enter() + .append('text') + .attr('x', (item) => item.data.x + item.data.width - 10) + .attr('y', (item) => item.data.y + item.data.height / 2) + .attr('text-anchor', 'end') + .attr('dominant-baseline', 'middle') + .attr('fill', 'black') + .attr('font-size', `${uniformFontSize}px`) + .text((item) => item.label); + } else { + const yOffset = 10; + + // filter out bars that have zero width or height. + const validItems = shape.data + .map((d, i) => ({ data: d, label: labelData[i].toString() })) + .filter((item) => item.data.width > 0 && item.data.height > 0); + + // Helper function that checks if the text with a given fontSize fits within the bar boundaries. + function fitsInBar(item: BarItem, fontSize: number, yOffset: number): boolean { + const { data, label } = item; + const charWidthFactor = 0.7; + const textWidth = fontSize * label.length * charWidthFactor; + + // Compute horizontal boundaries using the center. + const centerX = data.x + data.width / 2; + const leftEdge = centerX - textWidth / 2; + const rightEdge = centerX + textWidth / 2; + + // Check that text doesn't overflow horizontally. + const horizontalFits = leftEdge >= data.x && rightEdge <= data.x + data.width; + + // For vertical placement, we use 'dominant-baseline: hanging' so that y marks the top of the text. + // Thus, the bottom edge is y + yOffset + fontSize. + const verticalFits = data.y + yOffset + fontSize <= data.y + data.height; + + return horizontalFits && verticalFits; + } + + // For each valid item, start with a candidate font size based on the width, + // then reduce it until the text fits within both the horizontal and vertical boundaries. + const candidateFontSizes = validItems.map((item) => { + const { data, label } = item; + let fontSize = data.width / (label.length * 0.7); + + // Decrease the font size until the text fits or fontSize reaches 0. + while (!fitsInBar(item, fontSize, yOffset) && fontSize > 0) { + fontSize -= 1; + } + return fontSize; + }); + + // Choose the smallest candidate across all valid bars for uniformity. + const uniformFontSize = Math.floor(Math.min(...candidateFontSizes)); + + // Render text only for valid items. + shapeGroup + .selectAll('text') + .data(validItems) + .enter() + .append('text') + .attr('x', (item) => item.data.x + item.data.width / 2) + .attr('y', (item) => item.data.y + yOffset) + .attr('text-anchor', 'middle') + .attr('dominant-baseline', 'hanging') + .attr('fill', 'black') + .attr('font-size', `${uniformFontSize}px`) + .text((item) => item.label); + } + } break; case 'text': shapeGroup diff --git a/packages/mermaid/src/docs/.vitepress/config.ts b/packages/mermaid/src/docs/.vitepress/config.ts index d3f4a9aee..a07d1aea3 100644 --- a/packages/mermaid/src/docs/.vitepress/config.ts +++ b/packages/mermaid/src/docs/.vitepress/config.ts @@ -148,7 +148,7 @@ function sidebarSyntax() { { text: 'Pie Chart', link: '/syntax/pie' }, { text: 'Quadrant Chart', link: '/syntax/quadrantChart' }, { text: 'Requirement Diagram', link: '/syntax/requirementDiagram' }, - { text: 'Gitgraph (Git) Diagram', link: '/syntax/gitgraph' }, + { text: 'GitGraph (Git) Diagram', link: '/syntax/gitgraph' }, { text: 'C4 Diagram 🦺⚠️', link: '/syntax/c4' }, { text: 'Mindmaps', link: '/syntax/mindmap' }, { text: 'Timeline', link: '/syntax/timeline' }, diff --git a/packages/mermaid/src/docs/community/contributing.md b/packages/mermaid/src/docs/community/contributing.md index a962907df..62d06f72f 100644 --- a/packages/mermaid/src/docs/community/contributing.md +++ b/packages/mermaid/src/docs/community/contributing.md @@ -497,14 +497,14 @@ This is a danger alert ### Navigation -If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes to **topbar**. +If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes for **topbar**. ### Build Docs -The content of `/docs` folder is built with Github Actions. +The content of `/docs` folder is built with GitHub Actions. ```warning -So as to allow automatic compilation of documentation pages you have to enable Github Actions on your fork first +So as to allow automatic compilation of documentation pages you have to enable GitHub Actions on your fork first ``` ## Submit your pull request diff --git a/packages/mermaid/src/docs/config/8.6.0_docs.md b/packages/mermaid/src/docs/config/8.6.0_docs.md index efd29bfdc..342e05763 100644 --- a/packages/mermaid/src/docs/config/8.6.0_docs.md +++ b/packages/mermaid/src/docs/config/8.6.0_docs.md @@ -75,7 +75,7 @@ When deployed within code, init is called before the graph/diagram description. **for example**: -```mermaid +```mermaid-example %%{init: {"theme": "default", "logLevel": 1 }}%% graph LR a-->b diff --git a/packages/mermaid/src/docs/config/accessibility.md b/packages/mermaid/src/docs/config/accessibility.md index b53567f73..c4f019aa4 100644 --- a/packages/mermaid/src/docs/config/accessibility.md +++ b/packages/mermaid/src/docs/config/accessibility.md @@ -190,12 +190,12 @@ Here is the HTML generated for the SVG element: _(Note that some of the SVG attr ``` -##### Gitgraph +##### GitGraph ```mermaid-example gitGraph - accTitle: My Gitgraph Accessibility Title - accDescr: My Gitgraph Accessibility Description + accTitle: My GitGraph Accessibility Title + accDescr: My GitGraph Accessibility Description commit commit diff --git a/packages/mermaid/src/docs/config/directives.md b/packages/mermaid/src/docs/config/directives.md index 0e211161c..017fc486b 100644 --- a/packages/mermaid/src/docs/config/directives.md +++ b/packages/mermaid/src/docs/config/directives.md @@ -88,7 +88,7 @@ Here the directive declaration will set the `logLevel` to `debug` and the `theme Note: You can use 'init' or 'initialize' as both are acceptable as init directives. Also note that `%%init%%` and `%%initialize%%` directives will be grouped together after they are parsed. -```mermaid +```mermaid-example %%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%% %%{initialize: { 'logLevel': 'fatal', "theme":'dark', 'startOnLoad': true } }%% ... diff --git a/packages/mermaid/src/docs/config/math.md b/packages/mermaid/src/docs/config/math.md index a53dceaf2..bb6556b6c 100644 --- a/packages/mermaid/src/docs/config/math.md +++ b/packages/mermaid/src/docs/config/math.md @@ -10,7 +10,7 @@ Note that at the moment, the only supported diagrams are below: ### Flowcharts -```mermaid +```mermaid-example graph LR A["$$x^2$$"] -->|"$$\sqrt{x+3}$$"| B("$$\frac{1}{2}$$") A -->|"$$\overbrace{a+b+c}^{\text{note}}$$"| C("$$\pi r^2$$") @@ -20,7 +20,7 @@ Note that at the moment, the only supported diagrams are below: ### Sequence -```mermaid +```mermaid-example sequenceDiagram autonumber participant 1 as $$\alpha$$ diff --git a/packages/mermaid/src/docs/config/theming.md b/packages/mermaid/src/docs/config/theming.md index 5643dc7fb..bf54f3410 100644 --- a/packages/mermaid/src/docs/config/theming.md +++ b/packages/mermaid/src/docs/config/theming.md @@ -2,7 +2,7 @@ Dynamic and integrated theme configuration was introduced in Mermaid version 8.7.0. -Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, the `init` directive is used. +Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, frontmatter config is used. ## Available Themes @@ -31,18 +31,15 @@ mermaid.initialize({ ## Diagram-specific Themes -To customize the theme of an individual diagram, use the `init` directive. +To customize the theme of an individual diagram, use frontmatter config. -Example of `init` directive setting the `theme` to `forest`: +Example of frontmatter config setting the `theme` to `forest`: ```mermaid-example -%%{init: {'theme':'forest'}}%% - graph TD - a --> b -``` - -```mermaid -%%{init: {'theme':'forest'}}%% +--- +config: + theme: 'forest' +--- graph TD a --> b ``` @@ -51,60 +48,28 @@ Example of `init` directive setting the `theme` to `forest`: ## Customizing Themes with `themeVariables` -To make a custom theme, modify `themeVariables` via `init`. +To make a custom theme, modify `themeVariables` via frontmatter config. You will need to use the [base](#available-themes) theme as it is the only modifiable theme. -| Parameter | Description | Type | Properties | -| -------------- | ------------------------------------ | ------ | ----------------------------------------------------------------------------------- | -| themeVariables | Modifiable with the `init` directive | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) | +| Parameter | Description | Type | Properties | +| -------------- | ---------------------------------- | ------ | ----------------------------------------------------------------------------------- | +| themeVariables | Modifiable with frontmatter config | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) | -Example of modifying `themeVariables` using the `init` directive: +Example of modifying `themeVariables` using frontmatter config: ```mermaid-example -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% - graph TD - A[Christmas] -->|Get money| B(Go shopping) - B --> C{Let me think} - B --> G[/Another/] - C ==>|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[fa:fa-car Car] - subgraph section - C - D - E - F - G - end -``` - -```mermaid -%%{ - init: { - 'theme': 'base', - 'themeVariables': { - 'primaryColor': '#BB2528', - 'primaryTextColor': '#fff', - 'primaryBorderColor': '#7C0000', - 'lineColor': '#F8B229', - 'secondaryColor': '#006100', - 'tertiaryColor': '#fff' - } - } -}%% +--- +config: + theme: 'base' + themeVariables: + primaryColor: '#BB2528' + primaryTextColor: '#fff' + primaryBorderColor: '#7C0000' + lineColor: '#F8B229' + secondaryColor: '#006100' + tertiaryColor: '#fff' +--- graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} @@ -133,7 +98,7 @@ The theming engine will only recognize hex colors and not color names. So, the v | -------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | darkMode | false | Affects how derived colors are calculated. Set value to `true` for dark mode. | | background | #f4f4f4 | Used to calculate color for items that should either be background colored or contrasting to the background | -| fontFamily | trebuchet ms, verdana, arial | | +| fontFamily | trebuchet ms, verdana, arial | Font family for diagram text | | fontSize | 16px | Font size in pixels | | primaryColor | #fff4dd | Color to be used as background in nodes, other colors will be derived from this | | primaryTextColor | calculated from darkMode #ddd/#333 | Color to be used as text color in nodes using `primaryColor` | diff --git a/packages/mermaid/src/docs/ecosystem/integrations-community.md b/packages/mermaid/src/docs/ecosystem/integrations-community.md index 84040a3cd..0af2cc003 100644 --- a/packages/mermaid/src/docs/ecosystem/integrations-community.md +++ b/packages/mermaid/src/docs/ecosystem/integrations-community.md @@ -35,6 +35,7 @@ To add an integration to this list, see the [Integrations - create page](./integ - [Mermaid Charts & Diagrams for Jira](https://marketplace.atlassian.com/apps/1224537/) - [Mermaid for Jira Cloud - Draw UML diagrams easily](https://marketplace.atlassian.com/apps/1223053/mermaid-for-jira-cloud-draw-uml-diagrams-easily?hosting=cloud&tab=overview) - [CloudScript.io Mermaid Addon](https://marketplace.atlassian.com/apps/1219878/cloudscript-io-mermaid-addon?hosting=cloud&tab=overview) + - [Mermaid plus for Confluence](https://marketplace.atlassian.com/apps/1236814/mermaid-plus-for-confluence?hosting=cloud&tab=overview) - [Azure Devops](https://learn.microsoft.com/en-us/azure/devops/project/wiki/markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) ✅ - [Deepdwn](https://billiam.itch.io/deepdwn) ✅ - [Doctave](https://www.doctave.com/) ✅ @@ -109,6 +110,8 @@ Content Management Systems/Enterprise Content Management - [Grav CMS](https://getgrav.org/) - [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams) - [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter) +- [Tiki](https://tiki.org) + - [Tracker Entity Relationship Diagram](https://doc.tiki.org/Tracker-Entity-Relationship-Diagram) - [VitePress](https://vitepress.vuejs.org/) - [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/) - [VuePress](https://vuepress.vuejs.org/) @@ -262,7 +265,5 @@ Communication tools and platforms - [reveal.js-mermaid-plugin](https://github.com/ludwick/reveal.js-mermaid-plugin) - [Reveal CK](https://github.com/jedcn/reveal-ck) - [reveal-ck-mermaid-plugin](https://github.com/tmtm/reveal-ck-mermaid-plugin) -- [mermaid-isomorphic](https://github.com/remcohaszing/mermaid-isomorphic) -- [mermaid-server: Generate diagrams using a HTTP request](https://github.com/TomWright/mermaid-server) diff --git a/packages/mermaid/src/docs/intro/getting-started.md b/packages/mermaid/src/docs/intro/getting-started.md index 574881c4f..8e6482ae2 100644 --- a/packages/mermaid/src/docs/intro/getting-started.md +++ b/packages/mermaid/src/docs/intro/getting-started.md @@ -41,7 +41,7 @@ In the `Code` panel, write or edit Mermaid code, and instantly `Preview` the ren Here is an example of Mermaid code and its rendered result: -```mermaid +```mermaid-example graph TD A[Enter Chart Definition] --> B(Preview) B --> C{decide} diff --git a/packages/mermaid/src/docs/intro/index.md b/packages/mermaid/src/docs/intro/index.md index 08fa3d675..ff37d549b 100644 --- a/packages/mermaid/src/docs/intro/index.md +++ b/packages/mermaid/src/docs/intro/index.md @@ -44,7 +44,7 @@ For a more detailed introduction to Mermaid and some of its more basic uses, loo 🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/contributing.md) | 🔌 [Plug-Ins](../ecosystem/integrations-community.md) -> 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/mermaid-js/mermaid/issues/866). +> 🖖 Keep a steady pulse: [mermaid needs more Collaborators](https://github.com/mermaid-js/mermaid/issues/866). :trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/#nominees) in the category "The most exciting use of technology"!!!** @@ -192,7 +192,7 @@ For public sites, it can be precarious to retrieve text from users on the intern As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing JavaScript in the code from being executed. This is a great step forward for better security. -_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ +_Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ ## Reporting vulnerabilities diff --git a/packages/mermaid/src/docs/intro/syntax-reference.md b/packages/mermaid/src/docs/intro/syntax-reference.md index 14c56370a..934f1168e 100644 --- a/packages/mermaid/src/docs/intro/syntax-reference.md +++ b/packages/mermaid/src/docs/intro/syntax-reference.md @@ -8,7 +8,11 @@ Diagram Examples can be found in the [Mermaid Live Editor](https://mermaid.live) ## Syntax Structure -One would notice that all **Diagrams definitions begin** with a declaration of the **diagram type**, followed by the definitions of the diagram and its contents. This declaration notifies the parser which kind of diagram the code is supposed to generate. +One would notice that all **Diagrams definitions begin** with a declaration of the **diagram type**, followed by the definitions of the diagram and its contents. This declaration notifies the parser which kind of diagram the code is supposed to generate. The only exception to this a [Frontmatter](#frontmatter-for-diagram-code) configuration. + +Line comments can ignore anything on the line after '%% '. + +Unknown words and misspellings will break a diagram, while parameters silently fail. **Example** : The code below is for an Entity Relationship Diagram, specified by the `erDiagram` declaration. What follows is the definition of the different `Entities` represented in it. @@ -54,10 +58,34 @@ The following are the most commonly used methods, and they are all tied to Merma Here you can edit certain values to change the behavior and appearance of the diagram. +Each of these techniques are functionally equivalent, but better for different deployments. + ### [The initialize() call](./getting-started.md#_3-calling-the-javascript-api) Used when Mermaid is called via an API, or through a ` ``` -You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. +You can also refer the [implementation in the live editor](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. Not Urgent y-axis Not Important --> "Important ❤" @@ -146,7 +153,7 @@ Points can either be styled directly or with defined shared classes ```md Point A: [0.9, 0.0] radius: 12 Point B: [0.8, 0.1] color: #ff3300, radius: 10 -Point C: [0.7, 0.2] radius: 25, color: #00ff33, stroke-color: #10f0f0 +Point C: [0.7, 0.2] radius: 25, color: #00ff33, stroke-color: #10f0f0 Point D: [0.6, 0.3] radius: 15, stroke-color: #00ff0f, stroke-width: 5px ,color: #ff33f0 ``` diff --git a/packages/mermaid/src/docs/syntax/radar.md b/packages/mermaid/src/docs/syntax/radar.md index 9112bd84b..124cebb24 100644 --- a/packages/mermaid/src/docs/syntax/radar.md +++ b/packages/mermaid/src/docs/syntax/radar.md @@ -141,7 +141,13 @@ Please refer to the [configuration](/config/schema-docs/config-defs-radar-diagra ```note The default values for these variables depend on the theme used. To override the default values, set the desired values in the themeVariables section of the configuration: -%%{init: {"themeVariables": {"cScale0": "#FF0000", "cScale1": "#00FF00"}} }%% + +--- +config: + themeVariables: + cScale0: "#FF0000" + cScale1: "#00FF00" +--- ``` Radar charts support the color scales `cScale${i}` where `i` is a number from `0` to the theme's maximum number of colors in its color scale. Usually, the maximum number of colors is `12`. @@ -156,7 +162,13 @@ Radar charts support the color scales `cScale${i}` where `i` is a number from `0 ```note Specific variables for radar resides inside the `radar` key. To set the radar style options, use this syntax. -%%{init: {"themeVariables": {"radar": {"axisColor": "#FF0000"}} } }%% + +--- +config: + themeVariables: + radar: + axisColor: "#FF0000" +--- ``` | Property | Description | Default Value | diff --git a/packages/mermaid/src/docs/syntax/requirementDiagram.md b/packages/mermaid/src/docs/syntax/requirementDiagram.md index c1d171c17..06e7ac29e 100644 --- a/packages/mermaid/src/docs/syntax/requirementDiagram.md +++ b/packages/mermaid/src/docs/syntax/requirementDiagram.md @@ -27,7 +27,7 @@ There are three types of components to a requirement diagram: requirement, eleme The grammar for defining each is defined below. Words denoted in angle brackets, such as ``, are enumerated keywords that have options elaborated in a table. `user_defined_...` is use in any place where user input is expected. -An important note on user text: all input can be surrounded in quotes or not. For example, both `Id: "here is an example"` and `Id: here is an example` are both valid. However, users must be careful with unquoted input. The parser will fail if another keyword is detected. +An important note on user text: all input can be surrounded in quotes or not. For example, both `id: "here is an example"` and `id: here is an example` are both valid. However, users must be careful with unquoted input. The parser will fail if another keyword is detected. ### Requirement diff --git a/packages/mermaid/src/docs/syntax/sequenceDiagram.md b/packages/mermaid/src/docs/syntax/sequenceDiagram.md index 2357b9bf4..3087eb743 100644 --- a/packages/mermaid/src/docs/syntax/sequenceDiagram.md +++ b/packages/mermaid/src/docs/syntax/sequenceDiagram.md @@ -442,7 +442,7 @@ sequenceDiagram Comments can be entered within a sequence diagram, which will be ignored by the parser. Comments need to be on their own line, and must be prefaced with `%%` (double percent signs). Any text after the start of the comment to the next newline will be treated as a comment, including any diagram syntax -```mermaid +```mermaid-example sequenceDiagram Alice->>John: Hello John, how are you? %% this is a comment diff --git a/packages/mermaid/src/docs/syntax/stateDiagram.md b/packages/mermaid/src/docs/syntax/stateDiagram.md index 9d99ab93b..ca95bd4bb 100644 --- a/packages/mermaid/src/docs/syntax/stateDiagram.md +++ b/packages/mermaid/src/docs/syntax/stateDiagram.md @@ -160,7 +160,7 @@ stateDiagram-v2 } ``` -_You can not define transitions between internal states belonging to different composite states_ +_You cannot define transitions between internal states belonging to different composite states_ ## Choice diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md index abd320355..26e30f80b 100644 --- a/packages/mermaid/src/docs/syntax/timeline.md +++ b/packages/mermaid/src/docs/syntax/timeline.md @@ -160,7 +160,13 @@ mermaid.initialize({ let us look at same example, where we have disabled the multiColor option. ```mermaid-example - %%{init: { 'logLevel': 'debug', 'theme': 'base', 'timeline': {'disableMulticolor': true}}}%% +--- +config: + logLevel: 'debug' + theme: 'base' + timeline: + disableMulticolor: true +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -184,11 +190,17 @@ Example: Now let's override the default values for the `cScale0` to `cScale2` variables: ```mermaid-example - %%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': { - 'cScale0': '#ff0000', 'cScaleLabel0': '#ffffff', - 'cScale1': '#00ff00', - 'cScale2': '#0000ff', 'cScaleLabel2': '#ffffff' - } } }%% +--- +config: + logLevel: 'debug' + theme: 'default' + themeVariables: + cScale0: '#ff0000' + cScaleLabel0: '#ffffff' + cScale1: '#00ff00' + cScale2: '#0000ff' + cScaleLabel2: '#ffffff' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -205,7 +217,7 @@ See how the colors are changed to the values specified in the theme variables. ## Themes -Mermaid supports a bunch of pre-defined themes which you can use to find the right one for you. PS: you can actually override an existing theme's variable to get your own custom theme going. Learn more about theming your diagram [here](../config/theming.md). +Mermaid supports a bunch of pre-defined themes which you can use to find the right one for you. PS: you can actually override an existing theme's variable to get your own custom theme going. Learn more about [theming your diagram](../config/theming.md). The following are the different pre-defined theme options: @@ -221,7 +233,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Base Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'base' } }%% +--- +config: + logLevel: 'debug' + theme: 'base' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -236,7 +252,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Forest Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%% +--- +config: + logLevel: 'debug' + theme: 'forest' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -251,7 +271,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Dark Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'dark' } }%% +--- +config: + logLevel: 'debug' + theme: 'dark' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -266,7 +290,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Default Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'default' } }%% +--- +config: + logLevel: 'debug' + theme: 'default' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -281,7 +309,11 @@ Let's put them to use, and see how our sample diagram looks in different themes: ### Neutral Theme ```mermaid-example -%%{init: { 'logLevel': 'debug', 'theme': 'neutral' } }%% +--- +config: + logLevel: 'debug' + theme: 'neutral' +--- timeline title History of Social Media Platform 2002 : LinkedIn @@ -305,4 +337,4 @@ You can use this method to add mermaid including the timeline diagram to a web p ``` -You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. +You can also refer the [implementation in the live editor](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/packages/mermaid/src/docs/syntax/xyChart.md b/packages/mermaid/src/docs/syntax/xyChart.md index e6e969462..7de3d4144 100644 --- a/packages/mermaid/src/docs/syntax/xyChart.md +++ b/packages/mermaid/src/docs/syntax/xyChart.md @@ -95,17 +95,18 @@ xychart-beta ## Chart Configurations -| Parameter | Description | Default value | -| ------------------------ | ---------------------------------------------- | :-----------: | -| width | Width of the chart | 700 | -| height | Height of the chart | 500 | -| titlePadding | Top and Bottom padding of the title | 10 | -| titleFontSize | Title font size | 20 | -| showTitle | Title to be shown or not | true | -| xAxis | xAxis configuration | AxisConfig | -| yAxis | yAxis configuration | AxisConfig | -| chartOrientation | 'vertical' or 'horizontal' | 'vertical' | -| plotReservedSpacePercent | Minimum space plots will take inside the chart | 50 | +| Parameter | Description | Default value | +| ------------------------ | ------------------------------------------------------------- | :-----------: | +| width | Width of the chart | 700 | +| height | Height of the chart | 500 | +| titlePadding | Top and Bottom padding of the title | 10 | +| titleFontSize | Title font size | 20 | +| showTitle | Title to be shown or not | true | +| xAxis | xAxis configuration | AxisConfig | +| yAxis | yAxis configuration | AxisConfig | +| chartOrientation | 'vertical' or 'horizontal' | 'vertical' | +| plotReservedSpacePercent | Minimum space plots will take inside the chart | 50 | +| showDataLabel | Should show the value corresponding to the bar within the bar | false | ### AxisConfig @@ -125,9 +126,15 @@ xychart-beta ## Chart Theme Variables -```note -Themes for xychart resides inside xychart attribute so to set the variables use this syntax -%%{init: { "themeVariables": {"xyChart": {"titleColor": "#ff0000"} } }}%% +Themes for xychart resides inside xychart attribute so to set the variables use this syntax: + +```yaml +--- +config: + themeVariables: + xyChart: + titleColor: '#ff0000' +--- ``` | Parameter | Description | @@ -152,6 +159,7 @@ config: xyChart: width: 900 height: 600 + showDataLabel: true themeVariables: xyChart: titleColor: "#ff0000" diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index e9fc9196a..3ab31ee25 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -367,7 +367,7 @@ const parse: typeof mermaidAPI.parse = async (text, parseOptions) => { }; /** - * Function that renders an svg with a graph from a chart definition. Usage example below. + * Function that renders an SVG with a graph from a chart definition. Usage example below. * * ```javascript * element = document.querySelector('#graphDiv'); diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts index 64f4b8d60..3e28dbfd4 100644 --- a/packages/mermaid/src/mermaidAPI.spec.ts +++ b/packages/mermaid/src/mermaidAPI.spec.ts @@ -31,6 +31,7 @@ vi.mock('./diagrams/xychart/xychartRenderer.js'); vi.mock('./diagrams/requirement/requirementRenderer.js'); vi.mock('./diagrams/sequence/sequenceRenderer.js'); vi.mock('./diagrams/radar/renderer.js'); +vi.mock('./diagrams/architecture/architectureRenderer.js'); // ------------------------------------- @@ -609,7 +610,7 @@ describe('mermaidAPI', () => { let error: any = { message: '' }; try { - // @ts-ignore This is a read-only property. Typescript will not allow assignment, but regular javascript might. + // @ts-ignore This is a read-only property. TypeScript will not allow assignment, but regular javascript might. mermaidAPI.defaultConfig = config; } catch (e) { error = e; @@ -799,6 +800,7 @@ graph TD;A--x|text including URL space|B;`) { textDiagramType: 'sequenceDiagram', expectedType: 'sequence' }, { textDiagramType: 'stateDiagram-v2', expectedType: 'stateDiagram' }, { textDiagramType: 'radar-beta', expectedType: 'radar' }, + { textDiagramType: 'architecture-beta', expectedType: 'architecture' }, ]; describe('accessibility', () => { diff --git a/packages/mermaid/src/rendering-util/createText.spec.ts b/packages/mermaid/src/rendering-util/createText.spec.ts index da0505ad8..e2e13ef7d 100644 --- a/packages/mermaid/src/rendering-util/createText.spec.ts +++ b/packages/mermaid/src/rendering-util/createText.spec.ts @@ -1,34 +1,62 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { replaceIconSubstring } from './createText.js'; +import mermaid from '../mermaid.js'; describe('replaceIconSubstring', () => { - it('converts FontAwesome icon notations to HTML tags', () => { + it('converts FontAwesome icon notations to HTML tags', async () => { const input = 'This is an icon: fa:fa-user and fab:fa-github'; - const output = replaceIconSubstring(input); - const expected = - "This is an icon: and "; + const output = await replaceIconSubstring(input); + const expected = `This is an icon: and `; expect(output).toEqual(expected); }); - it('handles strings without FontAwesome icon notations', () => { + it('handles strings without FontAwesome icon notations', async () => { const input = 'This string has no icons'; - const output = replaceIconSubstring(input); + const output = await replaceIconSubstring(input); expect(output).toEqual(input); // No change expected }); - it('correctly processes multiple FontAwesome icon notations in one string', () => { + it('correctly processes multiple FontAwesome icon notations in one string', async () => { const input = 'Icons galore: fa:fa-arrow-right, fak:fa-truck, fas:fa-home'; - const output = replaceIconSubstring(input); - const expected = - "Icons galore: , , "; + const output = await replaceIconSubstring(input); + const expected = `Icons galore: , , `; expect(output).toEqual(expected); }); - it('correctly replaces a very long icon name with the fak prefix', () => { + it('correctly replaces a very long icon name with the fak prefix', async () => { const input = 'Here is a long icon: fak:fa-truck-driving-long-winding-road in use'; - const output = replaceIconSubstring(input); + const output = await replaceIconSubstring(input); const expected = "Here is a long icon: in use"; expect(output).toEqual(expected); }); + + it('correctly process the registered icons', async () => { + /** + * CC-BY-4.0 + * Copyright (c) Fonticons, Inc. - https://fontawesome.com/license/free + * https://fontawesome.com/icons/bell?f=classic&s=regular + */ + const staticBellIconPack = { + prefix: 'fa', + icons: { + bell: { + body: '', + width: 448, + }, + }, + width: 512, + height: 512, + }; + mermaid.registerIconPacks([ + { + name: 'fa', + loader: () => Promise.resolve(staticBellIconPack), + }, + ]); + const input = 'Icons galore: fa:fa-bell'; + const output = await replaceIconSubstring(input); + const expected = staticBellIconPack.icons.bell.body; + expect(output).toContain(expected); + }); }); diff --git a/packages/mermaid/src/rendering-util/createText.ts b/packages/mermaid/src/rendering-util/createText.ts index cc189e46e..6dad6b214 100644 --- a/packages/mermaid/src/rendering-util/createText.ts +++ b/packages/mermaid/src/rendering-util/createText.ts @@ -1,14 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ // @ts-nocheck TODO: Fix types -import { getConfig } from '../diagram-api/diagramAPI.js'; -import common, { hasKatex, renderKatex } from '../diagrams/common/common.js'; import { select } from 'd3'; import type { MermaidConfig } from '../config.type.js'; +import { getConfig, sanitizeText } from '../diagram-api/diagramAPI.js'; import type { SVGGroup } from '../diagram-api/types.js'; +import common, { hasKatex, renderKatex } from '../diagrams/common/common.js'; import type { D3TSpanElement, D3TextElement } from '../diagrams/common/commonTypes.js'; import { log } from '../logger.js'; import { markdownToHTML, markdownToLines } from '../rendering-util/handle-markdown-text.js'; import { decodeEntities } from '../utils.js'; +import { getIconSVG, isIconAvailable } from './icons.js'; import { splitLineToFitWidth } from './splitText.js'; import type { MarkdownLine, MarkdownWord } from './types.js'; @@ -180,17 +181,31 @@ function updateTextContentAndStyles(tspan: any, wrappedLine: MarkdownWord[]) { /** * Convert fontawesome labels into fontawesome icons by using a regex pattern * @param text - The raw string to convert - * @returns string with fontawesome icons as i tags + * @returns string with fontawesome icons as svg if the icon is registered otherwise as i tags */ -export function replaceIconSubstring(text: string) { - // The letters 'bklrs' stand for possible endings of the fontawesome prefix (e.g. 'fab' for brands, 'fak' for fa-kit) // cspell: disable-line - return text.replace( - /fa[bklrs]?:fa-[\w-]+/g, // cspell: disable-line - (s) => `` - ); +export async function replaceIconSubstring(text: string) { + const pendingReplacements: Promise[] = []; + // cspell: disable-next-line + text.replace(/(fa[bklrs]?):fa-([\w-]+)/g, (fullMatch, prefix, iconName) => { + pendingReplacements.push( + (async () => { + const registeredIconName = `${prefix}:${iconName}`; + if (await isIconAvailable(registeredIconName)) { + return await getIconSVG(registeredIconName, undefined, { class: 'label-icon' }); + } else { + return ``; + } + })() + ); + return fullMatch; + }); + + const replacements = await Promise.all(pendingReplacements); + // cspell: disable-next-line + return text.replace(/(fa[bklrs]?):fa-([\w-]+)/g, () => replacements.shift() ?? ''); } -// Note when using from flowcharts converting the API isNode means classes should be set accordingly. When using htmlLabels => to sett classes to'nodeLabel' when isNode=true otherwise 'edgeLabel' +// Note when using from flowcharts converting the API isNode means classes should be set accordingly. When using htmlLabels => to set classes to 'nodeLabel' when isNode=true otherwise 'edgeLabel' // When not using htmlLabels => to set classes to 'title-row' when isTitle=true otherwise 'title-row' export const createText = async ( el, @@ -221,7 +236,7 @@ export const createText = async ( // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that? const htmlText = markdownToHTML(text, config); - const decodedReplacedText = replaceIconSubstring(decodeEntities(htmlText)); + const decodedReplacedText = await replaceIconSubstring(decodeEntities(htmlText)); //for Katex the text could contain escaped characters, \\relax that should be transformed to \relax const inputForKatex = text.replace(/\\\\/g, '\\'); diff --git a/packages/mermaid/src/rendering-util/icons.ts b/packages/mermaid/src/rendering-util/icons.ts index 5eef3f7eb..50b1bbeb9 100644 --- a/packages/mermaid/src/rendering-util/icons.ts +++ b/packages/mermaid/src/rendering-util/icons.ts @@ -85,7 +85,8 @@ export const isIconAvailable = async (iconName: string) => { export const getIconSVG = async ( iconName: string, - customisations?: IconifyIconCustomisations & { fallbackPrefix?: string } + customisations?: IconifyIconCustomisations & { fallbackPrefix?: string }, + extraAttributes?: Record ) => { let iconData: ExtendedIconifyIcon; try { @@ -95,6 +96,9 @@ export const getIconSVG = async ( iconData = unknownIcon; } const renderData = iconToSVG(iconData, customisations); - const svg = iconToHTML(replaceIDs(renderData.body), renderData.attributes); + const svg = iconToHTML(replaceIDs(renderData.body), { + ...renderData.attributes, + ...extraAttributes, + }); return svg; }; diff --git a/packages/mermaid/src/rendering-util/rendering-elements/edges.js b/packages/mermaid/src/rendering-util/rendering-elements/edges.js index 434c53856..ce4244ff2 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/edges.js +++ b/packages/mermaid/src/rendering-util/rendering-elements/edges.js @@ -562,7 +562,7 @@ export const insertEdge = function (elem, edge, clusterDb, diagramType, startNod } let svgPath; let linePath = lineFunction(lineData); - const edgeStyles = Array.isArray(edge.style) ? edge.style : [edge.style]; + const edgeStyles = Array.isArray(edge.style) ? edge.style : edge.style ? [edge.style] : []; let strokeColor = edgeStyles.find((style) => style?.startsWith('stroke:')); if (edge.look === 'handDrawn') { diff --git a/packages/mermaid/src/rendering-util/rendering-elements/intersect/index.js b/packages/mermaid/src/rendering-util/rendering-elements/intersect/index.js index e33b6dd51..47f71747d 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/intersect/index.js +++ b/packages/mermaid/src/rendering-util/rendering-elements/intersect/index.js @@ -1,5 +1,5 @@ /* - * Borrowed with love from from dagre-d3. Many thanks to cpettitt! + * Borrowed with love from dagre-d3. Many thanks to cpettitt! */ import node from './intersect-node.js'; diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/erBox.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/erBox.ts index af1e9945a..23c6fb091 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/erBox.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/erBox.ts @@ -89,6 +89,7 @@ export async function erBox(parent: D3Selection nameBBox.height += TEXT_PADDING; let yOffset = 0; const yOffsets = []; + const rows = []; let maxTypeWidth = 0; let maxNameWidth = 0; let maxKeysWidth = 0; @@ -137,12 +138,12 @@ export async function erBox(parent: D3Selection ); maxCommentWidth = Math.max(maxCommentWidth, commentBBox.width + PADDING); - yOffset += + const rowHeight = Math.max(typeBBox.height, nameBBox.height, keysBBox.height, commentBBox.height) + TEXT_PADDING; - yOffsets.push(yOffset); + rows.push({ yOffset, rowHeight }); + yOffset += rowHeight; } - yOffsets.pop(); let totalWidthSections = 4; if (maxKeysWidth <= PADDING) { @@ -185,8 +186,12 @@ export async function erBox(parent: D3Selection options.fillStyle = 'solid'; } + let totalShapeBBoxHeight = 0; + if (rows.length > 0) { + totalShapeBBoxHeight = rows.reduce((sum, row) => sum + (row?.rowHeight ?? 0), 0); + } const w = Math.max(shapeBBox.width + PADDING * 2, node?.width || 0, maxWidth); - const h = Math.max(shapeBBox.height + (yOffsets[0] || yOffset) + TEXT_PADDING, node?.height || 0); + const h = Math.max((totalShapeBBoxHeight ?? 0) + nameBBox.height, node?.height || 0); const x = -w / 2; const y = -h / 2; @@ -232,13 +237,10 @@ export async function erBox(parent: D3Selection yOffsets.push(0); // Draw row rects - for (const [i, yOffset] of yOffsets.entries()) { - if (i === 0 && yOffsets.length > 1) { - continue; - // Skip first row - } - const isEven = i % 2 === 0 && yOffset !== 0; - const roughRect = rc.rectangle(x, nameBBox.height + y + yOffset, w, nameBBox.height, { + for (const [i, row] of rows.entries()) { + const contentRowIndex = i + 1; // Adjusted index to skip the header (name) row + const isEven = contentRowIndex % 2 === 0 && row.yOffset !== 0; + const roughRect = rc.rectangle(x, nameBBox.height + y + row?.yOffset, w, row?.rowHeight, { ...options, fill: isEven ? rowEven : rowOdd, stroke: nodeBorder, @@ -246,7 +248,7 @@ export async function erBox(parent: D3Selection shapeSvg .insert(() => roughRect, 'g.label') .attr('style', cssStyles!.join('')) - .attr('class', `row-rect-${i % 2 === 0 ? 'even' : 'odd'}`); + .attr('class', `row-rect-${isEven ? 'even' : 'odd'}`); } // Draw divider lines diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts index 4ac6b2ddd..99dedd919 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts @@ -16,8 +16,8 @@ export const solidStateFill = (color: string) => { }; export const compileStyles = (node: Node) => { - // node.cssCompiledStyles is an array of strings in the form of 'key: value' where jey is the css property and value is the value - // the array is the styles of node node from the classes it is using + // node.cssCompiledStyles is an array of strings in the form of 'key: value' where key is the css property and value is the value + // the array is the styles of node from the classes it is using // node.cssStyles is an array of styles directly set on the node // concat the arrays and remove duplicates such that the values from node.cssStyles are used if there are duplicates const stylesMap = styles2Map([...(node.cssCompiledStyles || []), ...(node.cssStyles || [])]); diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts index a41e1483a..eb50d09bd 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts @@ -54,7 +54,7 @@ export async function requirementBox( if (isRequirementNode) { const idHeight = await addText( shapeSvg, - `${requirementNode.requirementId ? `Id: ${requirementNode.requirementId}` : ''}`, + `${requirementNode.requirementId ? `id: ${requirementNode.requirementId}` : ''}`, accumulativeHeight, node.labelStyle ); diff --git a/packages/mermaid/src/schemas/config.schema.yaml b/packages/mermaid/src/schemas/config.schema.yaml index e36b00bf9..6dd21e884 100644 --- a/packages/mermaid/src/schemas/config.schema.yaml +++ b/packages/mermaid/src/schemas/config.schema.yaml @@ -1228,6 +1228,10 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file) type: number default: 10 minimum: 0 + showDataLabel: + description: Should show the value corresponding to the bar within the bar + type: boolean + default: false showTitle: description: Should show the chart title type: boolean @@ -1484,6 +1488,9 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file) - bottomMarginAdj - useMaxWidth - rightAngles + - titleColor + - titleFontFamily + - titleFontSize properties: diagramMarginX: $ref: '#/$defs/C4DiagramConfig/properties/diagramMarginX' @@ -1496,6 +1503,10 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file) type: integer default: 150 minimum: 0 + maxLabelWidth: + description: Maximum width of actor labels + type: integer + default: 360 width: description: Width of actor boxes type: integer @@ -1584,6 +1595,18 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file) items: type: string default: ['#fff'] + titleColor: + description: Color of the title text in Journey Diagrams + type: string + default: '' + titleFontFamily: + description: Font family to be used for the title text in Journey Diagrams + type: string + default: '"trebuchet ms", verdana, arial, sans-serif' + titleFontSize: + description: Font size to be used for the title text in Journey Diagrams + type: string + default: '4ex' TimelineDiagramConfig: # added by https://github.com/mermaid-js/mermaid/commit/0d5246fbc730bf15463d7183fe4400a1e2fc492c @@ -2096,11 +2119,18 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file) description: | Width of nodes where text is wrapped. - When using markdown strings the text ius wrapped automatically, this + When using markdown strings the text is wrapped automatically, this value sets the max width of a text before it continues on a new line. type: number default: 200 + inheritDir: + type: boolean + default: false + description: | + If true, subgraphs without explicit direction will inherit the global graph direction + (e.g., LR, TB, RL, BT). Defaults to false to preserve legacy layout behavior. + SankeyLinkColor: description: | Picks the color of the sankey diagram links, using the colors of the source and/or target of the links. diff --git a/packages/mermaid/src/tests/MockedD3.ts b/packages/mermaid/src/tests/MockedD3.ts index d0d67773f..019aed124 100644 --- a/packages/mermaid/src/tests/MockedD3.ts +++ b/packages/mermaid/src/tests/MockedD3.ts @@ -51,7 +51,7 @@ export class MockedD3 { }); // NOTE: The d3 implementation allows for a selector ('beforeSelector' arg below). - // With this mocked implementation, we assume it will always refer to an node id + // With this mocked implementation, we assume it will always refer to a node id // and will always be of the form "#[id of the node to insert before]". // To keep this simple, any leading '#' is removed and the resulting string is the node id searched. insert = (type: string, beforeSelector?: string, id = this.id + '-inserted'): MockedD3 => { diff --git a/packages/mermaid/src/themes/theme-base.js b/packages/mermaid/src/themes/theme-base.js index 73ffef070..0b90bd8d7 100644 --- a/packages/mermaid/src/themes/theme-base.js +++ b/packages/mermaid/src/themes/theme-base.js @@ -98,6 +98,7 @@ class Theme { this.critBorderColor = this.critBorderColor || '#ff8888'; this.critBkgColor = this.critBkgColor || 'red'; this.todayLineColor = this.todayLineColor || 'red'; + this.vertLineColor = this.vertLineColor || 'navy'; this.taskTextColor = this.taskTextColor || this.textColor; this.taskTextOutsideColor = this.taskTextOutsideColor || this.textColor; this.taskTextLightColor = this.taskTextLightColor || this.textColor; diff --git a/packages/mermaid/src/themes/theme-dark.js b/packages/mermaid/src/themes/theme-dark.js index c452eea9f..23e0fa33d 100644 --- a/packages/mermaid/src/themes/theme-dark.js +++ b/packages/mermaid/src/themes/theme-dark.js @@ -79,6 +79,7 @@ class Theme { this.critBkgColor = '#E83737'; this.taskTextDarkColor = 'calculated'; this.todayLineColor = '#DB5757'; + this.vertLineColor = '#00BFFF'; /* C4 Context Diagram variables */ this.personBorder = this.primaryBorderColor; diff --git a/packages/mermaid/src/themes/theme-default.js b/packages/mermaid/src/themes/theme-default.js index eba3ff101..6bdbc5f8c 100644 --- a/packages/mermaid/src/themes/theme-default.js +++ b/packages/mermaid/src/themes/theme-default.js @@ -88,6 +88,7 @@ class Theme { this.critBorderColor = 'calculated'; this.critBkgColor = 'calculated'; this.todayLineColor = 'calculated'; + this.vertLineColor = 'calculated'; this.sectionBkgColor = rgba(102, 102, 255, 0.49); this.altSectionBkgColor = 'white'; @@ -107,6 +108,7 @@ class Theme { this.critBorderColor = '#ff8888'; this.critBkgColor = 'red'; this.todayLineColor = 'red'; + this.vertLineColor = 'navy'; /* C4 Context Diagram variables */ this.personBorder = this.primaryBorderColor; diff --git a/packages/mermaid/src/themes/theme-forest.js b/packages/mermaid/src/themes/theme-forest.js index 853b4d032..f34478795 100644 --- a/packages/mermaid/src/themes/theme-forest.js +++ b/packages/mermaid/src/themes/theme-forest.js @@ -81,6 +81,7 @@ class Theme { this.critBorderColor = '#ff8888'; this.critBkgColor = 'red'; this.todayLineColor = 'red'; + this.vertLineColor = '#00BFFF'; /* C4 Context Diagram variables */ this.personBorder = this.primaryBorderColor; diff --git a/packages/mermaid/src/themes/theme-neutral.js b/packages/mermaid/src/themes/theme-neutral.js index 633a26849..c2a43d035 100644 --- a/packages/mermaid/src/themes/theme-neutral.js +++ b/packages/mermaid/src/themes/theme-neutral.js @@ -93,6 +93,7 @@ class Theme { this.critBkgColor = 'calculated'; this.critBorderColor = 'calculated'; this.todayLineColor = 'calculated'; + this.vertLineColor = 'calculated'; /* C4 Context Diagram variables */ this.personBorder = this.primaryBorderColor; @@ -209,6 +210,7 @@ class Theme { this.critBorderColor = darken(this.critBkgColor, 10); this.todayLineColor = this.critBkgColor; + this.vertLineColor = this.critBkgColor; /* Architecture Diagram variables */ this.archEdgeColor = this.lineColor; diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts index 5a5c57039..6ed935cf6 100644 --- a/packages/mermaid/src/utils.ts +++ b/packages/mermaid/src/utils.ts @@ -645,7 +645,7 @@ const breakString: ( * This calculates the text's height, taking into account the wrap breaks and both the statically * configured height, width, and the length of the text (in pixels). * - * If the wrapped text text has greater height, we extend the height, so it's value won't overflow. + * If the wrapped text has greater height, we extend the height, so it's value won't overflow. * * @param text - The text to measure * @param config - The config for fontSize, fontFamily, and fontWeight all impacting the diff --git a/packages/parser/src/language/architecture/arch.langium b/packages/parser/src/language/architecture/arch.langium new file mode 100644 index 000000000..7b3a2fe22 --- /dev/null +++ b/packages/parser/src/language/architecture/arch.langium @@ -0,0 +1,2 @@ +terminal ARCH_ICON: /\([\w-:]+\)/; +terminal ARCH_TITLE: /\[[\w ]+\]/; \ No newline at end of file diff --git a/packages/parser/src/language/architecture/architecture.langium b/packages/parser/src/language/architecture/architecture.langium index 11af26243..2e97372bd 100644 --- a/packages/parser/src/language/architecture/architecture.langium +++ b/packages/parser/src/language/architecture/architecture.langium @@ -1,14 +1,15 @@ grammar Architecture import "../common/common"; +import "arch"; entry Architecture: NEWLINE* "architecture-beta" ( - NEWLINE* TitleAndAccessibilities - | NEWLINE* Statement* - | NEWLINE* - ) + NEWLINE + | TitleAndAccessibilities + | Statement + )* ; fragment Statement: @@ -31,25 +32,21 @@ fragment Arrow: ; Group: - 'group' id=ARCH_ID icon=ARCH_ICON? title=ARCH_TITLE? ('in' in=ARCH_ID)? EOL + 'group' id=ID icon=ARCH_ICON? title=ARCH_TITLE? ('in' in=ID)? EOL ; Service: - 'service' id=ARCH_ID (iconText=ARCH_TEXT_ICON | icon=ARCH_ICON)? title=ARCH_TITLE? ('in' in=ARCH_ID)? EOL + 'service' id=ID (iconText=STRING | icon=ARCH_ICON)? title=ARCH_TITLE? ('in' in=ID)? EOL ; Junction: - 'junction' id=ARCH_ID ('in' in=ARCH_ID)? EOL + 'junction' id=ID ('in' in=ID)? EOL ; Edge: - lhsId=ARCH_ID lhsGroup?=ARROW_GROUP? Arrow rhsId=ARCH_ID rhsGroup?=ARROW_GROUP? EOL + lhsId=ID lhsGroup?=ARROW_GROUP? Arrow rhsId=ID rhsGroup?=ARROW_GROUP? EOL ; terminal ARROW_DIRECTION: 'L' | 'R' | 'T' | 'B'; -terminal ARCH_ID: /[\w]+/; -terminal ARCH_TEXT_ICON: /\("[^"]+"\)/; -terminal ARCH_ICON: /\([\w-:]+\)/; -terminal ARCH_TITLE: /\[[\w ]+\]/; terminal ARROW_GROUP: /\{group\}/; terminal ARROW_INTO: /<|>/; diff --git a/packages/parser/src/language/common/common.langium b/packages/parser/src/language/common/common.langium index 7989de193..b74ffc34d 100644 --- a/packages/parser/src/language/common/common.langium +++ b/packages/parser/src/language/common/common.langium @@ -1,22 +1,35 @@ -interface Common { - accDescr?: string; - accTitle?: string; - title?: string; -} - -fragment TitleAndAccessibilities: - ((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+ -; +// Base terminals and fragments for common language constructs +// Terminal Precedence: Lazy to Greedy +// When imported, the terminals are considered after the terminals in the importing grammar +// Note: Hence, to add a terminal greedier than the common terminals, import it separately after the common import fragment EOL returns string: NEWLINE+ | EOF ; -terminal NEWLINE: /\r?\n/; +fragment TitleAndAccessibilities: + ((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+ +; + +terminal BOOLEAN returns boolean: 'true' | 'false'; + terminal ACC_DESCR: /[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/; terminal ACC_TITLE: /[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/; terminal TITLE: /[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/; +terminal FLOAT returns number: /[0-9]+\.[0-9]+(?!\.)/; +terminal INT returns number: /0|[1-9][0-9]*(?!\.)/; +terminal NUMBER returns number: FLOAT | INT; + +terminal STRING returns string: /"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/; + +// Alphanumerics with underscores and dashes +// Must start with an alphanumeric or an underscore +// Cant end with a dash +terminal ID returns string: /[\w]([-\w]*\w)?/; + +terminal NEWLINE: /\r?\n/; + hidden terminal WHITESPACE: /[\t ]+/; hidden terminal YAML: /---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/; hidden terminal DIRECTIVE: /[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/; diff --git a/packages/parser/src/language/gitGraph/gitGraph.langium b/packages/parser/src/language/gitGraph/gitGraph.langium index 1571ebba8..5a4b0596c 100644 --- a/packages/parser/src/language/gitGraph/gitGraph.langium +++ b/packages/parser/src/language/gitGraph/gitGraph.langium @@ -1,39 +1,15 @@ grammar GitGraph - -interface Common { - accDescr?: string; - accTitle?: string; - title?: string; -} - -fragment TitleAndAccessibilities: - ((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+ -; - -fragment EOL returns string: - NEWLINE+ | EOF -; - -terminal NEWLINE: /\r?\n/; -terminal ACC_DESCR: /[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/; -terminal ACC_TITLE: /[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/; -terminal TITLE: /[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/; - -hidden terminal WHITESPACE: /[\t ]+/; -hidden terminal YAML: /---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/; -hidden terminal DIRECTIVE: /[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/; -hidden terminal SINGLE_LINE_COMMENT: /[\t ]*%%[^\n\r]*/; +import "../common/common"; +import "reference"; entry GitGraph: NEWLINE* ('gitGraph' | 'gitGraph' ':' | 'gitGraph:' | ('gitGraph' Direction ':')) - NEWLINE* ( - NEWLINE* - (TitleAndAccessibilities | - statements+=Statement | - NEWLINE)* - ) + NEWLINE + | TitleAndAccessibilities + | statements+=Statement + )* ; Statement @@ -56,12 +32,12 @@ Commit: |'type:' type=('NORMAL' | 'REVERSE' | 'HIGHLIGHT') )* EOL; Branch: - 'branch' name=(ID|STRING) + 'branch' name=(REFERENCE|STRING) ('order:' order=INT)? EOL; Merge: - 'merge' branch=(ID|STRING) + 'merge' branch=(REFERENCE|STRING) ( 'id:' id=STRING |'tag:' tags+=STRING @@ -69,7 +45,7 @@ Merge: )* EOL; Checkout: - ('checkout'|'switch') branch=(ID|STRING) EOL; + ('checkout'|'switch') branch=(REFERENCE|STRING) EOL; CherryPicking: 'cherry-pick' @@ -78,10 +54,3 @@ CherryPicking: |'tag:' tags+=STRING |'parent:' parent=STRING )* EOL; - - - -terminal INT returns number: /[0-9]+(?=\s)/; -terminal ID returns string: /\w([-\./\w]*[-\w])?/; -terminal STRING: /"[^"]*"|'[^']*'/; - diff --git a/packages/parser/src/language/gitGraph/reference.langium b/packages/parser/src/language/gitGraph/reference.langium new file mode 100644 index 000000000..6e1af5863 --- /dev/null +++ b/packages/parser/src/language/gitGraph/reference.langium @@ -0,0 +1,4 @@ +// Alphanumerics with underscores, dashes, slashes, and dots +// Must start with an alphanumeric or an underscore +// Cant end with a dash, slash, or dot +terminal REFERENCE returns string: /\w([-\./\w]*[-\w])?/; \ No newline at end of file diff --git a/packages/parser/src/language/index.ts b/packages/parser/src/language/index.ts index e3aa5c68c..aa0c0f703 100644 --- a/packages/parser/src/language/index.ts +++ b/packages/parser/src/language/index.ts @@ -12,7 +12,6 @@ export { Commit, Merge, Statement, - isCommon, isInfo, isPacket, isPacketBlock, diff --git a/packages/parser/src/language/packet/packet.langium b/packages/parser/src/language/packet/packet.langium index ad30f8df2..91d6501ed 100644 --- a/packages/parser/src/language/packet/packet.langium +++ b/packages/parser/src/language/packet/packet.langium @@ -5,15 +5,12 @@ entry Packet: NEWLINE* "packet-beta" ( - NEWLINE* TitleAndAccessibilities blocks+=PacketBlock* - | NEWLINE+ blocks+=PacketBlock+ - | NEWLINE* - ) + TitleAndAccessibilities + | blocks+=PacketBlock + | NEWLINE + )* ; PacketBlock: start=INT('-' end=INT)? ':' label=STRING EOL -; - -terminal INT returns number: /0|[1-9][0-9]*/; -terminal STRING: /"[^"]*"|'[^']*'/; +; \ No newline at end of file diff --git a/packages/parser/src/language/pie/pie.langium b/packages/parser/src/language/pie/pie.langium index 2bbf967e1..a80caa81f 100644 --- a/packages/parser/src/language/pie/pie.langium +++ b/packages/parser/src/language/pie/pie.langium @@ -5,15 +5,12 @@ entry Pie: NEWLINE* "pie" showData?="showData"? ( - NEWLINE* TitleAndAccessibilities sections+=PieSection* - | NEWLINE+ sections+=PieSection+ - | NEWLINE* - ) + TitleAndAccessibilities + | sections+=PieSection + | NEWLINE + )* ; PieSection: - label=PIE_SECTION_LABEL ":" value=PIE_SECTION_VALUE EOL + label=STRING ":" value=NUMBER EOL ; - -terminal PIE_SECTION_LABEL: /"[^"]+"/; -terminal PIE_SECTION_VALUE returns number: /(0|[1-9][0-9]*)(\.[0-9]+)?/; diff --git a/packages/parser/src/language/radar/radar.langium b/packages/parser/src/language/radar/radar.langium index f0ecd13cd..8aa9cb0ff 100644 --- a/packages/parser/src/language/radar/radar.langium +++ b/packages/parser/src/language/radar/radar.langium @@ -1,31 +1,5 @@ grammar Radar -// import "../common/common"; -// Note: The import statement breaks TitleAndAccessibilities probably because of terminal order definition -// TODO: May need to change the common.langium to fix this - -interface Common { - accDescr?: string; - accTitle?: string; - title?: string; -} - -fragment TitleAndAccessibilities: - ((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+ -; - -fragment EOL returns string: - NEWLINE+ | EOF -; - -terminal NEWLINE: /\r?\n/; -terminal ACC_DESCR: /[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/; -terminal ACC_TITLE: /[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/; -terminal TITLE: /[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/; - -hidden terminal WHITESPACE: /[\t ]+/; -hidden terminal YAML: /---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/; -hidden terminal DIRECTIVE: /[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/; -hidden terminal SINGLE_LINE_COMMENT: /[\t ]*%%[^\n\r]*/; +import "../common/common"; entry Radar: NEWLINE* @@ -76,14 +50,6 @@ Option: | name='min' value=NUMBER | name='graticule' value=GRATICULE ) -; +; - -terminal NUMBER returns number: /(0|[1-9][0-9]*)(\.[0-9]+)?/; - -terminal BOOLEAN returns boolean: 'true' | 'false'; - -terminal GRATICULE returns string: 'circle' | 'polygon'; - -terminal ID returns string: /[a-zA-Z_][a-zA-Z0-9\-_]*/; -terminal STRING: /"[^"]*"|'[^']*'/; \ No newline at end of file +terminal GRATICULE returns string: 'circle' | 'polygon'; \ No newline at end of file diff --git a/packages/parser/tests/architecture.test.ts b/packages/parser/tests/architecture.test.ts new file mode 100644 index 000000000..4dcce17d3 --- /dev/null +++ b/packages/parser/tests/architecture.test.ts @@ -0,0 +1,88 @@ +import { describe, expect, it } from 'vitest'; + +import { Architecture } from '../src/language/index.js'; +import { expectNoErrorsOrAlternatives, architectureParse as parse } from './test-util.js'; + +describe('architecture', () => { + describe('should handle architecture definition', () => { + it.each([ + `architecture-beta`, + ` architecture-beta `, + `\tarchitecture-beta\t`, + ` + \tarchitecture-beta + `, + ])('should handle regular architecture', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Architecture); + }); + }); + + describe('should handle TitleAndAccessibilities', () => { + it.each([ + `architecture-beta title sample title`, + ` architecture-beta title sample title `, + `\tarchitecture-beta\ttitle sample title\t`, + `architecture-beta + \ttitle sample title + `, + ])('should handle regular architecture + title in same line', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Architecture); + + const { title } = result.value; + expect(title).toBe('sample title'); + }); + + it.each([ + `architecture-beta + title sample title`, + `architecture-beta + title sample title + `, + ])('should handle regular architecture + title in next line', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Architecture); + + const { title } = result.value; + expect(title).toBe('sample title'); + }); + + it('should handle regular architecture + title + accTitle + accDescr', () => { + const context = `architecture-beta + title sample title + accTitle: sample accTitle + accDescr: sample accDescr + `; + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Architecture); + + const { title, accTitle, accDescr } = result.value; + expect(title).toBe('sample title'); + expect(accTitle).toBe('sample accTitle'); + expect(accDescr).toBe('sample accDescr'); + }); + + it('should handle regular architecture + title + accTitle + multi-line accDescr', () => { + const context = `architecture-beta + title sample title + accTitle: sample accTitle + accDescr { + sample accDescr + } + `; + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Architecture); + + const { title, accTitle, accDescr } = result.value; + expect(title).toBe('sample title'); + expect(accTitle).toBe('sample accTitle'); + expect(accDescr).toBe('sample accDescr'); + }); + }); +}); diff --git a/packages/parser/tests/gitGraph.test.ts b/packages/parser/tests/gitGraph.test.ts index 2d7c21bbe..f7f302236 100644 --- a/packages/parser/tests/gitGraph.test.ts +++ b/packages/parser/tests/gitGraph.test.ts @@ -63,6 +63,12 @@ describe('Parsing Branch Statements', () => { expect(branch.name).toBe('master'); }); + it('should parse a branch name starting with numbers', () => { + const result = parse(`gitGraph\n commit\n branch 1.0.1\n`); + const branch = result.value.statements[1] as Branch; + expect(branch.name).toBe('1.0.1'); + }); + it('should parse a branch with an order property', () => { const result = parse(`gitGraph\n commit\n branch feature order:1\n`); const branch = result.value.statements[1] as Branch; diff --git a/packages/parser/tests/pie.test.ts b/packages/parser/tests/pie.test.ts index 43e9a374f..caa7cc528 100644 --- a/packages/parser/tests/pie.test.ts +++ b/packages/parser/tests/pie.test.ts @@ -4,226 +4,247 @@ import { Pie } from '../src/language/index.js'; import { expectNoErrorsOrAlternatives, pieParse as parse } from './test-util.js'; describe('pie', () => { - it.each([ - `pie`, - ` pie `, - `\tpie\t`, - ` + describe('should handle pie definition with or without showData', () => { + it.each([ + `pie`, + ` pie `, + `\tpie\t`, + ` \tpie `, - ])('should handle regular pie', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); - }); + ])('should handle regular pie', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); + }); - it.each([ - `pie showData`, - ` pie showData `, - `\tpie\tshowData\t`, - ` + it.each([ + `pie showData`, + ` pie showData `, + `\tpie\tshowData\t`, + ` pie\tshowData `, - ])('should handle regular showData', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + ])('should handle regular showData', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { showData } = result.value; - expect(showData).toBeTruthy(); + const { showData } = result.value; + expect(showData).toBeTruthy(); + }); }); + describe('should handle TitleAndAccessibilities', () => { + describe('should handle TitleAndAccessibilities without showData', () => { + it.each([ + `pie title sample title`, + ` pie title sample title `, + `\tpie\ttitle sample title\t`, + `pie + \ttitle sample title + `, + ])('should handle regular pie + title in same line', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - it.each([ - `pie title sample title`, - ` pie title sample title `, - `\tpie\ttitle sample title\t`, - `pie - \ttitle sample title - `, - ])('should handle regular pie + title in same line', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const { title } = result.value; + expect(title).toBe('sample title'); + }); - const { title } = result.value; - expect(title).toBe('sample title'); - }); - - it.each([ - `pie - title sample title`, - `pie - title sample title - `, - `pie - title sample title`, - `pie - title sample title - `, - ])('should handle regular pie + title in different line', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); - - const { title } = result.value; - expect(title).toBe('sample title'); - }); - - it.each([ - `pie showData title sample title`, - `pie showData title sample title - `, - ])('should handle regular pie + showData + title', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); - - const { showData, title } = result.value; - expect(showData).toBeTruthy(); - expect(title).toBe('sample title'); - }); - - it.each([ - `pie showData - title sample title`, - `pie showData - title sample title - `, - `pie showData - title sample title`, - `pie showData - title sample title - `, - ])('should handle regular showData + title in different line', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); - - const { showData, title } = result.value; - expect(showData).toBeTruthy(); - expect(title).toBe('sample title'); - }); - - describe('sections', () => { - describe('normal', () => { it.each([ `pie + title sample title`, + `pie + title sample title + `, + `pie + title sample title`, + `pie + title sample title + `, + ])('should handle regular pie + title in different line', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); + + const { title } = result.value; + expect(title).toBe('sample title'); + }); + }); + + describe('should handle TitleAndAccessibilities with showData', () => { + it.each([ + `pie showData title sample title`, + `pie showData title sample title + `, + ])('should handle regular pie + showData + title', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); + + const { showData, title } = result.value; + expect(showData).toBeTruthy(); + expect(title).toBe('sample title'); + }); + + it.each([ + `pie showData + title sample title`, + `pie showData + title sample title + `, + `pie showData + title sample title`, + `pie showData + title sample title + `, + ])('should handle regular showData + title in different line', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); + + const { showData, title } = result.value; + expect(showData).toBeTruthy(); + expect(title).toBe('sample title'); + }); + }); + }); + + describe('should handle sections', () => { + it.each([ + `pie "GitHub":100 "GitLab":50`, - `pie + `pie "GitHub" : 100 "GitLab" : 50`, - `pie + `pie "GitHub"\t:\t100 "GitLab"\t:\t50`, - `pie + `pie \t"GitHub" \t : \t 100 \t"GitLab" \t : \t 50 `, - ])('should handle regular sections', (context: string) => { - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + ])('should handle regular sections', (context: string) => { + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { sections } = result.value; - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + const { sections } = result.value; + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); + }); - it('should handle sections with showData', () => { - const context = `pie showData + it('should handle sections with showData', () => { + const context = `pie showData "GitHub": 100 "GitLab": 50`; - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { showData, sections } = result.value; - expect(showData).toBeTruthy(); + const { showData, sections } = result.value; + expect(showData).toBeTruthy(); - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); + }); - it('should handle sections with title', () => { - const context = `pie title sample wow + it('should handle sections with title', () => { + const context = `pie title sample wow "GitHub": 100 "GitLab": 50`; - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { title, sections } = result.value; - expect(title).toBe('sample wow'); + const { title, sections } = result.value; + expect(title).toBe('sample wow'); - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); + }); - it('should handle sections with accTitle', () => { - const context = `pie accTitle: sample wow + it('should handle value with positive decimal', () => { + const context = `pie + "ash": 60.67 + "bat": 40`; + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); + + const { sections } = result.value; + expect(sections[0].label).toBe('ash'); + expect(sections[0].value).toBe(60.67); + + expect(sections[1].label).toBe('bat'); + expect(sections[1].value).toBe(40); + }); + + it('should handle sections with accTitle', () => { + const context = `pie accTitle: sample wow "GitHub": 100 "GitLab": 50`; - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { accTitle, sections } = result.value; - expect(accTitle).toBe('sample wow'); + const { accTitle, sections } = result.value; + expect(accTitle).toBe('sample wow'); - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); + }); - it('should handle sections with single line accDescr', () => { - const context = `pie accDescr: sample wow + it('should handle sections with single line accDescr', () => { + const context = `pie accDescr: sample wow "GitHub": 100 "GitLab": 50`; - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { accDescr, sections } = result.value; - expect(accDescr).toBe('sample wow'); + const { accDescr, sections } = result.value; + expect(accDescr).toBe('sample wow'); - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); + }); - it('should handle sections with multi line accDescr', () => { - const context = `pie accDescr { + it('should handle sections with multi line accDescr', () => { + const context = `pie accDescr { sample wow } "GitHub": 100 "GitLab": 50`; - const result = parse(context); - expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe(Pie); + const result = parse(context); + expectNoErrorsOrAlternatives(result); + expect(result.value.$type).toBe(Pie); - const { accDescr, sections } = result.value; - expect(accDescr).toBe('sample wow'); + const { accDescr, sections } = result.value; + expect(accDescr).toBe('sample wow'); - expect(sections[0].label).toBe('GitHub'); - expect(sections[0].value).toBe(100); + expect(sections[0].label).toBe('GitHub'); + expect(sections[0].value).toBe(100); - expect(sections[1].label).toBe('GitLab'); - expect(sections[1].value).toBe(50); - }); + expect(sections[1].label).toBe('GitLab'); + expect(sections[1].value).toBe(50); }); }); }); diff --git a/packages/parser/tests/test-util.ts b/packages/parser/tests/test-util.ts index bc2224e65..7a6050016 100644 --- a/packages/parser/tests/test-util.ts +++ b/packages/parser/tests/test-util.ts @@ -1,6 +1,8 @@ import type { LangiumParser, ParseResult } from 'langium'; import { expect, vi } from 'vitest'; import type { + Architecture, + ArchitectureServices, Info, InfoServices, Pie, @@ -13,6 +15,7 @@ import type { GitGraphServices, } from '../src/language/index.js'; import { + createArchitectureServices, createInfoServices, createPieServices, createRadarServices, @@ -47,6 +50,17 @@ export function createInfoTestServices() { } export const infoParse = createInfoTestServices().parse; +const architectureServices: ArchitectureServices = createArchitectureServices().Architecture; +const architectureParser: LangiumParser = architectureServices.parser.LangiumParser; +export function createArchitectureTestServices() { + const parse = (input: string) => { + return architectureParser.parse(input); + }; + + return { services: architectureServices, parse }; +} +export const architectureParse = createArchitectureTestServices().parse; + const pieServices: PieServices = createPieServices().Pie; const pieParser: LangiumParser = pieServices.parser.LangiumParser; export function createPieTestServices() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7290deed8..ebf81ac80 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ importers: specifier: ^3.44.9 version: 3.50.2(encoding@0.1.13)(typescript@5.7.3) '@argos-ci/cypress': - specifier: ^3.2.0 - version: 3.2.0(cypress@14.0.3) + specifier: ^4.0.3 + version: 4.0.3(cypress@14.0.3) '@changesets/changelog-github': specifier: ^0.5.1 version: 0.5.1(encoding@0.1.13) @@ -26,17 +26,17 @@ importers: specifier: ^2.27.12 version: 2.28.1 '@cspell/eslint-plugin': - specifier: ^8.8.4 - version: 8.14.4(eslint@9.20.1(jiti@2.4.2)) + specifier: ^8.19.3 + version: 8.19.3(eslint@9.25.1(jiti@2.4.2)) '@cypress/code-coverage': specifier: ^3.12.49 version: 3.13.4(@babel/core@7.26.9)(@babel/preset-env@7.26.9(@babel/core@7.26.9))(babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.95.0(esbuild@0.25.0)))(cypress@14.0.3)(webpack@5.95.0(esbuild@0.25.0)) '@eslint/js': - specifier: ^9.4.0 - version: 9.12.0 + specifier: ^9.25.1 + version: 9.25.1 '@rollup/plugin-typescript': specifier: ^12.1.2 - version: 12.1.2(rollup@4.34.8)(tslib@2.8.1)(typescript@5.7.3) + version: 12.1.2(rollup@4.40.1)(tslib@2.8.1)(typescript@5.7.3) '@types/cors': specifier: ^2.8.17 version: 2.8.17 @@ -60,7 +60,7 @@ importers: version: 22.13.5 '@types/rollup-plugin-visualizer': specifier: ^5.0.3 - version: 5.0.3(rollup@4.34.8) + version: 5.0.3(rollup@4.40.1) '@vitest/coverage-v8': specifier: ^3.0.6 version: 3.0.6(vitest@3.0.6) @@ -74,8 +74,8 @@ importers: specifier: ^8.17.1 version: 8.17.1 chokidar: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^4.0.3 + version: 4.0.3 concurrently: specifier: ^9.1.2 version: 9.1.2 @@ -104,32 +104,32 @@ importers: specifier: ^0.25.0 version: 0.25.0 eslint: - specifier: ^9.20.1 - version: 9.20.1(jiti@2.4.2) + specifier: ^9.25.1 + version: 9.25.1(jiti@2.4.2) eslint-config-prettier: - specifier: ^10.0.0 - version: 10.0.1(eslint@9.20.1(jiti@2.4.2)) + specifier: ^10.1.1 + version: 10.1.1(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-cypress: - specifier: ^4.1.0 - version: 4.1.0(eslint@9.20.1(jiti@2.4.2)) + specifier: ^4.3.0 + version: 4.3.0(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-html: specifier: ^8.1.2 version: 8.1.2 eslint-plugin-jest: - specifier: ^28.6.0 - version: 28.8.3(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.5))(typescript@5.7.3) + specifier: ^28.11.0 + version: 28.11.0(@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.5))(typescript@5.7.3) eslint-plugin-jsdoc: - specifier: ^50.0.1 - version: 50.3.2(eslint@9.20.1(jiti@2.4.2)) + specifier: ^50.6.9 + version: 50.6.9(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-json: specifier: ^4.0.1 version: 4.0.1 eslint-plugin-lodash: specifier: ^8.0.0 - version: 8.0.0(eslint@9.20.1(jiti@2.4.2)) + version: 8.0.0(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-markdown: specifier: ^5.1.0 - version: 5.1.0(eslint@9.20.1(jiti@2.4.2)) + version: 5.1.0(eslint@9.25.1(jiti@2.4.2)) eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 @@ -137,11 +137,11 @@ importers: specifier: ^0.4.0 version: 0.4.0 eslint-plugin-unicorn: - specifier: ^58.0.0 - version: 58.0.0(eslint@9.20.1(jiti@2.4.2)) + specifier: ^59.0.0 + version: 59.0.0(eslint@9.25.1(jiti@2.4.2)) express: - specifier: ^4.19.2 - version: 4.21.0 + specifier: ^5.1.0 + version: 5.1.0 globals: specifier: ^16.0.0 version: 16.0.0 @@ -189,7 +189,7 @@ importers: version: 6.0.1 rollup-plugin-visualizer: specifier: ^5.14.0 - version: 5.14.0(rollup@4.34.8) + version: 5.14.0(rollup@4.40.1) start-server-and-test: specifier: ^2.0.10 version: 2.0.10 @@ -203,17 +203,17 @@ importers: specifier: ~5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.24.1 - version: 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + specifier: ^8.31.1 + version: 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) vite: specifier: ^6.1.1 - version: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + version: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) vite-plugin-istanbul: specifier: ^7.0.0 - version: 7.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 7.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) vitest: specifier: ^3.0.6 - version: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + version: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) packages/mermaid: dependencies: @@ -251,8 +251,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 dompurify: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.2.5 + version: 3.2.5 katex: specifier: ^0.16.9 version: 0.16.11 @@ -394,10 +394,10 @@ importers: version: 5.0.0 vitepress: specifier: ^1.0.2 - version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) + version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) vitepress-plugin-search: specifier: 1.0.4-alpha.22 - version: 1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)) + version: 1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)) packages/mermaid-example-diagram: dependencies: @@ -453,8 +453,8 @@ importers: specifier: ^7.4.47 version: 7.4.47 '@vueuse/core': - specifier: ^12.7.0 - version: 12.7.0(typescript@5.7.3) + specifier: ^13.1.0 + version: 13.1.0(vue@3.5.13(typescript@5.7.3)) font-awesome: specifier: ^4.7.0 version: 4.7.0 @@ -475,11 +475,11 @@ importers: specifier: ^66.0.0 version: 66.0.0 '@vite-pwa/vitepress': - specifier: ^0.5.3 - version: 0.5.3(vite-plugin-pwa@0.21.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)) + specifier: ^1.0.0 + version: 1.0.0(vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)) '@vitejs/plugin-vue': specifier: ^5.0.5 - version: 5.2.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + version: 5.2.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -491,19 +491,19 @@ importers: version: 2.0.3 unocss: specifier: ^66.0.0 - version: 66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + version: 66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)) unplugin-vue-components: specifier: ^28.4.0 - version: 28.4.0(@babel/parser@7.26.9)(vue@3.5.13(typescript@5.7.3)) + version: 28.4.0(@babel/parser@7.27.1)(vue@3.5.13(typescript@5.7.3)) vite: specifier: ^6.1.1 - version: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + version: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) vite-plugin-pwa: - specifier: ^0.21.1 - version: 0.21.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0) + specifier: ^1.0.0 + version: 1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0) vitepress: specifier: 1.6.3 - version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) + version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) workbox-window: specifier: ^7.3.0 version: 7.3.0 @@ -768,26 +768,26 @@ packages: resolution: {integrity: sha512-4YQc/FGYmA4Jx8vRNRI6YOE8oa7tOWhCik3b1OV3RQ6OkAY5EpVRF8ruiFpX+9BIjZ2V5AdVpsJacYOIiCHNMg==} engines: {node: '>=12.13.0'} - '@argos-ci/api-client@0.8.0': - resolution: {integrity: sha512-UHa1vAf8gwHVpkqM/RaSryrFe1juqWH6dHpPeMtT4e/ZMB9hNYwYFinaGq/KRWe88JEi2WeAu776YdoeUSZQkQ==} + '@argos-ci/api-client@0.8.1': + resolution: {integrity: sha512-3IHv7ANSPNO6OwWgwULlHbP9/tFV9kQDu6+nL9jysfPkGj0GgtrOsyBb+iU931c7wSMo1OD+XNujCnRzDD968w==} engines: {node: '>=18.0.0'} - '@argos-ci/browser@3.0.1': - resolution: {integrity: sha512-dqRXWCllulbKlqzwNE2bjbCtNqxVnUUrYpI1iIJQCMvyStmPdGHOYD7BoQQQ2uNPT2pCHeDyysrxc5T3mDyScg==} + '@argos-ci/browser@4.1.1': + resolution: {integrity: sha512-UyKdnprGftUjWQkb0jqJ0zGHJmcWBzdko8zRy4y+4efukVX4jjC/Px2HvWW8aqwjoR4aplouMZuzhmOkq2SCsA==} engines: {node: '>=18.0.0'} - '@argos-ci/core@3.1.0': - resolution: {integrity: sha512-bo/pNKk6P0pz4NRdymgU1letwQrRbMPTeFyMsUEW8fhKNdesSFnFIWZBFGsGkkh05uw75PBjl2ZN4PvQ2TxSog==} + '@argos-ci/core@3.1.1': + resolution: {integrity: sha512-7iE3o1XGxlfHC5AF05pzT0OxuO387sryrZt3gKGj/e+6R20DXz7J49yI8++nQ2cuT+wLhcJp8+X0ox+SGMYHmw==} engines: {node: '>=18.0.0'} - '@argos-ci/cypress@3.2.0': - resolution: {integrity: sha512-eBmBiNk3Pxsy9huttYuH5JyZdFooARz12Zxgv6pAnaPLeIG1Rw+E8LwPa71TabNx9b0BjMCzP7L/n/rVd6xbIQ==} + '@argos-ci/cypress@4.0.3': + resolution: {integrity: sha512-JGP48zPwbUGU5ziLP4Okv6mTuLPiEPvQ954BoH78ySlNpDGxyw68yeY4jxz8QpYe+P7vvKmuZiUFPAXTFu8XiQ==} engines: {node: '>=18.0.0'} peerDependencies: cypress: ^12.0.0 || ^13.0.0 || ^14.0.0 - '@argos-ci/util@2.3.0': - resolution: {integrity: sha512-tkxnCpaj7yN9nCFzo9MX0FJ5YjUepEOGYfdvF8COQqp+EdY1qubOPpc4Z0l1B60BlC8YtjQv/oRxHSh1XzxWFg==} + '@argos-ci/util@2.3.1': + resolution: {integrity: sha512-kE61HU2480fbAnimmA4x9HK45ZJvkoqLdW5GxT5uvwhkclQykVd2S6WfGFUr3JokTXfZ5LZEEfoWgtGA316KSQ==} engines: {node: '>=18.0.0'} '@asamuzakjp/css-color@2.8.3': @@ -797,59 +797,89 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.27.1': + resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.9': resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} engines: {node: '>=6.9.0'} + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.26.9': resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.26.5': resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.26.9': - resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + '@babel/helper-compilation-targets@7.27.1': + resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.26.3': - resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.3': - resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.25.7': @@ -860,73 +890,98 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} '@babel/helpers@7.26.9': resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.26.9': resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/parser@7.27.1': + resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -958,8 +1013,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -970,8 +1025,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1046,302 +1101,302 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + '@babel/plugin-transform-block-scoping@7.27.1': + resolution: {integrity: sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.27.1': + resolution: {integrity: sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.27.1': + resolution: {integrity: sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + '@babel/plugin-transform-regenerator@7.27.1': + resolution: {integrity: sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.26.7': - resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1352,6 +1407,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.27.1': + resolution: {integrity: sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -1361,18 +1422,34 @@ packages: resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + engines: {node: '>=6.9.0'} + '@babel/template@7.26.9': resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.1': + resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.9': resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.9': resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1463,52 +1540,49 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@cspell/cspell-bundled-dicts@8.14.4': - resolution: {integrity: sha512-JHZOpCJzN6fPBapBOvoeMxZbr0ZA11ZAkwcqM4w0lKoacbi6TwK8GIYf66hHvwLmMeav75TNXWE6aPTvBLMMqA==} - engines: {node: '>=18'} - '@cspell/cspell-bundled-dicts@8.17.4': resolution: {integrity: sha512-oPNQU3Uwc0OnvAmC8Vs7DSCRBhGRbZvO8J57JEnJ6YMNyCJZpKq050OzbAWmNdjjZ7yRLJ+LOcxhzdFg2Qn4Yw==} engines: {node: '>=18'} + '@cspell/cspell-bundled-dicts@8.19.3': + resolution: {integrity: sha512-HRxcvD+fqgq6Ag6K7TMnlsO1Uq2nc3V/ug4huZSKK/+tErB1i/m4N4gkOzO0pFtQsJDhGdlio3Wud2ce6kVpdw==} + engines: {node: '>=18'} + '@cspell/cspell-json-reporter@8.17.4': resolution: {integrity: sha512-O7V2hMt6zPt2Eu5LSxFyD/dcZRUOASeY+8oE1O2xanfJUMOG1EldCt8LERSmU829RQ4VF4H2Z9TbeQzx+4G21w==} engines: {node: '>=18'} - '@cspell/cspell-pipe@8.14.4': - resolution: {integrity: sha512-CLLdouqfrQ4rqdQdPu0Oo+HHCU/oLYoEsK1nNPb28cZTFxnn0cuSPKB6AMPBJmMwdfJ6fMD0BCKNbEe1UNLHcw==} - engines: {node: '>=18'} - '@cspell/cspell-pipe@8.17.4': resolution: {integrity: sha512-0KzqYetKMT9c3Pt77yRla2/zLDitpztEQ/VPYAbW5DCW+btRe5pAb6VQ7U6HKA2HoM2rhlLTWOBh4jauRFtgxA==} engines: {node: '>=18'} - '@cspell/cspell-resolver@8.14.4': - resolution: {integrity: sha512-s3uZyymJ04yn8+zlTp7Pt1WRSlAel6XVo+iZRxls3LSvIP819KK64DoyjCD2Uon0Vg9P/K7aAPt8GcxDcnJtgA==} + '@cspell/cspell-pipe@8.19.3': + resolution: {integrity: sha512-Z90x+Kbq1P3A7iOsRe6FnsF2nisMKCY6bln03mTvHW0MmT8F69BEZTSZaL4z+kQ0L8qbjthJ+FqbQKYNNbPZpg==} engines: {node: '>=18'} '@cspell/cspell-resolver@8.17.4': resolution: {integrity: sha512-1Z3yZRuhnyGCheD2nt/ZswV+ulXBOfnKCoyfkUKNAR5ALkrqv6bjXXwZrpEi2cIK1km4/59ybT72+r2Ry9dGUw==} engines: {node: '>=18'} - '@cspell/cspell-service-bus@8.14.4': - resolution: {integrity: sha512-i3UG+ep63akNsDXZrtGgICNF3MLBHtvKe/VOIH6+L+NYaAaVHqqQvOY9MdUwt1HXh8ElzfwfoRp36wc5aAvt6g==} + '@cspell/cspell-resolver@8.19.3': + resolution: {integrity: sha512-hsEx/7q0tDCOFtMmlkpynlApgAWo4/7q846Y1deyDChtIElmS0dfuzdKzv3jvFi3KdTVgJyhJb+o7/OHH2D/4A==} engines: {node: '>=18'} '@cspell/cspell-service-bus@8.17.4': resolution: {integrity: sha512-S8fENifriBW8KdDIvOnsP9gdEyCp1zrs4GT15vmDvm6uoevj2mfmdCj4/EbM1KbmmNAh1tlidAgn2OWdtyW7Lg==} engines: {node: '>=18'} - '@cspell/cspell-types@8.14.4': - resolution: {integrity: sha512-VXwikqdHgjOVperVVCn2DOe8W3rPIswwZtMHfRYnagpzZo/TOntIjkXPJSfTtl/cFyx5DnCBsDH8ytKGlMeHkw==} + '@cspell/cspell-service-bus@8.19.3': + resolution: {integrity: sha512-K66Vj8O+SWjPUTFq1wfpq5uoDLmZcB7tY3m154WQa94RNpW+/z9kLXVPxW1FctRXfjxfc7bqfLq4LF6Yiu72fg==} engines: {node: '>=18'} '@cspell/cspell-types@8.17.4': resolution: {integrity: sha512-1K6tXEMXSaoUXhH3TiaCyh3Nh8ZE0wPej0+wa5HAMtdcY1B3FGvHZ9DltkgZxbzs3bGNXIySFE5ITqULbhweBA==} engines: {node: '>=18'} - '@cspell/dict-ada@4.0.2': - resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + '@cspell/cspell-types@8.19.3': + resolution: {integrity: sha512-q6aUHJSvUe0Bt57djQN7qQ/AVV9O6nVNO7Nj0rZxFsv/73CtUvJseSrpjlZgkHTRCjOL0iRsVG+B8IPaxjczgw==} + engines: {node: '>=18'} '@cspell/dict-ada@4.1.0': resolution: {integrity: sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg==} @@ -1516,62 +1590,44 @@ packages: '@cspell/dict-al@1.1.0': resolution: {integrity: sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==} - '@cspell/dict-aws@4.0.4': - resolution: {integrity: sha512-6AWI/Kkf+RcX/J81VX8+GKLeTgHWEr/OMhGk3dHQzWK66RaqDJCGDqi7494ghZKcBB7dGa3U5jcKw2FZHL/u3w==} + '@cspell/dict-aws@4.0.10': + resolution: {integrity: sha512-0qW4sI0GX8haELdhfakQNuw7a2pnWXz3VYQA2MpydH2xT2e6EN9DWFpKAi8DfcChm8MgDAogKkoHtIo075iYng==} '@cspell/dict-aws@4.0.9': resolution: {integrity: sha512-bDYdnnJGwSkIZ4gzrauu7qzOs/ZAY/FnU4k11LgdMI8BhwMfsbsy2EI1iS+sD/BI5ZnNT9kU5YR3WADeNOmhRg==} - '@cspell/dict-bash@4.1.5': - resolution: {integrity: sha512-YGim/h7E2U5HCCb2ckNufT6/yyWygt9nSZ5C7qw6oOD3bygbObqD1+rlPor1JW+YyO+3GwTIHE70uKEEU6VZYw==} - '@cspell/dict-bash@4.2.0': resolution: {integrity: sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==} '@cspell/dict-companies@3.1.14': resolution: {integrity: sha512-iqo1Ce4L7h0l0GFSicm2wCLtfuymwkvgFGhmu9UHyuIcTbdFkDErH+m6lH3Ed+QuskJlpQ9dM7puMIGqUlVERw==} - '@cspell/dict-companies@3.1.4': - resolution: {integrity: sha512-y9e0amzEK36EiiKx3VAA+SHQJPpf2Qv5cCt5eTUSggpTkiFkCh6gRKQ97rVlrKh5GJrqinDwYIJtTsxuh2vy2Q==} - - '@cspell/dict-cpp@5.1.19': - resolution: {integrity: sha512-i/odUPNFLdqWisOktu6c4qjUR4k+P9Al2RCri3Wso9EFblp53xt/5jIUdGMdDDVQGqX7s/KLtdqNxNKqP3/d+w==} + '@cspell/dict-companies@3.1.15': + resolution: {integrity: sha512-vnGYTJFrqM9HdtgpZFOThFTjlPyJWqPi0eidMKyZxMKTHhP7yg6mD5X9WPEPvfiysmJYMnA6KKYQEBqoKFPU9g==} '@cspell/dict-cpp@6.0.3': resolution: {integrity: sha512-OFrVXdxCeGKnon36Pe3yFjBuY4kzzEwWFf3vDz+cJTodZDkjFkBifQeTtt5YfimgF8cfAJZXkBCsxjipAgmAiw==} - '@cspell/dict-cryptocurrencies@5.0.0': - resolution: {integrity: sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==} + '@cspell/dict-cpp@6.0.8': + resolution: {integrity: sha512-BzurRZilWqaJt32Gif6/yCCPi+FtrchjmnehVEIFzbWyeBd/VOUw77IwrEzehZsu5cRU91yPWuWp5fUsKfDAXA==} '@cspell/dict-cryptocurrencies@5.0.4': resolution: {integrity: sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag==} - '@cspell/dict-csharp@4.0.2': - resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} - '@cspell/dict-csharp@4.0.6': resolution: {integrity: sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw==} - '@cspell/dict-css@4.0.13': - resolution: {integrity: sha512-WfOQkqlAJTo8eIQeztaH0N0P+iF5hsJVKFuhy4jmARPISy8Efcv8QXk2/IVbmjJH0/ZV7dKRdnY5JFVXuVz37g==} - '@cspell/dict-css@4.0.17': resolution: {integrity: sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==} - '@cspell/dict-dart@2.2.1': - resolution: {integrity: sha512-yriKm7QkoPx3JPSSOcw6iX9gOb2N50bOo/wqWviqPYbhpMRh9Xiv6dkUy3+ot+21GuShZazO8X6U5+Vw67XEwg==} - '@cspell/dict-dart@2.3.0': resolution: {integrity: sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg==} - '@cspell/dict-data-science@2.0.2': - resolution: {integrity: sha512-VwAck6OZQVqrscKyOrvllixIugIPF+Q6YoFNvXZCPhHGtNyOAVraD3S7kOgPYBdUjgno4QbdMWm92BUPqL1QjQ==} - '@cspell/dict-data-science@2.0.7': resolution: {integrity: sha512-XhAkK+nSW6zmrnWzusmZ1BpYLc62AWYHZc2p17u4nE2Z9XG5DleG55PCZxXQTKz90pmwlhFM9AfpkJsYaBWATA==} - '@cspell/dict-django@4.1.0': - resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + '@cspell/dict-data-science@2.0.8': + resolution: {integrity: sha512-uyAtT+32PfM29wRBeAkUSbkytqI8bNszNfAz2sGPtZBRmsZTYugKMEO9eDjAIE/pnT9CmbjNuoiXhk+Ss4fCOg==} '@cspell/dict-django@4.1.4': resolution: {integrity: sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==} @@ -1579,23 +1635,17 @@ packages: '@cspell/dict-docker@1.1.12': resolution: {integrity: sha512-6d25ZPBnYZaT9D9An/x6g/4mk542R8bR3ipnby3QFCxnfdd6xaWiTcwDPsCgwN2aQZIQ1jX/fil9KmBEqIK/qA==} - '@cspell/dict-docker@1.1.7': - resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} - - '@cspell/dict-dotnet@5.0.5': - resolution: {integrity: sha512-gjg0L97ee146wX47dnA698cHm85e7EOpf9mVrJD8DmEaqoo/k1oPy2g7c7LgKxK9XnqwoXxhLNnngPrwXOoEtQ==} + '@cspell/dict-docker@1.1.13': + resolution: {integrity: sha512-85X+ZC/CPT3ie26DcfeMFkZSNuhS8DlAqPXzAjilHtGE/Nj+QnS3jyBz0spDJOJrjh8wx1+ro2oCK98sbVcztw==} '@cspell/dict-dotnet@5.0.9': resolution: {integrity: sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ==} - '@cspell/dict-elixir@4.0.3': - resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} - '@cspell/dict-elixir@4.0.7': resolution: {integrity: sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==} - '@cspell/dict-en-common-misspellings@2.0.4': - resolution: {integrity: sha512-lvOiRjV/FG4pAGZL3PN2GCVHSTCE92cwhfLGGkOsQtxSmef6WCHfHwp9auafkBlX0yFQSKDfq6/TlpQbjbJBtQ==} + '@cspell/dict-en-common-misspellings@2.0.10': + resolution: {integrity: sha512-80mXJLtr0tVEtzowrI7ycVae/ULAYImZUlr0kUTpa8i57AUk7Zy3pYBs44EYIKW7ZC9AHu4Qjjfq4vriAtyTDQ==} '@cspell/dict-en-common-misspellings@2.0.9': resolution: {integrity: sha512-O/jAr1VNtuyCFckbTmpeEf43ZFWVD9cJFvWaA6rO2IVmLirJViHWJUyBZOuQcesSplzEIw80MAYmnK06/MDWXQ==} @@ -1603,129 +1653,89 @@ packages: '@cspell/dict-en-gb@1.1.33': resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - '@cspell/dict-en_us@4.3.23': - resolution: {integrity: sha512-l0SoEQBsi3zDSl3OuL4/apBkxjuj4hLIg/oy6+gZ7LWh03rKdF6VNtSZNXWAmMY+pmb1cGA3ouleTiJIglbsIg==} - '@cspell/dict-en_us@4.3.31': resolution: {integrity: sha512-MDc+1B0aFwQONS0JZ6w7ks2KFGkUcaNTFJ8kI6GHvFRmEl3zP5NJDwFEXFsoEdLDb86j2myauSWMJXR3JFuwbA==} + '@cspell/dict-en_us@4.4.3': + resolution: {integrity: sha512-KnsS19kL5lYEk2P9xGNwvZF5ZbDYv1Tkv4BKIx4n4jKlgUj9iHv7L0Q+2cCvllKDGjuP715G/3Rg0McKdHR1Xg==} + '@cspell/dict-filetypes@3.0.11': resolution: {integrity: sha512-bBtCHZLo7MiSRUqx5KEiPdGOmXIlDGY+L7SJEtRWZENpAKE+96rT7hj+TUUYWBbCzheqHr0OXZJFEKDgsG/uZg==} - '@cspell/dict-filetypes@3.0.4': - resolution: {integrity: sha512-IBi8eIVdykoGgIv5wQhOURi5lmCNJq0we6DvqKoPQJHthXbgsuO1qrHSiUVydMiQl/XvcnUWTMeAlVUlUClnVg==} - - '@cspell/dict-flutter@1.0.0': - resolution: {integrity: sha512-W7k1VIc4KeV8BjEBxpA3cqpzbDWjfb7oXkEb0LecBCBp5Z7kcfnjT1YVotTx/U9PGyAOBhDaEdgZACVGNQhayw==} - '@cspell/dict-flutter@1.1.0': resolution: {integrity: sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA==} - '@cspell/dict-fonts@4.0.0': - resolution: {integrity: sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==} - '@cspell/dict-fonts@4.0.4': resolution: {integrity: sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg==} - '@cspell/dict-fsharp@1.0.1': - resolution: {integrity: sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==} - '@cspell/dict-fsharp@1.1.0': resolution: {integrity: sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw==} - '@cspell/dict-fullstack@3.2.0': - resolution: {integrity: sha512-sIGQwU6G3rLTo+nx0GKyirR5dQSFeTIzFTOrURw51ISf+jKG9a3OmvsVtc2OANfvEAOLOC9Wfd8WYhmsO8KRDQ==} - '@cspell/dict-fullstack@3.2.4': resolution: {integrity: sha512-JRRvaOLBZ13BO9sP395W+06tyO1Jy/87aFlKe9xQiCWMiwpCo2kGq0xBGq0PDWe253lYLs+GKrNmLU0fSxrObg==} - '@cspell/dict-gaming-terms@1.0.5': - resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} + '@cspell/dict-fullstack@3.2.6': + resolution: {integrity: sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA==} '@cspell/dict-gaming-terms@1.1.0': resolution: {integrity: sha512-46AnDs9XkgJ2f1Sqol1WgfJ8gOqp60fojpc9Wxch7x+BA63g4JfMV5/M5x0sI0TLlLY8EBSglcr8wQF/7C80AQ==} - '@cspell/dict-git@3.0.0': - resolution: {integrity: sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==} + '@cspell/dict-gaming-terms@1.1.1': + resolution: {integrity: sha512-tb8GFxjTLDQstkJcJ90lDqF4rKKlMUKs5/ewePN9P+PYRSehqDpLI5S5meOfPit8LGszeOrjUdBQ4zXo7NpMyQ==} '@cspell/dict-git@3.0.4': resolution: {integrity: sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg==} - '@cspell/dict-golang@6.0.13': - resolution: {integrity: sha512-uBUWi+AjFpluB6qF0rsC1gGyooqXeKPUdWHSmSXW/DCnS5PBSjRW6VWWp8efc1Fanob0QJxiZiYlc4U7oxuG6Q==} - '@cspell/dict-golang@6.0.18': resolution: {integrity: sha512-Mt+7NwfodDwUk7423DdaQa0YaA+4UoV3XSxQwZioqjpFBCuxfvvv4l80MxCTAAbK6duGj0uHbGTwpv8fyKYPKg==} - '@cspell/dict-google@1.0.1': - resolution: {integrity: sha512-dQr4M3n95uOhtloNSgB9tYYGXGGEGEykkFyRtfcp5pFuEecYUa0BSgtlGKx9RXVtJtKgR+yFT/a5uQSlt8WjqQ==} + '@cspell/dict-golang@6.0.20': + resolution: {integrity: sha512-b7nd9XXs+apMMzNSWorjirQsbmlwcTC0ViQJU8u+XNose3z0y7oNeEpbTPTVoN1+1sO9aOHuFwfwoOMFCDS14Q==} '@cspell/dict-google@1.0.8': resolution: {integrity: sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A==} - '@cspell/dict-haskell@4.0.1': - resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} - '@cspell/dict-haskell@4.0.5': resolution: {integrity: sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ==} - '@cspell/dict-html-symbol-entities@4.0.0': - resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} - '@cspell/dict-html-symbol-entities@4.0.3': resolution: {integrity: sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==} '@cspell/dict-html@4.0.11': resolution: {integrity: sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==} - '@cspell/dict-html@4.0.6': - resolution: {integrity: sha512-cLWHfuOhE4wqwC12up6Doxo2u1xxVhX1A8zriR4CUD+osFQzUIcBK1ykNXppga+rt1WyypaJdTU2eV6OpzYrgQ==} - '@cspell/dict-java@5.0.11': resolution: {integrity: sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w==} - '@cspell/dict-java@5.0.7': - resolution: {integrity: sha512-ejQ9iJXYIq7R09BScU2y5OUGrSqwcD+J5mHFOKbduuQ5s/Eh/duz45KOzykeMLI6KHPVxhBKpUPBWIsfewECpQ==} - - '@cspell/dict-julia@1.0.1': - resolution: {integrity: sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==} - '@cspell/dict-julia@1.1.0': resolution: {integrity: sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==} '@cspell/dict-k8s@1.0.10': resolution: {integrity: sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw==} - '@cspell/dict-k8s@1.0.6': - resolution: {integrity: sha512-srhVDtwrd799uxMpsPOQqeDJY+gEocgZpoK06EFrb4GRYGhv7lXo9Fb+xQMyQytzOW9dw4DNOEck++nacDuymg==} - '@cspell/dict-kotlin@1.1.0': resolution: {integrity: sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ==} - '@cspell/dict-latex@4.0.0': - resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} - '@cspell/dict-latex@4.0.3': resolution: {integrity: sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==} - '@cspell/dict-lorem-ipsum@4.0.0': - resolution: {integrity: sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==} - '@cspell/dict-lorem-ipsum@4.0.4': resolution: {integrity: sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw==} - '@cspell/dict-lua@4.0.3': - resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} - '@cspell/dict-lua@4.0.7': resolution: {integrity: sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q==} - '@cspell/dict-makefile@1.0.0': - resolution: {integrity: sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==} - '@cspell/dict-makefile@1.0.4': resolution: {integrity: sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==} + '@cspell/dict-markdown@2.0.10': + resolution: {integrity: sha512-vtVa6L/84F9sTjclTYDkWJF/Vx2c5xzxBKkQp+CEFlxOF2SYgm+RSoEvAvg5vj4N5kuqR4350ZlY3zl2eA3MXw==} + peerDependencies: + '@cspell/dict-css': ^4.0.17 + '@cspell/dict-html': ^4.0.11 + '@cspell/dict-html-symbol-entities': ^4.0.3 + '@cspell/dict-typescript': ^3.2.1 + '@cspell/dict-markdown@2.0.9': resolution: {integrity: sha512-j2e6Eg18BlTb1mMP1DkyRFMM/FLS7qiZjltpURzDckB57zDZbUyskOFdl4VX7jItZZEeY0fe22bSPOycgS1Z5A==} peerDependencies: @@ -1737,152 +1747,119 @@ packages: '@cspell/dict-monkeyc@1.0.10': resolution: {integrity: sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw==} - '@cspell/dict-monkeyc@1.0.6': - resolution: {integrity: sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==} - - '@cspell/dict-node@5.0.1': - resolution: {integrity: sha512-lax/jGz9h3Dv83v8LHa5G0bf6wm8YVRMzbjJPG/9rp7cAGPtdrga+XANFq+B7bY5+jiSA3zvj10LUFCFjnnCCg==} - '@cspell/dict-node@5.0.6': resolution: {integrity: sha512-CEbhPCpxGvRNByGolSBTrXXW2rJA4bGqZuTx1KKO85mwR6aadeOmUE7xf/8jiCkXSy+qvr9aJeh+jlfXcsrziQ==} + '@cspell/dict-node@5.0.7': + resolution: {integrity: sha512-ZaPpBsHGQCqUyFPKLyCNUH2qzolDRm1/901IO8e7btk7bEDF56DN82VD43gPvD4HWz3yLs/WkcLa01KYAJpnOw==} + '@cspell/dict-npm@5.1.26': resolution: {integrity: sha512-JU0/9P4nLPPC3Py+sF42tUKm9J4KAvwXaJubp2a4QwhCPzFVlOJTP2tTseFlLbdZn23d61pt0hZ+Jhyy7N76Mg==} - '@cspell/dict-npm@5.1.5': - resolution: {integrity: sha512-oAOGWuJYU3DlO+cAsStKMWN8YEkBue25cRC9EwdiL5Z84nchU20UIoYrLfIQejMlZca+1GyrNeyxRAgn4KiivA==} - - '@cspell/dict-php@4.0.10': - resolution: {integrity: sha512-NfTZdp6kcZDF1PvgQ6cY0zE4FUO5rSwNmBH/iwCBuaLfJAFQ97rgjxo+D2bic4CFwNjyHutnHPtjJBRANO5XQw==} + '@cspell/dict-npm@5.2.1': + resolution: {integrity: sha512-aqcit8e/Hsnsmd2QoDDAaai+l80bQItwLggmlio/e5NTAfUu7qIVmx+/VFtUlXQH6sMKp+aAvxPC3K8tH86+qg==} '@cspell/dict-php@4.0.14': resolution: {integrity: sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g==} - '@cspell/dict-powershell@5.0.10': - resolution: {integrity: sha512-U4H0zm94sNK+YP7jSFb7xb160XLf2dKIPVt5sOYctKlEyR9M16sP8FHbyWV2Yp1YtxXugoNdeCm2vwGEDAd8sg==} - '@cspell/dict-powershell@5.0.14': resolution: {integrity: sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA==} '@cspell/dict-public-licenses@2.0.13': resolution: {integrity: sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==} - '@cspell/dict-public-licenses@2.0.8': - resolution: {integrity: sha512-Sup+tFS7cDV0fgpoKtUqEZ6+fA/H+XUgBiqQ/Fbs6vUE3WCjJHOIVsP+udHuyMH7iBfJ4UFYOYeORcY4EaKdMg==} - '@cspell/dict-python@4.2.15': resolution: {integrity: sha512-VNXhj0Eh+hdHN89MgyaoSAexBQKmYtJaMhucbMI7XmBs4pf8fuFFN3xugk51/A4TZJr8+RImdFFsGMOw+I4bDA==} - '@cspell/dict-python@4.2.8': - resolution: {integrity: sha512-4y5dynLiajvowhB3PqlcwJ2C4okK1y2Hombec1+TGcV9sUBfo8FYNw6VRFUUrpsxO+Ut/3ncIifdZS5/zAWi5w==} - - '@cspell/dict-r@2.0.1': - resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + '@cspell/dict-python@4.2.17': + resolution: {integrity: sha512-xqMKfVc8d7yDaOChFdL2uWAN3Mw9qObB/Zr6t5w1OHbi23gWs7V1lI9d0mXAoqSK6N3mosbum4OIq/FleQDnlw==} '@cspell/dict-r@2.1.0': resolution: {integrity: sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA==} - '@cspell/dict-ruby@5.0.4': - resolution: {integrity: sha512-URw0jScj5pv8sKCVLNnde11qVCQR442rUpSd12u46Swl+5qBaSdnOUoCWQk419kd9/dpC6bB/3l4kOSY2fdYHw==} - '@cspell/dict-ruby@5.0.7': resolution: {integrity: sha512-4/d0hcoPzi5Alk0FmcyqlzFW9lQnZh9j07MJzPcyVO62nYJJAGKaPZL2o4qHeCS/od/ctJC5AHRdoUm0ktsw6Q==} + '@cspell/dict-ruby@5.0.8': + resolution: {integrity: sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ==} + '@cspell/dict-rust@4.0.11': resolution: {integrity: sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw==} - '@cspell/dict-rust@4.0.6': - resolution: {integrity: sha512-Buzy9PfLbdRPibSth8CV1D8ZsYqybo26yNIlAN+8ehU0pSBss0Jv4aleL4vKQ3FjouXeAC27rtEsLd7yaMZTog==} - - '@cspell/dict-scala@5.0.3': - resolution: {integrity: sha512-4yGb4AInT99rqprxVNT9TYb1YSpq58Owzq7zi3ZS5T0u899Y4VsxsBiOgHnQ/4W+ygi+sp+oqef8w8nABR2lkg==} - '@cspell/dict-scala@5.0.7': resolution: {integrity: sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA==} '@cspell/dict-shell@1.1.0': resolution: {integrity: sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==} - '@cspell/dict-software-terms@4.1.7': - resolution: {integrity: sha512-+fFTALseXszDN8/khonF1DpTcYzwyNqYxhATLakr7CUPtUCO1fCH4lidMtBN4UtPVpE6tbjc5D8tj51PJxEOcw==} - '@cspell/dict-software-terms@4.2.5': resolution: {integrity: sha512-CaRzkWti3AgcXoxuRcMijaNG7YUk/MH1rHjB8VX34v3UdCxXXeqvRyElRKnxhFeVLB/robb2UdShqh/CpskxRg==} - '@cspell/dict-sql@2.1.5': - resolution: {integrity: sha512-FmxanytHXss7GAWAXmgaxl3icTCW7YxlimyOSPNfm+njqeUDjw3kEv4mFNDDObBJv8Ec5AWCbUDkWIpkE3IpKg==} + '@cspell/dict-software-terms@5.0.5': + resolution: {integrity: sha512-ZjAOa8FI8/JrxaRqKT3eS7AQXFjU174xxQoKYMkmdwSyNIj7WUCAg10UeLqeMjFVv36zIO0Hm0dD2+Bvn18SLA==} '@cspell/dict-sql@2.2.0': resolution: {integrity: sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ==} - '@cspell/dict-svelte@1.0.2': - resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} - '@cspell/dict-svelte@1.0.6': resolution: {integrity: sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q==} - '@cspell/dict-swift@2.0.1': - resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} - '@cspell/dict-swift@2.0.5': resolution: {integrity: sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==} - '@cspell/dict-terraform@1.0.2': - resolution: {integrity: sha512-UZdJwWIpib2Rx02w6vtXTU3z+M/VMZU0F1dhSL3Ab9otQsFntT8U1CX7wBSqQCLg8bJiCfnUyVvMK3UBm3SR8A==} - '@cspell/dict-terraform@1.1.0': resolution: {integrity: sha512-G55pcUUxeXAhejstmD35B47SkFd4uqCQimc+CMgq8Nx0dr03guL2iMsz8faRWQGkCnGimX8S91rbOhDv9p/heg==} - '@cspell/dict-typescript@3.1.6': - resolution: {integrity: sha512-1beC6O4P/j23VuxX+i0+F7XqPVc3hhiAzGJHEKqnWf5cWAXQtg0xz3xQJ5MvYx2a7iLaSa+lu7+05vG9UHyu9Q==} + '@cspell/dict-terraform@1.1.1': + resolution: {integrity: sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==} '@cspell/dict-typescript@3.2.0': resolution: {integrity: sha512-Pk3zNePLT8qg51l0M4g1ISowYAEGxTuNfZlgkU5SvHa9Cu7x/BWoyYq9Fvc3kAyoisCjRPyvWF4uRYrPitPDFw==} - '@cspell/dict-vue@3.0.0': - resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + '@cspell/dict-typescript@3.2.1': + resolution: {integrity: sha512-jdnKg4rBl75GUBTsUD6nTJl7FGvaIt5wWcWP7TZSC3rV1LfkwvbUiY3PiGpfJlAIdnLYSeFWIpYU9gyVgz206w==} '@cspell/dict-vue@3.0.4': resolution: {integrity: sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==} - '@cspell/dynamic-import@8.14.4': - resolution: {integrity: sha512-GjKsBJvPXp4dYRqsMn7n1zpnKbnpfJnlKLOVeoFBh8fi4n06G50xYr+G25CWX1WT3WFaALAavvVICEUPrVsuqg==} - engines: {node: '>=18.0'} - '@cspell/dynamic-import@8.17.4': resolution: {integrity: sha512-rUwFOVPnfEGzhzCRnE4esTTMgWtTORXfa5FJJR8653KwcvD6HJQfPTYepBG6n6Bmu3TssMa4ktq+ZJk4o1BF9A==} engines: {node: '>=18.0'} - '@cspell/eslint-plugin@8.14.4': - resolution: {integrity: sha512-Wv6Jkttp/rsEm1nadLFQrUrYg9nTWQFwJu47KO2cfWP39TeH0zXQpmyas1xNlcDx5QJ9JJw9urTT/iw2tsHeRA==} + '@cspell/dynamic-import@8.19.3': + resolution: {integrity: sha512-haAl+/HOLAPc6Cs7YkbpyIK1Htomp3/D42scl2FCe4PU860uFyjyOWeq99u2wetDI/SQn1Ry3sSOKRCjIGlHWA==} + engines: {node: '>=18.0'} + + '@cspell/eslint-plugin@8.19.3': + resolution: {integrity: sha512-5eZQYF5rG2WRgEpZM80XsYr0/LWx/VNRrVRIGHphd0geWLK8z/THyRCN8MV9EWn6txXIDZW2mEU2VWvv5rOAUg==} engines: {node: '>=18'} peerDependencies: eslint: ^7 || ^8 || ^9 - '@cspell/filetypes@8.14.4': - resolution: {integrity: sha512-qd68dD7xTA4Mnf/wjIKYz2SkiTBshIM+yszOUtLa06YJm0aocoNQ25FHXyYEQYm9NQXCYnRWWA02sFMGs8Sv/w==} - engines: {node: '>=18'} - '@cspell/filetypes@8.17.4': resolution: {integrity: sha512-zzYm0hr+lvctsy/65hjI0vsQJj2CAwSOTnVk+5ubJCkCaWH/rayI/SaVZA0Xynf08B/x0r/36nPH0lO2iMJ4aw==} engines: {node: '>=18'} - '@cspell/strong-weak-map@8.14.4': - resolution: {integrity: sha512-Uyfck64TfVU24wAP3BLGQ5EsAfzIZiLfN90NhttpEM7GlOBmbGrEJd4hNOwfpYsE/TT80eGWQVPRTLr5SDbXFA==} + '@cspell/filetypes@8.19.3': + resolution: {integrity: sha512-j6WEjuvh3t2zsBUvZm6leGhcpQtuCMroSjyGLSE7xNM5SRYOdd+KkO81erwyA/yAweTGlI6wYyXofUd+mRVFMw==} engines: {node: '>=18'} '@cspell/strong-weak-map@8.17.4': resolution: {integrity: sha512-Io4ffbMI9hQz+9CLe/oU1Om0H3SqAlvFTaS7ZQOg7joyJSXuGBsCcCg03uTRKWD+NoaxPNUlZOkucUBGil6djw==} engines: {node: '>=18'} - '@cspell/url@8.14.4': - resolution: {integrity: sha512-htHhNF8WrM/NfaLSWuTYw0NqVgFRVHYSyHlRT3i/Yv5xvErld8Gw7C6ldm+0TLjoGlUe6X1VV72JSir7+yLp/Q==} - engines: {node: '>=18.0'} + '@cspell/strong-weak-map@8.19.3': + resolution: {integrity: sha512-IKzzbVDEjAprH0vH16heKbqCMqNtdU4tZXbp7mjJ3P3Xodl4csERrFRNqSwlyQMqfpjVU5n+wO7BSq/2S/uzRg==} + engines: {node: '>=18'} '@cspell/url@8.17.4': resolution: {integrity: sha512-vWLySh0ARsI0+TdvA8W6btdeeQbSjBhDE8kwGlzIrOCLIfkeO9Bu++mkc1To1/uogkS2T5icmA24D0rL8ZqjNw==} engines: {node: '>=18.0'} + '@cspell/url@8.19.3': + resolution: {integrity: sha512-EATITl9WlmOuhdlUluHlYXCV7LFPuSw9CZ4gejPpjyDwQJUQg4ktHVNfy3hJ5I3h4SEiW0GWd68Gd61McmTO2A==} + engines: {node: '>=18.0'} + '@csstools/color-helpers@5.0.1': resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} engines: {node: '>=18'} @@ -1969,8 +1946,8 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@es-joy/jsdoccomment@0.48.0': - resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==} + '@es-joy/jsdoccomment@0.49.0': + resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} engines: {node: '>=16'} '@esbuild/aix-ppc64@0.21.5': @@ -2411,12 +2388,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.5.1': resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2427,36 +2398,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.12.0': - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@eslint/js@9.25.1': + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/ajv-compiler@3.6.0': @@ -2791,6 +2758,10 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -2861,96 +2832,196 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.40.1': + resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.34.8': resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.40.1': + resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.34.8': resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.40.1': + resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.34.8': resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.40.1': + resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.34.8': resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.40.1': + resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.34.8': resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.40.1': + resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.34.8': resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.34.8': resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.40.1': + resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.34.8': resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.40.1': + resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.34.8': resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.1': + resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.34.8': resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.40.1': + resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.34.8': resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.40.1': + resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.34.8': resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.40.1': + resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.34.8': resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.40.1': + resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.34.8': resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.40.1': + resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.34.8': resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.1': + resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} + cpu: [x64] + os: [win32] + '@shikijs/core@2.5.0': resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} @@ -3179,6 +3250,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -3290,9 +3364,6 @@ packages: '@types/node@22.13.5': resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} @@ -3357,6 +3428,9 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -3372,35 +3446,35 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.24.1': - resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} + '@typescript-eslint/eslint-plugin@8.31.1': + resolution: {integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.24.1': - resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} + '@typescript-eslint/parser@8.31.1': + resolution: {integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.24.1': resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.8.1': - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + '@typescript-eslint/scope-manager@8.31.1': + resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.24.1': - resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} + '@typescript-eslint/type-utils@8.31.1': + resolution: {integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} @@ -3410,8 +3484,8 @@ packages: resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.8.1': - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + '@typescript-eslint/types@8.31.1': + resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -3429,14 +3503,11 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/typescript-estree@8.8.1': - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + '@typescript-eslint/typescript-estree@8.31.1': + resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.24.1': resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} @@ -3445,11 +3516,12 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.8.1': - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + '@typescript-eslint/utils@8.31.1': + resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} @@ -3459,8 +3531,8 @@ packages: resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.8.1': - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + '@typescript-eslint/visitor-keys@8.31.1': + resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3549,11 +3621,11 @@ packages: peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 - '@vite-pwa/vitepress@0.5.3': - resolution: {integrity: sha512-ZNtBxZhS5Enp66z01gKuovTQzSorIpc6o9FEVwOk7kNivzuc4Q5RB04fcbBI1qqHE67rDmm+XqVQw0nj801gmw==} + '@vite-pwa/vitepress@1.0.0': + resolution: {integrity: sha512-i5RFah4urA6tZycYlGyBslVx8cVzbZBcARJLDg5rWMfAkRmyLtpRU6usGfVOwyN9kjJ2Bkm+gBHXF1hhr7HptQ==} peerDependencies: - '@vite-pwa/assets-generator': ^0.2.6 - vite-plugin-pwa: '>=0.20.5 <1' + '@vite-pwa/assets-generator': ^1.0.0 + vite-plugin-pwa: ^1.0.0 peerDependenciesMeta: '@vite-pwa/assets-generator': optional: true @@ -3657,6 +3729,11 @@ packages: '@vueuse/core@12.7.0': resolution: {integrity: sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==} + '@vueuse/core@13.1.0': + resolution: {integrity: sha512-PAauvdRXZvTWXtGLg8cPUFjiZEddTqmogdwYpnn60t08AA5a8Q4hZokBnpTOnVNqySlFlTcRYIC8OqreV4hv3Q==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/integrations@12.7.0': resolution: {integrity: sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g==} peerDependencies: @@ -3701,9 +3778,17 @@ packages: '@vueuse/metadata@12.7.0': resolution: {integrity: sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==} + '@vueuse/metadata@13.1.0': + resolution: {integrity: sha512-+TDd7/a78jale5YbHX9KHW3cEDav1lz1JptwDvep2zSG8XjCsVE+9mHIzjTOaPbHUAk5XiE4jXLz51/tS+aKQw==} + '@vueuse/shared@12.7.0': resolution: {integrity: sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==} + '@vueuse/shared@13.1.0': + resolution: {integrity: sha512-IVS/qRRjhPTZ6C2/AM3jieqXACGwFZwWTdw5sNTSKk2m/ZpkuuN+ri+WCVUP8TqaKwJYt/KuMwmXspMAw8E6ew==} + peerDependencies: + vue: ^3.5.0 + '@wdio/config@7.31.1': resolution: {integrity: sha512-WAfswbCatwiaDVqy6kfF/5T8/WS/US/SRhBGUFrfBuGMIe+RRoHgy7jURFWSvUIE7CNHj8yvs46fLUcxhXjzcQ==} engines: {node: '>=12.0.0'} @@ -3826,6 +3911,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -3850,6 +3939,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4084,6 +4178,9 @@ packages: axios@1.7.9: resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4105,8 +4202,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-polyfill-corejs2@0.4.12: - resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4115,8 +4212,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.3: - resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4179,6 +4276,10 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + bonjour-service@1.2.1: resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} @@ -4269,6 +4370,10 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -4588,6 +4693,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -4605,6 +4714,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -4620,6 +4733,9 @@ packages: core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -4675,69 +4791,69 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - cspell-config-lib@8.14.4: - resolution: {integrity: sha512-cnUeJfniTiebqCaQmIUnbSrPrTH7xzKRQjJDHAEV0WYnOG2MhRXI13OzytdFdhkVBdStmgTzTCJKE7x+kmU2NA==} - engines: {node: '>=18'} - cspell-config-lib@8.17.4: resolution: {integrity: sha512-vOi3B5gnngGeI1HMVDosHTBCRROx7XQXpD6rcKFxxehrs3hw1/EGGEKPKWX5R1UKhOiUNVmvicpqTXU+4/tbZA==} engines: {node: '>=18'} - cspell-dictionary@8.14.4: - resolution: {integrity: sha512-pZvQHxpAW5fZAnt3ZKKy3s7M+3CX2t8tCS3uJrpEHIynlCawpG0fPF78rVE5o+g0dON36Lguc/BUuSN4IWKLmQ==} + cspell-config-lib@8.19.3: + resolution: {integrity: sha512-GjSrLU1KFLVzFa5qQA8DMF04BXW6r3xnfhwHFqU/8tEqtQXxKemGWnc9mt42Ey5hoe366lvhbIoh+vUhGf/IKA==} engines: {node: '>=18'} cspell-dictionary@8.17.4: resolution: {integrity: sha512-nzFc/+r6Q0wP5KpvKnjtnI+C2HMaLfrzMaY4VtoCzyqEF8inYQz430e6sSReBDzjshoU9YUxhShXl18aA3eAqA==} engines: {node: '>=18'} + cspell-dictionary@8.19.3: + resolution: {integrity: sha512-tycnHhLHvqKl4a2hVg/tIIai0wmcHHSAlgBAXAnSl+0g2DRrQ5GDT+9tHJ8B373o62jD8f5jHwbfJrLgHiNXWg==} + engines: {node: '>=18'} + cspell-gitignore@8.17.4: resolution: {integrity: sha512-9KwnXwNwE1eXYRyqHAMFPowJd3yFh2pQnnrfdQRvdculqFY39G4g/d4OQV9W/iMpcednL9K01IhxuUvbF7ZrIA==} engines: {node: '>=18'} hasBin: true - cspell-glob@8.14.4: - resolution: {integrity: sha512-C/xTS5nujMRMuguibq92qMVP767mtxrur7DcVolCvpzcivm1RB5NtIN0OctQxTyMbnmKeQv1t4epRKQ9A8vWRg==} - engines: {node: '>=18'} - cspell-glob@8.17.4: resolution: {integrity: sha512-HbAyg/t6l2Um0kgeTZeTEyXgVkIQX/ir2uLW/W3T9foOkSZ016Os6GRYDRJX7ebfREk8cCZ0uFtOi1Yn56INEQ==} engines: {node: '>=18'} - cspell-grammar@8.14.4: - resolution: {integrity: sha512-yaSKAAJDiamsw3FChbw4HXb2RvTQrDsLelh1+T4MavarOIcAxXrqAJ8ysqm++g+S/ooJz2YO8YWIyzJKxcMf8g==} + cspell-glob@8.19.3: + resolution: {integrity: sha512-Fv4coZmCmqaNq2UfXhVqQbHschhAcm3rwoxPyBqQcDYpvCQ4Q2+qnHQkK1nAxmDjus4KFM/QKrBoxSlD90bD9g==} engines: {node: '>=18'} - hasBin: true cspell-grammar@8.17.4: resolution: {integrity: sha512-RgnpQPVSOdWxq7fLHUkjGJCkMNay4p2cZXRYwhTBJf2kWNsDC39tjRhugFweyxxZPamEbLERgkCaFzE54enuMw==} engines: {node: '>=18'} hasBin: true - cspell-io@8.14.4: - resolution: {integrity: sha512-o6OTWRyx/Az+PFhr1B0wMAwqG070hFC9g73Fkxd8+rHX0rfRS69QZH7LgSmZytqbZIMxCTDGdsLl33MFGWCbZQ==} + cspell-grammar@8.19.3: + resolution: {integrity: sha512-5VJjqTPRpJZpQvoGj0W88yo0orY/YVuG5P8NVIwnfMAMRAnw2PAb7fsDydO9bPdFKdGPQ4CWoO++ed0g/Ra6jQ==} engines: {node: '>=18'} + hasBin: true cspell-io@8.17.4: resolution: {integrity: sha512-lHvkxquov5XfIXSenzXrWcOWPiW79+uySoExb20UXHvPSMz0Bk7ZIqDf6lMwTquXbM4BvGGsKQbQE/D4SLD9jw==} engines: {node: '>=18'} - cspell-lib@8.14.4: - resolution: {integrity: sha512-qdkUkKtm+nmgpA4jQbmQTuepDfjHBDWvs3zDuEwVIVFq/h8gnXrRr75gJ3RYdTy+vOOqHPoLLqgxyqkUUrUGXA==} + cspell-io@8.19.3: + resolution: {integrity: sha512-kJa4ZQdr6QwFEo3TxcyXBLAs2DiogrdtYa4tK87Wzyg3+Am1l7Z9AN8gZWQ+tZIi3BC0FYj4PsBdZ4qdmcY98g==} engines: {node: '>=18'} cspell-lib@8.17.4: resolution: {integrity: sha512-BxQy4MDFSjMQ74SYptWJOLLPsNC8XDtKyey0IfMQaqeFmuxrz727GWcONQ2KROrPPs9dnmccDs6Kn8Tx7Wug4A==} engines: {node: '>=18'} - cspell-trie-lib@8.14.4: - resolution: {integrity: sha512-zu8EJ33CH+FA5lwTRGqS//Q6phO0qtgEmODMR1KPlD7WlrfTFMb3bWFsLo/tiv5hjpsn7CM6dYDAAgBOSkoyhQ==} + cspell-lib@8.19.3: + resolution: {integrity: sha512-tVxrZYG7VCjjzARoTBQ7F/3FCjIGbzN0YbFcB3g4KLvbEuH83uLXm2MNdN9yDMaiD1XZ0CzP14eKiwpSMT7tjQ==} engines: {node: '>=18'} cspell-trie-lib@8.17.4: resolution: {integrity: sha512-Ou2MGBnZyC+Hti57m4T4D/Tq1P3G570rFPkxgi32f325xsLz1AVEvqrM5oVHDilFH2guUYFaelmL0UcGeP3L6w==} engines: {node: '>=18'} + cspell-trie-lib@8.19.3: + resolution: {integrity: sha512-Z33vT0M/Vi10L9XaxKPTQu0AA0nmq91QWY5CzBymZY7LhOf6yGYcCgoTHluQms8YLCWaiX9pgTOF2/W1wlNiVg==} + engines: {node: '>=18'} + cspell@8.17.4: resolution: {integrity: sha512-cQ6KyYB7itXxc+roxvozIKksbOyBO1NY5Dt5RWHl1Uh4OO++RJAKxmVWrY0g1ubBxKWGXk8TvuunK1+L/jvjIQ==} engines: {node: '>=18'} @@ -5213,8 +5329,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.4: - resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dompurify@3.2.5: + resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -5410,14 +5526,14 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-cypress@4.1.0: - resolution: {integrity: sha512-JhqkMY02mw74USwK9OFhectx3YSj6Co1NgWBxlGdKvlqiAp9vdEuQqt33DKGQFvvGS/NWtduuhWXWNnU29xDSg==} + eslint-plugin-cypress@4.3.0: + resolution: {integrity: sha512-CgS/S940MJlT8jtnWGKI0LvZQBGb/BB0QCpgBOxFMM/Z6znD+PZUwBhCTwHKN2GEr5AOny3xB92an0QfzBGooQ==} peerDependencies: eslint: '>=9' @@ -5425,8 +5541,8 @@ packages: resolution: {integrity: sha512-pbRchDV2SmqbCi/Ev/q3aAikzG9BcFe0IjjqjtMn8eTLq71ZUggyJB6CDmuwGAXmYZHrXI12XTfCqvgcnPRqGw==} engines: {node: '>=16.0.0'} - eslint-plugin-jest@28.8.3: - resolution: {integrity: sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==} + eslint-plugin-jest@28.11.0: + resolution: {integrity: sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5438,8 +5554,8 @@ packages: jest: optional: true - eslint-plugin-jsdoc@50.3.2: - resolution: {integrity: sha512-TjgZocG53N3a84PdCFGqVMWLWwDitOUuKjlJftwTu/iTiD7N/Q2Q3eEy/Q4GfJqpM4rTJCkzUYWQfol6RZNDcA==} + eslint-plugin-jsdoc@50.6.9: + resolution: {integrity: sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -5467,8 +5583,8 @@ packages: eslint-plugin-tsdoc@0.4.0: resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==} - eslint-plugin-unicorn@58.0.0: - resolution: {integrity: sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==} + eslint-plugin-unicorn@59.0.0: + resolution: {integrity: sha512-7IEeqkymGa7tr6wTWS4DolfXnfcE3QjcD0g7I+qCfV5GPMvVsFsLT7zTIYvnudqwAm5nWekdGIOTTXA93Sz9Ow==} engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} peerDependencies: eslint: '>=9.22.0' @@ -5477,8 +5593,8 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -5489,8 +5605,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.1: - resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} + eslint@9.25.1: + resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -5610,6 +5726,10 @@ packages: resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -5638,10 +5758,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - fast-equals@5.2.2: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} @@ -5753,6 +5869,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -5782,6 +5902,10 @@ packages: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -5867,6 +5991,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} @@ -5938,6 +6066,10 @@ packages: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -6145,10 +6277,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -6275,10 +6403,6 @@ packages: resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -6303,10 +6427,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@0.1.2: - resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} - engines: {node: '>=18'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -6501,6 +6621,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -7237,6 +7360,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -7248,6 +7375,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -7370,10 +7501,18 @@ packages: resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -7475,8 +7614,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -7487,6 +7626,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -7502,6 +7645,7 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -7550,10 +7694,6 @@ packages: resolution: {integrity: sha512-fiVbT7BqxiQqjlR9U3FDGOSERFCKoXVCdxV2FwZuNN7/cmJ42iQx35nUFOAFDcyvemu9Adp+IlsCGlKQYLmBKw==} deprecated: Package no longer supported. Contact support@npmjs.com for more info. - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -7654,8 +7794,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openapi-fetch@0.13.4: - resolution: {integrity: sha512-JHX7UYjLEiHuQGCPxa3CCCIqe/nc4bTIF9c4UYVC8BegAbWoS3g4gJxKX5XcG7UtYQs2060kY6DH64KkvNZahg==} + openapi-fetch@0.13.5: + resolution: {integrity: sha512-AQK8T9GSKFREFlN1DBXTYsLjs7YV2tZcJ7zUWxbjMoQmj8dDSFRrzhLCbHPZWA1TMV3vACqfCxLEZcwf2wxV6Q==} openapi-typescript-helpers@0.0.15: resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} @@ -7794,10 +7934,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@8.1.0: - resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} - engines: {node: '>=18'} - parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -7853,6 +7989,10 @@ packages: path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -8127,6 +8267,10 @@ packages: resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8160,20 +8304,16 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-package-up@11.0.0: - resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} - engines: {node: '>=18'} - - read-pkg@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -8223,9 +8363,6 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -8405,9 +8542,18 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.40.1: + resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -8465,8 +8611,8 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} search-insights@2.17.2: @@ -8504,6 +8650,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -8515,6 +8665,10 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -8702,15 +8856,9 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} @@ -8913,6 +9061,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.4: + resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} + engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.2: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -9167,6 +9319,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -9199,12 +9355,12 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x - typescript-eslint@8.24.1: - resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} + typescript-eslint@8.31.1: + resolution: {integrity: sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} @@ -9261,10 +9417,6 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -9388,9 +9540,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -9415,11 +9564,11 @@ packages: peerDependencies: vite: '>=4 <=6' - vite-plugin-pwa@0.21.1: - resolution: {integrity: sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==} + vite-plugin-pwa@1.0.0: + resolution: {integrity: sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==} engines: {node: '>=16.0.0'} peerDependencies: - '@vite-pwa/assets-generator': ^0.2.6 + '@vite-pwa/assets-generator': ^1.0.0 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 workbox-build: ^7.3.0 workbox-window: ^7.3.0 @@ -9427,8 +9576,8 @@ packages: '@vite-pwa/assets-generator': optional: true - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -9498,6 +9647,46 @@ packages: yaml: optional: true + vite@6.1.6: + resolution: {integrity: sha512-u+jokLMwHVFUoUkfL+m/1hzucejL2639g9QXcrRdtN3WPHfW7imI83V96Oh1R0xVZqDjvcgp+7S8bSQpdVlmPA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitepress-plugin-search@1.0.4-alpha.22: resolution: {integrity: sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} @@ -9753,6 +9942,10 @@ packages: resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -9916,6 +10109,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -9943,8 +10141,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} zwitch@2.0.4: @@ -10368,20 +10566,20 @@ snapshots: '@applitools/utils@1.7.7': {} - '@argos-ci/api-client@0.8.0': + '@argos-ci/api-client@0.8.1': dependencies: debug: 4.4.0(supports-color@8.1.1) - openapi-fetch: 0.13.4 + openapi-fetch: 0.13.5 transitivePeerDependencies: - supports-color - '@argos-ci/browser@3.0.1': {} + '@argos-ci/browser@4.1.1': {} - '@argos-ci/core@3.1.0': + '@argos-ci/core@3.1.1': dependencies: - '@argos-ci/api-client': 0.8.0 - '@argos-ci/util': 2.3.0 - axios: 1.7.9(debug@4.4.0) + '@argos-ci/api-client': 0.8.1 + '@argos-ci/util': 2.3.1 + axios: 1.8.4(debug@4.4.0) convict: 6.2.4 debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 @@ -10390,17 +10588,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@argos-ci/cypress@3.2.0(cypress@14.0.3)': + '@argos-ci/cypress@4.0.3(cypress@14.0.3)': dependencies: - '@argos-ci/browser': 3.0.1 - '@argos-ci/core': 3.1.0 - '@argos-ci/util': 2.3.0 + '@argos-ci/browser': 4.1.1 + '@argos-ci/core': 3.1.1 + '@argos-ci/util': 2.3.1 cypress: 14.0.3 cypress-wait-until: 3.0.2 transitivePeerDependencies: - supports-color - '@argos-ci/util@2.3.0': {} + '@argos-ci/util@2.3.1': {} '@asamuzakjp/css-color@2.8.3': dependencies: @@ -10416,8 +10614,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.1': {} + '@babel/core@7.26.9': dependencies: '@ampproject/remapping': 2.3.0 @@ -10438,6 +10644,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/template': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.26.9': dependencies: '@babel/parser': 7.26.9 @@ -10446,9 +10672,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/generator@7.27.1': dependencies: - '@babel/types': 7.26.9 + '@babel/parser': 7.27.1 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.1': + dependencies: + '@babel/types': 7.27.1 '@babel/helper-compilation-targets@7.26.5': dependencies: @@ -10458,41 +10692,80 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.9)': + '@babel/helper-compilation-targets@7.27.1': + dependencies: + '@babel/compat-data': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.9)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-annotate-as-pure': 7.27.1 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.9)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.0(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.1)': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -10503,6 +10776,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 @@ -10512,50 +10792,94 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-module-transforms@7.27.1(@babel/core@7.26.9)': dependencies: - '@babel/types': 7.26.9 + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.27.1 '@babel/helper-plugin-utils@7.25.7': {} '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.9)': + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.9)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.9)': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.26.9 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': dependencies: - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/template': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -10564,42 +10888,86 @@ snapshots: '@babel/template': 7.26.9 '@babel/types': 7.26.9 + '@babel/helpers@7.27.1': + dependencies: + '@babel/template': 7.27.1 + '@babel/types': 7.27.1 + '@babel/parser@7.26.9': dependencies: '@babel/types': 7.26.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.9)': + '@babel/parser@7.27.1': + dependencies: + '@babel/types': 7.27.1 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -10607,6 +10975,10 @@ snapshots: dependencies: '@babel/core': 7.26.9 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 @@ -10627,20 +10999,30 @@ snapshots: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9)': dependencies: @@ -10705,399 +11087,797 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.9)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.9)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.9)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/traverse': 7.27.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.26.9 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/traverse': 7.27.1 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.1 + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.1 + + '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-destructuring@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.9)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.9)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.9)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.26.9) + + '@babel/plugin-transform-object-rest-spread@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1) + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 '@babel/preset-env@7.26.9(@babel/core@7.26.9)': dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.27.1 '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.9) + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.26.9) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.9) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.9) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.9) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.9) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoping': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-object-rest-spread': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-regenerator': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.26.9) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.9) - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.9) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.9) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.9) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.9) - core-js-compat: 3.41.0 + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.9) + core-js-compat: 3.42.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-env@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/compat-data': 7.27.1 + '@babel/core': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-object-rest-spread': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-regenerator': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.1) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.1) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.1) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.1) + core-js-compat: 3.42.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -11105,20 +11885,35 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.1 + esutils: 2.0.3 + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.1 esutils: 2.0.3 '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.1': {} + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.9 '@babel/types': 7.26.9 + '@babel/template@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/types': 7.27.1 + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 @@ -11131,11 +11926,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/template': 7.27.1 + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@1.0.2': {} @@ -11319,62 +12131,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@cspell/cspell-bundled-dicts@8.14.4': - dependencies: - '@cspell/dict-ada': 4.0.2 - '@cspell/dict-aws': 4.0.4 - '@cspell/dict-bash': 4.1.5 - '@cspell/dict-companies': 3.1.4 - '@cspell/dict-cpp': 5.1.19 - '@cspell/dict-cryptocurrencies': 5.0.0 - '@cspell/dict-csharp': 4.0.2 - '@cspell/dict-css': 4.0.13 - '@cspell/dict-dart': 2.2.1 - '@cspell/dict-django': 4.1.0 - '@cspell/dict-docker': 1.1.7 - '@cspell/dict-dotnet': 5.0.5 - '@cspell/dict-elixir': 4.0.3 - '@cspell/dict-en-common-misspellings': 2.0.4 - '@cspell/dict-en-gb': 1.1.33 - '@cspell/dict-en_us': 4.3.23 - '@cspell/dict-filetypes': 3.0.4 - '@cspell/dict-flutter': 1.0.0 - '@cspell/dict-fonts': 4.0.0 - '@cspell/dict-fsharp': 1.0.1 - '@cspell/dict-fullstack': 3.2.0 - '@cspell/dict-gaming-terms': 1.0.5 - '@cspell/dict-git': 3.0.0 - '@cspell/dict-golang': 6.0.13 - '@cspell/dict-google': 1.0.1 - '@cspell/dict-haskell': 4.0.1 - '@cspell/dict-html': 4.0.6 - '@cspell/dict-html-symbol-entities': 4.0.0 - '@cspell/dict-java': 5.0.7 - '@cspell/dict-julia': 1.0.1 - '@cspell/dict-k8s': 1.0.6 - '@cspell/dict-latex': 4.0.0 - '@cspell/dict-lorem-ipsum': 4.0.0 - '@cspell/dict-lua': 4.0.3 - '@cspell/dict-makefile': 1.0.0 - '@cspell/dict-monkeyc': 1.0.6 - '@cspell/dict-node': 5.0.1 - '@cspell/dict-npm': 5.1.5 - '@cspell/dict-php': 4.0.10 - '@cspell/dict-powershell': 5.0.10 - '@cspell/dict-public-licenses': 2.0.8 - '@cspell/dict-python': 4.2.8 - '@cspell/dict-r': 2.0.1 - '@cspell/dict-ruby': 5.0.4 - '@cspell/dict-rust': 4.0.6 - '@cspell/dict-scala': 5.0.3 - '@cspell/dict-software-terms': 4.1.7 - '@cspell/dict-sql': 2.1.5 - '@cspell/dict-svelte': 1.0.2 - '@cspell/dict-swift': 2.0.1 - '@cspell/dict-terraform': 1.0.2 - '@cspell/dict-typescript': 3.1.6 - '@cspell/dict-vue': 3.0.0 - '@cspell/cspell-bundled-dicts@8.17.4': dependencies: '@cspell/dict-ada': 4.1.0 @@ -11436,178 +12192,196 @@ snapshots: '@cspell/dict-typescript': 3.2.0 '@cspell/dict-vue': 3.0.4 + '@cspell/cspell-bundled-dicts@8.19.3': + dependencies: + '@cspell/dict-ada': 4.1.0 + '@cspell/dict-al': 1.1.0 + '@cspell/dict-aws': 4.0.10 + '@cspell/dict-bash': 4.2.0 + '@cspell/dict-companies': 3.1.15 + '@cspell/dict-cpp': 6.0.8 + '@cspell/dict-cryptocurrencies': 5.0.4 + '@cspell/dict-csharp': 4.0.6 + '@cspell/dict-css': 4.0.17 + '@cspell/dict-dart': 2.3.0 + '@cspell/dict-data-science': 2.0.8 + '@cspell/dict-django': 4.1.4 + '@cspell/dict-docker': 1.1.13 + '@cspell/dict-dotnet': 5.0.9 + '@cspell/dict-elixir': 4.0.7 + '@cspell/dict-en-common-misspellings': 2.0.10 + '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.4.3 + '@cspell/dict-filetypes': 3.0.11 + '@cspell/dict-flutter': 1.1.0 + '@cspell/dict-fonts': 4.0.4 + '@cspell/dict-fsharp': 1.1.0 + '@cspell/dict-fullstack': 3.2.6 + '@cspell/dict-gaming-terms': 1.1.1 + '@cspell/dict-git': 3.0.4 + '@cspell/dict-golang': 6.0.20 + '@cspell/dict-google': 1.0.8 + '@cspell/dict-haskell': 4.0.5 + '@cspell/dict-html': 4.0.11 + '@cspell/dict-html-symbol-entities': 4.0.3 + '@cspell/dict-java': 5.0.11 + '@cspell/dict-julia': 1.1.0 + '@cspell/dict-k8s': 1.0.10 + '@cspell/dict-kotlin': 1.1.0 + '@cspell/dict-latex': 4.0.3 + '@cspell/dict-lorem-ipsum': 4.0.4 + '@cspell/dict-lua': 4.0.7 + '@cspell/dict-makefile': 1.0.4 + '@cspell/dict-markdown': 2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1) + '@cspell/dict-monkeyc': 1.0.10 + '@cspell/dict-node': 5.0.7 + '@cspell/dict-npm': 5.2.1 + '@cspell/dict-php': 4.0.14 + '@cspell/dict-powershell': 5.0.14 + '@cspell/dict-public-licenses': 2.0.13 + '@cspell/dict-python': 4.2.17 + '@cspell/dict-r': 2.1.0 + '@cspell/dict-ruby': 5.0.8 + '@cspell/dict-rust': 4.0.11 + '@cspell/dict-scala': 5.0.7 + '@cspell/dict-shell': 1.1.0 + '@cspell/dict-software-terms': 5.0.5 + '@cspell/dict-sql': 2.2.0 + '@cspell/dict-svelte': 1.0.6 + '@cspell/dict-swift': 2.0.5 + '@cspell/dict-terraform': 1.1.1 + '@cspell/dict-typescript': 3.2.1 + '@cspell/dict-vue': 3.0.4 + '@cspell/cspell-json-reporter@8.17.4': dependencies: '@cspell/cspell-types': 8.17.4 - '@cspell/cspell-pipe@8.14.4': {} - '@cspell/cspell-pipe@8.17.4': {} - '@cspell/cspell-resolver@8.14.4': - dependencies: - global-directory: 4.0.1 + '@cspell/cspell-pipe@8.19.3': {} '@cspell/cspell-resolver@8.17.4': dependencies: global-directory: 4.0.1 - '@cspell/cspell-service-bus@8.14.4': {} + '@cspell/cspell-resolver@8.19.3': + dependencies: + global-directory: 4.0.1 '@cspell/cspell-service-bus@8.17.4': {} - '@cspell/cspell-types@8.14.4': {} + '@cspell/cspell-service-bus@8.19.3': {} '@cspell/cspell-types@8.17.4': {} - '@cspell/dict-ada@4.0.2': {} + '@cspell/cspell-types@8.19.3': {} '@cspell/dict-ada@4.1.0': {} '@cspell/dict-al@1.1.0': {} - '@cspell/dict-aws@4.0.4': {} + '@cspell/dict-aws@4.0.10': {} '@cspell/dict-aws@4.0.9': {} - '@cspell/dict-bash@4.1.5': {} - '@cspell/dict-bash@4.2.0': dependencies: '@cspell/dict-shell': 1.1.0 '@cspell/dict-companies@3.1.14': {} - '@cspell/dict-companies@3.1.4': {} - - '@cspell/dict-cpp@5.1.19': {} + '@cspell/dict-companies@3.1.15': {} '@cspell/dict-cpp@6.0.3': {} - '@cspell/dict-cryptocurrencies@5.0.0': {} + '@cspell/dict-cpp@6.0.8': {} '@cspell/dict-cryptocurrencies@5.0.4': {} - '@cspell/dict-csharp@4.0.2': {} - '@cspell/dict-csharp@4.0.6': {} - '@cspell/dict-css@4.0.13': {} - '@cspell/dict-css@4.0.17': {} - '@cspell/dict-dart@2.2.1': {} - '@cspell/dict-dart@2.3.0': {} - '@cspell/dict-data-science@2.0.2': {} - '@cspell/dict-data-science@2.0.7': {} - '@cspell/dict-django@4.1.0': {} + '@cspell/dict-data-science@2.0.8': {} '@cspell/dict-django@4.1.4': {} '@cspell/dict-docker@1.1.12': {} - '@cspell/dict-docker@1.1.7': {} - - '@cspell/dict-dotnet@5.0.5': {} + '@cspell/dict-docker@1.1.13': {} '@cspell/dict-dotnet@5.0.9': {} - '@cspell/dict-elixir@4.0.3': {} - '@cspell/dict-elixir@4.0.7': {} - '@cspell/dict-en-common-misspellings@2.0.4': {} + '@cspell/dict-en-common-misspellings@2.0.10': {} '@cspell/dict-en-common-misspellings@2.0.9': {} '@cspell/dict-en-gb@1.1.33': {} - '@cspell/dict-en_us@4.3.23': {} - '@cspell/dict-en_us@4.3.31': {} + '@cspell/dict-en_us@4.4.3': {} + '@cspell/dict-filetypes@3.0.11': {} - '@cspell/dict-filetypes@3.0.4': {} - - '@cspell/dict-flutter@1.0.0': {} - '@cspell/dict-flutter@1.1.0': {} - '@cspell/dict-fonts@4.0.0': {} - '@cspell/dict-fonts@4.0.4': {} - '@cspell/dict-fsharp@1.0.1': {} - '@cspell/dict-fsharp@1.1.0': {} - '@cspell/dict-fullstack@3.2.0': {} - '@cspell/dict-fullstack@3.2.4': {} - '@cspell/dict-gaming-terms@1.0.5': {} + '@cspell/dict-fullstack@3.2.6': {} '@cspell/dict-gaming-terms@1.1.0': {} - '@cspell/dict-git@3.0.0': {} + '@cspell/dict-gaming-terms@1.1.1': {} '@cspell/dict-git@3.0.4': {} - '@cspell/dict-golang@6.0.13': {} - '@cspell/dict-golang@6.0.18': {} - '@cspell/dict-google@1.0.1': {} + '@cspell/dict-golang@6.0.20': {} '@cspell/dict-google@1.0.8': {} - '@cspell/dict-haskell@4.0.1': {} - '@cspell/dict-haskell@4.0.5': {} - '@cspell/dict-html-symbol-entities@4.0.0': {} - '@cspell/dict-html-symbol-entities@4.0.3': {} '@cspell/dict-html@4.0.11': {} - '@cspell/dict-html@4.0.6': {} - '@cspell/dict-java@5.0.11': {} - '@cspell/dict-java@5.0.7': {} - - '@cspell/dict-julia@1.0.1': {} - '@cspell/dict-julia@1.1.0': {} '@cspell/dict-k8s@1.0.10': {} - '@cspell/dict-k8s@1.0.6': {} - '@cspell/dict-kotlin@1.1.0': {} - '@cspell/dict-latex@4.0.0': {} - '@cspell/dict-latex@4.0.3': {} - '@cspell/dict-lorem-ipsum@4.0.0': {} - '@cspell/dict-lorem-ipsum@4.0.4': {} - '@cspell/dict-lua@4.0.3': {} - '@cspell/dict-lua@4.0.7': {} - '@cspell/dict-makefile@1.0.0': {} - '@cspell/dict-makefile@1.0.4': {} + '@cspell/dict-markdown@2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1)': + dependencies: + '@cspell/dict-css': 4.0.17 + '@cspell/dict-html': 4.0.11 + '@cspell/dict-html-symbol-entities': 4.0.3 + '@cspell/dict-typescript': 3.2.1 + '@cspell/dict-markdown@2.0.9(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.0)': dependencies: '@cspell/dict-css': 4.0.17 @@ -11617,111 +12391,90 @@ snapshots: '@cspell/dict-monkeyc@1.0.10': {} - '@cspell/dict-monkeyc@1.0.6': {} - - '@cspell/dict-node@5.0.1': {} - '@cspell/dict-node@5.0.6': {} + '@cspell/dict-node@5.0.7': {} + '@cspell/dict-npm@5.1.26': {} - '@cspell/dict-npm@5.1.5': {} - - '@cspell/dict-php@4.0.10': {} + '@cspell/dict-npm@5.2.1': {} '@cspell/dict-php@4.0.14': {} - '@cspell/dict-powershell@5.0.10': {} - '@cspell/dict-powershell@5.0.14': {} '@cspell/dict-public-licenses@2.0.13': {} - '@cspell/dict-public-licenses@2.0.8': {} - '@cspell/dict-python@4.2.15': dependencies: - '@cspell/dict-data-science': 2.0.7 + '@cspell/dict-data-science': 2.0.8 - '@cspell/dict-python@4.2.8': + '@cspell/dict-python@4.2.17': dependencies: - '@cspell/dict-data-science': 2.0.2 - - '@cspell/dict-r@2.0.1': {} + '@cspell/dict-data-science': 2.0.8 '@cspell/dict-r@2.1.0': {} - '@cspell/dict-ruby@5.0.4': {} - '@cspell/dict-ruby@5.0.7': {} + '@cspell/dict-ruby@5.0.8': {} + '@cspell/dict-rust@4.0.11': {} - '@cspell/dict-rust@4.0.6': {} - - '@cspell/dict-scala@5.0.3': {} - '@cspell/dict-scala@5.0.7': {} '@cspell/dict-shell@1.1.0': {} - '@cspell/dict-software-terms@4.1.7': {} - '@cspell/dict-software-terms@4.2.5': {} - '@cspell/dict-sql@2.1.5': {} + '@cspell/dict-software-terms@5.0.5': {} '@cspell/dict-sql@2.2.0': {} - '@cspell/dict-svelte@1.0.2': {} - '@cspell/dict-svelte@1.0.6': {} - '@cspell/dict-swift@2.0.1': {} - '@cspell/dict-swift@2.0.5': {} - '@cspell/dict-terraform@1.0.2': {} - '@cspell/dict-terraform@1.1.0': {} - '@cspell/dict-typescript@3.1.6': {} + '@cspell/dict-terraform@1.1.1': {} '@cspell/dict-typescript@3.2.0': {} - '@cspell/dict-vue@3.0.0': {} + '@cspell/dict-typescript@3.2.1': {} '@cspell/dict-vue@3.0.4': {} - '@cspell/dynamic-import@8.14.4': - dependencies: - import-meta-resolve: 4.1.0 - '@cspell/dynamic-import@8.17.4': dependencies: '@cspell/url': 8.17.4 import-meta-resolve: 4.1.0 - '@cspell/eslint-plugin@8.14.4(eslint@9.20.1(jiti@2.4.2))': + '@cspell/dynamic-import@8.19.3': dependencies: - '@cspell/cspell-types': 8.14.4 - '@cspell/url': 8.14.4 - cspell-lib: 8.14.4 - eslint: 9.20.1(jiti@2.4.2) - synckit: 0.9.2 + '@cspell/url': 8.19.3 + import-meta-resolve: 4.1.0 - '@cspell/filetypes@8.14.4': {} + '@cspell/eslint-plugin@8.19.3(eslint@9.25.1(jiti@2.4.2))': + dependencies: + '@cspell/cspell-types': 8.19.3 + '@cspell/url': 8.19.3 + cspell-lib: 8.19.3 + eslint: 9.25.1(jiti@2.4.2) + synckit: 0.11.4 '@cspell/filetypes@8.17.4': {} - '@cspell/strong-weak-map@8.14.4': {} + '@cspell/filetypes@8.19.3': {} '@cspell/strong-weak-map@8.17.4': {} - '@cspell/url@8.14.4': {} + '@cspell/strong-weak-map@8.19.3': {} '@cspell/url@8.17.4': {} + '@cspell/url@8.19.3': {} + '@csstools/color-helpers@5.0.1': {} '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': @@ -11837,7 +12590,7 @@ snapshots: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.48.0': + '@es-joy/jsdoccomment@0.49.0': dependencies: comment-parser: 1.4.1 esquery: 1.6.0 @@ -12062,19 +12815,14 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.5.1(eslint@9.25.1(jiti@2.4.2))': dependencies: - eslint: 9.20.1(jiti@2.4.2) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.5.1(eslint@9.20.1(jiti@2.4.2))': - dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0(supports-color@8.1.1) @@ -12082,15 +12830,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.11.0': + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.12.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0(supports-color@8.1.1) @@ -12104,15 +12850,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.12.0': {} - - '@eslint/js@9.20.0': {} + '@eslint/js@9.25.1': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@fastify/ajv-compiler@3.6.0': @@ -12546,12 +13290,14 @@ snapshots: '@pkgr/core@0.1.1': {} + '@pkgr/core@0.2.4': {} + '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.26.9)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.27.1)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) rollup: 2.79.2 optionalDependencies: @@ -12583,13 +13329,13 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/plugin-typescript@12.1.2(rollup@4.34.8)(tslib@2.8.1)(typescript@5.7.3)': + '@rollup/plugin-typescript@12.1.2(rollup@4.40.1)(tslib@2.8.1)(typescript@5.7.3)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + '@rollup/pluginutils': 5.1.4(rollup@4.40.1) resolve: 1.22.10 typescript: 5.7.3 optionalDependencies: - rollup: 4.34.8 + rollup: 4.40.1 tslib: 2.8.1 '@rollup/pluginutils@3.1.0(rollup@2.79.2)': @@ -12607,71 +13353,131 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.4(rollup@4.34.8)': + '@rollup/pluginutils@5.1.4(rollup@4.40.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.34.8 + rollup: 4.40.1 '@rollup/rollup-android-arm-eabi@4.34.8': optional: true + '@rollup/rollup-android-arm-eabi@4.40.1': + optional: true + '@rollup/rollup-android-arm64@4.34.8': optional: true + '@rollup/rollup-android-arm64@4.40.1': + optional: true + '@rollup/rollup-darwin-arm64@4.34.8': optional: true + '@rollup/rollup-darwin-arm64@4.40.1': + optional: true + '@rollup/rollup-darwin-x64@4.34.8': optional: true + '@rollup/rollup-darwin-x64@4.40.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true + '@rollup/rollup-freebsd-arm64@4.40.1': + optional: true + '@rollup/rollup-freebsd-x64@4.34.8': optional: true + '@rollup/rollup-freebsd-x64@4.40.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true + '@rollup/rollup-linux-arm64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true + '@rollup/rollup-linux-arm64-musl@4.40.1': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true + '@rollup/rollup-linux-s390x-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true + '@rollup/rollup-linux-x64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true + '@rollup/rollup-linux-x64-musl@4.40.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true + '@rollup/rollup-win32-arm64-msvc@4.40.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true + '@rollup/rollup-win32-x64-msvc@4.40.1': + optional: true + '@shikijs/core@2.5.0': dependencies: '@shikijs/engine-javascript': 2.5.0 @@ -12959,6 +13765,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} + '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 22.13.5 @@ -13092,8 +13900,6 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/normalize-package-data@2.4.4': {} - '@types/qs@6.9.16': {} '@types/ramda@0.28.25': @@ -13110,9 +13916,9 @@ snapshots: '@types/retry@0.12.0': {} - '@types/rollup-plugin-visualizer@5.0.3(rollup@4.34.8)': + '@types/rollup-plugin-visualizer@5.0.3(rollup@4.40.1)': dependencies: - rollup-plugin-visualizer: 5.14.0(rollup@4.34.8) + rollup-plugin-visualizer: 5.14.0(rollup@4.40.1) transitivePeerDependencies: - rolldown - rollup @@ -13156,6 +13962,8 @@ snapshots: '@types/web-bluetooth@0.0.20': {} + '@types/web-bluetooth@0.0.21': {} + '@types/ws@8.5.12': dependencies: '@types/node': 22.13.5 @@ -13175,15 +13983,15 @@ snapshots: '@types/node': 22.13.5 optional: true - '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/type-utils': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 - eslint: 9.20.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/type-utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.31.1 + eslint: 9.25.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -13192,14 +14000,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.1 - '@typescript-eslint/types': 8.24.1 - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.1 + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0(supports-color@8.1.1) - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -13209,17 +14017,17 @@ snapshots: '@typescript-eslint/types': 8.24.1 '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/scope-manager@8.8.1': + '@typescript-eslint/scope-manager@8.31.1': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 - '@typescript-eslint/type-utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0(supports-color@8.1.1) - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -13229,7 +14037,7 @@ snapshots: '@typescript-eslint/types@8.24.1': {} - '@typescript-eslint/types@8.8.1': {} + '@typescript-eslint/types@8.31.1': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': dependencies: @@ -13260,42 +14068,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.8.1(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.31.1(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.3.0(typescript@5.7.3) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.24.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.24.1 '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.8.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.7.3) + eslint: 9.25.1(jiti@2.4.2) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/visitor-keys@7.18.0': dependencies: @@ -13307,20 +14114,20 @@ snapshots: '@typescript-eslint/types': 8.24.1 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.8.1': + '@typescript-eslint/visitor-keys@8.31.1': dependencies: - '@typescript-eslint/types': 8.8.1 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.31.1 + eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.3.0': {} - '@unocss/astro@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + '@unocss/astro@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3))': dependencies: '@unocss/core': 66.0.0 '@unocss/reset': 66.0.0 - '@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + '@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)) optionalDependencies: - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - vue @@ -13445,7 +14252,7 @@ snapshots: dependencies: '@unocss/core': 66.0.0 - '@unocss/vite@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + '@unocss/vite@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.0.0 @@ -13455,22 +14262,22 @@ snapshots: magic-string: 0.30.17 tinyglobby: 0.2.12 unplugin-utils: 0.2.4 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - vue - '@vite-pwa/vitepress@0.5.3(vite-plugin-pwa@0.21.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))': + '@vite-pwa/vitepress@1.0.0(vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))': dependencies: - vite-plugin-pwa: 0.21.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0) + vite-plugin-pwa: 1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0) - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.5)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3))': + '@vitejs/plugin-vue@5.2.1(vite@5.4.19(@types/node@22.13.5)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3))': dependencies: - vite: 5.4.14(@types/node@22.13.5)(terser@5.39.0) + vite: 5.4.19(@types/node@22.13.5)(terser@5.39.0) vue: 3.5.13(typescript@5.7.3) - '@vitejs/plugin-vue@5.2.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3))': dependencies: - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) vue: 3.5.13(typescript@5.7.3) '@vitest/coverage-v8@3.0.6(vitest@3.0.6)': @@ -13487,7 +14294,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -13498,13 +14305,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.6(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.0.6(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.0.6 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) '@vitest/pretty-format@3.0.6': dependencies: @@ -13534,7 +14341,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vitest: 3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) '@vitest/utils@3.0.6': dependencies: @@ -13632,25 +14439,38 @@ snapshots: transitivePeerDependencies: - typescript - '@vueuse/integrations@12.7.0(axios@1.7.9)(focus-trap@7.6.4)(typescript@5.7.3)': + '@vueuse/core@13.1.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.1.0 + '@vueuse/shared': 13.1.0(vue@3.5.13(typescript@5.7.3)) + vue: 3.5.13(typescript@5.7.3) + + '@vueuse/integrations@12.7.0(axios@1.8.4)(focus-trap@7.6.4)(typescript@5.7.3)': dependencies: '@vueuse/core': 12.7.0(typescript@5.7.3) '@vueuse/shared': 12.7.0(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) optionalDependencies: - axios: 1.7.9(debug@4.4.0) + axios: 1.8.4(debug@4.4.0) focus-trap: 7.6.4 transitivePeerDependencies: - typescript '@vueuse/metadata@12.7.0': {} + '@vueuse/metadata@13.1.0': {} + '@vueuse/shared@12.7.0(typescript@5.7.3)': dependencies: vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - typescript + '@vueuse/shared@13.1.0(vue@3.5.13(typescript@5.7.3))': + dependencies: + vue: 3.5.13(typescript@5.7.3) + '@wdio/config@7.31.1(typescript@5.7.3)': dependencies: '@types/glob': 8.1.0 @@ -13795,7 +14615,7 @@ snapshots: antlr4: 4.11.0 color-string: 1.9.1 dom-to-image-more: 2.16.0 - dompurify: 3.2.4 + dompurify: 3.2.5 file-saver: 2.0.5 highlight.js: 10.7.3 html-to-image: 1.11.13 @@ -13827,22 +14647,29 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: acorn: 8.12.1 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn-walk@8.3.4: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn@8.12.1: {} acorn@8.14.0: {} + acorn@8.14.1: {} + agent-base@6.0.2: dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -14013,7 +14840,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 arrify@3.0.0: {} @@ -14061,6 +14888,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.8.4(debug@4.4.0): + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + babel-jest@29.7.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 @@ -14078,7 +14913,7 @@ snapshots: dependencies: '@babel/core': 7.26.9 find-cache-dir: 4.0.0 - schema-utils: 4.3.0 + schema-utils: 4.3.2 webpack: 5.95.0(esbuild@0.25.0) babel-plugin-istanbul@6.1.1: @@ -14098,11 +14933,20 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.9): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.9): dependencies: - '@babel/compat-data': 7.26.8 + '@babel/compat-data': 7.27.1 '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.1): + dependencies: + '@babel/compat-data': 7.27.1 + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14110,15 +14954,30 @@ snapshots: babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) - core-js-compat: 3.41.0 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.9) + core-js-compat: 3.42.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.9): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.1): + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) + core-js-compat: 3.42.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.1): + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.1) transitivePeerDependencies: - supports-color @@ -14199,6 +15058,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0(supports-color@8.1.1) + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + bonjour-service@1.2.1: dependencies: fast-deep-equal: 3.1.3 @@ -14308,6 +15181,11 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.2.7 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -14610,6 +15488,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-type@1.0.5: {} convert-source-map@1.9.0: {} @@ -14623,6 +15505,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} + cookie@0.6.0: {} cookie@0.7.2: {} @@ -14635,6 +15519,10 @@ snapshots: dependencies: browserslist: 4.24.4 + core-js-compat@3.42.0: + dependencies: + browserslist: 4.24.4 + core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -14715,24 +15603,17 @@ snapshots: crypto-random-string@2.0.0: {} - cspell-config-lib@8.14.4: - dependencies: - '@cspell/cspell-types': 8.14.4 - comment-json: 4.2.5 - yaml: 2.7.0 - cspell-config-lib@8.17.4: dependencies: '@cspell/cspell-types': 8.17.4 comment-json: 4.2.5 yaml: 2.7.0 - cspell-dictionary@8.14.4: + cspell-config-lib@8.19.3: dependencies: - '@cspell/cspell-pipe': 8.14.4 - '@cspell/cspell-types': 8.14.4 - cspell-trie-lib: 8.14.4 - fast-equals: 5.0.1 + '@cspell/cspell-types': 8.19.3 + comment-json: 4.2.5 + yaml: 2.7.1 cspell-dictionary@8.17.4: dependencies: @@ -14741,6 +15622,13 @@ snapshots: cspell-trie-lib: 8.17.4 fast-equals: 5.2.2 + cspell-dictionary@8.19.3: + dependencies: + '@cspell/cspell-pipe': 8.19.3 + '@cspell/cspell-types': 8.19.3 + cspell-trie-lib: 8.19.3 + fast-equals: 5.2.2 + cspell-gitignore@8.17.4: dependencies: '@cspell/url': 8.17.4 @@ -14748,62 +15636,35 @@ snapshots: cspell-io: 8.17.4 find-up-simple: 1.0.0 - cspell-glob@8.14.4: - dependencies: - '@cspell/url': 8.14.4 - micromatch: 4.0.8 - cspell-glob@8.17.4: dependencies: '@cspell/url': 8.17.4 micromatch: 4.0.8 - cspell-grammar@8.14.4: + cspell-glob@8.19.3: dependencies: - '@cspell/cspell-pipe': 8.14.4 - '@cspell/cspell-types': 8.14.4 + '@cspell/url': 8.19.3 + picomatch: 4.0.2 cspell-grammar@8.17.4: dependencies: '@cspell/cspell-pipe': 8.17.4 '@cspell/cspell-types': 8.17.4 - cspell-io@8.14.4: + cspell-grammar@8.19.3: dependencies: - '@cspell/cspell-service-bus': 8.14.4 - '@cspell/url': 8.14.4 + '@cspell/cspell-pipe': 8.19.3 + '@cspell/cspell-types': 8.19.3 cspell-io@8.17.4: dependencies: '@cspell/cspell-service-bus': 8.17.4 '@cspell/url': 8.17.4 - cspell-lib@8.14.4: + cspell-io@8.19.3: dependencies: - '@cspell/cspell-bundled-dicts': 8.14.4 - '@cspell/cspell-pipe': 8.14.4 - '@cspell/cspell-resolver': 8.14.4 - '@cspell/cspell-types': 8.14.4 - '@cspell/dynamic-import': 8.14.4 - '@cspell/filetypes': 8.14.4 - '@cspell/strong-weak-map': 8.14.4 - '@cspell/url': 8.14.4 - clear-module: 4.1.2 - comment-json: 4.2.5 - cspell-config-lib: 8.14.4 - cspell-dictionary: 8.14.4 - cspell-glob: 8.14.4 - cspell-grammar: 8.14.4 - cspell-io: 8.14.4 - cspell-trie-lib: 8.14.4 - env-paths: 3.0.0 - fast-equals: 5.0.1 - gensequence: 7.0.0 - import-fresh: 3.3.0 - resolve-from: 5.0.0 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - xdg-basedir: 5.1.0 + '@cspell/cspell-service-bus': 8.19.3 + '@cspell/url': 8.19.3 cspell-lib@8.17.4: dependencies: @@ -14832,11 +15693,32 @@ snapshots: vscode-uri: 3.1.0 xdg-basedir: 5.1.0 - cspell-trie-lib@8.14.4: + cspell-lib@8.19.3: dependencies: - '@cspell/cspell-pipe': 8.14.4 - '@cspell/cspell-types': 8.14.4 + '@cspell/cspell-bundled-dicts': 8.19.3 + '@cspell/cspell-pipe': 8.19.3 + '@cspell/cspell-resolver': 8.19.3 + '@cspell/cspell-types': 8.19.3 + '@cspell/dynamic-import': 8.19.3 + '@cspell/filetypes': 8.19.3 + '@cspell/strong-weak-map': 8.19.3 + '@cspell/url': 8.19.3 + clear-module: 4.1.2 + comment-json: 4.2.5 + cspell-config-lib: 8.19.3 + cspell-dictionary: 8.19.3 + cspell-glob: 8.19.3 + cspell-grammar: 8.19.3 + cspell-io: 8.19.3 + cspell-trie-lib: 8.19.3 + env-paths: 3.0.0 + fast-equals: 5.2.2 gensequence: 7.0.0 + import-fresh: 3.3.1 + resolve-from: 5.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + xdg-basedir: 5.1.0 cspell-trie-lib@8.17.4: dependencies: @@ -14844,6 +15726,12 @@ snapshots: '@cspell/cspell-types': 8.17.4 gensequence: 7.0.0 + cspell-trie-lib@8.19.3: + dependencies: + '@cspell/cspell-pipe': 8.19.3 + '@cspell/cspell-types': 8.19.3 + gensequence: 7.0.0 + cspell@8.17.4: dependencies: '@cspell/cspell-json-reporter': 8.17.4 @@ -15158,19 +16046,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -15398,7 +16286,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.2.4: + dompurify@3.2.5: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -15495,7 +16383,7 @@ snapshots: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -15505,7 +16393,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -15541,7 +16429,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 es-define-property@1.0.1: {} @@ -15694,38 +16582,38 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.20.1(jiti@2.4.2)): + eslint-config-prettier@10.1.1(eslint@9.25.1(jiti@2.4.2)): dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) - eslint-plugin-cypress@4.1.0(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-cypress@4.3.0(eslint@9.25.1(jiti@2.4.2)): dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) globals: 15.15.0 eslint-plugin-html@8.1.2: dependencies: htmlparser2: 9.1.0 - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.5))(typescript@5.7.3): + eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(jest@29.7.0(@types/node@22.13.5))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 8.8.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + '@typescript-eslint/utils': 8.24.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.25.1(jiti@2.4.2) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) jest: 29.7.0(@types/node@22.13.5) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@50.3.2(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-jsdoc@50.6.9(eslint@9.25.1(jiti@2.4.2)): dependencies: - '@es-joy/jsdoccomment': 0.48.0 + '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) espree: 10.3.0 esquery: 1.6.0 parse-imports: 2.2.1 @@ -15740,14 +16628,14 @@ snapshots: lodash: 4.17.21 vscode-json-languageservice: 4.2.1 - eslint-plugin-lodash@8.0.0(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-lodash@8.0.0(eslint@9.25.1(jiti@2.4.2)): dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) lodash: 4.17.21 - eslint-plugin-markdown@5.1.0(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-markdown@5.1.0(eslint@9.25.1(jiti@2.4.2)): dependencies: - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color @@ -15759,22 +16647,22 @@ snapshots: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - eslint-plugin-unicorn@58.0.0(eslint@9.20.1(jiti@2.4.2)): + eslint-plugin-unicorn@59.0.0(eslint@9.25.1(jiti@2.4.2)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.5.1(eslint@9.20.1(jiti@2.4.2)) - '@eslint/plugin-kit': 0.2.7 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1(jiti@2.4.2)) + '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 core-js-compat: 3.41.0 - eslint: 9.20.1(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) esquery: 1.6.0 + find-up-simple: 1.0.1 globals: 16.0.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 jsesc: 3.1.0 pluralize: 8.0.0 - read-package-up: 11.0.0 regexp-tree: 0.1.27 regjsparser: 0.12.0 semver: 7.7.1 @@ -15785,7 +16673,7 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -15794,26 +16682,27 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.1(jiti@2.4.2): + eslint@9.25.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.25.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.25.1 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 + eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 @@ -15837,8 +16726,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 esprima@1.1.1: {} @@ -15865,7 +16754,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@1.0.0: {} @@ -15991,6 +16880,38 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.0(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -16019,8 +16940,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-equals@5.0.1: {} - fast-equals@5.2.2: {} fast-glob@3.3.3: @@ -16169,6 +17088,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -16224,6 +17154,8 @@ snapshots: find-up-simple@1.0.0: {} + find-up-simple@1.0.1: {} + find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -16280,7 +17212,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forever-agent@0.6.1: {} @@ -16302,6 +17234,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + from@0.1.7: {} fromentries@1.3.2: {} @@ -16349,7 +17283,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -16383,6 +17317,19 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -16410,9 +17357,9 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-tsconfig@4.8.1: dependencies: @@ -16611,10 +17558,6 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.4.3 - hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -16761,11 +17704,6 @@ snapshots: ignore@7.0.3: {} - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -16784,8 +17722,6 @@ snapshots: indent-string@5.0.0: {} - index-to-position@0.1.2: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -16844,7 +17780,7 @@ snapshots: is-async-function@2.1.1: dependencies: async-function: 1.0.0 - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -16874,8 +17810,8 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -16891,7 +17827,7 @@ snapshots: is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -16905,7 +17841,7 @@ snapshots: is-generator-function@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -16948,6 +17884,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -16986,7 +17924,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-typedarray@1.0.0: {} @@ -17000,7 +17938,7 @@ snapshots: is-weakref@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-weakset@2.0.3: dependencies: @@ -17063,7 +18001,7 @@ snapshots: istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 @@ -17997,6 +18935,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + memfs@3.5.3: dependencies: fs-monkey: 1.0.6 @@ -18005,6 +18945,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -18234,10 +19176,16 @@ snapshots: mime-db@1.53.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mimic-fn@2.1.0: {} @@ -18322,12 +19270,14 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.8: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} negotiator@0.6.3: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} nested-error-stacks@2.1.1: {} @@ -18377,12 +19327,6 @@ snapshots: colors: 0.5.1 underscore: 1.1.7 - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.7.1 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-url@6.1.0: {} @@ -18533,7 +19477,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openapi-fetch@0.13.4: + openapi-fetch@0.13.5: dependencies: openapi-typescript-helpers: 0.0.15 @@ -18556,7 +19500,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -18588,7 +19532,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.1.1 + yocto-queue: 1.2.1 p-locate@3.0.0: dependencies: @@ -18673,12 +19617,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@8.1.0: - dependencies: - '@babel/code-frame': 7.26.2 - index-to-position: 0.1.2 - type-fest: 4.35.0 - parse5@7.2.1: dependencies: entities: 4.5.0 @@ -18717,6 +19655,8 @@ snapshots: path-to-regexp@0.1.10: {} + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} path-type@6.0.0: {} @@ -18880,7 +19820,7 @@ snapshots: postcss@8.5.3: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -18982,6 +19922,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -19009,26 +19953,19 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + react-is@18.3.1: {} read-cache@1.0.0: dependencies: pify: 2.3.0 - read-package-up@11.0.0: - dependencies: - find-up-simple: 1.0.0 - read-pkg: 9.0.1 - type-fest: 4.35.0 - - read-pkg@9.0.1: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 8.1.0 - type-fest: 4.35.0 - unicorn-magic: 0.1.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -19083,7 +20020,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -19095,10 +20032,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.26.9 - regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -19269,14 +20202,14 @@ snapshots: robust-predicates@3.0.2: {} - rollup-plugin-visualizer@5.14.0(rollup@4.34.8): + rollup-plugin-visualizer@5.14.0(rollup@4.40.1): dependencies: open: 8.4.2 picomatch: 4.0.2 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.34.8 + rollup: 4.40.1 rollup@2.79.2: optionalDependencies: @@ -19307,6 +20240,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 + rollup@4.40.1: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.1 + '@rollup/rollup-android-arm64': 4.40.1 + '@rollup/rollup-darwin-arm64': 4.40.1 + '@rollup/rollup-darwin-x64': 4.40.1 + '@rollup/rollup-freebsd-arm64': 4.40.1 + '@rollup/rollup-freebsd-x64': 4.40.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 + '@rollup/rollup-linux-arm-musleabihf': 4.40.1 + '@rollup/rollup-linux-arm64-gnu': 4.40.1 + '@rollup/rollup-linux-arm64-musl': 4.40.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-musl': 4.40.1 + '@rollup/rollup-linux-s390x-gnu': 4.40.1 + '@rollup/rollup-linux-x64-gnu': 4.40.1 + '@rollup/rollup-linux-x64-musl': 4.40.1 + '@rollup/rollup-win32-arm64-msvc': 4.40.1 + '@rollup/rollup-win32-ia32-msvc': 4.40.1 + '@rollup/rollup-win32-x64-msvc': 4.40.1 + fsevents: 2.3.3 + roughjs@4.6.6(patch_hash=3543d47108cb41b68ec6a671c0e1f9d0cfe2ce524fea5b0992511ae84c3c6b64): dependencies: hachure-fill: 0.5.2 @@ -19314,6 +20273,16 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 + router@2.2.0: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + rrweb-cssom@0.8.0: {} run-parallel@1.2.0: @@ -19329,8 +20298,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -19378,7 +20347,7 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) - schema-utils@4.3.0: + schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -19422,6 +20391,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -19447,6 +20432,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-cookie-parser@2.7.1: {} @@ -19677,18 +20671,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 - spdx-exceptions@2.5.0: {} - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 - spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 @@ -19813,12 +20797,12 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -19829,7 +20813,7 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -19839,7 +20823,7 @@ snapshots: string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -19936,6 +20920,11 @@ snapshots: symbol-tree@3.2.4: {} + synckit@0.11.4: + dependencies: + '@pkgr/core': 0.2.4 + tslib: 2.8.1 + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 @@ -20029,7 +21018,7 @@ snapshots: terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -20188,9 +21177,15 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -20238,12 +21233,12 @@ snapshots: typescript: 5.7.3 yaml: 2.7.0 - typescript-eslint@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3): + typescript-eslint@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -20260,7 +21255,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -20292,8 +21287,6 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} - unicorn-magic@0.1.0: {} - unicorn-magic@0.3.0: {} unified@11.0.4: @@ -20357,9 +21350,9 @@ snapshots: universalify@2.0.1: {} - unocss@66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)): + unocss@66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)): dependencies: - '@unocss/astro': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + '@unocss/astro': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)) '@unocss/cli': 66.0.0 '@unocss/core': 66.0.0 '@unocss/postcss': 66.0.0(postcss@8.5.3) @@ -20376,9 +21369,9 @@ snapshots: '@unocss/transformer-compile-class': 66.0.0 '@unocss/transformer-directives': 66.0.0 '@unocss/transformer-variant-group': 66.0.0 - '@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) + '@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.7.3)) optionalDependencies: - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - postcss - supports-color @@ -20391,7 +21384,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.2 - unplugin-vue-components@28.4.0(@babel/parser@7.26.9)(vue@3.5.13(typescript@5.7.3)): + unplugin-vue-components@28.4.0(@babel/parser@7.27.1)(vue@3.5.13(typescript@5.7.3)): dependencies: chokidar: 3.6.0 debug: 4.4.0(supports-color@8.1.1) @@ -20403,7 +21396,7 @@ snapshots: unplugin-utils: 0.2.4 vue: 3.5.13(typescript@5.7.3) optionalDependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 transitivePeerDependencies: - supports-color @@ -20448,11 +21441,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - vary@1.1.2: {} verror@1.10.0: @@ -20471,13 +21459,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0): + vite-node@3.0.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -20492,7 +21480,7 @@ snapshots: - tsx - yaml - vite-plugin-istanbul@7.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-istanbul@7.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): dependencies: '@istanbuljs/load-nyc-config': 1.1.0 espree: 10.3.0 @@ -20500,32 +21488,32 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.4 test-exclude: 7.0.1 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color - vite-plugin-pwa@0.21.1(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.0(supports-color@8.1.1) pretty-bytes: 6.1.1 tinyglobby: 0.2.12 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) workbox-build: 7.1.1(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite@5.4.14(@types/node@22.13.5)(terser@5.39.0): + vite@5.4.19(@types/node@22.13.5)(terser@5.39.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 - rollup: 4.34.8 + rollup: 4.40.1 optionalDependencies: '@types/node': 22.13.5 fsevents: 2.3.3 terser: 5.39.0 - vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0): + vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: esbuild: 0.24.2 postcss: 8.5.3 @@ -20536,19 +21524,32 @@ snapshots: jiti: 2.4.2 terser: 5.39.0 tsx: 4.19.3 - yaml: 2.7.0 + yaml: 2.7.1 - vitepress-plugin-search@1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)): + vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.3 + rollup: 4.40.1 + optionalDependencies: + '@types/node': 22.13.5 + fsevents: 2.3.3 + jiti: 2.4.2 + terser: 5.39.0 + tsx: 4.19.3 + yaml: 2.7.1 + + vitepress-plugin-search@1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3))(vue@3.5.13(typescript@5.7.3)): dependencies: '@types/flexsearch': 0.7.6 '@types/markdown-it': 12.2.3 flexsearch: 0.7.43 glob-to-regexp: 0.4.1 markdown-it: 13.0.2 - vitepress: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) + vitepress: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3) - vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.7.9)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3): + vitepress@1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.20.3)(search-insights@2.17.2) @@ -20557,16 +21558,16 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.13.5)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3)) + '@vitejs/plugin-vue': 5.2.1(vite@5.4.19(@types/node@22.13.5)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3)) '@vue/devtools-api': 7.7.2 '@vue/shared': 3.5.13 '@vueuse/core': 12.7.0(typescript@5.7.3) - '@vueuse/integrations': 12.7.0(axios@1.7.9)(focus-trap@7.6.4)(typescript@5.7.3) + '@vueuse/integrations': 12.7.0(axios@1.8.4)(focus-trap@7.6.4)(typescript@5.7.3) focus-trap: 7.6.4 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.14(@types/node@22.13.5)(terser@5.39.0) + vite: 5.4.19(@types/node@22.13.5)(terser@5.39.0) vue: 3.5.13(typescript@5.7.3) optionalDependencies: postcss: 8.5.3 @@ -20597,10 +21598,10 @@ snapshots: - typescript - universal-cookie - vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0): + vitest@3.0.6(@types/debug@4.1.12)(@types/node@22.13.5)(@vitest/ui@3.0.6)(jiti@2.4.2)(jsdom@26.0.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.0.6 - '@vitest/mocker': 3.0.6(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/mocker': 3.0.6(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.0.6 '@vitest/runner': 3.0.6 '@vitest/snapshot': 3.0.6 @@ -20616,8 +21617,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - vite-node: 3.0.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.0.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -20929,7 +21930,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -20941,7 +21942,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -20961,6 +21962,16 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@1.3.1: dependencies: isexe: 2.0.0 @@ -20994,10 +22005,10 @@ snapshots: workbox-build@7.1.1(@types/babel__core@7.20.5): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.26.9 - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - '@babel/runtime': 7.26.9 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.9)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@babel/core': 7.27.1 + '@babel/preset-env': 7.27.1(@babel/core@7.27.1) + '@babel/runtime': 7.27.1 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.1)(@types/babel__core@7.20.5)(rollup@2.79.2) '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) @@ -21164,6 +22175,8 @@ snapshots: yaml@2.7.0: {} + yaml@2.7.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -21204,6 +22217,6 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.1.1: {} + yocto-queue@1.2.1: {} zwitch@2.0.4: {} diff --git a/scripts/compare-timings.ts b/scripts/compare-timings.ts new file mode 100644 index 000000000..1dbfc41d0 --- /dev/null +++ b/scripts/compare-timings.ts @@ -0,0 +1,115 @@ +/** + * Compares new E2E test timings with previous timings and determines whether to keep the new timings. + * + * The script will: + * 1. Read old timings from git HEAD + * 2. Read new timings from the current file + * 3. Compare the timings and specs + * 4. Keep new timings if: + * - Specs were added/removed + * - Any timing changed by 20% or more + * 5. Revert to old timings if: + * - No significant timing changes + * + * This helps prevent unnecessary timing updates when test performance hasn't changed significantly. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import { execSync } from 'node:child_process'; + +interface Timing { + spec: string; + duration: number; +} + +interface TimingsFile { + durations: Timing[]; +} + +interface CleanupOptions { + keepNew: boolean; + reason: string; +} + +const TIMINGS_FILE = 'cypress/timings.json'; +const TIMINGS_PATH = path.join(process.cwd(), TIMINGS_FILE); + +function log(message: string): void { + // eslint-disable-next-line no-console + console.log(message); +} + +function readOldTimings(): TimingsFile { + try { + const oldContent = execSync(`git show HEAD:${TIMINGS_FILE}`, { encoding: 'utf8' }); + return JSON.parse(oldContent); + } catch { + log('Error getting old timings, using empty file'); + return { durations: [] }; + } +} + +function readNewTimings(): TimingsFile { + return JSON.parse(fs.readFileSync(TIMINGS_PATH, 'utf8')); +} + +function cleanupFiles({ keepNew, reason }: CleanupOptions): void { + if (keepNew) { + log(`Keeping new timings: ${reason}`); + } else { + log(`Reverting to old timings: ${reason}`); + execSync(`git checkout HEAD -- ${TIMINGS_FILE}`); + } +} + +function compareTimings(): void { + const oldTimings = readOldTimings(); + const newTimings = readNewTimings(); + + const oldSpecs = new Set(oldTimings.durations.map((d) => d.spec)); + const newSpecs = new Set(newTimings.durations.map((d) => d.spec)); + + // Check if specs were added or removed + const addedSpecs = [...newSpecs].filter((spec) => !oldSpecs.has(spec)); + const removedSpecs = [...oldSpecs].filter((spec) => !newSpecs.has(spec)); + + if (addedSpecs.length > 0 || removedSpecs.length > 0) { + log('Specs changed:'); + if (addedSpecs.length > 0) { + log(`Added: ${addedSpecs.join(', ')}`); + } + if (removedSpecs.length > 0) { + log(`Removed: ${removedSpecs.join(', ')}`); + } + return cleanupFiles({ keepNew: true, reason: 'Specs were added or removed' }); + } + + // Check timing variations + const timingChanges = newTimings.durations.map((newTiming) => { + const oldTiming = oldTimings.durations.find((d) => d.spec === newTiming.spec); + if (!oldTiming) { + throw new Error(`Could not find old timing for spec: ${newTiming.spec}`); + } + const change = Math.abs(newTiming.duration - oldTiming.duration); + const changePercent = change / oldTiming.duration; + return { spec: newTiming.spec, change, changePercent }; + }); + + // Filter changes that's more than 5 seconds and 20% different + const significantChanges = timingChanges.filter((t) => t.change > 5000 && t.changePercent >= 0.2); + + if (significantChanges.length === 0) { + log('No significant timing changes detected (threshold: 5s and 20%)'); + return cleanupFiles({ keepNew: false, reason: 'No significant timing changes' }); + } + + log('Significant timing changes:'); + significantChanges.forEach((t) => { + log(`${t.spec}: ${t.change.toFixed(1)}ms (${(t.changePercent * 100).toFixed(1)}%)`); + }); + + cleanupFiles({ keepNew: true, reason: 'Significant timing changes detected' }); +} + +compareTimings(); diff --git a/tsconfig.json b/tsconfig.json index 266b68dda..bd343b278 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -91,7 +91,7 @@ // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noImplicitReturns": true, /* Enable error reporting for code paths that do not explicitly return in a function. */ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */