Compare commits

...

20 Commits

Author SHA1 Message Date
Sidharth Vinod
d5bc07dc0c fix: Remove unnecessary changeset 2025-12-19 16:50:52 +05:30
Knut Sveidqvist
80a686be03 Merge pull request #7245 from mermaid-js/canonicals-to-mermaid-ai
setting canonicals to mermaid.ai/open-source
2025-12-19 10:12:44 +00:00
autofix-ci[bot]
d26f2c6043 [autofix.ci] apply automated fixes 2025-12-15 14:42:00 +00:00
Knut Sveidqvist
8ca7a28bf3 Update canonicals in big-trees-walk.md
Set canonicals for Mermaid documentation to mermaid.ai/open-source.
2025-12-15 15:32:33 +01:00
Knut Sveidqvist
6b77c9c4c7 setting canonicals to mermaid.ai/open-source 2025-12-15 15:17:56 +01:00
Shubham P
7b167cf331 Merge pull request #7242 from mermaid-js/renovate/patch-dompurify
fix(deps): update dependency dompurify to ^3.3.1
2025-12-15 11:41:32 +00:00
Shubham P
d435ac6fe1 Merge pull request #7228 from mermaid-js/renovate/peter-evans-create-pull-request-digest
chore(deps): update peter-evans/create-pull-request digest to 0979079
2025-12-15 06:47:12 +00:00
renovate[bot]
ed96d067fc fix(deps): update dependency dompurify to ^3.3.1 2025-12-15 00:42:27 +00:00
renovate[bot]
09c60be450 chore(deps): update peter-evans/create-pull-request digest to 0979079 2025-12-10 10:49:20 +00:00
Sidharth Vinod
39d070fdea Merge pull request #7215 from mermaid-js/update-timings
Update E2E Timings
2025-12-04 13:42:51 +05:30
github-actions[bot]
4f6f627e75 chore: update E2E timings 2025-12-04 04:17:52 +00:00
Sidharth Vinod
53570ee815 Merge pull request #7204 from leandroebner/patch-1
Add HackMD integration to community integrations list
2025-12-03 09:58:48 +00:00
Shubham P
a3a5040d79 Merge pull request #7206 from mermaid-js/renovate/patch-all-patch
fix(deps): update all patch dependencies (patch)
2025-12-02 08:57:58 +00:00
renovate[bot]
7ff9bf1a50 fix(deps): update all patch dependencies 2025-12-02 07:42:41 +00:00
Shubham P
ffd38716d0 Merge pull request #7208 from mermaid-js/renovate/npm-express-vulnerability
chore(deps): update dependency express to v5.2.0 [security]
2025-12-02 07:28:21 +00:00
Shubham P
4313f233d2 Merge pull request #7205 from mermaid-js/renovate/patch-eslint
chore(deps): update dependency @cspell/eslint-plugin to ^9.3.2
2025-12-02 07:27:24 +00:00
renovate[bot]
56564f3807 chore(deps): update dependency express to v5.2.0 [security] 2025-12-01 20:55:04 +00:00
renovate[bot]
7e1a1de5e9 chore(deps): update dependency @cspell/eslint-plugin to ^9.3.2 2025-12-01 02:27:03 +00:00
autofix-ci[bot]
b4b90417cf [autofix.ci] apply automated fixes 2025-11-30 19:33:42 +00:00
Leandro Ebner
6bf2b2108c Add HackMD integration to community integrations list
Works natively, see hackmd docs.
2025-11-30 20:22:15 +01:00
10 changed files with 348 additions and 706 deletions

View File

@@ -58,7 +58,7 @@ jobs:
echo "EOF" >> $GITHUB_OUTPUT
- name: Commit and create pull request
uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412
uses: peter-evans/create-pull-request@0979079bc20c05bbbb590a56c21c4e2b1d1f1bbe
with:
add-paths: |
cypress/timings.json

View File

@@ -2,35 +2,35 @@
"durations": [
{
"spec": "cypress/integration/other/configuration.spec.js",
"duration": 6099
"duration": 5944
},
{
"spec": "cypress/integration/other/external-diagrams.spec.js",
"duration": 2236
"duration": 2180
},
{
"spec": "cypress/integration/other/ghsa.spec.js",
"duration": 3405
"duration": 3282
},
{
"spec": "cypress/integration/other/iife.spec.js",
"duration": 2176
"duration": 2137
},
{
"spec": "cypress/integration/other/interaction.spec.js",
"duration": 12300
"duration": 11926
},
{
"spec": "cypress/integration/other/rerender.spec.js",
"duration": 2089
"duration": 2021
},
{
"spec": "cypress/integration/other/xss.spec.js",
"duration": 32033
"duration": 31377
},
{
"spec": "cypress/integration/rendering/appli.spec.js",
"duration": 3672
"duration": 3442
},
{
"spec": "cypress/integration/rendering/architecture.spec.ts",
@@ -38,191 +38,191 @@
},
{
"spec": "cypress/integration/rendering/block.spec.js",
"duration": 18135
"duration": 18390
},
{
"spec": "cypress/integration/rendering/c4.spec.js",
"duration": 5661
"duration": 6468
},
{
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
"duration": 41456
"duration": 41282
},
{
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
"duration": 38910
"duration": 39226
},
{
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
"duration": 24120
"duration": 25028
},
{
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
"duration": 38454
"duration": 38458
},
{
"spec": "cypress/integration/rendering/classDiagram.spec.js",
"duration": 17099
"duration": 17305
},
{
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
"duration": 9844
"duration": 9762
},
{
"spec": "cypress/integration/rendering/current.spec.js",
"duration": 2951
"duration": 2923
},
{
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
"duration": 90081
"duration": 89135
},
{
"spec": "cypress/integration/rendering/erDiagram.spec.js",
"duration": 19496
"duration": 18976
},
{
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
"duration": 3829
"duration": 3643
},
{
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
"duration": 42517
"duration": 43103
},
{
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
"duration": 31541
"duration": 31637
},
{
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
"duration": 7749
"duration": 7630
},
{
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
"duration": 25230
"duration": 25642
},
{
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
"duration": 49359
"duration": 50365
},
{
"spec": "cypress/integration/rendering/flowchart.spec.js",
"duration": 33028
"duration": 32790
},
{
"spec": "cypress/integration/rendering/gantt.spec.js",
"duration": 22271
"duration": 23065
},
{
"spec": "cypress/integration/rendering/gitGraph.spec.js",
"duration": 51837
"duration": 52238
},
{
"spec": "cypress/integration/rendering/iconShape.spec.ts",
"duration": 285060
"duration": 289380
},
{
"spec": "cypress/integration/rendering/imageShape.spec.ts",
"duration": 59517
"duration": 59265
},
{
"spec": "cypress/integration/rendering/info.spec.ts",
"duration": 3501
"duration": 3269
},
{
"spec": "cypress/integration/rendering/journey.spec.js",
"duration": 7405
"duration": 7470
},
{
"spec": "cypress/integration/rendering/kanban.spec.ts",
"duration": 7975
"duration": 7980
},
{
"spec": "cypress/integration/rendering/katex.spec.js",
"duration": 4312
"duration": 3896
},
{
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
"duration": 2630
"duration": 2640
},
{
"spec": "cypress/integration/rendering/mindmap-tidy-tree.spec.js",
"duration": 4541
"duration": 4327
},
{
"spec": "cypress/integration/rendering/mindmap.spec.ts",
"duration": 12134
"duration": 12588
},
{
"spec": "cypress/integration/rendering/newShapes.spec.ts",
"duration": 151160
"duration": 153490
},
{
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
"duration": 118044
"duration": 117833
},
{
"spec": "cypress/integration/rendering/packet.spec.ts",
"duration": 5166
"duration": 4975
},
{
"spec": "cypress/integration/rendering/pie.spec.ts",
"duration": 7074
"duration": 6682
},
{
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
"duration": 9518
"duration": 8972
},
{
"spec": "cypress/integration/rendering/radar.spec.js",
"duration": 5846
"duration": 5631
},
{
"spec": "cypress/integration/rendering/requirement.spec.js",
"duration": 3089
"duration": 2776
},
{
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
"duration": 55361
"duration": 54373
},
{
"spec": "cypress/integration/rendering/sankey.spec.ts",
"duration": 7236
"duration": 7203
},
{
"spec": "cypress/integration/rendering/sequencediagram-v2.spec.js",
"duration": 26057
"duration": 31707
},
{
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
"duration": 48401
"duration": 48327
},
{
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
"duration": 30364
"duration": 30728
},
{
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
"duration": 16862
"duration": 16881
},
{
"spec": "cypress/integration/rendering/theme.spec.js",
"duration": 30553
"duration": 30715
},
{
"spec": "cypress/integration/rendering/timeline.spec.ts",
"duration": 8962
"duration": 8586
},
{
"spec": "cypress/integration/rendering/treemap.spec.ts",
"duration": 12486
"duration": 15184
},
{
"spec": "cypress/integration/rendering/xyChart.spec.js",
"duration": 21718
"duration": 21282
},
{
"spec": "cypress/integration/rendering/zenuml.spec.js",
"duration": 3882
"duration": 3576
}
]
}

