UNPKG

mermaid

Version:

Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.

8 lines (7 loc) 9.27 kB
{ "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": "6YAkBO,IAAMA,EAAkB,CAC7B,OAAAC,EACA,UAAAC,EACA,cAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,mBAAAC,EACA,YAAAC,EACA,IAAAC,EACA,kBAAAC,CACF,ECtBO,IAAMC,EAAiB,CAC5B,aACA,YACA,aACA,mBACA,UACA,iBACF,ECkBA,IAAMC,EAA2D,OAAO,OAAO,IAAI,EAEtEC,EAAwBC,EAACC,GAAsC,CAC1E,QAAWC,KAAUD,EACnBH,EAAiBI,EAAO,IAAI,EAAIA,CAEpC,EAJqC,yBA4BrC,IAAMC,EAAmBC,EAAA,IAAgC,CACvD,IAAMC,EAASD,EAAA,SAAY,KAAM,QAAO,oBAAkC,EAA3D,UACf,MAAO,CACL,CAAE,KAAM,MAAO,OAAAC,EAAQ,UAAW,aAAc,EAChD,GAAGC,EAAe,IAAKC,IAAe,CAAE,KAAMA,EAAW,OAAAF,EAAQ,UAAAE,CAAU,EAAE,CAC/E,CACF,EANyB,oBASnBC,EAA+BJ,EAAA,IAAM,CACzCK,EAAsB,CACpB,CACE,KAAM,QACN,OAAQL,EAAA,SAAY,KAAM,QAAO,sBAAoC,EAA7D,SACV,EACA,CACE,KAAM,WACN,OAAQA,EAAA,SAAY,KAAM,QAAO,0BAAwC,EAAjE,SACV,EAMM,CACE,KAAM,eACN,OAAQA,EAAA,SAAY,KAAM,QAAO,6BAA2C,EAApE,SACV,EACA,GAAGD,EAAiB,CAG5B,CAAC,CACH,EAvBqC,gCAyBrCK,EAA6B,EAEtB,IAAME,EAASN,EAAA,MAAOO,EAAyBC,IAAa,CACjE,GAAI,CAAC,OAAO,OAAOC,EAAkBF,EAAY,eAAe,EAC9D,MAAM,IAAI,MAAM,6BAA6BA,EAAY,eAAe,EAAE,EAK5E,GAAIA,EAAY,UACd,QAAWG,KAAQH,EAAY,MAAO,CACpC,IAAMI,EAAgBD,EAAK,OAASA,EAAK,GACzCA,EAAK,MAAQ,GAAGH,EAAY,SAAS,IAAII,CAAa,EACxD,CAGF,IAAMC,EAAmBH,EAAiBF,EAAY,eAAe,EAC/DM,EAAiB,MAAMD,EAAiB,OAAO,EAErD,OAAAE,EAAeN,EAAKD,EAAY,MAAM,EAE/BM,EAAe,OAAON,EAAaC,EAAKO,EAAiB,CAC9D,UAAWH,EAAiB,SAC9B,CAAC,CACH,EAtBsB,UAyBhBI,EAAqB,QAOdC,EAA+BjB,EAAA,CAC1CG,EAAY,GACZ,CAAE,SAAAe,EAAWF,CAAmB,EAAI,CAAC,IAClC,CACH,GAAI,OAAO,OAAOP,EAAkBN,CAAS,EAC3C,OAAOA,EAET,QAAWgB,IAAa,CAACD,EAAUF,CAAkB,EACnD,GAAI,OAAO,OAAOP,EAAkBU,CAAS,EAC3C,OAAAC,EAAI,KAAK,oBAAoBjB,CAAS,6BAA6BgB,CAAS,eAAe,EACpFA,EAGX,MAAM,IAAI,MACR,4BAA4BhB,CAAS,KAAKe,CAAQ,SAASF,CAAkB,iBAC/E,CACF,EAhB4C", "names": ["internalHelpers", "common_default", "getConfig", "insertCluster", "insertEdge", "insertEdgeLabel", "markers_default", "insertNode", "interpolateToCurve", "labelHelper", "log", "positionEdgeLabel", "ELK_ALGORITHMS", "layoutAlgorithms", "registerLayoutLoaders", "__name", "loaders", "loader", "elkLayoutLoaders", "__name", "loader", "ELK_ALGORITHMS", "algorithm", "registerDefaultLayoutLoaders", "registerLayoutLoaders", "render", "data4Layout", "svg", "layoutAlgorithms", "node", "originalDomId", "layoutDefinition", "layoutRenderer", "insertLookDefs", "internalHelpers", "LAST_RESORT_LAYOUT", "getRegisteredLayoutAlgorithm", "fallback", "candidate", "log"] }