diff --git a/.build/common.ts b/.build/common.ts index 86ccd15d1..efd0e3a85 100644 --- a/.build/common.ts +++ b/.build/common.ts @@ -33,4 +33,9 @@ export const packageOptions = { packageName: 'mermaid-layout-elk', file: 'layouts.ts', }, + examples: { + name: 'mermaid-examples', + packageName: 'examples', + file: 'index.ts', + }, } as const satisfies Record; diff --git a/.build/types.ts b/.build/types.ts index 9dec05a68..1d439d87c 100644 --- a/.build/types.ts +++ b/.build/types.ts @@ -10,13 +10,16 @@ const buildType = (packageName: string) => { console.log(out.toString()); } } catch (e) { - console.error(e); if (e.stdout.length > 0) { console.error(e.stdout.toString()); } if (e.stderr.length > 0) { console.error(e.stderr.toString()); } + // Exit the build process if we are in CI + if (process.env.CI) { + throw new Error(`Failed to build types for ${packageName}`); + } } }; diff --git a/.changeset/better-days-bow.md b/.changeset/better-days-bow.md deleted file mode 100644 index b1baf994b..000000000 --- a/.changeset/better-days-bow.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'mermaid': minor -'@mermaid-js/parser': minor ---- - -Adding support for the new diagram type nested treemap diff --git a/.changeset/gold-olives-rule.md b/.changeset/gold-olives-rule.md new file mode 100644 index 000000000..6fe343774 --- /dev/null +++ b/.changeset/gold-olives-rule.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +feat: Add `getRegisteredDiagramsMetadata` to `mermaid`, which returns all the registered diagram IDs in mermaid diff --git a/.changeset/platinum-olives-rule.md b/.changeset/platinum-olives-rule.md new file mode 100644 index 000000000..af70d6538 --- /dev/null +++ b/.changeset/platinum-olives-rule.md @@ -0,0 +1,5 @@ +--- +'@mermaid-js/examples': minor +--- + +feat: Add examples for diagrams in the `@mermaid-js/examples` package diff --git a/.github/lychee.toml b/.github/lychee.toml index 7e23b2351..03dc0c5e5 100644 --- a/.github/lychee.toml +++ b/.github/lychee.toml @@ -46,6 +46,9 @@ exclude = [ # Drupal 403 "https://(www.)?drupal.org", +# Phbpp 403 +"https://(www.)?phpbb.com", + # Swimm returns 404, even though the link is valid "https://docs.swimm.io", diff --git a/cypress/timings.json b/cypress/timings.json index 03eb22b98..05263ad9f 100644 --- a/cypress/timings.json +++ b/cypress/timings.json @@ -2,35 +2,35 @@ "durations": [ { "spec": "cypress/integration/other/configuration.spec.js", - "duration": 6130 + "duration": 5672 }, { "spec": "cypress/integration/other/external-diagrams.spec.js", - "duration": 1974 + "duration": 1990 }, { "spec": "cypress/integration/other/ghsa.spec.js", - "duration": 3308 + "duration": 3186 }, { "spec": "cypress/integration/other/iife.spec.js", - "duration": 1877 + "duration": 1948 }, { "spec": "cypress/integration/other/interaction.spec.js", - "duration": 10902 + "duration": 11938 }, { "spec": "cypress/integration/other/rerender.spec.js", - "duration": 1836 + "duration": 1932 }, { "spec": "cypress/integration/other/xss.spec.js", - "duration": 26467 + "duration": 27237 }, { "spec": "cypress/integration/rendering/appli.spec.js", - "duration": 3129 + "duration": 3170 }, { "spec": "cypress/integration/rendering/architecture.spec.ts", @@ -38,147 +38,147 @@ }, { "spec": "cypress/integration/rendering/block.spec.js", - "duration": 16230 + "duration": 17390 }, { "spec": "cypress/integration/rendering/c4.spec.js", - "duration": 5231 + "duration": 5296 }, { "spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js", - "duration": 38113 + "duration": 39004 }, { "spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js", - "duration": 36423 + "duration": 37653 }, { "spec": "cypress/integration/rendering/classDiagram-v2.spec.js", - "duration": 22509 + "duration": 23278 }, { "spec": "cypress/integration/rendering/classDiagram-v3.spec.js", - "duration": 34933 + "duration": 36645 }, { "spec": "cypress/integration/rendering/classDiagram.spec.js", - "duration": 14681 + "duration": 15418 }, { "spec": "cypress/integration/rendering/conf-and-directives.spec.js", - "duration": 8877 + "duration": 9684 }, { "spec": "cypress/integration/rendering/current.spec.js", - "duration": 2517 + "duration": 2570 }, { "spec": "cypress/integration/rendering/erDiagram-unified.spec.js", - "duration": 81226 + "duration": 84687 }, { "spec": "cypress/integration/rendering/erDiagram.spec.js", - "duration": 14211 + "duration": 14819 }, { "spec": "cypress/integration/rendering/errorDiagram.spec.js", - "duration": 3355 + "duration": 3371 }, { "spec": "cypress/integration/rendering/flowchart-elk.spec.js", - "duration": 38857 + "duration": 39925 }, { "spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js", - "duration": 28570 + "duration": 34694 }, { "spec": "cypress/integration/rendering/flowchart-icon.spec.js", - "duration": 6902 + "duration": 7137 }, { "spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts", - "duration": 23075 + "duration": 24740 }, { "spec": "cypress/integration/rendering/flowchart-v2.spec.js", - "duration": 40514 + "duration": 42077 }, { "spec": "cypress/integration/rendering/flowchart.spec.js", - "duration": 28611 + "duration": 30642 }, { "spec": "cypress/integration/rendering/gantt.spec.js", - "duration": 16605 + "duration": 18085 }, { "spec": "cypress/integration/rendering/gitGraph.spec.js", - "duration": 47636 + "duration": 50107 }, { "spec": "cypress/integration/rendering/iconShape.spec.ts", - "duration": 262219 + "duration": 276279 }, { "spec": "cypress/integration/rendering/imageShape.spec.ts", - "duration": 54111 + "duration": 56505 }, { "spec": "cypress/integration/rendering/info.spec.ts", - "duration": 3006 + "duration": 3036 }, { "spec": "cypress/integration/rendering/journey.spec.js", - "duration": 6858 + "duration": 6889 }, { "spec": "cypress/integration/rendering/kanban.spec.ts", - "duration": 7281 + "duration": 7353 }, { "spec": "cypress/integration/rendering/katex.spec.js", - "duration": 3579 + "duration": 3580 }, { "spec": "cypress/integration/rendering/marker_unique_id.spec.js", - "duration": 2448 + "duration": 2508 }, { "spec": "cypress/integration/rendering/mindmap.spec.ts", - "duration": 10618 + "duration": 10939 }, { "spec": "cypress/integration/rendering/newShapes.spec.ts", - "duration": 140874 + "duration": 149102 }, { "spec": "cypress/integration/rendering/oldShapes.spec.ts", - "duration": 108015 + "duration": 113987 }, { "spec": "cypress/integration/rendering/packet.spec.ts", - "duration": 4241 + "duration": 4060 }, { "spec": "cypress/integration/rendering/pie.spec.ts", - "duration": 5645 + "duration": 5715 }, { "spec": "cypress/integration/rendering/quadrantChart.spec.js", - "duration": 8524 + "duration": 8945 }, { "spec": "cypress/integration/rendering/radar.spec.js", - "duration": 5203 + "duration": 5337 }, { "spec": "cypress/integration/rendering/requirement.spec.js", - "duration": 2635 + "duration": 2643 }, { "spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js", - "duration": 50512 + "duration": 52072 }, { "spec": "cypress/integration/rendering/sankey.spec.ts", @@ -186,31 +186,35 @@ }, { "spec": "cypress/integration/rendering/sequencediagram.spec.js", - "duration": 34559 + "duration": 35721 }, { "spec": "cypress/integration/rendering/stateDiagram-v2.spec.js", - "duration": 24421 + "duration": 26030 }, { "spec": "cypress/integration/rendering/stateDiagram.spec.js", - "duration": 15316 + "duration": 16333 }, { "spec": "cypress/integration/rendering/theme.spec.js", - "duration": 28240 + "duration": 29287 }, { "spec": "cypress/integration/rendering/timeline.spec.ts", - "duration": 6808 + "duration": 8491 + }, + { + "spec": "cypress/integration/rendering/treemap.spec.ts", + "duration": 12291 }, { "spec": "cypress/integration/rendering/xyChart.spec.js", - "duration": 19359 + "duration": 20651 }, { "spec": "cypress/integration/rendering/zenuml.spec.js", - "duration": 3164 + "duration": 3218 } ] } diff --git a/docs/community/new-diagram.md b/docs/community/new-diagram.md index c214afa64..847f3ef35 100644 --- a/docs/community/new-diagram.md +++ b/docs/community/new-diagram.md @@ -111,3 +111,13 @@ const themes = { ``` The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups. + +## Examples + +The `@mermaid-js/examples` package contains a collection of examples that are used by tools like mermaid.live to help users get started with the new diagram. + +You can duplicate an existing diagram example file, eg: `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram. + +Then you can import the example in the `packages/examples/src/index.ts` file and add it to the `examples` array. + +Each diagram should have at least one example, and that should be marked as default. It is good to add more examples to showcase different features of the diagram. diff --git a/docs/config/setup/mermaid/interfaces/ExternalDiagramDefinition.md b/docs/config/setup/mermaid/interfaces/ExternalDiagramDefinition.md index 34e475388..35efcddeb 100644 --- a/docs/config/setup/mermaid/interfaces/ExternalDiagramDefinition.md +++ b/docs/config/setup/mermaid/interfaces/ExternalDiagramDefinition.md @@ -10,7 +10,7 @@ # Interface: ExternalDiagramDefinition -Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L99) +Defined in: [packages/mermaid/src/diagram-api/types.ts:94](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L94) ## Properties @@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/me > **detector**: `DiagramDetector` -Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L101) +Defined in: [packages/mermaid/src/diagram-api/types.ts:96](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L96) --- @@ -26,7 +26,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/m > **id**: `string` -Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L100) +Defined in: [packages/mermaid/src/diagram-api/types.ts:95](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L95) --- @@ -34,4 +34,4 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/m > **loader**: `DiagramLoader` -Defined in: [packages/mermaid/src/diagram-api/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L102) +Defined in: [packages/mermaid/src/diagram-api/types.ts:97](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L97) diff --git a/docs/config/setup/mermaid/interfaces/Mermaid.md b/docs/config/setup/mermaid/interfaces/Mermaid.md index 2e5cc3571..fd15b306b 100644 --- a/docs/config/setup/mermaid/interfaces/Mermaid.md +++ b/docs/config/setup/mermaid/interfaces/Mermaid.md @@ -10,7 +10,7 @@ # Interface: Mermaid -Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L418) +Defined in: [packages/mermaid/src/mermaid.ts:429](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L429) ## Properties @@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/ > **contentLoaded**: () => `void` -Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436) +Defined in: [packages/mermaid/src/mermaid.ts:447](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L447) \##contentLoaded Callback function that is called when page is loaded. This functions fetches configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the @@ -34,7 +34,7 @@ page. > **detectType**: (`text`, `config`?) => `string` -Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438) +Defined in: [packages/mermaid/src/mermaid.ts:449](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L449) Detects the type of the graph text. @@ -86,11 +86,28 @@ A graph definition key --- +### getRegisteredDiagramsMetadata() + +> **getRegisteredDiagramsMetadata**: () => `Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[] + +Defined in: [packages/mermaid/src/mermaid.ts:451](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L451) + +Gets the metadata for all registered diagrams. +Currently only the id is returned. + +#### Returns + +`Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[] + +An array of objects with the id of the diagram. + +--- + ### ~~init()~~ > **init**: (`config`?, `nodes`?, `callback`?) => `Promise`<`void`> -Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431) +Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442) ## init @@ -138,7 +155,7 @@ Use [initialize](Mermaid.md#initialize) and [run](Mermaid.md#run) instead. > **initialize**: (`config`) => `void` -Defined in: [packages/mermaid/src/mermaid.ts:435](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L435) +Defined in: [packages/mermaid/src/mermaid.ts:446](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L446) Used to set configurations for mermaid. This function should be called before the run function. @@ -161,7 +178,7 @@ Configuration object for mermaid. > **mermaidAPI**: `Readonly`<{ `defaultConfig`: [`MermaidConfig`](MermaidConfig.md); `getConfig`: () => [`MermaidConfig`](MermaidConfig.md); `getDiagramFromText`: (`text`, `metadata`) => `Promise`<`Diagram`>; `getSiteConfig`: () => [`MermaidConfig`](MermaidConfig.md); `globalReset`: () => `void`; `initialize`: (`userOptions`) => `void`; `parse`: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>; `render`: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>; `reset`: () => `void`; `setConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); `updateSiteConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); }> -Defined in: [packages/mermaid/src/mermaid.ts:425](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L425) +Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436) **`Internal`** @@ -175,7 +192,7 @@ Use [parse](Mermaid.md#parse) and [render](Mermaid.md#render) instead. Please [o > **parse**: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)> -Defined in: [packages/mermaid/src/mermaid.ts:426](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L426) +Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437) Parse the text and validate the syntax. @@ -243,7 +260,7 @@ Error if the diagram is invalid and parseOptions.suppressErrors is false or not > `optional` **parseError**: [`ParseErrorFunction`](../type-aliases/ParseErrorFunction.md) -Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L420) +Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431) --- @@ -251,7 +268,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/ > **registerExternalDiagrams**: (`diagrams`, `opts`) => `Promise`<`void`> -Defined in: [packages/mermaid/src/mermaid.ts:434](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L434) +Defined in: [packages/mermaid/src/mermaid.ts:445](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L445) Used to register external diagram types. @@ -281,7 +298,7 @@ If opts.lazyLoad is false, the diagrams will be loaded immediately. > **registerIconPacks**: (`iconLoaders`) => `void` -Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L439) +Defined in: [packages/mermaid/src/mermaid.ts:450](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L450) #### Parameters @@ -299,7 +316,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/ > **registerLayoutLoaders**: (`loaders`) => `void` -Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L433) +Defined in: [packages/mermaid/src/mermaid.ts:444](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L444) #### Parameters @@ -317,7 +334,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/ > **render**: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)> -Defined in: [packages/mermaid/src/mermaid.ts:427](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L427) +Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438) #### Parameters @@ -349,7 +366,7 @@ Deprecated for external use. > **run**: (`options`) => `Promise`<`void`> -Defined in: [packages/mermaid/src/mermaid.ts:432](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L432) +Defined in: [packages/mermaid/src/mermaid.ts:443](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L443) ## run @@ -393,7 +410,7 @@ Optional runtime configs > **setParseErrorHandler**: (`parseErrorHandler`) => `void` -Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437) +Defined in: [packages/mermaid/src/mermaid.ts:448](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L448) ## setParseErrorHandler Alternative to directly setting parseError using: @@ -424,4 +441,4 @@ New parseError() callback. > **startOnLoad**: `boolean` -Defined in: [packages/mermaid/src/mermaid.ts:419](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L419) +Defined in: [packages/mermaid/src/mermaid.ts:430](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L430) diff --git a/docs/config/setup/mermaid/type-aliases/SVG.md b/docs/config/setup/mermaid/type-aliases/SVG.md index 2c72882ae..8bfb7bda0 100644 --- a/docs/config/setup/mermaid/type-aliases/SVG.md +++ b/docs/config/setup/mermaid/type-aliases/SVG.md @@ -12,4 +12,4 @@ > **SVG**: `d3.Selection`<`SVGSVGElement`, `unknown`, `Element` | `null`, `unknown`> -Defined in: [packages/mermaid/src/diagram-api/types.ts:130](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L130) +Defined in: [packages/mermaid/src/diagram-api/types.ts:126](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L126) diff --git a/docs/config/setup/mermaid/type-aliases/SVGGroup.md b/docs/config/setup/mermaid/type-aliases/SVGGroup.md index 30ada9928..5e53052fd 100644 --- a/docs/config/setup/mermaid/type-aliases/SVGGroup.md +++ b/docs/config/setup/mermaid/type-aliases/SVGGroup.md @@ -12,4 +12,4 @@ > **SVGGroup**: `d3.Selection`<`SVGGElement`, `unknown`, `Element` | `null`, `unknown`> -Defined in: [packages/mermaid/src/diagram-api/types.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L132) +Defined in: [packages/mermaid/src/diagram-api/types.ts:128](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L128) diff --git a/docs/config/setup/mermaid/variables/default.md b/docs/config/setup/mermaid/variables/default.md index 24ec84128..a953a641b 100644 --- a/docs/config/setup/mermaid/variables/default.md +++ b/docs/config/setup/mermaid/variables/default.md @@ -12,4 +12,4 @@ > `const` **default**: [`Mermaid`](../interfaces/Mermaid.md) -Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442) +Defined in: [packages/mermaid/src/mermaid.ts:454](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L454) diff --git a/packages/examples/package.json b/packages/examples/package.json new file mode 100644 index 000000000..90abc9da9 --- /dev/null +++ b/packages/examples/package.json @@ -0,0 +1,32 @@ +{ + "name": "@mermaid-js/examples", + "version": "0.0.1-beta.1", + "description": "Mermaid examples package", + "author": "Sidharth Vinod", + "type": "module", + "module": "./dist/mermaid-examples.core.mjs", + "types": "./dist/mermaid.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/mermaid-examples.core.mjs", + "default": "./dist/mermaid-examples.core.mjs" + } + }, + "files": [ + "dist" + ], + "scripts": { + "clean": "rimraf dist" + }, + "dependencies": {}, + "devDependencies": { + "mermaid": "workspace:*" + }, + "peerDependencies": { + "mermaid": "workspace:~" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/examples/src/example.spec.ts b/packages/examples/src/example.spec.ts new file mode 100644 index 000000000..71e3e6fab --- /dev/null +++ b/packages/examples/src/example.spec.ts @@ -0,0 +1,34 @@ +import mermaid from 'mermaid'; +import { diagramData } from './index.js'; + +describe('examples', () => { + beforeAll(async () => { + // To trigger the diagram registration + await mermaid.registerExternalDiagrams([]); + }); + + it('should have examples for each diagrams', () => { + const skippedDiagrams = [ + // These diagrams have no examples + 'error', + 'info', + '---', + // These diagrams have v2 versions, with examples + 'class', + 'graph', + 'flowchart-elk', + 'flowchart', + 'state', + ]; + const diagrams = mermaid + .getRegisteredDiagramsMetadata() + .filter((d) => !skippedDiagrams.includes(d.id)); + expect(diagrams.length).toBeGreaterThan(0); + for (const diagram of diagrams) { + const data = diagramData.find((d) => d.id === diagram.id)!; + expect(data, `Example for ${diagram.id} is not defined`).toBeDefined(); + expect(data.examples.length).toBeGreaterThan(0); + expect(data.examples.filter((e) => e.isDefault).length).toBe(1); + } + }); +}); diff --git a/packages/examples/src/examples/architecture.ts b/packages/examples/src/examples/architecture.ts new file mode 100644 index 000000000..d2b53d26c --- /dev/null +++ b/packages/examples/src/examples/architecture.ts @@ -0,0 +1,24 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'architecture', + name: 'Architecture Diagram', + description: 'Visualize system architecture and components', + examples: [ + { + title: 'Basic System Architecture', + isDefault: true, + code: `architecture-beta + 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`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/block.ts b/packages/examples/src/examples/block.ts new file mode 100644 index 000000000..4ea374b52 --- /dev/null +++ b/packages/examples/src/examples/block.ts @@ -0,0 +1,27 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'block', + name: 'Block Diagram', + description: 'Create block-based visualizations with beta styling', + examples: [ + { + title: 'Basic Block Layout', + isDefault: true, + code: `block-beta +columns 1 + db(("DB")) + blockArrowId6<["   "]>(down) + block:ID + A + B["A wide one in the middle"] + C + end + space + D + ID --> D + C --> D + style B fill:#969,stroke:#333,stroke-width:4px`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/c4.ts b/packages/examples/src/examples/c4.ts new file mode 100644 index 000000000..40ea86bc8 --- /dev/null +++ b/packages/examples/src/examples/c4.ts @@ -0,0 +1,47 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'c4', + name: 'C4 Diagram', + description: + 'Visualize software architecture using the C4 model (Context, Container, Component, Code)', + examples: [ + { + title: 'Internet Banking System Context', + isDefault: true, + code: `C4Context + title System Context diagram for Internet Banking System + Enterprise_Boundary(b0, "BankBoundary0") { + Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") + Person(customerB, "Banking Customer B") + Person_Ext(customerC, "Banking Customer C", "desc") + + Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") + + System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") + + Enterprise_Boundary(b1, "BankBoundary") { + SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") + + System_Boundary(b2, "BankBoundary2") { + System(SystemA, "Banking System A") + System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.") + } + + System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") + SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") + + Boundary(b3, "BankBoundary3", "boundary") { + SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.") + SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") + } + } + } + + BiRel(customerA, SystemAA, "Uses") + BiRel(SystemAA, SystemE, "Uses") + Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") + Rel(SystemC, customerA, "Sends e-mails to")`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/class.ts b/packages/examples/src/examples/class.ts new file mode 100644 index 000000000..41d54bb3a --- /dev/null +++ b/packages/examples/src/examples/class.ts @@ -0,0 +1,34 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'classDiagram', + name: 'Class Diagram', + description: 'Visualize class structures and relationships in object-oriented programming', + examples: [ + { + title: 'Basic Class Inheritance', + isDefault: true, + code: `classDiagram + Animal <|-- Duck + Animal <|-- Fish + Animal <|-- Zebra + Animal : +int age + Animal : +String gender + Animal: +isMammal() + Animal: +mate() + class Duck{ + +String beakColor + +swim() + +quack() + } + class Fish{ + -int sizeInFeet + -canEat() + } + class Zebra{ + +bool is_wild + +run() + }`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/er.ts b/packages/examples/src/examples/er.ts new file mode 100644 index 000000000..faa36f3c2 --- /dev/null +++ b/packages/examples/src/examples/er.ts @@ -0,0 +1,36 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'er', + name: 'Entity Relationship Diagram', + description: 'Visualize database schemas and relationships between entities', + examples: [ + { + title: 'Basic ER Schema', + isDefault: true, + code: `erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ ORDER_ITEM : contains + PRODUCT ||--o{ ORDER_ITEM : includes + CUSTOMER { + string id + string name + string email + } + ORDER { + string id + date orderDate + string status + } + PRODUCT { + string id + string name + float price + } + ORDER_ITEM { + int quantity + float price + }`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/flowchart.ts b/packages/examples/src/examples/flowchart.ts new file mode 100644 index 000000000..655e5795e --- /dev/null +++ b/packages/examples/src/examples/flowchart.ts @@ -0,0 +1,19 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'flowchart-v2', + name: 'Flowchart', + description: 'Visualize flowcharts and directed graphs', + examples: [ + { + title: 'Basic Flowchart', + isDefault: true, + code: `flowchart TD + A[Christmas] -->|Get money| B(Go shopping) + B --> C{Let me think} + C -->|One| D[Laptop] + C -->|Two| E[iPhone] + C -->|Three| F[fa:fa-car Car]`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/gantt.ts b/packages/examples/src/examples/gantt.ts new file mode 100644 index 000000000..989eac572 --- /dev/null +++ b/packages/examples/src/examples/gantt.ts @@ -0,0 +1,22 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'gantt', + name: 'Gantt Chart', + description: 'Visualize project schedules and timelines', + examples: [ + { + title: 'Basic Project Timeline', + isDefault: true, + code: `gantt + title A Gantt Diagram + dateFormat YYYY-MM-DD + section Section + A task :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/git.ts b/packages/examples/src/examples/git.ts new file mode 100644 index 000000000..64ba5df82 --- /dev/null +++ b/packages/examples/src/examples/git.ts @@ -0,0 +1,28 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'gitGraph', + name: 'Git Graph', + description: 'Visualize Git repository history and branch relationships', + examples: [ + { + title: 'Basic Git Flow', + isDefault: true, + code: `gitGraph + commit + branch develop + checkout develop + commit + commit + checkout main + merge develop + commit + branch feature + checkout feature + commit + commit + checkout main + merge feature`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/kanban.ts b/packages/examples/src/examples/kanban.ts new file mode 100644 index 000000000..480059fb8 --- /dev/null +++ b/packages/examples/src/examples/kanban.ts @@ -0,0 +1,37 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'kanban', + name: 'Kanban Diagram', + description: 'Visualize work items in a Kanban board', + examples: [ + { + title: 'Kanban Diagram', + isDefault: true, + code: `--- +config: + kanban: + ticketBaseUrl: 'https://github.com/mermaid-js/mermaid/issues/#TICKET#' +--- +kanban + Todo + [Create Documentation] + docs[Create Blog about the new diagram] + [In progress] + 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.] + id9[Ready for deploy] + id8[Design grammar]@{ assigned: 'knsv' } + id10[Ready for test] + id4[Create parsing tests]@{ ticket: 2038, assigned: 'K.Sveidqvist', priority: 'High' } + id66[last item]@{ priority: 'Very Low', assigned: 'knsv' } + id11[Done] + id5[define getData] + id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: 2036, priority: 'Very High'} + id3[Update DB function]@{ ticket: 2037, assigned: knsv, priority: 'High' } + + id12[Can't reproduce] + id3[Weird flickering in Firefox] +`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/mindmap.ts b/packages/examples/src/examples/mindmap.ts new file mode 100644 index 000000000..cba39ef91 --- /dev/null +++ b/packages/examples/src/examples/mindmap.ts @@ -0,0 +1,32 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'mindmap', + name: 'Mindmap', + description: 'Visualize ideas and concepts in a tree-like structure', + examples: [ + { + title: 'Basic Mindmap', + isDefault: true, + code: `mindmap + root((mindmap)) + Origins + Long history + ::icon(fa fa-book) + Popularisation + British popular psychology author Tony Buzan + Research + On effectiveness
and features + On Automatic creation + Uses + Creative techniques + Strategic planning + Argument mapping + Tools + Pen and paper + Mermaid`, + }, + ], +} satisfies DiagramMetadata; + +// cspell:ignore Buzan diff --git a/packages/examples/src/examples/packet.ts b/packages/examples/src/examples/packet.ts new file mode 100644 index 000000000..0ec0a32d2 --- /dev/null +++ b/packages/examples/src/examples/packet.ts @@ -0,0 +1,34 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'packet', + name: 'Packet Diagram', + description: 'Visualize packet data and network traffic', + examples: [ + { + title: 'TCP Packet', + isDefault: true, + code: `--- +title: "TCP Packet" +--- +packet-beta +0-15: "Source Port" +16-31: "Destination Port" +32-63: "Sequence Number" +64-95: "Acknowledgment Number" +96-99: "Data Offset" +100-105: "Reserved" +106: "URG" +107: "ACK" +108: "PSH" +109: "RST" +110: "SYN" +111: "FIN" +112-127: "Window" +128-143: "Checksum" +144-159: "Urgent Pointer" +160-191: "(Options and Padding)" +192-255: "Data (variable length)"`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/pie.ts b/packages/examples/src/examples/pie.ts new file mode 100644 index 000000000..d75fa5cf3 --- /dev/null +++ b/packages/examples/src/examples/pie.ts @@ -0,0 +1,17 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'pie', + name: 'Pie Chart', + description: 'Visualize data as proportional segments of a circle', + examples: [ + { + title: 'Basic Pie Chart', + isDefault: true, + code: `pie title Pets adopted by volunteers + "Dogs" : 386 + "Cats" : 85 + "Rats" : 15`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/quadrant-chart.ts b/packages/examples/src/examples/quadrant-chart.ts new file mode 100644 index 000000000..c013f57d6 --- /dev/null +++ b/packages/examples/src/examples/quadrant-chart.ts @@ -0,0 +1,27 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'quadrantChart', + name: 'Quadrant Chart', + description: 'Visualize items in a 2x2 matrix based on two variables', + examples: [ + { + title: 'Product Positioning', + isDefault: true, + code: `quadrantChart + title Reach and engagement of campaigns + x-axis Low Reach --> High Reach + y-axis Low Engagement --> High Engagement + quadrant-1 We should expand + quadrant-2 Need to promote + quadrant-3 Re-evaluate + quadrant-4 May be improved + Campaign A: [0.3, 0.6] + Campaign B: [0.45, 0.23] + Campaign C: [0.57, 0.69] + Campaign D: [0.78, 0.34] + Campaign E: [0.40, 0.34] + Campaign F: [0.35, 0.78]`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/radar.ts b/packages/examples/src/examples/radar.ts new file mode 100644 index 000000000..4798ffe17 --- /dev/null +++ b/packages/examples/src/examples/radar.ts @@ -0,0 +1,25 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'radar', + name: 'Radar Diagram', + description: 'Visualize data in a radial format', + examples: [ + { + title: 'Student Grades', + isDefault: true, + code: `--- +title: "Grades" +--- +radar-beta + axis m["Math"], s["Science"], e["English"] + axis h["History"], g["Geography"], a["Art"] + curve a["Alice"]{85, 90, 80, 70, 75, 90} + curve b["Bob"]{70, 75, 85, 80, 90, 85} + + max 100 + min 0 +`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/requirement.ts b/packages/examples/src/examples/requirement.ts new file mode 100644 index 000000000..6804ffdf8 --- /dev/null +++ b/packages/examples/src/examples/requirement.ts @@ -0,0 +1,27 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'requirement', + name: 'Requirement Diagram', + description: 'Visualize system requirements and their relationships', + examples: [ + { + title: 'Basic Requirements', + code: `requirementDiagram + + requirement test_req { + id: 1 + text: the test text. + risk: high + verifymethod: test + } + + element test_entity { + type: simulation + } + + test_entity - satisfies -> test_req`, + isDefault: true, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/sankey.ts b/packages/examples/src/examples/sankey.ts new file mode 100644 index 000000000..99a2c07be --- /dev/null +++ b/packages/examples/src/examples/sankey.ts @@ -0,0 +1,88 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'sankey', + name: 'Sankey Diagram', + description: 'Visualize flow quantities between different stages or processes', + examples: [ + { + title: 'Energy Flow', + isDefault: true, + code: `--- +config: + sankey: + showValues: false +--- +sankey-beta + +Agricultural 'waste',Bio-conversion,124.729 +Bio-conversion,Liquid,0.597 +Bio-conversion,Losses,26.862 +Bio-conversion,Solid,280.322 +Bio-conversion,Gas,81.144 +Biofuel imports,Liquid,35 +Biomass imports,Solid,35 +Coal imports,Coal,11.606 +Coal reserves,Coal,63.965 +Coal,Solid,75.571 +District heating,Industry,10.639 +District heating,Heating and cooling - commercial,22.505 +District heating,Heating and cooling - homes,46.184 +Electricity grid,Over generation / exports,104.453 +Electricity grid,Heating and cooling - homes,113.726 +Electricity grid,H2 conversion,27.14 +Electricity grid,Industry,342.165 +Electricity grid,Road transport,37.797 +Electricity grid,Agriculture,4.412 +Electricity grid,Heating and cooling - commercial,40.858 +Electricity grid,Losses,56.691 +Electricity grid,Rail transport,7.863 +Electricity grid,Lighting & appliances - commercial,90.008 +Electricity grid,Lighting & appliances - homes,93.494 +Gas imports,NGas,40.719 +Gas reserves,NGas,82.233 +Gas,Heating and cooling - commercial,0.129 +Gas,Losses,1.401 +Gas,Thermal generation,151.891 +Gas,Agriculture,2.096 +Gas,Industry,48.58 +Geothermal,Electricity grid,7.013 +H2 conversion,H2,20.897 +H2 conversion,Losses,6.242 +H2,Road transport,20.897 +Hydro,Electricity grid,6.995 +Liquid,Industry,121.066 +Liquid,International shipping,128.69 +Liquid,Road transport,135.835 +Liquid,Domestic aviation,14.458 +Liquid,International aviation,206.267 +Liquid,Agriculture,3.64 +Liquid,National navigation,33.218 +Liquid,Rail transport,4.413 +Marine algae,Bio-conversion,4.375 +NGas,Gas,122.952 +Nuclear,Thermal generation,839.978 +Oil imports,Oil,504.287 +Oil reserves,Oil,107.703 +Oil,Liquid,611.99 +Other waste,Solid,56.587 +Other waste,Bio-conversion,77.81 +Pumped heat,Heating and cooling - homes,193.026 +Pumped heat,Heating and cooling - commercial,70.672 +Solar PV,Electricity grid,59.901 +Solar Thermal,Heating and cooling - homes,19.263 +Solar,Solar Thermal,19.263 +Solar,Solar PV,59.901 +Solid,Agriculture,0.882 +Solid,Thermal generation,400.12 +Solid,Industry,46.477 +Thermal generation,Electricity grid,525.531 +Thermal generation,Losses,787.129 +Thermal generation,District heating,79.329 +Tidal,Electricity grid,9.452 +UK land based bioenergy,Bio-conversion,182.01 +Wave,Electricity grid,19.013 +Wind,Electricity grid,289.366`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/sequence.ts b/packages/examples/src/examples/sequence.ts new file mode 100644 index 000000000..7110e6f3d --- /dev/null +++ b/packages/examples/src/examples/sequence.ts @@ -0,0 +1,18 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'sequence', + name: 'Sequence Diagram', + description: 'Visualize interactions between objects over time', + examples: [ + { + title: 'Basic Sequence', + isDefault: true, + code: `sequenceDiagram + Alice->>+John: Hello John, how are you? + Alice->>+John: John, can you hear me? + John-->>-Alice: Hi Alice, I can hear you! + John-->>-Alice: I feel great!`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/state.ts b/packages/examples/src/examples/state.ts new file mode 100644 index 000000000..bfe1c0600 --- /dev/null +++ b/packages/examples/src/examples/state.ts @@ -0,0 +1,20 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'stateDiagram', + name: 'State Diagram', + description: 'Visualize the states and transitions of a system', + examples: [ + { + title: 'Basic State Diagram', + code: `stateDiagram-v2 + [*] --> Still + Still --> [*] + Still --> Moving + Moving --> Still + Moving --> Crash + Crash --> [*]`, + isDefault: true, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/timeline.ts b/packages/examples/src/examples/timeline.ts new file mode 100644 index 000000000..87b604422 --- /dev/null +++ b/packages/examples/src/examples/timeline.ts @@ -0,0 +1,20 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'timeline', + name: 'Timeline Diagram', + description: 'Visualize events and milestones in chronological order', + examples: [ + { + title: 'Project Timeline', + isDefault: true, + code: `timeline + title History of Social Media Platform + 2002 : LinkedIn + 2004 : Facebook + : Google + 2005 : YouTube + 2006 : Twitter`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/treemap.ts b/packages/examples/src/examples/treemap.ts new file mode 100644 index 000000000..a37a95d43 --- /dev/null +++ b/packages/examples/src/examples/treemap.ts @@ -0,0 +1,21 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'treemap', + name: 'Treemap', + description: 'Visualize hierarchical data as nested rectangles', + examples: [ + { + title: 'Treemap', + isDefault: true, + code: `treemap-beta +"Section 1" + "Leaf 1.1": 12 + "Section 1.2" + "Leaf 1.2.1": 12 +"Section 2" + "Leaf 2.1": 20 + "Leaf 2.2": 25`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/user-journey.ts b/packages/examples/src/examples/user-journey.ts new file mode 100644 index 000000000..9c3ccec17 --- /dev/null +++ b/packages/examples/src/examples/user-journey.ts @@ -0,0 +1,22 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'journey', + name: 'User Journey Diagram', + description: 'Visualize user interactions and experiences with a system', + examples: [ + { + title: 'My Working Day', + isDefault: true, + code: `journey + title My working day + section Go to work + Make tea: 5: Me + Go upstairs: 3: Me + Do work: 1: Me, Cat + section Go home + Go downstairs: 5: Me + Sit down: 5: Me`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/examples/xychart.ts b/packages/examples/src/examples/xychart.ts new file mode 100644 index 000000000..5fb692b46 --- /dev/null +++ b/packages/examples/src/examples/xychart.ts @@ -0,0 +1,19 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'xychart', + name: 'XY Chart', + description: 'Create scatter plots and line charts with customizable axes', + examples: [ + { + title: 'Sales Revenue', + isDefault: true, + code: `xychart-beta + title "Sales Revenue" + x-axis [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] + line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/index.ts b/packages/examples/src/index.ts new file mode 100644 index 000000000..eb9160bcf --- /dev/null +++ b/packages/examples/src/index.ts @@ -0,0 +1,48 @@ +import type { DiagramMetadata } from './types.js'; +import flowChart from './examples/flowchart.js'; +import c4 from './examples/c4.js'; +import kanban from './examples/kanban.js'; +import classDiagram from './examples/class.js'; +import sequenceDiagram from './examples/sequence.js'; +import pieDiagram from './examples/pie.js'; +import userJourneyDiagram from './examples/user-journey.js'; +import mindmapDiagram from './examples/mindmap.js'; +import requirementDiagram from './examples/requirement.js'; +import radarDiagram from './examples/radar.js'; +import stateDiagram from './examples/state.js'; +import erDiagram from './examples/er.js'; +import gitDiagram from './examples/git.js'; +import architectureDiagram from './examples/architecture.js'; +import xychartDiagram from './examples/xychart.js'; +import sankeyDiagram from './examples/sankey.js'; +import ganttDiagram from './examples/gantt.js'; +import timelineDiagram from './examples/timeline.js'; +import quadrantChart from './examples/quadrant-chart.js'; +import packetDiagram from './examples/packet.js'; +import blockDiagram from './examples/block.js'; +import treemapDiagram from './examples/treemap.js'; + +export const diagramData: DiagramMetadata[] = [ + flowChart, + c4, + kanban, + classDiagram, + sequenceDiagram, + pieDiagram, + userJourneyDiagram, + mindmapDiagram, + requirementDiagram, + radarDiagram, + stateDiagram, + erDiagram, + gitDiagram, + architectureDiagram, + xychartDiagram, + sankeyDiagram, + ganttDiagram, + timelineDiagram, + quadrantChart, + packetDiagram, + blockDiagram, + treemapDiagram, +]; diff --git a/packages/examples/src/types.ts b/packages/examples/src/types.ts new file mode 100644 index 000000000..1658f588c --- /dev/null +++ b/packages/examples/src/types.ts @@ -0,0 +1,12 @@ +export interface Example { + title: string; + code: string; + isDefault?: boolean; +} + +export interface DiagramMetadata { + id: string; + name: string; + description: string; + examples: Example[]; +} diff --git a/packages/examples/tsconfig.json b/packages/examples/tsconfig.json new file mode 100644 index 000000000..320d730e1 --- /dev/null +++ b/packages/examples/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "module": "Node16", + "moduleResolution": "Node16" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/mermaid/CHANGELOG.md b/packages/mermaid/CHANGELOG.md index 1a266e140..c57e2a6db 100644 --- a/packages/mermaid/CHANGELOG.md +++ b/packages/mermaid/CHANGELOG.md @@ -1,5 +1,25 @@ # mermaid +## 11.8.1 + +### Patch Changes + +- Updated dependencies [[`0da2922`](https://github.com/mermaid-js/mermaid/commit/0da2922ee7f47959e324ec10d3d21ee70594f557)]: + - @mermaid-js/parser@0.6.1 + +## 11.8.0 + +### Minor Changes + +- [#6590](https://github.com/mermaid-js/mermaid/pull/6590) [`f338802`](https://github.com/mermaid-js/mermaid/commit/f338802642cdecf5b7ed6c19a20cf2a81effbbee) Thanks [@knsv](https://github.com/knsv)! - Adding support for the new diagram type nested treemap + +### Patch Changes + +- [#6707](https://github.com/mermaid-js/mermaid/pull/6707) [`592c5bb`](https://github.com/mermaid-js/mermaid/commit/592c5bb880c3b942710a2878d386bcb3eb35c137) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: Log a warning when duplicate commit IDs are encountered in gitGraph to help identify and debug rendering issues caused by non-unique IDs. + +- Updated dependencies [[`f338802`](https://github.com/mermaid-js/mermaid/commit/f338802642cdecf5b7ed6c19a20cf2a81effbbee)]: + - @mermaid-js/parser@0.6.0 + ## 11.7.0 ### Minor Changes diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 8f8f64766..80c83ec8e 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -1,6 +1,6 @@ { "name": "mermaid", - "version": "11.7.0", + "version": "11.8.1", "description": "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.", "type": "module", "module": "./dist/mermaid.core.mjs", diff --git a/packages/mermaid/src/diagram-api/loadDiagram.ts b/packages/mermaid/src/diagram-api/loadDiagram.ts index 1ec01ec06..b3c1cdb57 100644 --- a/packages/mermaid/src/diagram-api/loadDiagram.ts +++ b/packages/mermaid/src/diagram-api/loadDiagram.ts @@ -7,20 +7,21 @@ export const loadRegisteredDiagrams = async () => { // Load all lazy loaded diagrams in parallel const results = await Promise.allSettled( Object.entries(detectors).map(async ([key, { detector, loader }]) => { - if (loader) { + if (!loader) { + return; + } + try { + getDiagram(key); + } catch { try { - getDiagram(key); - } catch { - try { - // Register diagram if it is not already registered - const { diagram, id } = await loader(); - registerDiagram(id, diagram, detector); - } catch (err) { - // Remove failed diagram from detectors - log.error(`Failed to load external diagram with key ${key}. Removing from detectors.`); - delete detectors[key]; - throw err; - } + // Register diagram if it is not already registered + const { diagram, id } = await loader(); + registerDiagram(id, diagram, detector); + } catch (err) { + // Remove failed diagram from detectors + log.error(`Failed to load external diagram with key ${key}. Removing from detectors.`); + delete detectors[key]; + throw err; } } }) diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts index fdb175e52..56364e9c6 100644 --- a/packages/mermaid/src/diagram-api/types.ts +++ b/packages/mermaid/src/diagram-api/types.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type * as d3 from 'd3'; -import type { SetRequired } from 'type-fest'; +import type { SetOptional, SetRequired } from 'type-fest'; import type { Diagram } from '../Diagram.js'; import type { BaseDiagramConfig, MermaidConfig } from '../config.type.js'; @@ -91,17 +91,13 @@ export interface DiagramDefinition { ) => void; } -export interface DetectorRecord { - detector: DiagramDetector; - loader?: DiagramLoader; -} - export interface ExternalDiagramDefinition { id: string; detector: DiagramDetector; loader: DiagramLoader; } +export type DetectorRecord = SetOptional, 'loader'>; export type DiagramDetector = (text: string, config?: MermaidConfig) => boolean; export type DiagramLoader = () => Promise<{ id: string; diagram: DiagramDefinition }>; diff --git a/packages/mermaid/src/diagrams/git/gitGraph.spec.ts b/packages/mermaid/src/diagrams/git/gitGraph.spec.ts index fed21dd19..ee20a9aaf 100644 --- a/packages/mermaid/src/diagrams/git/gitGraph.spec.ts +++ b/packages/mermaid/src/diagrams/git/gitGraph.spec.ts @@ -1,4 +1,4 @@ -import { rejects } from 'assert'; +import { log } from '../../logger.js'; import { db } from './gitGraphAst.js'; import { parser } from './gitGraphParser.js'; @@ -1319,4 +1319,42 @@ describe('when parsing a gitGraph', function () { } }); }); + it('should log a warning when two commits have the same ID', async () => { + const str = `gitGraph + commit id:"initial commit" + commit id:"work on first release" + commit id:"design freeze from here" + branch v1-rc + checkout v1-rc + commit id:"bugfix 1" + commit id:"bigfix 2" tag:"v1.0.1" + branch FORK-v1.0-MDR + checkout FORK-v1.0-MDR + commit id:"working on MDR" + checkout v1-rc + commit id:"minor design changes for MDR" tag:"v1.0.2" + checkout FORK-v1.0-MDR + merge v1-rc + checkout main + commit id:"new feature for v1.1…" + checkout FORK-v1.0-MDR + commit id:"working on MDR" + commit id:"finishing MDR" + branch v1.0-MDR + checkout v1.0-MDR + commit id:"brush up release" tag:"v1.0.2-MDR" + checkout v1-rc + commit id:"bugfix without MDR" + checkout main + commit id:"work on v1.1" + `; + + const logWarnSpy = vi.spyOn(log, 'warn').mockImplementation(() => undefined); + + await parser.parse(str); + + expect(logWarnSpy).toHaveBeenCalledWith('Commit ID working on MDR already exists'); + + logWarnSpy.mockRestore(); + }); }); diff --git a/packages/mermaid/src/diagrams/git/gitGraphAst.ts b/packages/mermaid/src/diagrams/git/gitGraphAst.ts index 36595eb51..0dbc1ecb0 100644 --- a/packages/mermaid/src/diagrams/git/gitGraphAst.ts +++ b/packages/mermaid/src/diagrams/git/gitGraphAst.ts @@ -125,6 +125,9 @@ export const commit = function (commitDB: CommitDB) { }; state.records.head = newCommit; log.info('main branch', config.mainBranchName); + if (state.records.commits.has(newCommit.id)) { + log.warn(`Commit ID ${newCommit.id} already exists`); + } state.records.commits.set(newCommit.id, newCommit); state.records.branches.set(state.records.currBranch, newCommit.id); log.debug('in pushCommit ' + newCommit.id); diff --git a/packages/mermaid/src/docs/community/new-diagram.md b/packages/mermaid/src/docs/community/new-diagram.md index 16504ca32..147caa121 100644 --- a/packages/mermaid/src/docs/community/new-diagram.md +++ b/packages/mermaid/src/docs/community/new-diagram.md @@ -106,3 +106,13 @@ const themes = { ``` The actual options and values for the colors are defined in **src/theme/theme-[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups. + +## Examples + +The `@mermaid-js/examples` package contains a collection of examples that are used by tools like mermaid.live to help users get started with the new diagram. + +You can duplicate an existing diagram example file, eg: `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram. + +Then you can import the example in the `packages/examples/src/index.ts` file and add it to the `examples` array. + +Each diagram should have at least one example, and that should be marked as default. It is good to add more examples to showcase different features of the diagram. diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 3ab31ee25..46e7cac63 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -5,7 +5,7 @@ import { registerIconPacks } from './rendering-util/icons.js'; import { dedent } from 'ts-dedent'; import type { MermaidConfig } from './config.type.js'; -import { detectType, registerLazyLoadedDiagrams } from './diagram-api/detectType.js'; +import { detectType, detectors, registerLazyLoadedDiagrams } from './diagram-api/detectType.js'; import { addDiagrams } from './diagram-api/diagram-orchestration.js'; import { loadRegisteredDiagrams } from './diagram-api/loadDiagram.js'; import type { ExternalDiagramDefinition, SVG, SVGGroup } from './diagram-api/types.js'; @@ -415,6 +415,17 @@ const render: typeof mermaidAPI.render = (id, text, container) => { }); }; +/** + * Gets the metadata for all registered diagrams. + * Currently only the id is returned. + * @returns An array of objects with the id of the diagram. + */ +const getRegisteredDiagramsMetadata = (): Pick[] => { + return Object.keys(detectors).map((id) => ({ + id, + })); +}; + export interface Mermaid { startOnLoad: boolean; parseError?: ParseErrorFunction; @@ -437,6 +448,7 @@ export interface Mermaid { setParseErrorHandler: typeof setParseErrorHandler; detectType: typeof detectType; registerIconPacks: typeof registerIconPacks; + getRegisteredDiagramsMetadata: typeof getRegisteredDiagramsMetadata; } const mermaid: Mermaid = { @@ -454,6 +466,7 @@ const mermaid: Mermaid = { setParseErrorHandler, detectType, registerIconPacks, + getRegisteredDiagramsMetadata, }; export default mermaid; diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index f69a9ddff..da0f244a3 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,5 +1,17 @@ # @mermaid-js/parser +## 0.6.1 + +### Patch Changes + +- [#6725](https://github.com/mermaid-js/mermaid/pull/6725) [`0da2922`](https://github.com/mermaid-js/mermaid/commit/0da2922ee7f47959e324ec10d3d21ee70594f557) Thanks [@shubham-mermaid](https://github.com/shubham-mermaid)! - chore: use Treemap instead of TreemapDoc in parser. + +## 0.6.0 + +### Minor Changes + +- [#6590](https://github.com/mermaid-js/mermaid/pull/6590) [`f338802`](https://github.com/mermaid-js/mermaid/commit/f338802642cdecf5b7ed6c19a20cf2a81effbbee) Thanks [@knsv](https://github.com/knsv)! - Adding support for the new diagram type nested treemap + ## 0.5.0 ### Minor Changes diff --git a/packages/parser/package.json b/packages/parser/package.json index e70b9f9b3..a51229ae8 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@mermaid-js/parser", - "version": "0.5.0", + "version": "0.6.1", "description": "MermaidJS parser", "author": "Yokozuna59", "contributors": [ diff --git a/packages/parser/src/language/index.ts b/packages/parser/src/language/index.ts index c41d7eeb8..9b31af5ba 100644 --- a/packages/parser/src/language/index.ts +++ b/packages/parser/src/language/index.ts @@ -8,7 +8,7 @@ export { Architecture, GitGraph, Radar, - TreemapDoc, + Treemap, Branch, Commit, Merge, @@ -20,7 +20,7 @@ export { isPieSection, isArchitecture, isGitGraph, - isTreemapDoc, + isTreemap, isBranch, isCommit, isMerge, diff --git a/packages/parser/src/language/treemap/treemap-validator.ts b/packages/parser/src/language/treemap/treemap-validator.ts index 9a9e5c469..4509b4b58 100644 --- a/packages/parser/src/language/treemap/treemap-validator.ts +++ b/packages/parser/src/language/treemap/treemap-validator.ts @@ -1,5 +1,5 @@ import type { ValidationAcceptor, ValidationChecks } from 'langium'; -import type { MermaidAstType, TreemapDoc } from '../generated/ast.js'; +import type { MermaidAstType, Treemap } from '../generated/ast.js'; import type { TreemapServices } from './module.js'; /** @@ -9,10 +9,10 @@ export function registerValidationChecks(services: TreemapServices) { const validator = services.validation.TreemapValidator; const registry = services.validation.ValidationRegistry; if (registry) { - // Use any to bypass type checking since we know TreemapDoc is part of the AST + // Use any to bypass type checking since we know Treemap is part of the AST // but the type system is having trouble with it const checks: ValidationChecks = { - TreemapDoc: validator.checkSingleRoot.bind(validator), + Treemap: validator.checkSingleRoot.bind(validator), // Remove unused validation for TreemapRow }; registry.register(checks, validator); @@ -27,7 +27,7 @@ export class TreemapValidator { * Validates that a treemap has only one root node. * A root node is defined as a node that has no indentation. */ - checkSingleRoot(doc: TreemapDoc, accept: ValidationAcceptor): void { + checkSingleRoot(doc: Treemap, accept: ValidationAcceptor): void { let rootNodeIndentation; for (const row of doc.TreemapRows) { diff --git a/packages/parser/src/language/treemap/treemap.langium b/packages/parser/src/language/treemap/treemap.langium index 45ee2588f..c35d5f0e9 100644 --- a/packages/parser/src/language/treemap/treemap.langium +++ b/packages/parser/src/language/treemap/treemap.langium @@ -34,14 +34,14 @@ interface ClassDefStatement { className: string styleText: string // Optional style text } -interface TreemapDoc { +interface Treemap { TreemapRows: TreemapRow[] title?: string accTitle?: string accDescr?: string } -entry TreemapDoc returns TreemapDoc: +entry Treemap returns Treemap: TREEMAP_KEYWORD ( TitleAndAccessibilities diff --git a/packages/parser/tests/treemap.test.ts b/packages/parser/tests/treemap.test.ts index 6afb6e7db..b05ab39fc 100644 --- a/packages/parser/tests/treemap.test.ts +++ b/packages/parser/tests/treemap.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { expectNoErrorsOrAlternatives } from './test-util.js'; -import type { TreemapDoc, Section, Leaf, TreemapRow } from '../src/language/generated/ast.js'; +import type { Treemap, Section, Leaf, TreemapRow } from '../src/language/generated/ast.js'; import type { LangiumParser } from 'langium'; import { createTreemapServices } from '../src/language/treemap/module.js'; @@ -9,21 +9,21 @@ describe('Treemap Parser', () => { const parser: LangiumParser = services.parser.LangiumParser; const parse = (input: string) => { - return parser.parse(input); + return parser.parse(input); }; describe('Basic Parsing', () => { it('should parse empty treemap', () => { const result = parse('treemap'); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); expect(result.value.TreemapRows).toHaveLength(0); }); it('should parse a section node', () => { const result = parse('treemap\n"Root"'); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); expect(result.value.TreemapRows).toHaveLength(1); if (result.value.TreemapRows[0].item) { expect(result.value.TreemapRows[0].item.$type).toBe('Section'); @@ -39,7 +39,7 @@ describe('Treemap Parser', () => { "Child2" : 200 `); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); expect(result.value.TreemapRows).toHaveLength(3); if (result.value.TreemapRows[0].item) { @@ -95,7 +95,7 @@ describe('Treemap Parser', () => { // We're only checking that the multiple root nodes parse successfully // The validation errors would be reported by the validator during validation - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); expect(result.value.TreemapRows).toHaveLength(2); }); }); @@ -104,7 +104,7 @@ describe('Treemap Parser', () => { it('should parse a treemap with title', () => { const result = parse('treemap\ntitle My Treemap Diagram\n"Root"\n "Child": 100'); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); // We can't directly test the title property due to how Langium processes TitleAndAccessibilities // but we can verify the TreemapRows are parsed correctly expect(result.value.TreemapRows).toHaveLength(2); @@ -113,7 +113,7 @@ describe('Treemap Parser', () => { it('should parse a treemap with accTitle', () => { const result = parse('treemap\naccTitle: Accessible Title\n"Root"\n "Child": 100'); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); // We can't directly test the accTitle property due to how Langium processes TitleAndAccessibilities expect(result.value.TreemapRows).toHaveLength(2); }); @@ -123,7 +123,7 @@ describe('Treemap Parser', () => { 'treemap\naccDescr: This is an accessible description\n"Root"\n "Child": 100' ); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); // We can't directly test the accDescr property due to how Langium processes TitleAndAccessibilities expect(result.value.TreemapRows).toHaveLength(2); }); @@ -136,7 +136,7 @@ accDescr: This is an accessible description "Root" "Child": 100`); expectNoErrorsOrAlternatives(result); - expect(result.value.$type).toBe('TreemapDoc'); + expect(result.value.$type).toBe('Treemap'); // We can't directly test these properties due to how Langium processes TitleAndAccessibilities expect(result.value.TreemapRows).toHaveLength(2); }); diff --git a/packages/tiny/CHANGELOG.md b/packages/tiny/CHANGELOG.md index 1a266e140..c57e2a6db 100644 --- a/packages/tiny/CHANGELOG.md +++ b/packages/tiny/CHANGELOG.md @@ -1,5 +1,25 @@ # mermaid +## 11.8.1 + +### Patch Changes + +- Updated dependencies [[`0da2922`](https://github.com/mermaid-js/mermaid/commit/0da2922ee7f47959e324ec10d3d21ee70594f557)]: + - @mermaid-js/parser@0.6.1 + +## 11.8.0 + +### Minor Changes + +- [#6590](https://github.com/mermaid-js/mermaid/pull/6590) [`f338802`](https://github.com/mermaid-js/mermaid/commit/f338802642cdecf5b7ed6c19a20cf2a81effbbee) Thanks [@knsv](https://github.com/knsv)! - Adding support for the new diagram type nested treemap + +### Patch Changes + +- [#6707](https://github.com/mermaid-js/mermaid/pull/6707) [`592c5bb`](https://github.com/mermaid-js/mermaid/commit/592c5bb880c3b942710a2878d386bcb3eb35c137) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: Log a warning when duplicate commit IDs are encountered in gitGraph to help identify and debug rendering issues caused by non-unique IDs. + +- Updated dependencies [[`f338802`](https://github.com/mermaid-js/mermaid/commit/f338802642cdecf5b7ed6c19a20cf2a81effbbee)]: + - @mermaid-js/parser@0.6.0 + ## 11.7.0 ### Minor Changes diff --git a/packages/tiny/package.json b/packages/tiny/package.json index 6ae7d440c..79dba051b 100644 --- a/packages/tiny/package.json +++ b/packages/tiny/package.json @@ -1,6 +1,6 @@ { "name": "@mermaid-js/tiny", - "version": "11.7.0", + "version": "11.8.1", "description": "Tiny version of mermaid", "type": "commonjs", "main": "./dist/mermaid.tiny.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02be1b686..18f084c8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,6 +215,12 @@ importers: 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.1) + packages/examples: + devDependencies: + mermaid: + specifier: workspace:* + version: link:../mermaid + packages/mermaid: dependencies: '@braintree/sanitize-url': @@ -3317,6 +3323,9 @@ packages: '@types/node@18.19.76': resolution: {integrity: sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==} + '@types/node@20.17.30': + resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} + '@types/node@22.13.5': resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} @@ -9353,6 +9362,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -13284,6 +13296,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.17.30': + dependencies: + undici-types: 6.19.8 + '@types/node@22.13.5': dependencies: undici-types: 6.20.0 @@ -17697,7 +17713,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.5 + '@types/node': 20.17.30 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -20637,6 +20653,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici-types@6.20.0: {} undici@5.28.4: