mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-20 15:59:51 +02:00
Merge branch 'release_9.2.0_buggfixes' into release/9.2.0
This commit is contained in:
@@ -6,6 +6,7 @@ import pkg from '../package.json' assert { type: 'json' };
|
|||||||
|
|
||||||
const { dependencies } = pkg;
|
const { dependencies } = pkg;
|
||||||
const watch = process.argv.includes('--watch');
|
const watch = process.argv.includes('--watch');
|
||||||
|
const mermaidOnly = process.argv.includes('--mermaid');
|
||||||
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
|
||||||
type OutputOptions = Exclude<
|
type OutputOptions = Exclude<
|
||||||
@@ -129,14 +130,19 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
|||||||
const main = async () => {
|
const main = async () => {
|
||||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
||||||
for (const pkg of packageNames) {
|
for (const pkg of packageNames) {
|
||||||
|
if (mermaidOnly && pkg !== 'mermaid') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
await buildPackage(pkg);
|
await buildPackage(pkg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (watch) {
|
if (watch) {
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid' }));
|
build(getBuildConfig({ minify: false, watch, core: true, entryName: 'mermaid' }));
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
|
if (!mermaidOnly) {
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
|
||||||
|
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
void main();
|
void main();
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
"git graph"
|
"git graph"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"build:mermaid": "ts-node-esm --transpileOnly --project=.vite/tsconfig.json .vite/build.ts --mermaid",
|
||||||
"build:vite": "ts-node-esm --transpileOnly --project=.vite/tsconfig.json .vite/build.ts",
|
"build:vite": "ts-node-esm --transpileOnly --project=.vite/tsconfig.json .vite/build.ts",
|
||||||
"build:types": "concurrently \"tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly\" \"tsc -p ./packages/mermaid-mindmap/tsconfig.json --emitDeclarationOnly\"",
|
"build:types": "concurrently \"tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly\" \"tsc -p ./packages/mermaid-mindmap/tsconfig.json --emitDeclarationOnly\"",
|
||||||
"build:watch": "pnpm build:vite --watch",
|
"build:watch": "pnpm build:vite --watch",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mermaid-js/mermaid-mindmap",
|
"name": "@mermaid-js/mermaid-mindmap",
|
||||||
"version": "9.2.0-rc3",
|
"version": "9.2.0-rc4",
|
||||||
"description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
|
"description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
|
||||||
"main": "dist/mermaid-mindmap.core.mjs",
|
"main": "dist/mermaid-mindmap.core.mjs",
|
||||||
"module": "dist/mermaid-mindmap.core.mjs",
|
"module": "dist/mermaid-mindmap.core.mjs",
|
||||||
|
@@ -3,11 +3,10 @@ import { sanitizeText, getConfig, log } from './mermaidUtils';
|
|||||||
|
|
||||||
let nodes = [];
|
let nodes = [];
|
||||||
let cnt = 0;
|
let cnt = 0;
|
||||||
let elements = {};
|
|
||||||
export const clear = () => {
|
export const clear = () => {
|
||||||
nodes = [];
|
nodes = [];
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
elements = {};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getParent = function (level) {
|
const getParent = function (level) {
|
||||||
@@ -27,7 +26,7 @@ export const addNode = (level, id, descr, type) => {
|
|||||||
log.info('addNode', level, id, descr, type);
|
log.info('addNode', level, id, descr, type);
|
||||||
const conf = getConfig();
|
const conf = getConfig();
|
||||||
const node = {
|
const node = {
|
||||||
id: cnt++,
|
id: `id-${cnt++}`,
|
||||||
nodeId: sanitizeText(id),
|
nodeId: sanitizeText(id),
|
||||||
level,
|
level,
|
||||||
descr: sanitizeText(descr),
|
descr: sanitizeText(descr),
|
||||||
@@ -99,10 +98,6 @@ export const getType = (startStr, endStr) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const setElementForId = (id, element) => {
|
|
||||||
elements[id] = element;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const decorateNode = (decoration) => {
|
export const decorateNode = (decoration) => {
|
||||||
const node = nodes[nodes.length - 1];
|
const node = nodes[nodes.length - 1];
|
||||||
if (decoration && decoration.icon) {
|
if (decoration && decoration.icon) {
|
||||||
@@ -141,4 +136,3 @@ export const setErrorHandler = (handler) => {
|
|||||||
export const getLogger = () => log;
|
export const getLogger = () => log;
|
||||||
|
|
||||||
export const getNodeById = (id) => nodes[id];
|
export const getNodeById = (id) => nodes[id];
|
||||||
export const getElementById = (id) => elements[id];
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/** Created by knut on 14-12-11. */
|
/** Created by knut on 14-12-11. */
|
||||||
import { select } from 'd3';
|
import { select } from 'd3';
|
||||||
import { log, getConfig, setupGraphViewbox } from './mermaidUtils';
|
import { log, getConfig, setupGraphViewbox } from './mermaidUtils';
|
||||||
import svgDraw from './svgDraw';
|
import svgDraw, { getElementById, clearElementRefs } from './svgDraw';
|
||||||
import cytoscape from 'cytoscape';
|
import cytoscape from 'cytoscape';
|
||||||
import coseBilkent from 'cytoscape-cose-bilkent';
|
import coseBilkent from 'cytoscape-cose-bilkent';
|
||||||
import * as db from './mindmapDb';
|
import * as db from './mindmapDb';
|
||||||
@@ -155,7 +155,7 @@ function positionNodes(cy) {
|
|||||||
data.x = node.position().x;
|
data.x = node.position().x;
|
||||||
data.y = node.position().y;
|
data.y = node.position().y;
|
||||||
svgDraw.positionNode(data);
|
svgDraw.positionNode(data);
|
||||||
const el = db.getElementById(data.nodeId);
|
const el = getElementById(data.nodeId);
|
||||||
log.info('Id:', id, 'Position: (', node.position().x, ', ', node.position().y, ')', data);
|
log.info('Id:', id, 'Position: (', node.position().x, ', ', node.position().y, ')', data);
|
||||||
el.attr(
|
el.attr(
|
||||||
'transform',
|
'transform',
|
||||||
@@ -179,6 +179,7 @@ export const draw = async (text, id, version, diagObj) => {
|
|||||||
|
|
||||||
// This is done only for throwing the error if the text is not valid.
|
// This is done only for throwing the error if the text is not valid.
|
||||||
diagObj.db.clear();
|
diagObj.db.clear();
|
||||||
|
clearElementRefs();
|
||||||
// Parse the graph definition
|
// Parse the graph definition
|
||||||
diagObj.parser.parse(text);
|
diagObj.parser.parse(text);
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ const genSections = (options) => {
|
|||||||
.node-icon-${i - 1} {
|
.node-icon-${i - 1} {
|
||||||
font-size: 40px;
|
font-size: 40px;
|
||||||
color: ${options['cScaleLabel' + i]};
|
color: ${options['cScaleLabel' + i]};
|
||||||
|
// fill: ${options['cScaleLabel' + i]};
|
||||||
// color: ${options['gitInv' + i]};
|
// color: ${options['gitInv' + i]};
|
||||||
}
|
}
|
||||||
.section-edge-${i - 1}{
|
.section-edge-${i - 1}{
|
||||||
@@ -36,7 +37,7 @@ const genSections = (options) => {
|
|||||||
stroke-width: ${sw};
|
stroke-width: ${sw};
|
||||||
}
|
}
|
||||||
.section-${i - 1} line {
|
.section-${i - 1} line {
|
||||||
stroke: ${options['lineColor' + i]} ;
|
stroke: ${options['cScaleInv' + i]} ;
|
||||||
stroke-width: 3;
|
stroke-width: 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -259,7 +259,7 @@ export const drawNode = function (elem, node, fullSection, conf) {
|
|||||||
// if (typeof node.x !== 'undefined' && typeof node.y !== 'undefined') {
|
// if (typeof node.x !== 'undefined' && typeof node.y !== 'undefined') {
|
||||||
// nodeElem.attr('transform', 'translate(' + node.x + ',' + node.y + ')');
|
// nodeElem.attr('transform', 'translate(' + node.x + ',' + node.y + ')');
|
||||||
// }
|
// }
|
||||||
db.setElementForId(node.id, nodeElem);
|
setElementById(node.id, nodeElem);
|
||||||
return node.height;
|
return node.height;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -286,7 +286,7 @@ export const drawEdge = function drawEdge(edgesElem, mindmap, parent, depth, ful
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const positionNode = function (node) {
|
export const positionNode = function (node) {
|
||||||
const nodeElem = db.getElementById(node.id);
|
const nodeElem = getElementById(node.id);
|
||||||
|
|
||||||
const x = node.x || 0;
|
const x = node.x || 0;
|
||||||
const y = node.y || 0;
|
const y = node.y || 0;
|
||||||
@@ -295,3 +295,17 @@ export const positionNode = function (node) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default { drawNode, positionNode, drawEdge };
|
export default { drawNode, positionNode, drawEdge };
|
||||||
|
|
||||||
|
let elements = {};
|
||||||
|
|
||||||
|
export const setElementById = (id, element) => {
|
||||||
|
elements[id] = element;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getElementById = (id) => {
|
||||||
|
return elements[id];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const clearElementRefs = () => {
|
||||||
|
elements = {};
|
||||||
|
};
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import * as configApi from './config';
|
import * as configApi from './config';
|
||||||
import { log } from './logger';
|
import { log } from './logger';
|
||||||
import { getDiagram, registerDiagram } from './diagram-api/diagramAPI';
|
import { DiagramNotFoundError, getDiagram, registerDiagram } from './diagram-api/diagramAPI';
|
||||||
import { detectType, getDiagramLoader } from './diagram-api/detectType';
|
import { detectType, getDiagramLoader } from './diagram-api/detectType';
|
||||||
import { isDetailedError } from './utils';
|
import { isDetailedError } from './utils';
|
||||||
export class Diagram {
|
export class Diagram {
|
||||||
@@ -92,9 +92,13 @@ export const getDiagramFromText = (
|
|||||||
getDiagram(type);
|
getDiagram(type);
|
||||||
return new Diagram(txt, parseError);
|
return new Diagram(txt, parseError);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
if (!(error instanceof DiagramNotFoundError)) {
|
||||||
|
log.error(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
const loader = getDiagramLoader(type);
|
const loader = getDiagramLoader(type);
|
||||||
if (!loader) {
|
if (!loader) {
|
||||||
throw new Error(`Diagram ${type} not found.`);
|
throw new Error(`Loader for ${type} not found.`);
|
||||||
}
|
}
|
||||||
// TODO: Uncomment for v10
|
// TODO: Uncomment for v10
|
||||||
// // Diagram not available, loading it
|
// // Diagram not available, loading it
|
||||||
|
@@ -34,6 +34,7 @@ export const registerDiagram = (
|
|||||||
_setupGraphViewbox: any
|
_setupGraphViewbox: any
|
||||||
) => void
|
) => void
|
||||||
) => {
|
) => {
|
||||||
|
log.debug(`Registering diagram ${id}`);
|
||||||
if (diagrams[id]) {
|
if (diagrams[id]) {
|
||||||
log.warn(`Diagram ${id} already registered.`);
|
log.warn(`Diagram ${id} already registered.`);
|
||||||
// The error throw is commented out to as it breaks pages where you have multiple diagrams,
|
// The error throw is commented out to as it breaks pages where you have multiple diagrams,
|
||||||
@@ -50,11 +51,19 @@ export const registerDiagram = (
|
|||||||
if (typeof callback !== 'undefined') {
|
if (typeof callback !== 'undefined') {
|
||||||
callback(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox);
|
callback(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox);
|
||||||
}
|
}
|
||||||
|
log.debug(`Registered diagram ${id}. ${Object.keys(diagrams).join(', ')} diagrams registered.`);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getDiagram = (name: string): DiagramDefinition => {
|
export const getDiagram = (name: string): DiagramDefinition => {
|
||||||
|
log.debug(`Getting diagram ${name}. ${Object.keys(diagrams).join(', ')} diagrams registered.`);
|
||||||
if (name in diagrams) {
|
if (name in diagrams) {
|
||||||
return diagrams[name];
|
return diagrams[name];
|
||||||
}
|
}
|
||||||
throw new Error(`Diagram ${name} not found.`);
|
throw new DiagramNotFoundError(name);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export class DiagramNotFoundError extends Error {
|
||||||
|
constructor(message: string) {
|
||||||
|
super(`Diagram ${message} not found.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -30,6 +30,8 @@ export const log: Record<keyof typeof LEVELS, typeof console.log> = {
|
|||||||
* @param {LogLevel} [level="fatal"] The level to set the logging to. Default is `"fatal"`
|
* @param {LogLevel} [level="fatal"] The level to set the logging to. Default is `"fatal"`
|
||||||
*/
|
*/
|
||||||
export const setLogLevel = function (level: keyof typeof LEVELS | number | string = 'fatal') {
|
export const setLogLevel = function (level: keyof typeof LEVELS | number | string = 'fatal') {
|
||||||
|
// TODO: Even if we call initialize with loglevel 0, many initial logs are skipped as LL is set to 5 initially.
|
||||||
|
|
||||||
let numericLevel: number = LEVELS.fatal;
|
let numericLevel: number = LEVELS.fatal;
|
||||||
if (typeof level === 'string') {
|
if (typeof level === 'string') {
|
||||||
level = level.toLowerCase();
|
level = level.toLowerCase();
|
||||||
@@ -39,6 +41,7 @@ export const setLogLevel = function (level: keyof typeof LEVELS | number | strin
|
|||||||
} else if (typeof level === 'number') {
|
} else if (typeof level === 'number') {
|
||||||
numericLevel = level;
|
numericLevel = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.trace = () => {};
|
log.trace = () => {};
|
||||||
log.debug = () => {};
|
log.debug = () => {};
|
||||||
log.info = () => {};
|
log.info = () => {};
|
||||||
|
@@ -743,10 +743,11 @@ const handleDirective = function (p: any, directive: any, type: string): void {
|
|||||||
/** @param {MermaidConfig} options */
|
/** @param {MermaidConfig} options */
|
||||||
function initialize(options: MermaidConfig) {
|
function initialize(options: MermaidConfig) {
|
||||||
// Handle legacy location of font-family configuration
|
// Handle legacy location of font-family configuration
|
||||||
if (options?.fontFamily) {
|
if (options.fontFamily) {
|
||||||
if (!options.themeVariables?.fontFamily) {
|
if (!options.themeVariables) {
|
||||||
options.themeVariables = { fontFamily: options.fontFamily };
|
options.themeVariables = {};
|
||||||
}
|
}
|
||||||
|
options.themeVariables.fontFamily = options.fontFamily;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set default options
|
// Set default options
|
||||||
|
Reference in New Issue
Block a user