mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
8 lines (7 loc) • 8.84 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/internals.ts", "../../../src/rendering-util/layout-algorithms/elk/algorithms.ts", "../../../src/rendering-util/render.ts"],
"sourcesContent": ["import { getConfig } from './config.js';\nimport common from './diagrams/common/common.js';\nimport { log } from './logger.js';\nimport { insertCluster } from './rendering-util/rendering-elements/clusters.js';\nimport {\n insertEdge,\n insertEdgeLabel,\n positionEdgeLabel,\n} from './rendering-util/rendering-elements/edges.js';\nimport insertMarkers from './rendering-util/rendering-elements/markers.js';\nimport { insertNode } from './rendering-util/rendering-elements/nodes.js';\nimport { labelHelper } from './rendering-util/rendering-elements/shapes/util.js';\nimport { interpolateToCurve } from './utils.js';\n\n/**\n * Internal helpers for mermaid\n * @deprecated - This should not be used by external packages, as the definitions will change without notice.\n */\nexport const internalHelpers = {\n common,\n getConfig,\n insertCluster,\n insertEdge,\n insertEdgeLabel,\n insertMarkers,\n insertNode,\n interpolateToCurve,\n labelHelper,\n log,\n positionEdgeLabel,\n};\n\nexport type InternalHelpers = typeof internalHelpers;\n", "/**\n * ELK algorithms selectable as `layout: <name>`, in addition to the plain `elk`\n * name which maps to `elk.layered`.\n *\n * Shared by mermaid's own registration and by the standalone\n * `@mermaid-js/layout-elk` plugin entry, which each declare their own loader so\n * that neither drags the other's dynamic import into its bundle.\n */\nexport const ELK_ALGORITHMS = [\n 'elk.stress',\n 'elk.force',\n 'elk.mrtree',\n 'elk.sporeOverlap',\n 'elk.box',\n 'elk.rectpacking',\n] as const;\n", "import type { SVG } from '../diagram-api/types.js';\nimport type { InternalHelpers } from '../internals.js';\nimport { internalHelpers } from '../internals.js';\nimport { log } from '../logger.js';\nimport { insertLookDefs } from './insertLookDefs.js';\nimport type { LayoutData } from './types.js';\nimport { ELK_ALGORITHMS } from './layout-algorithms/elk/algorithms.js';\n\n// console.log('MUST be removed, this only for keeping dev server working');\n// import tmp from './layout-algorithms/dagre/index.js';\n\nexport interface RenderOptions {\n algorithm?: string;\n}\n\nexport interface LayoutAlgorithm {\n render(\n layoutData: LayoutData,\n svg: SVG,\n helpers: InternalHelpers,\n options?: RenderOptions\n ): Promise<void>;\n}\n\nexport type LayoutLoader = () => Promise<LayoutAlgorithm>;\nexport interface LayoutLoaderDefinition {\n name: string;\n loader: LayoutLoader;\n algorithm?: string;\n}\n\n// Prototype-less: `layout` is settable from frontmatter, and on a plain object a value of\n// `__proto__` or `toString` would pass a membership test and reach `loader()` as a TypeError.\nconst layoutAlgorithms: Record<string, LayoutLoaderDefinition> = Object.create(null);\n\nexport const registerLayoutLoaders = (loaders: LayoutLoaderDefinition[]) => {\n for (const loader of loaders) {\n layoutAlgorithms[loader.name] = loader;\n }\n};\n\n/**\n * Look up a registered layout by name.\n *\n * @internal Not part of the public API; it exists so the registration of the\n * built-in layouts can be asserted on directly.\n */\nexport const getLayoutLoaderDefinition = (name: string): LayoutLoaderDefinition => {\n const definition = layoutAlgorithms[name];\n if (!definition) {\n throw new Error(`Unknown layout algorithm: ${name}`);\n }\n return definition;\n};\n\n/**\n * Every ELK entry shares one loader, so all of them resolve to the same lazily\n * imported chunk and elkjs is fetched at most once.\n *\n * The loader is declared here rather than imported from the ELK plugin entry so\n * that the tiny build, which compiles this branch away, does not retain a\n * dynamic import of elkjs.\n */\nconst elkLayoutLoaders = (): LayoutLoaderDefinition[] => {\n const loader = async () => await import('./layout-algorithms/elk/index.js');\n return [\n { name: 'elk', loader, algorithm: 'elk.layered' },\n ...ELK_ALGORITHMS.map((algorithm) => ({ name: algorithm, loader, algorithm })),\n ];\n};\n\n// TODO: Should we load dagre without lazy loading?\nconst registerDefaultLayoutLoaders = () => {\n registerLayoutLoaders([\n {\n name: 'dagre',\n loader: async () => await import('./layout-algorithms/dagre/index.js'),\n },\n {\n name: 'swimlane',\n loader: async () => await import('./layout-algorithms/swimlanes/index.js'),\n },\n // elkjs is ~1.6 MB of source, so it is excluded from the tiny build along\n // with the other large features. `getRegisteredLayoutAlgorithm` then falls\n // back to dagre for diagrams that ask for an ELK layout there.\n ...(injected.includeLargeFeatures\n ? [\n {\n name: 'cose-bilkent',\n loader: async () => await import('./layout-algorithms/cose-bilkent/index.js'),\n },\n ...elkLayoutLoaders(),\n ]\n : []),\n ]);\n};\n\nregisterDefaultLayoutLoaders();\n\nexport const render = async (data4Layout: LayoutData, svg: SVG) => {\n if (!Object.hasOwn(layoutAlgorithms, data4Layout.layoutAlgorithm)) {\n throw new Error(`Unknown layout algorithm: ${data4Layout.layoutAlgorithm}`);\n }\n\n // Prefix all node domIds with the diagram's SVG element ID to ensure uniqueness\n // across multiple diagrams on the same page.\n if (data4Layout.diagramId) {\n for (const node of data4Layout.nodes) {\n const originalDomId = node.domId || node.id;\n node.domId = `${data4Layout.diagramId}-${originalDomId}`;\n }\n }\n\n const layoutDefinition = layoutAlgorithms[data4Layout.layoutAlgorithm];\n const layoutRenderer = await layoutDefinition.loader();\n\n insertLookDefs(svg, data4Layout.config);\n\n return layoutRenderer.render(data4Layout, svg, internalHelpers, {\n algorithm: layoutDefinition.algorithm,\n });\n};\n\n/** Always registered, so the fallback chain can always end. */\nconst LAST_RESORT_LAYOUT = 'dagre';\n\n/**\n * Get the registered layout algorithm, falling back when it is not available -- `elk` and\n * `cose-bilkent` ship only in large-feature builds (the tiny build omits them), so a diagram\n * type may name either as its default. `fallback` may itself be absent, so `dagre` closes the chain.\n */\nexport const getRegisteredLayoutAlgorithm = (\n algorithm = '',\n { fallback = LAST_RESORT_LAYOUT } = {}\n) => {\n if (Object.hasOwn(layoutAlgorithms, algorithm)) {\n return algorithm;\n }\n for (const candidate of [fallback, LAST_RESORT_LAYOUT]) {\n if (Object.hasOwn(layoutAlgorithms, candidate)) {\n log.warn(`Layout algorithm ${algorithm} is not registered. Using ${candidate} as fallback.`);\n return candidate;\n }\n }\n throw new Error(\n `Neither layout algorithm ${algorithm}, ${fallback}, nor ${LAST_RESORT_LAYOUT} is registered.`\n );\n};\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACtBO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACkBA,IAAM,mBAA2D,uBAAO,OAAO,IAAI;AAE5E,IAAM,wBAAwB,wBAAC,YAAsC;AAC1E,aAAW,UAAU,SAAS;AAC5B,qBAAiB,OAAO,IAAI,IAAI;AAAA,EAClC;AACF,GAJqC;AA4BrC,IAAM,mBAAmB,6BAAgC;AACvD,QAAM,SAAS,mCAAY,MAAM,OAAO,oBAAkC,GAA3D;AACf,SAAO;AAAA,IACL,EAAE,MAAM,OAAO,QAAQ,WAAW,cAAc;AAAA,IAChD,GAAG,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,WAAW,QAAQ,UAAU,EAAE;AAAA,EAC/E;AACF,GANyB;AASzB,IAAM,+BAA+B,6BAAM;AACzC,wBAAsB;AAAA,IACpB;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,mCAAY,MAAM,OAAO,sBAAoC,GAA7D;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,mCAAY,MAAM,OAAO,0BAAwC,GAAjE;AAAA,IACV;AAAA;AAAA;AAAA;AAAA,IAIA,GAAI,OACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,QAAQ,mCAAY,MAAM,OAAO,6BAA2C,GAApE;AAAA,MACV;AAAA,MACA,GAAG,iBAAiB;AAAA,IACtB,IACA,CAAC;AAAA,EACP,CAAC;AACH,GAvBqC;AAyBrC,6BAA6B;AAEtB,IAAM,SAAS,8BAAO,aAAyB,QAAa;AACjE,MAAI,CAAC,OAAO,OAAO,kBAAkB,YAAY,eAAe,GAAG;AACjE,UAAM,IAAI,MAAM,6BAA6B,YAAY,eAAe,EAAE;AAAA,EAC5E;AAIA,MAAI,YAAY,WAAW;AACzB,eAAW,QAAQ,YAAY,OAAO;AACpC,YAAM,gBAAgB,KAAK,SAAS,KAAK;AACzC,WAAK,QAAQ,GAAG,YAAY,SAAS,IAAI,aAAa;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,mBAAmB,iBAAiB,YAAY,eAAe;AACrE,QAAM,iBAAiB,MAAM,iBAAiB,OAAO;AAErD,iBAAe,KAAK,YAAY,MAAM;AAEtC,SAAO,eAAe,OAAO,aAAa,KAAK,iBAAiB;AAAA,IAC9D,WAAW,iBAAiB;AAAA,EAC9B,CAAC;AACH,GAtBsB;AAyBtB,IAAM,qBAAqB;AAOpB,IAAM,+BAA+B,wBAC1C,YAAY,IACZ,EAAE,WAAW,mBAAmB,IAAI,CAAC,MAClC;AACH,MAAI,OAAO,OAAO,kBAAkB,SAAS,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,aAAW,aAAa,CAAC,UAAU,kBAAkB,GAAG;AACtD,QAAI,OAAO,OAAO,kBAAkB,SAAS,GAAG;AAC9C,UAAI,KAAK,oBAAoB,SAAS,6BAA6B,SAAS,eAAe;AAC3F,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,4BAA4B,SAAS,KAAK,QAAQ,SAAS,kBAAkB;AAAA,EAC/E;AACF,GAhB4C;",
"names": []
}