diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 6ce4f8109..76648977d 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -72,7 +72,8 @@ "lodash": "^4.17.21", "moment-mini": "^2.24.0", "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2" + "stylis": "^4.1.2", + "uuid": "^9.0.0" }, "devDependencies": { "@applitools/eyes-cypress": "^3.25.7", @@ -86,6 +87,7 @@ "@types/lodash": "^4.14.185", "@types/prettier": "^2.7.0", "@types/stylis": "^4.0.2", + "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.37.0", "@typescript-eslint/parser": "^5.37.0", "concurrently": "^7.4.0", diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index 2343bdd34..222b05de8 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -4,6 +4,7 @@ import DOMPurify from 'dompurify'; export interface MermaidConfig { lazyLoadedDiagrams?: string[]; + loadExternalDiagramsAtStartup?: boolean; theme?: string; themeVariables?: any; themeCSS?: string; diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 05dfe1bcd..7a280fa31 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -8,6 +8,7 @@ import utils from './utils'; import { mermaidAPI } from './mermaidAPI'; import { addDetector } from './diagram-api/detectType'; import { isDetailedError } from './utils'; +import { registerDiagram } from './diagram-api/diagramAPI'; /** * ## init @@ -178,6 +179,22 @@ const registerLazyLoadedDiagrams = async (conf: MermaidConfig) => { await lazyLoadingPromise; }; +const loadExternalDiagrams = async (conf: MermaidConfig) => { + // Only lazy load once + // TODO: This is a hack. We should either throw error when new diagrams are added, or load them anyway. + if (lazyLoadingPromise === undefined) { + // Load all lazy loaded diagrams in parallel + lazyLoadingPromise = Promise.allSettled( + (conf?.lazyLoadedDiagrams ?? []).map(async (url: string) => { + const { id, detector, loadDiagram } = await import(url); + const { diagram } = await loadDiagram(); + registerDiagram(id, diagram, detector, diagram.injectUtils); + }) + ); + } + await lazyLoadingPromise; +}; + /** * @deprecated This is an internal function and should not be used. Will be removed in v10. */ @@ -286,7 +303,11 @@ const initialize = function (config: MermaidConfig) { * @deprecated This is an internal function and should not be used. Will be removed in v10. */ const initializeAsync = async function (config: MermaidConfig) { - await registerLazyLoadedDiagrams(config); + if (config.loadExternalDiagramsAtStartup) { + await loadExternalDiagrams(config); + } else { + await registerLazyLoadedDiagrams(config); + } mermaidAPI.initialize(config); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2f88060c..63a1f3d43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,7 +27,6 @@ importers: '@vitest/coverage-c8': ^0.23.4 '@vitest/ui': ^0.23.4 concurrently: ^7.4.0 - coveralls: ^3.1.1 cypress: ^10.0.0 cypress-image-snapshot: ^4.0.1 d3: ^7.0.0 @@ -112,7 +111,6 @@ importers: '@vitest/coverage-c8': 0.23.4_gkhtrnfwk72a2xpsvrk7h3dcna '@vitest/ui': 0.23.4 concurrently: 7.4.0 - coveralls: 3.1.1 cypress: 10.8.0 cypress-image-snapshot: 4.0.1_cypress@10.8.0+jest@29.1.1 documentation: 13.2.0 @@ -164,10 +162,10 @@ importers: '@types/lodash': ^4.14.185 '@types/prettier': ^2.7.0 '@types/stylis': ^4.0.2 + '@types/uuid': ^8.3.4 '@typescript-eslint/eslint-plugin': ^5.37.0 '@typescript-eslint/parser': ^5.37.0 concurrently: ^7.4.0 - coveralls: ^3.1.1 cypress: ^10.0.0 cypress-image-snapshot: ^4.0.1 d3: ^7.0.0 @@ -209,6 +207,7 @@ importers: ts-node: ^10.9.1 typescript: ^4.8.3 unist-util-flatmap: ^1.0.0 + uuid: ^9.0.0 dependencies: '@braintree/sanitize-url': 6.0.0 d3: 7.6.1 @@ -222,6 +221,7 @@ importers: moment-mini: 2.29.4 non-layered-tidy-tree-layout: 2.0.2 stylis: 4.1.2 + uuid: 9.0.0 devDependencies: '@applitools/eyes-cypress': 3.27.1 '@commitlint/cli': 17.1.2 @@ -234,10 +234,10 @@ importers: '@types/lodash': 4.14.185 '@types/prettier': 2.7.0 '@types/stylis': 4.0.2 + '@types/uuid': 8.3.4 '@typescript-eslint/eslint-plugin': 5.38.0_wsb62dxj2oqwgas4kadjymcmry '@typescript-eslint/parser': 5.38.0_irgkl5vooow2ydyo6aokmferha concurrently: 7.4.0 - coveralls: 3.1.1 cypress: 10.8.0 cypress-image-snapshot: 4.0.1_cypress@10.8.0 documentation: 13.2.0 @@ -3273,7 +3273,6 @@ packages: /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - dev: false /@types/web-bluetooth/0.0.15: resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==} @@ -5133,18 +5132,6 @@ packages: yaml: 1.10.2 dev: true - /coveralls/3.1.1: - resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==} - engines: {node: '>=6'} - hasBin: true - dependencies: - js-yaml: 3.14.1 - lcov-parse: 1.0.0 - log-driver: 1.2.7 - minimist: 1.2.6 - request: 2.88.2 - dev: true - /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -7772,20 +7759,6 @@ packages: uglify-js: 3.17.1 dev: true - /har-schema/2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - dev: true - - /har-validator/5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: true - /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -7979,15 +7952,6 @@ packages: - supports-color dev: true - /http-signature/1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.17.0 - dev: true - /http-signature/1.3.6: resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} engines: {node: '>=0.10'} @@ -9186,16 +9150,6 @@ packages: engines: {'0': node >= 0.2.0} dev: true - /jsprim/1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - /jsprim/2.0.2: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} engines: {'0': node >=0.6.0} @@ -9284,11 +9238,6 @@ packages: readable-stream: 2.3.7 dev: true - /lcov-parse/1.0.0: - resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==} - hasBin: true - dev: true - /lead/1.0.0: resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} engines: {node: '>= 0.10'} @@ -9466,11 +9415,6 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-driver/1.2.7: - resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==} - engines: {node: '>=0.8.6'} - dev: true - /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} @@ -10248,10 +10192,6 @@ packages: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true - /oauth-sign/0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -11305,33 +11245,6 @@ packages: throttleit: 1.0.0 dev: true - /request/2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.11.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: true - /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -12843,12 +12756,6 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /uuid/3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - /uuid/8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true