View File

@@ -59,6 +59,7 @@ To add an integration to this list, see the [Integrations - create page](./integ
- [GitLab](https://docs.gitlab.com/ee/user/markdown.html#diagrams-and-flowcharts) ✅
- [GNU Octave](https://octave.org/) ✅
- [octave_mermaid_js](https://github.com/CNOCTAVE/octave_mermaid_js) ✅
- [HackMD](https://hackmd.io/c/tutorials/%2F%40docs%2Fflowchart-en#Create-more-complex-flowcharts) ✅
- [Mermaid Plugin for JetBrains IDEs](https://plugins.jetbrains.com/plugin/20146-mermaid)
- [MonsterWriter](https://www.monsterwriter.com/) ✅
- [Joplin](https://joplinapp.org) ✅

View File

@@ -65,14 +65,14 @@
"devDependencies": {
"@applitools/eyes-cypress": "^3.56.5",
"@argos-ci/cypress": "^6.2.2",
"@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.29.7",
"@cspell/eslint-plugin": "^9.3.0",
"@changesets/changelog-github": "^0.5.2",
"@changesets/cli": "^2.29.8",
"@cspell/eslint-plugin": "^9.3.2",
"@cypress/code-coverage": "^3.14.7",
"@eslint/js": "^9.26.0",
"@rollup/plugin-typescript": "^12.1.4",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.5",
"@types/express": "^5.0.6",
"@types/js-yaml": "^4.0.9",
"@types/jsdom": "^21.1.7",
"@types/lodash": "^4.17.21",
@@ -105,7 +105,7 @@
"eslint-plugin-no-only-tests": "^3.3.0",
"eslint-plugin-tsdoc": "^0.4.0",
"eslint-plugin-unicorn": "^62.0.0",
"express": "^5.1.0",
"express": "^5.2.1",
"globals": "^16.4.0",
"globby": "^14.1.0",
"husky": "^9.1.7",

View File

@@ -78,7 +78,7 @@
"d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.13",
"dayjs": "^1.11.19",
"dompurify": "^3.3.0",
"dompurify": "^3.3.1",
"katex": "^0.16.25",
"khroma": "^2.1.0",
"lodash-es": "^4.17.21",
@@ -123,7 +123,7 @@
"rimraf": "^6.0.1",
"start-server-and-test": "^2.1.3",
"type-fest": "^4.41.0",
"typedoc": "^0.28.14",
"typedoc": "^0.28.15",
"typedoc-plugin-markdown": "^4.8.1",
"typescript": "~5.7.3",
"unist-util-flatmap": "^1.0.0",

View File

@@ -8,7 +8,7 @@ import type { CanonicalUrlConfig } from './canonical-urls.js';
*/
export const canonicalConfig: CanonicalUrlConfig = {
// Base URL for the Mermaid documentation site
baseUrl: 'https://docs.mermaidchart.com',
baseUrl: 'https://mermaid.ai/open-source',
// Disable automatic generation - only use specificCanonicalUrls
autoGenerate: false,
@@ -57,93 +57,6 @@ export const canonicalConfig: CanonicalUrlConfig = {
},
};
/**
* Pages that should have specific canonical URLs
*
* Since autoGenerate is set to false, ONLY pages listed here will get canonical URLs.
*
* Usage: Add entries to this object where the key is the relative path
* of the markdown file and the value is the desired canonical URL.
*
* Examples:
* - 'intro/index.md': 'https://docs.mermaidchart.com/intro/index.html'
* - 'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html'
* - 'config/configuration.md': 'https://docs.mermaidchart.com/mermaid-oss/config/configuration.html'
*/
export const specificCanonicalUrls: Record<string, string> = {
// Add your specific canonical URLs here
// Example:
// 'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html',
// Intro section
'intro/index.md': 'https://docs.mermaidchart.com/intro/index.html',
'intro/getting-started.md':
'https://docs.mermaidchart.com/mermaid-oss/intro/getting-started.html',
'intro/syntax-reference.md':
'https://docs.mermaidchart.com/mermaid-oss/intro/syntax-reference.html',
// Syntax section
'syntax/flowchart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/flowchart.html',
'syntax/sequenceDiagram.md':
'https://docs.mermaidchart.com/mermaid-oss/syntax/sequenceDiagram.html',
'syntax/classDiagram.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/classDiagram.html',
'syntax/stateDiagram.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/stateDiagram.html',
'syntax/entityRelationshipDiagram.md':
'https://docs.mermaidchart.com/mermaid-oss/syntax/entityRelationshipDiagram.html',
'syntax/userJourney.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/userJourney.html',
'syntax/gantt.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/gantt.html',
'syntax/pie.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/pie.html',
'syntax/quadrantChart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/quadrantChart.html',
'syntax/requirementDiagram.md':
'https://docs.mermaidchart.com/mermaid-oss/syntax/requirementDiagram.html',
'syntax/mindmap.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/mindmap.html',
'syntax/timeline.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/timeline.html',
'syntax/gitgraph.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/gitgraph.html',
'syntax/c4.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/c4.html',
'syntax/sankey.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/sankey.html',
'syntax/xyChart.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/xyChart.html',
'syntax/block.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/block.html',
'syntax/packet.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/packet.html',
'syntax/kanban.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/kanban.html',
'syntax/architecture.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/architecture.html',
'syntax/radar.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/radar.html',
'syntax/examples.md': 'https://docs.mermaidchart.com/mermaid-oss/syntax/examples.html',
// Config section
'config/configuration.md': 'https://docs.mermaidchart.com/mermaid-oss/config/configuration.html',
'config/usage.md': 'https://docs.mermaidchart.com/mermaid-oss/config/usage.html',
'config/icons.md': 'https://docs.mermaidchart.com/mermaid-oss/config/icons.html',
'config/directives.md': 'https://docs.mermaidchart.com/mermaid-oss/config/directives.html',
'config/theming.md': 'https://docs.mermaidchart.com/mermaid-oss/config/theming.html',
'config/math.md': 'https://docs.mermaidchart.com/mermaid-oss/config/math.html',
'config/accessibility.md': 'https://docs.mermaidchart.com/mermaid-oss/config/accessibility.html',
'config/mermaidCLI.md': 'https://docs.mermaidchart.com/mermaid-oss/config/mermaidCLI.html',
'config/faq.md': 'https://docs.mermaidchart.com/mermaid-oss/config/faq.html',
// Ecosystem section
'ecosystem/mermaid-chart.md':
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/mermaid-chart.html',
'ecosystem/tutorials.md': 'https://docs.mermaidchart.com/mermaid-oss/ecosystem/tutorials.html',
'ecosystem/integrations-community.md':
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/integrations-community.html',
'ecosystem/integrations-create.md':
'https://docs.mermaidchart.com/mermaid-oss/ecosystem/integrations-create.html',
// Community section
'community/intro.md': 'https://docs.mermaidchart.com/mermaid-oss/community/intro.html',
'community/contributing.md':
'https://docs.mermaidchart.com/mermaid-oss/community/contributing.html',
'community/new-diagram.md':
'https://docs.mermaidchart.com/mermaid-oss/community/new-diagram.html',
'community/questions-and-suggestions.md':
'https://docs.mermaidchart.com/mermaid-oss/community/questions-and-suggestions.html',
'community/security.md': 'https://docs.mermaidchart.com/mermaid-oss/community/security.html',
};
/**
* Helper function to get canonical URL for a specific page
* This can be used in frontmatter or for manual overrides
*/
export function getCanonicalUrl(relativePath: string): string | undefined {
return specificCanonicalUrls[relativePath];
return `https://mermaid.ai/open-source/${relativePath}`;
}

View File

@@ -1,5 +1,5 @@
import type { PageData } from 'vitepress';
import { canonicalConfig, specificCanonicalUrls } from './canonical-config.js';
import { canonicalConfig } from './canonical-config.js';
/**
* Configuration for canonical URL generation
@@ -48,31 +48,15 @@ const defaultConfig: CanonicalUrlConfig = {
},
};
/**
* Check if a path matches any of the exclude patterns
*/
function shouldExcludePath(relativePath: string, excludePatterns: string[] = []): boolean {
return excludePatterns.some((pattern) => {
// Convert glob pattern to regex
const regexPattern = pattern
.replace(/\*\*/g, '.*')
.replace(/\*/g, '[^/]*')
.replace(/\?/g, '.')
.replace(/\./g, '\\.');
const regex = new RegExp(`^${regexPattern}$`);
return regex.test(relativePath);
});
}
/**
* Transform a relative path to a canonical URL path
*/
function transformPath(relativePath: string, config: CanonicalUrlConfig): string {
export function transformPath(relativePath: string, config: CanonicalUrlConfig): string {
let transformedPath = relativePath;
// Apply built-in transformations
if (config.transformations?.removeMarkdownExtension) {
transformedPath = transformedPath.replace(/\.md$/, '');
transformedPath = transformedPath.replace(/\.md$/, '.html');
}
if (config.transformations?.removeIndex) {
@@ -116,45 +100,9 @@ function generateCanonicalUrl(relativePath: string, config: CanonicalUrlConfig):
export function addCanonicalUrls(pageData: PageData): void {
const config = canonicalConfig;
// Check for specific canonical URLs first
const specificUrl = specificCanonicalUrls[pageData.relativePath];
if (specificUrl) {
addCanonicalToHead(pageData, specificUrl);
return;
}
// Skip if canonical URL is already explicitly set in frontmatter
if (pageData.frontmatter.canonical) {
// If it's already a full URL, use as-is
if (pageData.frontmatter.canonical.startsWith('http')) {
addCanonicalToHead(pageData, pageData.frontmatter.canonical);
return;
}
// If it's a relative path, convert to absolute URL
const canonicalUrl = config.baseUrl + pageData.frontmatter.canonical;
addCanonicalToHead(pageData, canonicalUrl);
return;
}
// Skip if canonicalPath is set in frontmatter
if (pageData.frontmatter.canonicalPath) {
const canonicalUrl = config.baseUrl + pageData.frontmatter.canonicalPath;
addCanonicalToHead(pageData, canonicalUrl);
return;
}
// Skip if auto-generation is disabled
if (!config.autoGenerate) {
return;
}
// Skip if path should be excluded
if (shouldExcludePath(pageData.relativePath, config.excludePatterns)) {
return;
}
// Generate canonical URL
const canonicalUrl = generateCanonicalUrl(pageData.relativePath, config);
transformPath(pageData.relativePath, config);
addCanonicalToHead(pageData, canonicalUrl);
}

View File

@@ -54,6 +54,7 @@ To add an integration to this list, see the [Integrations - create page](./integ
- [GitLab](https://docs.gitlab.com/ee/user/markdown.html#diagrams-and-flowcharts) ✅
- [GNU Octave](https://octave.org/) ✅
- [octave_mermaid_js](https://github.com/CNOCTAVE/octave_mermaid_js) ✅
- [HackMD](https://hackmd.io/c/tutorials/%2F%40docs%2Fflowchart-en#Create-more-complex-flowcharts) ✅
- [Mermaid Plugin for JetBrains IDEs](https://plugins.jetbrains.com/plugin/20146-mermaid)
- [MonsterWriter](https://www.monsterwriter.com/) ✅
- [Joplin](https://joplinapp.org) ✅

View File

@@ -21,7 +21,7 @@
"font-awesome": "^4.7.0",
"jiti": "^2.4.2",
"mermaid": "workspace:^",
"vue": "^3.5.24"
"vue": "^3.5.25"
},
"devDependencies": {
"@iconify-json/carbon": "^1.2.14",

773
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff