Compare commits

..

1 Commits

Author SHA1 Message Date
renovate[bot]
bd343d0d86 chore(deps): update eslint 2025-10-03 21:13:12 +00:00
15 changed files with 233 additions and 557 deletions

View File

@@ -6,14 +6,6 @@
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"
/>
<link
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
rel="stylesheet"
/>
<style>
svg:not(svg svg) {
border: 2px solid darkred;

View File

@@ -10,7 +10,7 @@
# Interface: LayoutData
Defined in: [packages/mermaid/src/rendering-util/types.ts:169](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L169)
Defined in: [packages/mermaid/src/rendering-util/types.ts:168](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L168)
## Indexable
@@ -22,7 +22,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:169](https://github.co
> **config**: [`MermaidConfig`](MermaidConfig.md)
Defined in: [packages/mermaid/src/rendering-util/types.ts:172](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L172)
Defined in: [packages/mermaid/src/rendering-util/types.ts:171](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L171)
---
@@ -30,7 +30,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:172](https://github.co
> **edges**: `Edge`\[]
Defined in: [packages/mermaid/src/rendering-util/types.ts:171](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L171)
Defined in: [packages/mermaid/src/rendering-util/types.ts:170](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L170)
---
@@ -38,4 +38,4 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:171](https://github.co
> **nodes**: `Node`\[]
Defined in: [packages/mermaid/src/rendering-util/types.ts:170](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L170)
Defined in: [packages/mermaid/src/rendering-util/types.ts:169](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L169)

View File

@@ -69,7 +69,7 @@
"@changesets/cli": "^2.29.7",
"@cspell/eslint-plugin": "^8.19.4",
"@cypress/code-coverage": "^3.14.6",
"@eslint/js": "^9.26.0",
"@eslint/js": "^9.37.0",
"@rollup/plugin-typescript": "^12.1.4",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.3",
@@ -93,7 +93,7 @@
"cypress-image-snapshot": "^4.0.1",
"cypress-split": "^1.24.23",
"esbuild": "^0.25.10",
"eslint": "^9.26.0",
"eslint": "^9.37.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-cypress": "^4.3.0",
"eslint-plugin-html": "^8.1.3",
@@ -126,7 +126,7 @@
"tslib": "^2.8.1",
"tsx": "^4.20.5",
"typescript": "~5.7.3",
"typescript-eslint": "^8.38.0",
"typescript-eslint": "^8.45.0",
"vite": "^7.0.7",
"vite-plugin-istanbul": "^7.0.0",
"vitest": "^3.2.4"

View File

@@ -1,222 +0,0 @@
import { log } from '../../logger.js';
import type { D3Selection } from '../../types.js';
import type { Node } from '../../rendering-util/types.js';
import { getIconSVG, isIconAvailable } from '../../rendering-util/icons.js';
export interface MindmapIconConfig {
iconSize: number;
iconPadding: number;
shapeType: 'circle' | 'rect' | 'rounded' | 'bang' | 'cloud' | 'hexagon' | 'default';
}
export interface MindmapDimensions {
width: number;
height: number;
labelOffset: { x: number; y: number };
}
/**
* Get icon configuration for different mindmap shape types
*/
export function getMindmapIconConfig(shapeType: string): MindmapIconConfig {
const baseConfig = {
iconSize: 30,
iconPadding: 15,
shapeType: shapeType as MindmapIconConfig['shapeType'],
};
switch (shapeType) {
case 'bang':
return { ...baseConfig, iconPadding: 1 };
case 'rect':
case 'default':
return { ...baseConfig, iconPadding: 10 };
default:
return baseConfig;
}
}
/**
* Calculate dimensions and label positioning for mindmap nodes with icons
*/
export function calculateMindmapDimensions(
node: Node,
bbox: any,
baseWidth: number,
baseHeight: number,
basePadding: number,
config: MindmapIconConfig
): MindmapDimensions {
const hasIcon = Boolean(node.icon);
if (!hasIcon) {
return {
width: baseWidth,
height: baseHeight,
labelOffset: { x: -bbox.width / 2, y: -bbox.height / 2 },
};
}
const { iconSize, iconPadding, shapeType } = config;
let width = baseWidth;
let height = baseHeight;
let labelXOffset = -bbox.width / 2;
const labelYOffset = -bbox.height / 2;
switch (shapeType) {
case 'circle': {
const totalWidthNeeded = bbox.width + iconSize + iconPadding * 2;
const minRadiusWithIcon = totalWidthNeeded / 2 + basePadding;
const radius = Math.max(baseWidth / 2, minRadiusWithIcon);
width = radius * 2;
height = radius * 2;
labelXOffset = -radius + iconSize + iconPadding;
break;
}
case 'rect':
case 'rounded':
case 'default': {
const minWidthWithIcon = bbox.width + iconSize + iconPadding * 2 + basePadding * 2;
width = Math.max(baseWidth, minWidthWithIcon);
height = Math.max(baseHeight, iconSize + basePadding * 2);
const availableTextSpace = width - iconSize - iconPadding * 2;
labelXOffset = -width / 2 + iconSize + iconPadding + availableTextSpace / 2 - bbox.width / 2;
break;
}
case 'bang':
case 'cloud': {
const minWidthWithIcon = bbox.width + iconSize + iconPadding * 2 + basePadding;
width = Math.max(baseWidth, minWidthWithIcon);
height = Math.max(baseHeight, iconSize + basePadding);
const availableTextSpace = width - iconSize - iconPadding * 2;
labelXOffset = -width / 2 + iconSize + iconPadding + availableTextSpace / 2 - bbox.width / 2;
break;
}
default: {
const minWidthWithIcon = bbox.width + iconSize + iconPadding * 2 + basePadding * 2;
width = Math.max(baseWidth, minWidthWithIcon);
height = Math.max(baseHeight, iconSize + basePadding * 2);
const availableTextSpace = width - iconSize - iconPadding * 2;
labelXOffset = -width / 2 + iconSize + iconPadding + availableTextSpace / 2 - bbox.width / 2;
break;
}
}
return {
width,
height,
labelOffset: { x: labelXOffset, y: labelYOffset },
};
}
/**
* Insert mindmap icon into the shape SVG element
*/
export async function insertMindmapIcon(
parentElement: D3Selection<SVGGraphicsElement>,
node: Node,
config: MindmapIconConfig
): Promise<void> {
if (!node.icon) {
return;
}
const { iconSize, iconPadding, shapeType } = config;
const section = node.section ?? 0;
let iconName = node.icon;
const isCssFormat = iconName.includes(' ');
if (isCssFormat) {
iconName = iconName.replace(' ', ':');
}
try {
if (await isIconAvailable(iconName)) {
const iconSvg = await getIconSVG(
iconName,
{
height: iconSize,
width: iconSize,
},
{ class: 'label-icon' }
);
const iconElem = parentElement.append('g');
iconElem.html(`<g>${iconSvg}</g>`);
let iconX = 0;
let iconY = 0;
switch (shapeType) {
case 'circle': {
const nodeWidth = node.width || 100;
const radius = nodeWidth / 2;
iconX = -radius + iconSize / 2 + iconPadding;
iconY = 0;
break;
}
default: {
const nodeWidth = node.width || 100;
iconX = -nodeWidth / 2 + iconSize / 2 + iconPadding;
iconY = 0;
break;
}
}
iconElem.attr('transform', `translate(${iconX}, ${iconY})`);
iconElem.attr('style', 'color: currentColor;');
return;
}
} catch (error) {
log.debug('SVG icon rendering failed, falling back to CSS:', error);
}
// Fallback to CSS approach (original mindmap behavior)
const iconClass = isCssFormat ? node.icon : node.icon.replace(':', ' ');
let iconX = 0;
const iconY = -iconSize / 2;
switch (shapeType) {
case 'circle': {
const nodeWidth = node.width || 100;
const radius = nodeWidth / 2;
iconX = -radius + iconPadding;
break;
}
default: {
const nodeWidth = node.width || 100;
iconX = -nodeWidth / 2 + iconPadding;
break;
}
}
const icon = parentElement
.append('foreignObject')
.attr('height', `${iconSize}px`)
.attr('width', `${iconSize}px`)
.attr('x', iconX)
.attr('y', iconY)
.attr(
'style',
'text-align: center; display: flex; align-items: center; justify-content: center;'
);
icon
.append('div')
.attr('class', 'icon-container')
.attr(
'style',
'width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;'
)
.append('i')
.attr('class', `node-icon-${section} ${iconClass}`)
.attr('style', `font-size: ${iconSize}px;`);
}

View File

@@ -7,7 +7,6 @@ import type { LayoutData } from '../../rendering-util/types.js';
import type { FilledMindMapNode } from './mindmapTypes.js';
import defaultConfig from '../../defaultConfig.js';
import type { MindmapDB } from './mindmapDb.js';
import { getMindmapIconConfig, insertMindmapIcon } from './mindmapIconHelper.js';
/**
* Update the layout data with actual node dimensions after drawing
@@ -72,28 +71,6 @@ export const draw: DrawDefinition = async (text, id, _version, diagObj) => {
// Use the unified rendering system
await render(data4Layout, svg);
const genericShapes = ['hexagon', 'rect', 'rounded', 'squareRect'];
const nodesWithIcons = data4Layout.nodes.filter(
(node) => node.icon && genericShapes.includes(node.shape || '')
);
if (nodesWithIcons.length > 0) {
for (const node of nodesWithIcons) {
const nodeId = node.domId || node.id;
const nodeElement = svg.select(`g[id="${nodeId}"]`);
if (!nodeElement.empty()) {
try {
const iconConfig = getMindmapIconConfig(node.shape || 'default');
await insertMindmapIcon(nodeElement, node, iconConfig);
} catch (error) {
log.warn(`Failed to add icon to ${nodeId}:`, error);
}
} else {
log.warn(`Could not find DOM element for node ${nodeId}`);
}
}
}
// Setup the view box and size of the svg element using config from data4Layout
setupViewPortForSVG(

View File

@@ -7,11 +7,6 @@ import rough from 'roughjs';
import type { D3Selection } from '../../../types.js';
import { handleUndefinedAttr } from '../../../utils.js';
import type { Bounds, Point } from '../../../types.js';
import {
calculateMindmapDimensions,
getMindmapIconConfig,
insertMindmapIcon,
} from '../../../diagrams/mindmap/mindmapIconHelper.js';
export async function bang<T extends SVGGraphicsElement>(parent: D3Selection<T>, node: Node) {
const { labelStyles, nodeStyles } = styles2String(node);
@@ -22,34 +17,20 @@ export async function bang<T extends SVGGraphicsElement>(parent: D3Selection<T>,
getNodeClasses(node)
);
const baseWidth = bbox.width + 10 * halfPadding;
const baseHeight = bbox.height + 8 * halfPadding;
const iconConfig = getMindmapIconConfig('bang');
const dimensions = calculateMindmapDimensions(
node,
bbox,
baseWidth,
baseHeight,
halfPadding,
iconConfig
);
const w = dimensions.width;
const h = dimensions.height;
node.width = w;
node.height = h;
const w = bbox.width + 10 * halfPadding;
const h = bbox.height + 8 * halfPadding;
const r = 0.15 * w;
const { cssStyles } = node;
const minWidth = bbox.width + 20;
const minHeight = bbox.height + 20;
const effectiveWidth = Math.max(w, minWidth);
const effectiveHeight = Math.max(h, minHeight);
label.attr('transform', `translate(${dimensions.labelOffset.x}, ${dimensions.labelOffset.y})`);
label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);
const r = 0.15 * effectiveWidth;
const path = `M0 0
let bangElem;
const path = `M0 0
a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${-1 * effectiveHeight * 0.1}
a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0}
a${r},${r} 1 0,0 ${effectiveWidth * 0.25},${0}
@@ -69,16 +50,13 @@ export async function bang<T extends SVGGraphicsElement>(parent: D3Selection<T>,
a${r},${r} 1 0,0 ${effectiveWidth * 0.1},${-1 * effectiveHeight * 0.33}
H0 V0 Z`;
let bangElem;
if (node.look === 'handDrawn') {
// @ts-expect-error -- Passing a D3.Selection seems to work for some reason
const rc = rough.svg(shapeSvg);
const options = userNodeOverrides(node, {});
const roughNode = rc.path(path, options);
bangElem = shapeSvg.insert(() => roughNode, ':first-child');
bangElem
.attr('class', 'basic label-container')
.attr('style', handleUndefinedAttr(node.cssStyles));
bangElem.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));
} else {
bangElem = shapeSvg
.insert('path', ':first-child')
@@ -90,10 +68,6 @@ export async function bang<T extends SVGGraphicsElement>(parent: D3Selection<T>,
// Translate the path (center the shape)
bangElem.attr('transform', `translate(${-effectiveWidth / 2}, ${-effectiveHeight / 2})`);
if (node.icon) {
await insertMindmapIcon(shapeSvg, node, iconConfig);
}
updateNodeBounds(node, bangElem);
node.calcIntersect = function (bounds: Bounds, point: Point) {
return intersect.rect(bounds, point);

View File

@@ -14,25 +14,9 @@ export async function circle<T extends SVGGraphicsElement>(
) {
const { labelStyles, nodeStyles } = styles2String(node);
node.labelStyle = labelStyles;
const { shapeSvg, bbox, halfPadding, label } = await labelHelper(
parent,
node,
getNodeClasses(node)
);
const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node));
const padding = options?.padding ?? halfPadding;
const radius = bbox.width / 2 + padding;
node.width = radius * 2;
node.height = radius * 2;
const labelXOffset = -bbox.width / 2;
const labelYOffset = -bbox.height / 2;
if (node.icon) {
label.attr('transform', `translate(${labelXOffset}, ${labelYOffset})`);
}
let circleElem;
const { cssStyles } = node;

View File

@@ -6,11 +6,6 @@ import type { Node } from '../../types.js';
import intersect from '../intersect/index.js';
import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';
import { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';
import {
getMindmapIconConfig,
calculateMindmapDimensions,
insertMindmapIcon,
} from '../../../diagrams/mindmap/mindmapIconHelper.js';
export async function cloud<T extends SVGGraphicsElement>(parent: D3Selection<T>, node: Node) {
const { labelStyles, nodeStyles } = styles2String(node);
@@ -22,26 +17,8 @@ export async function cloud<T extends SVGGraphicsElement>(parent: D3Selection<T>
getNodeClasses(node)
);
const baseWidth = bbox.width + 2 * halfPadding;
const baseHeight = bbox.height + 2 * halfPadding;
const iconConfig = getMindmapIconConfig('cloud');
const dimensions = calculateMindmapDimensions(
node,
bbox,
baseWidth,
baseHeight,
halfPadding,
iconConfig
);
const w = dimensions.width;
const h = dimensions.height;
node.width = w;
node.height = h;
label.attr('transform', `translate(${dimensions.labelOffset.x}, ${dimensions.labelOffset.y})`);
const w = bbox.width + 2 * halfPadding;
const h = bbox.height + 2 * halfPadding;
// Cloud radii
const r1 = 0.15 * w;
@@ -84,13 +61,11 @@ export async function cloud<T extends SVGGraphicsElement>(parent: D3Selection<T>
.attr('d', path);
}
label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);
// Center the shape
cloudElem.attr('transform', `translate(${-w / 2}, ${-h / 2})`);
if (node.icon) {
await insertMindmapIcon(shapeSvg, node, iconConfig);
}
updateNodeBounds(node, cloudElem);
node.calcIntersect = function (bounds: Bounds, point: Point) {

View File

@@ -3,11 +3,6 @@ import type { Node } from '../../types.js';
import intersect from '../intersect/index.js';
import { styles2String } from './handDrawnShapeStyles.js';
import { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';
import {
getMindmapIconConfig,
calculateMindmapDimensions,
insertMindmapIcon,
} from '../../../diagrams/mindmap/mindmapIconHelper.js';
export async function defaultMindmapNode<T extends SVGGraphicsElement>(
parent: D3Selection<T>,
@@ -22,38 +17,22 @@ export async function defaultMindmapNode<T extends SVGGraphicsElement>(
getNodeClasses(node)
);
const baseWidth = bbox.width + 8 * halfPadding;
const baseHeight = bbox.height + 2 * halfPadding;
const w = bbox.width + 8 * halfPadding;
const h = bbox.height + 2 * halfPadding;
const rd = 5;
const iconConfig = getMindmapIconConfig('default');
const dimensions = calculateMindmapDimensions(
node,
bbox,
baseWidth,
baseHeight,
halfPadding,
iconConfig
);
const w = dimensions.width;
const h = dimensions.height;
node.width = w;
node.height = h;
label.attr('transform', `translate(${dimensions.labelOffset.x}, ${dimensions.labelOffset.y})`);
const RD = 5;
const rectPath = `M${-w / 2} ${h / 2 - RD}
v${-h + 2 * RD}
q0,-${RD} ${RD},-${RD}
h${w - 2 * RD}
q${RD},0 ${RD},${RD}
v${h - 2 * RD}
q0,${RD} -${RD},${RD}
h${-w + 2 * RD}
q-${RD},0 -${RD},-${RD}
Z`;
const rectPath = `
M${-w / 2} ${h / 2 - rd}
v${-h + 2 * rd}
q0,-${rd} ${rd},-${rd}
h${w - 2 * rd}
q${rd},0 ${rd},${rd}
v${h - 2 * rd}
q0,${rd} -${rd},${rd}
h${-w + 2 * rd}
q-${rd},0 -${rd},-${rd}
Z
`;
const bg = shapeSvg
.append('path')
@@ -70,12 +49,9 @@ export async function defaultMindmapNode<T extends SVGGraphicsElement>(
.attr('x2', w / 2)
.attr('y2', h / 2);
label.attr('transform', `translate(${-bbox.width / 2}, ${-bbox.height / 2})`);
shapeSvg.append(() => label.node());
if (node.icon) {
await insertMindmapIcon(shapeSvg, node, iconConfig);
}
updateNodeBounds(node, bg);
node.calcIntersect = function (bounds: Bounds, point: Point) {
return intersect.rect(bounds, point);

View File

@@ -15,21 +15,11 @@ export async function drawRect<T extends SVGGraphicsElement>(
) {
const { labelStyles, nodeStyles } = styles2String(node);
node.labelStyle = labelStyles;
const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));
// console.log('IPI labelStyles:', labelStyles);
const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));
const totalWidth = Math.max(bbox.width + options.labelPaddingX * 2, node?.width || 0);
const totalHeight = Math.max(bbox.height + options.labelPaddingY * 2, node?.height || 0);
node.width = totalWidth;
node.height = totalHeight;
const labelXOffset = -bbox.width / 2;
const labelYOffset = -bbox.height / 2;
if (node.icon) {
label.attr('transform', `translate(${labelXOffset}, ${labelYOffset})`);
}
const x = -totalWidth / 2;
const y = -totalHeight / 2;

View File

@@ -26,22 +26,10 @@ export const createHexagonPathD = (
export async function hexagon<T extends SVGGraphicsElement>(parent: D3Selection<T>, node: Node) {
const { labelStyles, nodeStyles } = styles2String(node);
node.labelStyle = labelStyles;
const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));
const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));
const h = bbox.height + (node.padding ?? 0);
const w = bbox.width + (node.padding ?? 0) * 2.5;
node.width = w;
node.height = h;
const labelXOffset = -bbox.width / 2;
const labelYOffset = -bbox.height / 2;
if (node.icon) {
label.attr('transform', `translate(${labelXOffset}, ${labelYOffset})`);
}
const { cssStyles } = node;
// @ts-expect-error -- Passing a D3.Selection seems to work for some reason
const rc = rough.svg(shapeSvg);
@@ -86,6 +74,9 @@ export async function hexagon<T extends SVGGraphicsElement>(parent: D3Selection<
polygon.selectChildren('path').attr('style', nodeStyles);
}
node.width = w;
node.height = h;
updateNodeBounds(node, polygon);
node.intersect = function (point) {

View File

@@ -1,57 +1,13 @@
import type { Node } from '../../types.js';
import { circle } from './circle.js';
import type { Node, MindmapOptions } from '../../types.js';
import type { D3Selection } from '../../../types.js';
import { getNodeClasses, labelHelper, updateNodeBounds } from './util.js';
import { styles2String } from './handDrawnShapeStyles.js';
import intersect from '../intersect/index.js';
import {
getMindmapIconConfig,
calculateMindmapDimensions,
insertMindmapIcon,
} from '../../../diagrams/mindmap/mindmapIconHelper.js';
export async function mindmapCircle<T extends SVGGraphicsElement>(
parent: D3Selection<T>,
node: Node
) {
const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));
const halfPadding = (node.padding ?? 0) / 2;
const iconConfig = getMindmapIconConfig('circle');
const baseRadius = bbox.width / 2 + halfPadding;
const baseDiameter = baseRadius * 2;
const dimensions = calculateMindmapDimensions(
node,
bbox,
baseDiameter,
baseDiameter,
halfPadding,
iconConfig
);
const radius = dimensions.width / 2;
node.width = dimensions.width;
node.height = dimensions.height;
label.attr('transform', `translate(${dimensions.labelOffset.x}, ${dimensions.labelOffset.y})`);
const circle = shapeSvg
.insert('circle', ':first-child')
.attr('r', radius)
.attr('class', 'basic label-container')
.attr('style', styles2String(node).nodeStyles);
shapeSvg.append(() => label.node());
if (node.icon) {
await insertMindmapIcon(shapeSvg, node, iconConfig);
}
updateNodeBounds(node, circle);
node.intersect = function (point) {
return intersect.circle(node, radius, point);
};
return shapeSvg;
const options = {
padding: node.padding ?? 0,
} as MindmapOptions;
return circle(parent, node, options);
}

View File

@@ -2,8 +2,8 @@ import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } f
import intersect from '../intersect/index.js';
import type { Node } from '../../types.js';
import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';
import type { D3Selection } from '../../../types.js';
import rough from 'roughjs';
import type { D3Selection } from '../../../types.js';
/**
* Generates evenly spaced points along an elliptical arc connecting two points.
@@ -91,20 +91,13 @@ export async function roundedRect<T extends SVGGraphicsElement>(
) {
const { labelStyles, nodeStyles } = styles2String(node);
node.labelStyle = labelStyles;
const { shapeSvg, bbox, label } = await labelHelper(parent, node, getNodeClasses(node));
const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));
const labelPaddingX = node?.padding ?? 0;
const labelPaddingY = node?.padding ?? 0;
const w = (node?.width ? node?.width : bbox.width) + labelPaddingX * 2;
const h = (node?.height ? node?.height : bbox.height) + labelPaddingY * 2;
const labelXOffset = -bbox.width / 2;
if (node.icon) {
label.attr('transform', `translate(${labelXOffset}, ${-bbox.height / 2})`);
}
const radius = node.radius || 5;
const taper = node.taper || 5; // Taper width for the rounded corners
const { cssStyles } = node;

View File

@@ -84,7 +84,6 @@ interface BaseNode {
radius?: number;
taper?: number;
stroke?: string;
section?: number;
}
/**

275
pnpm-lock.yaml generated
View File

@@ -27,13 +27,13 @@ importers:
version: 2.29.7(@types/node@22.18.6)
'@cspell/eslint-plugin':
specifier: ^8.19.4
version: 8.19.4(eslint@9.35.0(jiti@2.5.1))
version: 8.19.4(eslint@9.37.0(jiti@2.5.1))
'@cypress/code-coverage':
specifier: ^3.14.6
version: 3.14.6(@babel/core@7.28.4)(@babel/preset-env@7.28.3(@babel/core@7.28.4))(babel-loader@10.0.0(@babel/core@7.28.4)(webpack@5.101.3(esbuild@0.25.10)))(cypress@14.5.4)(webpack@5.101.3(esbuild@0.25.10))
'@eslint/js':
specifier: ^9.26.0
version: 9.35.0
specifier: ^9.37.0
version: 9.37.0
'@rollup/plugin-typescript':
specifier: ^12.1.4
version: 12.1.4(rollup@4.50.2)(tslib@2.8.1)(typescript@5.7.3)
@@ -104,32 +104,32 @@ importers:
specifier: ^0.25.10
version: 0.25.10
eslint:
specifier: ^9.26.0
version: 9.35.0(jiti@2.5.1)
specifier: ^9.37.0
version: 9.37.0(jiti@2.5.1)
eslint-config-prettier:
specifier: ^10.1.8
version: 10.1.8(eslint@9.35.0(jiti@2.5.1))
version: 10.1.8(eslint@9.37.0(jiti@2.5.1))
eslint-plugin-cypress:
specifier: ^4.3.0
version: 4.3.0(eslint@9.35.0(jiti@2.5.1))
version: 4.3.0(eslint@9.37.0(jiti@2.5.1))
eslint-plugin-html:
specifier: ^8.1.3
version: 8.1.3
eslint-plugin-jest:
specifier: ^28.14.0
version: 28.14.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(jest@30.1.3(@types/node@22.18.6))(typescript@5.7.3)
version: 28.14.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(jest@30.1.3(@types/node@22.18.6))(typescript@5.7.3)
eslint-plugin-jsdoc:
specifier: ^50.8.0
version: 50.8.0(eslint@9.35.0(jiti@2.5.1))
version: 50.8.0(eslint@9.37.0(jiti@2.5.1))
eslint-plugin-json:
specifier: ^4.0.1
version: 4.0.1
eslint-plugin-lodash:
specifier: ^8.0.0
version: 8.0.0(eslint@9.35.0(jiti@2.5.1))
version: 8.0.0(eslint@9.37.0(jiti@2.5.1))
eslint-plugin-markdown:
specifier: ^5.1.0
version: 5.1.0(eslint@9.35.0(jiti@2.5.1))
version: 5.1.0(eslint@9.37.0(jiti@2.5.1))
eslint-plugin-no-only-tests:
specifier: ^3.3.0
version: 3.3.0
@@ -138,7 +138,7 @@ importers:
version: 0.4.0
eslint-plugin-unicorn:
specifier: ^59.0.1
version: 59.0.1(eslint@9.35.0(jiti@2.5.1))
version: 59.0.1(eslint@9.37.0(jiti@2.5.1))
express:
specifier: ^5.1.0
version: 5.1.0
@@ -203,8 +203,8 @@ importers:
specifier: ~5.7.3
version: 5.7.3
typescript-eslint:
specifier: ^8.38.0
version: 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
specifier: ^8.45.0
version: 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
vite:
specifier: ^7.0.7
version: 7.1.5(@types/node@22.18.6)(jiti@2.5.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)
@@ -2161,24 +2161,24 @@ packages:
resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/config-helpers@0.3.1':
resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==}
'@eslint/config-helpers@0.4.0':
resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.13.0':
resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.15.2':
resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
'@eslint/core@0.16.0':
resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.35.0':
resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==}
'@eslint/js@9.37.0':
resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6':
@@ -2189,8 +2189,8 @@ packages:
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.3.5':
resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
'@eslint/plugin-kit@0.4.0':
resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@fastify/ajv-compiler@3.6.0':
@@ -3242,16 +3242,16 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/eslint-plugin@8.43.0':
resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==}
'@typescript-eslint/eslint-plugin@8.45.0':
resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.43.0
'@typescript-eslint/parser': ^8.45.0
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.43.0':
resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==}
'@typescript-eslint/parser@8.45.0':
resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -3263,18 +3263,34 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.45.0':
resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.43.0':
resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.45.0':
resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.43.0':
resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.43.0':
resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==}
'@typescript-eslint/tsconfig-utils@8.45.0':
resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.45.0':
resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -3284,12 +3300,22 @@ packages:
resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.45.0':
resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.43.0':
resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/typescript-estree@8.45.0':
resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.43.0':
resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3297,10 +3323,21 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.45.0':
resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.43.0':
resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.45.0':
resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@@ -5439,8 +5476,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.35.0:
resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==}
eslint@9.37.0:
resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -9145,8 +9182,8 @@ packages:
peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x
typescript-eslint@8.43.0:
resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==}
typescript-eslint@8.45.0:
resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -11554,12 +11591,12 @@ snapshots:
'@cspell/url': 9.2.1
import-meta-resolve: 4.2.0
'@cspell/eslint-plugin@8.19.4(eslint@9.35.0(jiti@2.5.1))':
'@cspell/eslint-plugin@8.19.4(eslint@9.37.0(jiti@2.5.1))':
dependencies:
'@cspell/cspell-types': 8.19.4
'@cspell/url': 8.19.4
cspell-lib: 8.19.4
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
synckit: 0.11.11
'@cspell/filetypes@8.19.4': {}
@@ -11856,9 +11893,9 @@ snapshots:
'@esbuild/win32-x64@0.25.10':
optional: true
'@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.5.1))':
'@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.5.1))':
dependencies:
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
@@ -11871,13 +11908,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/config-helpers@0.3.1': {}
'@eslint/config-helpers@0.4.0':
dependencies:
'@eslint/core': 0.16.0
'@eslint/core@0.13.0':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/core@0.15.2':
'@eslint/core@0.16.0':
dependencies:
'@types/json-schema': 7.0.15
@@ -11895,7 +11934,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/js@9.35.0': {}
'@eslint/js@9.37.0': {}
'@eslint/object-schema@2.1.6': {}
@@ -11904,9 +11943,9 @@ snapshots:
'@eslint/core': 0.13.0
levn: 0.4.1
'@eslint/plugin-kit@0.3.5':
'@eslint/plugin-kit@0.4.0':
dependencies:
'@eslint/core': 0.15.2
'@eslint/core': 0.16.0
levn: 0.4.1
'@fastify/ajv-compiler@3.6.0':
@@ -13119,15 +13158,15 @@ snapshots:
'@types/node': 22.18.6
optional: true
'@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)':
'@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/scope-manager': 8.43.0
'@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.43.0
eslint: 9.35.0(jiti@2.5.1)
'@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/scope-manager': 8.45.0
'@typescript-eslint/type-utils': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.45.0
eslint: 9.37.0(jiti@2.5.1)
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
@@ -13136,14 +13175,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)':
'@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.43.0
'@typescript-eslint/types': 8.43.0
'@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.43.0
'@typescript-eslint/scope-manager': 8.45.0
'@typescript-eslint/types': 8.45.0
'@typescript-eslint/typescript-estree': 8.45.0(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.45.0
debug: 4.4.3(supports-color@8.1.1)
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@@ -13157,22 +13196,40 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.45.0(typescript@5.7.3)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.7.3)
'@typescript-eslint/types': 8.45.0
debug: 4.4.3(supports-color@8.1.1)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@8.43.0':
dependencies:
'@typescript-eslint/types': 8.43.0
'@typescript-eslint/visitor-keys': 8.43.0
'@typescript-eslint/scope-manager@8.45.0':
dependencies:
'@typescript-eslint/types': 8.45.0
'@typescript-eslint/visitor-keys': 8.45.0
'@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.7.3)':
dependencies:
typescript: 5.7.3
'@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)':
'@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.7.3)':
dependencies:
'@typescript-eslint/types': 8.43.0
'@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
typescript: 5.7.3
'@typescript-eslint/type-utils@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/types': 8.45.0
'@typescript-eslint/typescript-estree': 8.45.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
debug: 4.4.3(supports-color@8.1.1)
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
ts-api-utils: 2.1.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
@@ -13180,6 +13237,8 @@ snapshots:
'@typescript-eslint/types@8.43.0': {}
'@typescript-eslint/types@8.45.0': {}
'@typescript-eslint/typescript-estree@8.43.0(typescript@5.7.3)':
dependencies:
'@typescript-eslint/project-service': 8.43.0(typescript@5.7.3)
@@ -13196,13 +13255,40 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)':
'@typescript-eslint/typescript-estree@8.45.0(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1))
'@typescript-eslint/project-service': 8.45.0(typescript@5.7.3)
'@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.7.3)
'@typescript-eslint/types': 8.45.0
'@typescript-eslint/visitor-keys': 8.45.0
debug: 4.4.3(supports-color@8.1.1)
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.2
ts-api-utils: 2.1.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.43.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1))
'@typescript-eslint/scope-manager': 8.43.0
'@typescript-eslint/types': 8.43.0
'@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3)
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1))
'@typescript-eslint/scope-manager': 8.45.0
'@typescript-eslint/types': 8.45.0
'@typescript-eslint/typescript-estree': 8.45.0(typescript@5.7.3)
eslint: 9.37.0(jiti@2.5.1)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@@ -13212,6 +13298,11 @@ snapshots:
'@typescript-eslint/types': 8.43.0
eslint-visitor-keys: 4.2.1
'@typescript-eslint/visitor-keys@8.45.0':
dependencies:
'@typescript-eslint/types': 8.45.0
eslint-visitor-keys: 4.2.1
'@ungap/structured-clone@1.3.0': {}
'@unocss/astro@66.5.1(vite@7.1.5(@types/node@22.18.6)(jiti@2.5.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))':
@@ -15688,38 +15779,38 @@ snapshots:
optionalDependencies:
source-map: 0.6.1
eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.5.1)):
eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.5.1)):
dependencies:
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
eslint-plugin-cypress@4.3.0(eslint@9.35.0(jiti@2.5.1)):
eslint-plugin-cypress@4.3.0(eslint@9.37.0(jiti@2.5.1)):
dependencies:
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
globals: 15.15.0
eslint-plugin-html@8.1.3:
dependencies:
htmlparser2: 10.0.0
eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(jest@30.1.3(@types/node@22.18.6))(typescript@5.7.3):
eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(jest@30.1.3(@types/node@22.18.6))(typescript@5.7.3):
dependencies:
'@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
eslint: 9.35.0(jiti@2.5.1)
'@typescript-eslint/utils': 8.43.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
eslint: 9.37.0(jiti@2.5.1)
optionalDependencies:
'@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
jest: 30.1.3(@types/node@22.18.6)
transitivePeerDependencies:
- supports-color
- typescript
eslint-plugin-jsdoc@50.8.0(eslint@9.35.0(jiti@2.5.1)):
eslint-plugin-jsdoc@50.8.0(eslint@9.37.0(jiti@2.5.1)):
dependencies:
'@es-joy/jsdoccomment': 0.50.2
are-docs-informative: 0.0.2
comment-parser: 1.4.1
debug: 4.4.3(supports-color@8.1.1)
escape-string-regexp: 4.0.0
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
espree: 10.4.0
esquery: 1.6.0
parse-imports-exports: 0.2.4
@@ -15733,14 +15824,14 @@ snapshots:
lodash: 4.17.21
vscode-json-languageservice: 4.2.1
eslint-plugin-lodash@8.0.0(eslint@9.35.0(jiti@2.5.1)):
eslint-plugin-lodash@8.0.0(eslint@9.37.0(jiti@2.5.1)):
dependencies:
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
lodash: 4.17.21
eslint-plugin-markdown@5.1.0(eslint@9.35.0(jiti@2.5.1)):
eslint-plugin-markdown@5.1.0(eslint@9.37.0(jiti@2.5.1)):
dependencies:
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
mdast-util-from-markdown: 0.8.5
transitivePeerDependencies:
- supports-color
@@ -15752,15 +15843,15 @@ snapshots:
'@microsoft/tsdoc': 0.15.1
'@microsoft/tsdoc-config': 0.17.1
eslint-plugin-unicorn@59.0.1(eslint@9.35.0(jiti@2.5.1)):
eslint-plugin-unicorn@59.0.1(eslint@9.37.0(jiti@2.5.1)):
dependencies:
'@babel/helper-validator-identifier': 7.27.1
'@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1))
'@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1))
'@eslint/plugin-kit': 0.2.8
ci-info: 4.3.0
clean-regexp: 1.0.0
core-js-compat: 3.45.1
eslint: 9.35.0(jiti@2.5.1)
eslint: 9.37.0(jiti@2.5.1)
esquery: 1.6.0
find-up-simple: 1.0.1
globals: 16.4.0
@@ -15787,16 +15878,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
eslint@9.35.0(jiti@2.5.1):
eslint@9.37.0(jiti@2.5.1):
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.5.1))
'@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.21.0
'@eslint/config-helpers': 0.3.1
'@eslint/core': 0.15.2
'@eslint/config-helpers': 0.4.0
'@eslint/core': 0.16.0
'@eslint/eslintrc': 3.3.1
'@eslint/js': 9.35.0
'@eslint/plugin-kit': 0.3.5
'@eslint/js': 9.37.0
'@eslint/plugin-kit': 0.4.0
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
@@ -20266,13 +20357,13 @@ snapshots:
typescript: 5.7.3
yaml: 2.8.1
typescript-eslint@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3):
typescript-eslint@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/typescript-estree': 8.43.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.7.3)
eslint: 9.35.0(jiti@2.5.1)
'@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/parser': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
'@typescript-eslint/typescript-estree': 8.45.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.45.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.7.3)
eslint: 9.37.0(jiti@2.5.1)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color