mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-31 06:06:44 +02:00
Compare commits
98 Commits
@mermaid-j
...
6638-seque
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c40faac80d | ||
![]() |
82800a2c84 | ||
![]() |
27e700debd | ||
![]() |
01e47333d5 | ||
![]() |
d47ba7c2d1 | ||
![]() |
b1c4eb3f5c | ||
![]() |
310fcd2292 | ||
![]() |
04b6fc1280 | ||
![]() |
c530baed3f | ||
![]() |
f46a151075 | ||
![]() |
b7e9d02b7c | ||
![]() |
00f5700320 | ||
![]() |
e32dc8513f | ||
![]() |
50127f3ffe | ||
![]() |
29bb0e3dca | ||
![]() |
1221de4c2d | ||
![]() |
c41e08cb7a | ||
![]() |
4760ed8893 | ||
![]() |
31ecf31c2e | ||
![]() |
b52766653c | ||
![]() |
6d9fad01a9 | ||
![]() |
8322a63598 | ||
![]() |
075e1b5e1f | ||
![]() |
045699de10 | ||
![]() |
3c9bd7be29 | ||
![]() |
6995248443 | ||
![]() |
93467a6fce | ||
![]() |
95d48e3497 | ||
![]() |
1988d24227 | ||
![]() |
39f90debe7 | ||
![]() |
29886b8dd4 | ||
![]() |
e438e035bc | ||
![]() |
2bc5b6d2fa | ||
![]() |
e0b45c2d2b | ||
![]() |
d4c76968e9 | ||
![]() |
73e9849f99 | ||
![]() |
5a05540a5f | ||
![]() |
2cfebef122 | ||
![]() |
c0e2d4a23b | ||
![]() |
7171237b96 | ||
![]() |
066883f4cd | ||
![]() |
2b58df9665 | ||
![]() |
7bdcf93412 | ||
![]() |
d86e46b705 | ||
![]() |
71e09bcaef | ||
![]() |
c534d3d364 | ||
![]() |
4db72f5357 | ||
![]() |
cba659d097 | ||
![]() |
f7a0844a31 | ||
![]() |
2817383714 | ||
![]() |
80c6faf4d5 | ||
![]() |
9f6ee53382 | ||
![]() |
3248bf3da4 | ||
![]() |
0b42bdba07 | ||
![]() |
e7a7ff8a2a | ||
![]() |
68fc68c239 | ||
![]() |
769b362005 | ||
![]() |
e4d3aa4610 | ||
![]() |
716548548a | ||
![]() |
4bece53a3c | ||
![]() |
297be4a868 | ||
![]() |
fb6ace73b5 | ||
![]() |
bf362673fc | ||
![]() |
d042b21b12 | ||
![]() |
677ff82d13 | ||
![]() |
981829a426 | ||
![]() |
327a5aa9fd | ||
![]() |
74c96db3e2 | ||
![]() |
bd47c57eaf | ||
![]() |
3e5d2db514 | ||
![]() |
848f69a75c | ||
![]() |
99dbeba407 | ||
![]() |
d525acc05b | ||
![]() |
40990bb096 | ||
![]() |
4915545429 | ||
![]() |
7ca0665764 | ||
![]() |
334fe87bc6 | ||
![]() |
283e7810d2 | ||
![]() |
81a6a361ab | ||
![]() |
237d01d510 | ||
![]() |
62faacdeeb | ||
![]() |
0e40d8e8a8 | ||
![]() |
e8d6daf4f6 | ||
![]() |
cb4ed605b2 | ||
![]() |
ba9db26bfa | ||
![]() |
252b1837f7 | ||
![]() |
6b9c15d7f0 | ||
![]() |
fda640c90c | ||
![]() |
584a789183 | ||
![]() |
afeb761296 | ||
![]() |
3abcfbb8d2 | ||
![]() |
ee82694645 | ||
![]() |
012530e98e | ||
![]() |
a4a27611dd | ||
![]() |
5055ade44e | ||
![]() |
b61bec8faf | ||
![]() |
76d073b027 | ||
![]() |
cc476d59d1 |
5
.changeset/crazy-loops-matter.md
Normal file
5
.changeset/crazy-loops-matter.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Handle arrows correctly when auto number is enabled
|
5
.changeset/hungry-baths-glow.md
Normal file
5
.changeset/hungry-baths-glow.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Added support for new participant types (`actor`, `boundary`, `control`, `entity`, `database`, `collections`, `queue`) in `sequenceDiagram`.
|
5
.changeset/loud-results-melt.md
Normal file
5
.changeset/loud-results-melt.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Add half-arrowheads (solid & stick) and central connection support
|
3
.github/workflows/e2e-applitools.yml
vendored
3
.github/workflows/e2e-applitools.yml
vendored
@@ -23,9 +23,6 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
e2e-applitools:
|
e2e-applitools:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
|
||||||
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
|
||||||
options: --user 1001
|
|
||||||
steps:
|
steps:
|
||||||
- if: ${{ ! env.USE_APPLI }}
|
- if: ${{ ! env.USE_APPLI }}
|
||||||
name: Warn if not using Applitools
|
name: Warn if not using Applitools
|
||||||
|
2
.github/workflows/e2e-timings.yml
vendored
2
.github/workflows/e2e-timings.yml
vendored
@@ -58,7 +58,7 @@ jobs:
|
|||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Commit and create pull request
|
- name: Commit and create pull request
|
||||||
uses: peter-evans/create-pull-request@1310d7dab503600742045e6fd4b84dda64352858
|
uses: peter-evans/create-pull-request@18e469570b1cf0dfc11d60ec121099f8ff3e617a
|
||||||
with:
|
with:
|
||||||
add-paths: |
|
add-paths: |
|
||||||
cypress/timings.json
|
cypress/timings.json
|
||||||
|
659
cypress/integration/rendering/sequencediagram-v2.spec.js
Normal file
659
cypress/integration/rendering/sequencediagram-v2.spec.js
Normal file
@@ -0,0 +1,659 @@
|
|||||||
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
const looks = ['classic'];
|
||||||
|
const participantTypes = [
|
||||||
|
{ type: 'participant', display: 'participant' },
|
||||||
|
{ type: 'actor', display: 'actor' },
|
||||||
|
{ type: 'boundary', display: 'boundary' },
|
||||||
|
{ type: 'control', display: 'control' },
|
||||||
|
{ type: 'entity', display: 'entity' },
|
||||||
|
{ type: 'database', display: 'database' },
|
||||||
|
{ type: 'collections', display: 'collections' },
|
||||||
|
{ type: 'queue', display: 'queue' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const restrictedTypes = ['boundary', 'control', 'entity', 'database', 'collections', 'queue'];
|
||||||
|
|
||||||
|
const interactionTypes = ['->>', '-->>', '->', '-->', '-x', '--x', '->>+', '-->>+'];
|
||||||
|
|
||||||
|
const notePositions = ['left of', 'right of', 'over'];
|
||||||
|
|
||||||
|
function getParticipantLine(name, type, alias) {
|
||||||
|
if (restrictedTypes.includes(type)) {
|
||||||
|
return ` participant ${name}@{ "type" : "${type}" }\n`;
|
||||||
|
} else if (alias) {
|
||||||
|
return ` participant ${name}@{ "type" : "${type}" } \n`;
|
||||||
|
} else {
|
||||||
|
return ` participant ${name}@{ "type" : "${type}" }\n`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
looks.forEach((look) => {
|
||||||
|
describe(`Sequence Diagram Tests - ${look} look`, () => {
|
||||||
|
it('should render all participant types', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
participantTypes.forEach((pt, index) => {
|
||||||
|
const name = `${pt.display}${index}`;
|
||||||
|
diagramCode += getParticipantLine(name, pt.type);
|
||||||
|
});
|
||||||
|
for (let i = 0; i < participantTypes.length - 1; i++) {
|
||||||
|
diagramCode += ` ${participantTypes[i].display}${i} ->> ${participantTypes[i + 1].display}${i + 1}: Message ${i}\n`;
|
||||||
|
}
|
||||||
|
imgSnapshotTest(diagramCode, { look, sequence: { diagramMarginX: 50, diagramMarginY: 10 } });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render all interaction types', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
diagramCode += getParticipantLine('A', 'actor');
|
||||||
|
diagramCode += getParticipantLine('B', 'boundary');
|
||||||
|
interactionTypes.forEach((interaction, index) => {
|
||||||
|
diagramCode += ` A ${interaction} B: ${interaction} message ${index}\n`;
|
||||||
|
});
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render participant creation and destruction', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
participantTypes.forEach((pt, index) => {
|
||||||
|
const name = `${pt.display}${index}`;
|
||||||
|
diagramCode += getParticipantLine('A', pt.type);
|
||||||
|
diagramCode += getParticipantLine('B', pt.type);
|
||||||
|
diagramCode += ` create participant ${name}@{ "type" : "${pt.type}" }\n`;
|
||||||
|
diagramCode += ` A ->> ${name}: Hello ${pt.display}\n`;
|
||||||
|
if (index % 2 === 0) {
|
||||||
|
diagramCode += ` destroy ${name}\n`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render notes in all positions', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
diagramCode += getParticipantLine('A', 'actor');
|
||||||
|
diagramCode += getParticipantLine('B', 'boundary');
|
||||||
|
notePositions.forEach((position, index) => {
|
||||||
|
diagramCode += ` Note ${position} A: Note ${position} ${index}\n`;
|
||||||
|
});
|
||||||
|
diagramCode += ` A ->> B: Message with notes\n`;
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render parallel interactions', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
participantTypes.slice(0, 4).forEach((pt, index) => {
|
||||||
|
diagramCode += getParticipantLine(`${pt.display}${index}`, pt.type);
|
||||||
|
});
|
||||||
|
diagramCode += ` par Parallel actions\n`;
|
||||||
|
for (let i = 0; i < 3; i += 2) {
|
||||||
|
diagramCode += ` ${participantTypes[i].display}${i} ->> ${participantTypes[i + 1].display}${i + 1}: Message ${i}\n`;
|
||||||
|
if (i < participantTypes.length - 2) {
|
||||||
|
diagramCode += ` and\n`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diagramCode += ` end\n`;
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render alternative flows', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
diagramCode += getParticipantLine('A', 'actor');
|
||||||
|
diagramCode += getParticipantLine('B', 'boundary');
|
||||||
|
diagramCode += ` alt Successful case\n`;
|
||||||
|
diagramCode += ` A ->> B: Request\n`;
|
||||||
|
diagramCode += ` B -->> A: Success\n`;
|
||||||
|
diagramCode += ` else Failure case\n`;
|
||||||
|
diagramCode += ` A ->> B: Request\n`;
|
||||||
|
diagramCode += ` B --x A: Failure\n`;
|
||||||
|
diagramCode += ` end\n`;
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render loops', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
participantTypes.slice(0, 3).forEach((pt, index) => {
|
||||||
|
diagramCode += getParticipantLine(`${pt.display}${index}`, pt.type);
|
||||||
|
});
|
||||||
|
diagramCode += ` loop For each participant\n`;
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
diagramCode += ` ${participantTypes[0].display}0 ->> ${participantTypes[1].display}1: Message ${i}\n`;
|
||||||
|
}
|
||||||
|
diagramCode += ` end\n`;
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render boxes around groups', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
diagramCode += ` box Group 1\n`;
|
||||||
|
participantTypes.slice(0, 3).forEach((pt, index) => {
|
||||||
|
diagramCode += ` ${getParticipantLine(`${pt.display}${index}`, pt.type)}`;
|
||||||
|
});
|
||||||
|
diagramCode += ` end\n`;
|
||||||
|
diagramCode += ` box rgb(200,220,255) Group 2\n`;
|
||||||
|
participantTypes.slice(3, 6).forEach((pt, index) => {
|
||||||
|
diagramCode += ` ${getParticipantLine(`${pt.display}${index}`, pt.type)}`;
|
||||||
|
});
|
||||||
|
diagramCode += ` end\n`;
|
||||||
|
diagramCode += ` ${participantTypes[0].display}0 ->> ${participantTypes[3].display}0: Cross-group message\n`;
|
||||||
|
imgSnapshotTest(diagramCode, { look });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render with different font settings', () => {
|
||||||
|
let diagramCode = `sequenceDiagram\n`;
|
||||||
|
participantTypes.slice(0, 3).forEach((pt, index) => {
|
||||||
|
diagramCode += getParticipantLine(`${pt.display}${index}`, pt.type);
|
||||||
|
});
|
||||||
|
diagramCode += ` ${participantTypes[0].display}0 ->> ${participantTypes[1].display}1: Regular message\n`;
|
||||||
|
diagramCode += ` Note right of ${participantTypes[1].display}1: Regular note\n`;
|
||||||
|
imgSnapshotTest(diagramCode, {
|
||||||
|
look,
|
||||||
|
sequence: {
|
||||||
|
actorFontFamily: 'courier',
|
||||||
|
actorFontSize: 14,
|
||||||
|
messageFontFamily: 'Arial',
|
||||||
|
messageFontSize: 12,
|
||||||
|
noteFontFamily: 'times',
|
||||||
|
noteFontSize: 16,
|
||||||
|
noteAlign: 'left',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Additional tests for specific combinations
|
||||||
|
describe('Sequence Diagram Special Cases', () => {
|
||||||
|
it('should render complex sequence with all features', () => {
|
||||||
|
const diagramCode = `
|
||||||
|
sequenceDiagram
|
||||||
|
box rgb(200,220,255) Authentication
|
||||||
|
actor User
|
||||||
|
participant LoginUI@{ "type": "boundary" }
|
||||||
|
participant AuthService@{ "type": "control" }
|
||||||
|
participant UserDB@{ "type": "database" }
|
||||||
|
end
|
||||||
|
|
||||||
|
box rgb(200,255,220) Order Processing
|
||||||
|
participant Order@{ "type": "entity" }
|
||||||
|
participant OrderQueue@{ "type": "queue" }
|
||||||
|
participant AuditLogs@{ "type": "collections" }
|
||||||
|
end
|
||||||
|
|
||||||
|
User ->> LoginUI: Enter credentials
|
||||||
|
LoginUI ->> AuthService: Validate
|
||||||
|
AuthService ->> UserDB: Query user
|
||||||
|
UserDB -->> AuthService: User data
|
||||||
|
alt Valid credentials
|
||||||
|
AuthService -->> LoginUI: Success
|
||||||
|
LoginUI -->> User: Welcome
|
||||||
|
|
||||||
|
par Place order
|
||||||
|
User ->> Order: New order
|
||||||
|
Order ->> OrderQueue: Process
|
||||||
|
and
|
||||||
|
Order ->> AuditLogs: Record
|
||||||
|
end
|
||||||
|
|
||||||
|
loop Until confirmed
|
||||||
|
OrderQueue ->> Order: Update status
|
||||||
|
Order -->> User: Notification
|
||||||
|
end
|
||||||
|
else Invalid credentials
|
||||||
|
AuthService --x LoginUI: Failure
|
||||||
|
LoginUI --x User: Retry
|
||||||
|
end
|
||||||
|
`;
|
||||||
|
imgSnapshotTest(diagramCode, {});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render with wrapped messages and notes', () => {
|
||||||
|
const diagramCode = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant A
|
||||||
|
participant B
|
||||||
|
|
||||||
|
A ->> B: This is a very long message that should wrap properly in the diagram rendering
|
||||||
|
Note over A,B: This is a very long note that should also wrap properly when rendered in the diagram
|
||||||
|
|
||||||
|
par Wrapped parallel
|
||||||
|
A ->> B: Parallel message 1<br>with explicit line break
|
||||||
|
and
|
||||||
|
B ->> A: Parallel message 2<br>with explicit line break
|
||||||
|
end
|
||||||
|
|
||||||
|
loop Wrapped loop
|
||||||
|
Note right of B: This is a long note<br>in a loop
|
||||||
|
A ->> B: Message in loop
|
||||||
|
end
|
||||||
|
`;
|
||||||
|
imgSnapshotTest(diagramCode, { sequence: { wrap: true } });
|
||||||
|
});
|
||||||
|
describe('Sequence Diagram Rendering with Different Participant Types', () => {
|
||||||
|
it('should render a sequence diagram with various participant types', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant User@{ "type": "actor" }
|
||||||
|
participant AuthService@{ "type": "control" }
|
||||||
|
participant UI@{ "type": "boundary" }
|
||||||
|
participant OrderController@{ "type": "control" }
|
||||||
|
participant Product@{ "type": "entity" }
|
||||||
|
participant MongoDB@{ "type": "database" }
|
||||||
|
participant Products@{ "type": "collections" }
|
||||||
|
participant OrderQueue@{ "type": "queue" }
|
||||||
|
User ->> UI: Login request
|
||||||
|
UI ->> AuthService: Validate credentials
|
||||||
|
AuthService -->> UI: Authentication token
|
||||||
|
UI ->> OrderController: Place order
|
||||||
|
OrderController ->> Product: Check availability
|
||||||
|
Product -->> OrderController: Available
|
||||||
|
OrderController ->> MongoDB: Save order
|
||||||
|
MongoDB -->> OrderController: Order saved
|
||||||
|
OrderController ->> OrderQueue: Process payment
|
||||||
|
OrderQueue -->> User: Order confirmation
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render participant creation and destruction with different types', () => {
|
||||||
|
imgSnapshotTest(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "boundary" }
|
||||||
|
Alice->>Bob: Hello Bob, how are you ?
|
||||||
|
Bob->>Alice: Fine, thank you. And you?
|
||||||
|
create participant Carl@{ "type" : "control" }
|
||||||
|
Alice->>Carl: Hi Carl!
|
||||||
|
create actor D as Donald
|
||||||
|
Carl->>D: Hi!
|
||||||
|
destroy Carl
|
||||||
|
Alice-xCarl: We are too many
|
||||||
|
destroy Bob
|
||||||
|
Bob->>Alice: I agree
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle complex interactions between different participant types', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
box rgb(200,220,255) Authentication
|
||||||
|
participant User@{ "type": "actor" }
|
||||||
|
participant LoginUI@{ "type": "boundary" }
|
||||||
|
participant AuthService@{ "type": "control" }
|
||||||
|
participant UserDB@{ "type": "database" }
|
||||||
|
end
|
||||||
|
|
||||||
|
box rgb(200,255,220) Order Processing
|
||||||
|
participant Order@{ "type": "entity" }
|
||||||
|
participant OrderQueue@{ "type": "queue" }
|
||||||
|
participant AuditLogs@{ "type": "collections" }
|
||||||
|
end
|
||||||
|
|
||||||
|
User ->> LoginUI: Enter credentials
|
||||||
|
LoginUI ->> AuthService: Validate
|
||||||
|
AuthService ->> UserDB: Query user
|
||||||
|
UserDB -->> AuthService: User data
|
||||||
|
|
||||||
|
alt Valid credentials
|
||||||
|
AuthService -->> LoginUI: Success
|
||||||
|
LoginUI -->> User: Welcome
|
||||||
|
|
||||||
|
par Place order
|
||||||
|
User ->> Order: New order
|
||||||
|
Order ->> OrderQueue: Process
|
||||||
|
and
|
||||||
|
Order ->> AuditLogs: Record
|
||||||
|
end
|
||||||
|
|
||||||
|
loop Until confirmed
|
||||||
|
OrderQueue ->> Order: Update status
|
||||||
|
Order -->> User: Notification
|
||||||
|
end
|
||||||
|
else Invalid credentials
|
||||||
|
AuthService --x LoginUI: Failure
|
||||||
|
LoginUI --x User: Retry
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{ sequence: { useMaxWidth: false } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render parallel processes with different participant types', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Customer@{ "type": "actor" }
|
||||||
|
participant Frontend@{ "type": "participant" }
|
||||||
|
participant PaymentService@{ "type": "boundary" }
|
||||||
|
participant InventoryManager@{ "type": "control" }
|
||||||
|
participant Order@{ "type": "entity" }
|
||||||
|
participant OrdersDB@{ "type": "database" }
|
||||||
|
participant NotificationQueue@{ "type": "queue" }
|
||||||
|
|
||||||
|
Customer ->> Frontend: Place order
|
||||||
|
Frontend ->> Order: Create order
|
||||||
|
par Parallel Processing
|
||||||
|
Order ->> PaymentService: Process payment
|
||||||
|
and
|
||||||
|
Order ->> InventoryManager: Reserve items
|
||||||
|
end
|
||||||
|
PaymentService -->> Order: Payment confirmed
|
||||||
|
InventoryManager -->> Order: Items reserved
|
||||||
|
Order ->> OrdersDB: Save finalized order
|
||||||
|
OrdersDB -->> Order: Order saved
|
||||||
|
Order ->> NotificationQueue: Send confirmation
|
||||||
|
NotificationQueue -->> Customer: Order confirmation
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should render different participant types with notes and loops', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Admin
|
||||||
|
participant Dashboard
|
||||||
|
participant AuthService@{ "type" : "boundary" }
|
||||||
|
participant UserManager@{ "type" : "control" }
|
||||||
|
participant UserProfile@{ "type" : "entity" }
|
||||||
|
participant UserDB@{ "type" : "database" }
|
||||||
|
participant Logs@{ "type" : "database" }
|
||||||
|
|
||||||
|
Admin ->> Dashboard: Open user management
|
||||||
|
loop Authentication check
|
||||||
|
Dashboard ->> AuthService: Verify admin rights
|
||||||
|
AuthService ->> Dashboard: Access granted
|
||||||
|
end
|
||||||
|
Dashboard ->> UserManager: List users
|
||||||
|
UserManager ->> UserDB: Query users
|
||||||
|
UserDB ->> UserManager: Return user data
|
||||||
|
Note right of UserDB: Encrypted data<br/>requires decryption
|
||||||
|
UserManager ->> UserProfile: Format profiles
|
||||||
|
UserProfile ->> UserManager: Formatted data
|
||||||
|
UserManager ->> Dashboard: Display users
|
||||||
|
Dashboard ->> Logs: Record access
|
||||||
|
Logs ->> Admin: Audit trail
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render different participant types with alternative flows', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Client
|
||||||
|
participant MobileApp
|
||||||
|
participant CloudService@{ "type" : "boundary" }
|
||||||
|
participant DataProcessor@{ "type" : "control" }
|
||||||
|
participant Transaction@{ "type" : "entity" }
|
||||||
|
participant TransactionsDB@{ "type" : "database" }
|
||||||
|
participant EventBus@{ "type" : "queue" }
|
||||||
|
|
||||||
|
Client ->> MobileApp: Initiate transaction
|
||||||
|
MobileApp ->> CloudService: Authenticate
|
||||||
|
alt Authentication successful
|
||||||
|
CloudService -->> MobileApp: Auth token
|
||||||
|
MobileApp ->> DataProcessor: Process data
|
||||||
|
DataProcessor ->> Transaction: Create transaction
|
||||||
|
Transaction ->> TransactionsDB: Save record
|
||||||
|
TransactionsDB -->> Transaction: Confirmation
|
||||||
|
Transaction ->> EventBus: Publish event
|
||||||
|
EventBus -->> Client: Notification
|
||||||
|
else Authentication failed
|
||||||
|
CloudService -->> MobileApp: Error
|
||||||
|
MobileApp -->> Client: Show error
|
||||||
|
end
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render different participant types with wrapping text', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant B@{ "type" : "boundary" }
|
||||||
|
participant C@{ "type" : "control" }
|
||||||
|
participant E@{ "type" : "entity" }
|
||||||
|
participant DB@{ "type" : "database" }
|
||||||
|
participant COL@{ "type" : "collections" }
|
||||||
|
participant Q@{ "type" : "queue" }
|
||||||
|
|
||||||
|
FE ->> B: Another long message<br/>with explicit<br/>line breaks
|
||||||
|
B -->> FE: Response message that is also quite long and needs to wrap
|
||||||
|
FE ->> C: Process data
|
||||||
|
C ->> E: Validate
|
||||||
|
E -->> C: Validation result
|
||||||
|
C ->> DB: Save
|
||||||
|
DB -->> C: Save result
|
||||||
|
C ->> COL: Log
|
||||||
|
COL -->> Q: Forward
|
||||||
|
Q -->> LongNameUser: Final response with confirmation of all actions taken
|
||||||
|
`,
|
||||||
|
{ sequence: { wrap: true } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Sequence Diagram - New Participant Types with Long Notes and Messages', () => {
|
||||||
|
it('should render long notes left of boundary', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "boundary" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note left of Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render wrapped long notes left of control', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "control" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note left of Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render long notes right of entity', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "entity" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note right of Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render wrapped long notes right of database', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note right of Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render long notes over collections', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "collections" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note over Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render wrapped long notes over queue', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "queue" }
|
||||||
|
actor Bob
|
||||||
|
Alice->>Bob: Hola
|
||||||
|
Note over Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render notes over actor and boundary', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
participant Charlie@{ "type" : "boundary" }
|
||||||
|
note over Alice: Some note
|
||||||
|
note over Charlie: Other note
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render long messages from database to collections', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
participant Bob@{ "type" : "collections" }
|
||||||
|
Alice->>Bob: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render wrapped long messages from control to entity', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "control" }
|
||||||
|
participant Bob@{ "type" : "entity" }
|
||||||
|
Alice->>Bob:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
Bob->>Alice: I'm short though
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render long messages from queue to boundary', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "queue" }
|
||||||
|
participant Bob@{ "type" : "boundary" }
|
||||||
|
Alice->>Bob: I'm short
|
||||||
|
Bob->>Alice: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render wrapped long messages from actor to database', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
participant Bob@{ "type" : "database" }
|
||||||
|
Alice->>Bob: I'm short
|
||||||
|
Bob->>Alice:wrap: Extremely utterly long line of longness which had previously overflown the actor box as it is much longer than what it should be
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('svg size', () => {
|
||||||
|
it('should render a sequence diagram when useMaxWidth is true (default)', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
participant Bob@{ "type" : "boundary" }
|
||||||
|
participant John@{ "type" : "control" }
|
||||||
|
Alice ->> Bob: Hello Bob, how are you?
|
||||||
|
Bob-->>John: How about you John?
|
||||||
|
Bob--x Alice: I am good thanks!
|
||||||
|
Bob-x John: I am good thanks!
|
||||||
|
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||||
|
Bob-->Alice: Checking with John...
|
||||||
|
alt either this
|
||||||
|
Alice->>John: Yes
|
||||||
|
else or this
|
||||||
|
Alice->>John: No
|
||||||
|
else or this will happen
|
||||||
|
Alice->John: Maybe
|
||||||
|
end
|
||||||
|
par this happens in parallel
|
||||||
|
Alice -->> Bob: Parallel message 1
|
||||||
|
and
|
||||||
|
Alice -->> John: Parallel message 2
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{ sequence: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
cy.get('svg').should((svg) => {
|
||||||
|
expect(svg).to.have.attr('width', '100%');
|
||||||
|
const style = svg.attr('style');
|
||||||
|
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||||
|
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||||
|
expect(maxWidthValue).to.be.within(820 * 0.95, 820 * 1.05);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a sequence diagram when useMaxWidth is false', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
participant Bob@{ "type" : "boundary" }
|
||||||
|
participant John@{ "type" : "control" }
|
||||||
|
Alice ->> Bob: Hello Bob, how are you?
|
||||||
|
Bob-->>John: How about you John?
|
||||||
|
Bob--x Alice: I am good thanks!
|
||||||
|
Bob-x John: I am good thanks!
|
||||||
|
Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
|
||||||
|
Bob-->Alice: Checking with John...
|
||||||
|
alt either this
|
||||||
|
Alice->>John: Yes
|
||||||
|
else or this
|
||||||
|
Alice->>John: No
|
||||||
|
else or this will happen
|
||||||
|
Alice->John: Maybe
|
||||||
|
end
|
||||||
|
par this happens in parallel
|
||||||
|
Alice -->> Bob: Parallel message 1
|
||||||
|
and
|
||||||
|
Alice -->> John: Parallel message 2
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{ sequence: { useMaxWidth: false } }
|
||||||
|
);
|
||||||
|
cy.get('svg').should((svg) => {
|
||||||
|
const width = parseFloat(svg.attr('width'));
|
||||||
|
expect(width).to.be.within(820 * 0.95, 820 * 1.05);
|
||||||
|
expect(svg).to.not.have.attr('style');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -893,6 +893,17 @@ describe('Sequence diagram', () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should handle bidirectional arrows with autonumber', () => {
|
||||||
|
imgSnapshotTest(`
|
||||||
|
sequenceDiagram
|
||||||
|
autonumber
|
||||||
|
participant A
|
||||||
|
participant B
|
||||||
|
A<<->>B: This is a bidirectional message
|
||||||
|
A->B: This is a normal message`);
|
||||||
|
});
|
||||||
|
|
||||||
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
||||||
//Be aware that the syntax for "properties" is likely to be changed.
|
//Be aware that the syntax for "properties" is likely to be changed.
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -1042,4 +1053,167 @@ describe('Sequence diagram', () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('render new arrow type', () => {
|
||||||
|
it('should render Solid half arrow top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice -|\\ John: Hello John, how are you?
|
||||||
|
Alice-|\\ John: Hi Alice, I can hear you!
|
||||||
|
Alice -|\\ John: Test
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should render Solid half arrow bottom', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice-|/John: Hello John, how are you?
|
||||||
|
Alice-|/John: Hi Alice, I can hear you!
|
||||||
|
Alice-|/John: Test
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow top ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice-\\\\John: Hello John, how are you?
|
||||||
|
Alice-\\\\John: Hi Alice, I can hear you!
|
||||||
|
Alice-\\\\John: Test
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should render Stick half arrow bottom ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice-//John: Hello John, how are you?
|
||||||
|
Alice-//John: Hi Alice, I can hear you!
|
||||||
|
Alice-//John: Test
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should render Solid half arrow top reverse ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice/|-John: Hello Alice, how are you?
|
||||||
|
Alice/|-John: Hi Alice, I can hear you!
|
||||||
|
Alice/|-John: Test
|
||||||
|
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Solid half arrow bottom reverse ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`sequenceDiagram
|
||||||
|
Alice \\|- John: Hello Alice, how are you?
|
||||||
|
Alice \\|- John: Hi Alice, I can hear you!
|
||||||
|
Alice \\|- John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow top reverse ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice //-John: Hello Alice, how are you?
|
||||||
|
Alice //-John: Hi Alice, I can hear you!
|
||||||
|
Alice //-John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow bottom reverse ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice \\\\-John: Hello Alice, how are you?
|
||||||
|
Alice \\\\-John: Hi Alice, I can hear you!
|
||||||
|
Alice \\\\-John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Solid half arrow top dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice --|\\John: Hello John, how are you?
|
||||||
|
Alice --|\\John: Hi Alice, I can hear you!
|
||||||
|
Alice --|\\John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Solid half arrow bottom dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice --|/John: Hello John, how are you?
|
||||||
|
Alice --|/John: Hi Alice, I can hear you!
|
||||||
|
Alice --|/John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow top dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice--\\\\John: Hello John, how are you?
|
||||||
|
Alice--\\\\John: Hi Alice, I can hear you!
|
||||||
|
Alice--\\\\John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow bottom dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice--//John: Hello John, how are you?
|
||||||
|
Alice--//John: Hi Alice, I can hear you!
|
||||||
|
Alice--//John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Solid half arrow top reverse dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice/|--John: Hello Alice, how are you?
|
||||||
|
Alice/|--John: Hi Alice, I can hear you!
|
||||||
|
Alice/|--John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Solid half arrow bottom reverse dotted', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice\\|--John: Hello Alice, how are you?
|
||||||
|
Alice\\|--John: Hi Alice, I can hear you!
|
||||||
|
Alice\\|--John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow top reverse dotted ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice//--John: Hello Alice, how are you?
|
||||||
|
Alice//--John: Hi Alice, I can hear you!
|
||||||
|
Alice//--John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Stick half arrow bottom reverse dotted ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice\\\\--John: Hello Alice, how are you?
|
||||||
|
Alice\\\\--John: Hi Alice, I can hear you!
|
||||||
|
Alice\\\\--John: Test`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -2,219 +2,223 @@
|
|||||||
"durations": [
|
"durations": [
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/configuration.spec.js",
|
"spec": "cypress/integration/other/configuration.spec.js",
|
||||||
"duration": 6297
|
"duration": 6162
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
||||||
"duration": 2187
|
"duration": 2148
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/ghsa.spec.js",
|
"spec": "cypress/integration/other/ghsa.spec.js",
|
||||||
"duration": 3509
|
"duration": 3585
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/iife.spec.js",
|
"spec": "cypress/integration/other/iife.spec.js",
|
||||||
"duration": 2218
|
"duration": 2099
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/interaction.spec.js",
|
"spec": "cypress/integration/other/interaction.spec.js",
|
||||||
"duration": 12104
|
"duration": 12119
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/rerender.spec.js",
|
"spec": "cypress/integration/other/rerender.spec.js",
|
||||||
"duration": 2151
|
"duration": 2063
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/xss.spec.js",
|
"spec": "cypress/integration/other/xss.spec.js",
|
||||||
"duration": 33064
|
"duration": 31921
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/appli.spec.js",
|
"spec": "cypress/integration/rendering/appli.spec.js",
|
||||||
"duration": 3488
|
"duration": 3385
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
||||||
"duration": 106
|
"duration": 108
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/block.spec.js",
|
"spec": "cypress/integration/rendering/block.spec.js",
|
||||||
"duration": 18317
|
"duration": 18063
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/c4.spec.js",
|
"spec": "cypress/integration/rendering/c4.spec.js",
|
||||||
"duration": 5592
|
"duration": 5519
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
|
||||||
"duration": 39358
|
"duration": 40040
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
|
||||||
"duration": 37160
|
"duration": 38665
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
||||||
"duration": 23660
|
"duration": 22836
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
|
||||||
"duration": 36866
|
"duration": 37096
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
||||||
"duration": 17334
|
"duration": 16452
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
||||||
"duration": 9871
|
"duration": 10387
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/current.spec.js",
|
"spec": "cypress/integration/rendering/current.spec.js",
|
||||||
"duration": 2833
|
"duration": 2803
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
|
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
|
||||||
"duration": 85321
|
"duration": 86891
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
||||||
"duration": 15673
|
"duration": 15206
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
||||||
"duration": 3724
|
"duration": 3540
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
||||||
"duration": 41178
|
"duration": 41975
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
||||||
"duration": 29966
|
"duration": 30909
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
|
||||||
"duration": 7689
|
"duration": 7881
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
||||||
"duration": 24709
|
"duration": 24294
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
||||||
"duration": 45565
|
"duration": 47652
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
||||||
"duration": 31144
|
"duration": 32049
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gantt.spec.js",
|
"spec": "cypress/integration/rendering/gantt.spec.js",
|
||||||
"duration": 20808
|
"duration": 20248
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
||||||
"duration": 49985
|
"duration": 51202
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
||||||
"duration": 273272
|
"duration": 283546
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
||||||
"duration": 55880
|
"duration": 57257
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/info.spec.ts",
|
"spec": "cypress/integration/rendering/info.spec.ts",
|
||||||
"duration": 3271
|
"duration": 3352
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/journey.spec.js",
|
"spec": "cypress/integration/rendering/journey.spec.js",
|
||||||
"duration": 7293
|
"duration": 7423
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/kanban.spec.ts",
|
"spec": "cypress/integration/rendering/kanban.spec.ts",
|
||||||
"duration": 7861
|
"duration": 7804
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/katex.spec.js",
|
"spec": "cypress/integration/rendering/katex.spec.js",
|
||||||
"duration": 3922
|
"duration": 3847
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
||||||
"duration": 2726
|
"duration": 2637
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
||||||
"duration": 11670
|
"duration": 11658
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
||||||
"duration": 146020
|
"duration": 149500
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
|
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
|
||||||
"duration": 114244
|
"duration": 115427
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/packet.spec.ts",
|
"spec": "cypress/integration/rendering/packet.spec.ts",
|
||||||
"duration": 5036
|
"duration": 4801
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/pie.spec.ts",
|
"spec": "cypress/integration/rendering/pie.spec.ts",
|
||||||
"duration": 6545
|
"duration": 6786
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
|
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
|
||||||
"duration": 9097
|
"duration": 9422
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/radar.spec.js",
|
"spec": "cypress/integration/rendering/radar.spec.js",
|
||||||
"duration": 5676
|
"duration": 5652
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/requirement.spec.js",
|
"spec": "cypress/integration/rendering/requirement.spec.js",
|
||||||
"duration": 2795
|
"duration": 2787
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
|
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
|
||||||
"duration": 51660
|
"duration": 53631
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/sankey.spec.ts",
|
"spec": "cypress/integration/rendering/sankey.spec.ts",
|
||||||
"duration": 6957
|
"duration": 7075
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/sequencediagram-v2.spec.js",
|
||||||
|
"duration": 20446
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
|
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
|
||||||
"duration": 36026
|
"duration": 37326
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
|
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
|
||||||
"duration": 29551
|
"duration": 29208
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
||||||
"duration": 17364
|
"duration": 16328
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/theme.spec.js",
|
"spec": "cypress/integration/rendering/theme.spec.js",
|
||||||
"duration": 30209
|
"duration": 30541
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
||||||
"duration": 8699
|
"duration": 8611
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/treemap.spec.ts",
|
"spec": "cypress/integration/rendering/treemap.spec.ts",
|
||||||
"duration": 12168
|
"duration": 11878
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
||||||
"duration": 21453
|
"duration": 20400
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
||||||
"duration": 3577
|
"duration": 3528
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
- [addDirective](functions/addDirective.md)
|
- [addDirective](functions/addDirective.md)
|
||||||
- [getConfig](functions/getConfig.md)
|
- [getConfig](functions/getConfig.md)
|
||||||
- [getSiteConfig](functions/getSiteConfig.md)
|
- [getSiteConfig](functions/getSiteConfig.md)
|
||||||
|
- [getUserDefinedConfig](functions/getUserDefinedConfig.md)
|
||||||
- [reset](functions/reset.md)
|
- [reset](functions/reset.md)
|
||||||
- [sanitize](functions/sanitize.md)
|
- [sanitize](functions/sanitize.md)
|
||||||
- [saveConfigFromInitialize](functions/saveConfigFromInitialize.md)
|
- [saveConfigFromInitialize](functions/saveConfigFromInitialize.md)
|
||||||
|
19
docs/config/setup/config/functions/getUserDefinedConfig.md
Normal file
19
docs/config/setup/config/functions/getUserDefinedConfig.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
> **Warning**
|
||||||
|
>
|
||||||
|
> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
|
||||||
|
>
|
||||||
|
> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/setup/config/functions/getUserDefinedConfig.md](../../../../../packages/mermaid/src/docs/config/setup/config/functions/getUserDefinedConfig.md).
|
||||||
|
|
||||||
|
[**mermaid**](../../README.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Function: getUserDefinedConfig()
|
||||||
|
|
||||||
|
> **getUserDefinedConfig**(): [`MermaidConfig`](../../mermaid/interfaces/MermaidConfig.md)
|
||||||
|
|
||||||
|
Defined in: [packages/mermaid/src/config.ts:252](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L252)
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
|
||||||
|
[`MermaidConfig`](../../mermaid/interfaces/MermaidConfig.md)
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseOptions
|
# Interface: ParseOptions
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:72](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L72)
|
Defined in: [packages/mermaid/src/types.ts:84](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L84)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:72](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **suppressErrors**: `boolean`
|
> `optional` **suppressErrors**: `boolean`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:77](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L77)
|
Defined in: [packages/mermaid/src/types.ts:89](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L89)
|
||||||
|
|
||||||
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
||||||
The `parseError` function will not be called.
|
The `parseError` function will not be called.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseResult
|
# Interface: ParseResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:80](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L80)
|
Defined in: [packages/mermaid/src/types.ts:92](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L92)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:80](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:88](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L88)
|
Defined in: [packages/mermaid/src/types.ts:100](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L100)
|
||||||
|
|
||||||
The config passed as YAML frontmatter or directives
|
The config passed as YAML frontmatter or directives
|
||||||
|
|
||||||
@@ -28,6 +28,6 @@ The config passed as YAML frontmatter or directives
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:84](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L84)
|
Defined in: [packages/mermaid/src/types.ts:96](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L96)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: RenderResult
|
# Interface: RenderResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:98](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L98)
|
Defined in: [packages/mermaid/src/types.ts:110](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L110)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:98](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **bindFunctions**: (`element`) => `void`
|
> `optional` **bindFunctions**: (`element`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:116](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L116)
|
Defined in: [packages/mermaid/src/types.ts:128](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L128)
|
||||||
|
|
||||||
Bind function to be called after the svg has been inserted into the DOM.
|
Bind function to be called after the svg has been inserted into the DOM.
|
||||||
This is necessary for adding event listeners to the elements in the svg.
|
This is necessary for adding event listeners to the elements in the svg.
|
||||||
@@ -45,7 +45,7 @@ bindFunctions?.(div); // To call bindFunctions only if it's present.
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:106](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L106)
|
Defined in: [packages/mermaid/src/types.ts:118](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L118)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
|
||||||
@@ -55,6 +55,6 @@ The diagram type, e.g. 'flowchart', 'sequence', etc.
|
|||||||
|
|
||||||
> **svg**: `string`
|
> **svg**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L102)
|
Defined in: [packages/mermaid/src/types.ts:114](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L114)
|
||||||
|
|
||||||
The svg code for the rendered graph.
|
The svg code for the rendered graph.
|
||||||
|
@@ -983,11 +983,23 @@ flowchart TD
|
|||||||
- `b`
|
- `b`
|
||||||
- **w**: The width of the image. If not defined, this will default to the natural width of the image.
|
- **w**: The width of the image. If not defined, this will default to the natural width of the image.
|
||||||
- **h**: The height of the image. If not defined, this will default to the natural height of the image.
|
- **h**: The height of the image. If not defined, this will default to the natural height of the image.
|
||||||
- **constraint**: Determines if the image should constrain the node size. This setting also ensures the image maintains its original aspect ratio, adjusting the height (`h`) accordingly to the width (`w`). If not defined, this will default to `off` Possible values are:
|
- **constraint**: Determines if the image should constrain the node size. This setting also ensures the image maintains its original aspect ratio, adjusting the width (`w`) accordingly to the height (`h`). If not defined, this will default to `off` Possible values are:
|
||||||
- `on`
|
- `on`
|
||||||
- `off`
|
- `off`
|
||||||
|
|
||||||
These new shapes provide additional flexibility and visual appeal to your flowcharts, making them more informative and engaging.
|
If you want to resize an image, but keep the same aspect ratio, set `h`, and set `constraint: on` to constrain the aspect ratio. E.g.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
flowchart TD
|
||||||
|
%% My image with a constrained aspect ratio
|
||||||
|
A@{ img: "https://mermaid.js.org/favicon.svg", label: "My example image label", pos: "t", h: 60, constraint: "on" }
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
%% My image with a constrained aspect ratio
|
||||||
|
A@{ img: "https://mermaid.js.org/favicon.svg", label: "My example image label", pos: "t", h: 60, constraint: "on" }
|
||||||
|
```
|
||||||
|
|
||||||
## Links between nodes
|
## Links between nodes
|
||||||
|
|
||||||
|
@@ -74,6 +74,126 @@ sequenceDiagram
|
|||||||
Bob->>Alice: Hi Alice
|
Bob->>Alice: Hi Alice
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Boundary
|
||||||
|
|
||||||
|
If you want to use the boundary symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "boundary" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Request from boundary
|
||||||
|
Bob->>Alice: Response to boundary
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "boundary" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Request from boundary
|
||||||
|
Bob->>Alice: Response to boundary
|
||||||
|
```
|
||||||
|
|
||||||
|
### Control
|
||||||
|
|
||||||
|
If you want to use the control symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "control" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Control request
|
||||||
|
Bob->>Alice: Control response
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "control" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Control request
|
||||||
|
Bob->>Alice: Control response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Entity
|
||||||
|
|
||||||
|
If you want to use the entity symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "entity" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Entity request
|
||||||
|
Bob->>Alice: Entity response
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "entity" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Entity request
|
||||||
|
Bob->>Alice: Entity response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
If you want to use the database symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: DB query
|
||||||
|
Bob->>Alice: DB result
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: DB query
|
||||||
|
Bob->>Alice: DB result
|
||||||
|
```
|
||||||
|
|
||||||
|
### Collections
|
||||||
|
|
||||||
|
If you want to use the collections symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "collections" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Collections request
|
||||||
|
Bob->>Alice: Collections response
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "collections" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Collections request
|
||||||
|
Bob->>Alice: Collections response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Queue
|
||||||
|
|
||||||
|
If you want to use the queue symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "queue" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Queue message
|
||||||
|
Bob->>Alice: Queue response
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "queue" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Queue message
|
||||||
|
Bob->>Alice: Queue response
|
||||||
|
```
|
||||||
|
|
||||||
### Aliases
|
### Aliases
|
||||||
|
|
||||||
The actor can have a convenient identifier and a descriptive label.
|
The actor can have a convenient identifier and a descriptive label.
|
||||||
@@ -209,7 +329,11 @@ Messages can be of two displayed either solid or with a dotted line.
|
|||||||
[Actor][Arrow][Actor]:Message text
|
[Actor][Arrow][Actor]:Message text
|
||||||
```
|
```
|
||||||
|
|
||||||
There are ten types of arrows currently supported:
|
Lines can be solid or dotted, and can end with various types of arrowheads, crosses, or open arrows.
|
||||||
|
|
||||||
|
#### Supported Arrow Types
|
||||||
|
|
||||||
|
**Standard Arrow Types**
|
||||||
|
|
||||||
| Type | Description |
|
| Type | Description |
|
||||||
| -------- | ---------------------------------------------------- |
|
| -------- | ---------------------------------------------------- |
|
||||||
@@ -224,6 +348,58 @@ There are ten types of arrows currently supported:
|
|||||||
| `-)` | Solid line with an open arrow at the end (async) |
|
| `-)` | Solid line with an open arrow at the end (async) |
|
||||||
| `--)` | Dotted line with a open arrow at the end (async) |
|
| `--)` | Dotted line with a open arrow at the end (async) |
|
||||||
|
|
||||||
|
**Half-Arrows**
|
||||||
|
|
||||||
|
The following half-arrow types are now supported for more expressive sequence diagrams. Both solid and dotted variants are available by increasing the number of dashes (`-` → `--`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
| ------- | ---------------------------------------------------- |
|
||||||
|
| `-\|\` | Solid line with top half arrowhead |
|
||||||
|
| `--\|\` | Dotted line with top half arrowhead |
|
||||||
|
| `-\|/` | Solid line with bottom half arrowhead |
|
||||||
|
| `--\|/` | Dotted line with bottom half arrowhead |
|
||||||
|
| `/\|-` | Solid line with reverse top half arrowhead |
|
||||||
|
| `/\|--` | Dotted line with reverse top half arrowhead |
|
||||||
|
| `\\-` | Solid line with reverse bottom half arrowhead |
|
||||||
|
| `\\--` | Dotted line with reverse bottom half arrowhead |
|
||||||
|
| `-\\` | Solid line with top stick half arrowhead |
|
||||||
|
| `--\\` | Dotted line with top stick half arrowhead |
|
||||||
|
| `-//` | Solid line with bottom stick half arrowhead |
|
||||||
|
| `--//` | Dotted line with bottom stick half arrowhead |
|
||||||
|
| `//-` | Solid line with reverse top stick half arrowhead |
|
||||||
|
| `//--` | Dotted line with reverse top stick half arrowhead |
|
||||||
|
| `\\-` | Solid line with reverse bottom stick half arrowhead |
|
||||||
|
| `\\--` | Dotted line with reverse bottom stick half arrowhead |
|
||||||
|
|
||||||
|
## Central Connections
|
||||||
|
|
||||||
|
Mermaid sequence diagrams now support **central lifeline connections** using a `()`.\
|
||||||
|
This is useful to represent messages or signals that connect to a central point, rather than from one actor directly to another.
|
||||||
|
|
||||||
|
To indicate a central connection, append `()` to the arrow syntax.
|
||||||
|
|
||||||
|
#### Basic Syntax
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice
|
||||||
|
participant John
|
||||||
|
Alice->>()John: Hello John
|
||||||
|
Alice()->>John: How are you?
|
||||||
|
John()->>()Alice: Great!
|
||||||
|
```
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice
|
||||||
|
participant John
|
||||||
|
Alice->>()John: Hello John
|
||||||
|
Alice()->>John: How are you?
|
||||||
|
John()->>()Alice: Great!
|
||||||
|
```
|
||||||
|
|
||||||
## Activations
|
## Activations
|
||||||
|
|
||||||
It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations:
|
It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations:
|
||||||
|
@@ -68,7 +68,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@braintree/sanitize-url": "^7.0.4",
|
"@braintree/sanitize-url": "^7.0.4",
|
||||||
"@iconify/utils": "^2.1.33",
|
"@iconify/utils": "^3.0.1",
|
||||||
"@mermaid-js/parser": "workspace:^",
|
"@mermaid-js/parser": "workspace:^",
|
||||||
"@types/d3": "^7.4.3",
|
"@types/d3": "^7.4.3",
|
||||||
"cytoscape": "^3.29.3",
|
"cytoscape": "^3.29.3",
|
||||||
|
@@ -78,3 +78,187 @@ describe('when working with site config', () => {
|
|||||||
expect(config_4.altFontFamily).toBeUndefined();
|
expect(config_4.altFontFamily).toBeUndefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getUserDefinedConfig', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
configApi.reset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return empty object when no user config is defined', () => {
|
||||||
|
const userConfig = configApi.getUserDefinedConfig();
|
||||||
|
expect(userConfig).toEqual({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return config from initialize only', () => {
|
||||||
|
const initConfig: MermaidConfig = { theme: 'dark', fontFamily: 'Arial' };
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
|
||||||
|
const userConfig = configApi.getUserDefinedConfig();
|
||||||
|
expect(userConfig).toEqual(initConfig);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return config from directives only', () => {
|
||||||
|
const directive1: MermaidConfig = { layout: 'elk', fontSize: 14 };
|
||||||
|
const directive2: MermaidConfig = { theme: 'forest' };
|
||||||
|
|
||||||
|
configApi.addDirective(directive1);
|
||||||
|
configApi.addDirective(directive2);
|
||||||
|
|
||||||
|
expect(configApi.getUserDefinedConfig()).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"fontFamily": "Arial",
|
||||||
|
"fontSize": 14,
|
||||||
|
"layout": "elk",
|
||||||
|
"theme": "forest",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should combine initialize config and directives', () => {
|
||||||
|
const initConfig: MermaidConfig = { theme: 'dark', fontFamily: 'Arial', layout: 'dagre' };
|
||||||
|
const directive1: MermaidConfig = { layout: 'elk', fontSize: 14 };
|
||||||
|
const directive2: MermaidConfig = { theme: 'forest' };
|
||||||
|
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
configApi.addDirective(directive1);
|
||||||
|
configApi.addDirective(directive2);
|
||||||
|
|
||||||
|
const userConfig = configApi.getUserDefinedConfig();
|
||||||
|
expect(userConfig).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"fontFamily": "Arial",
|
||||||
|
"fontSize": 14,
|
||||||
|
"layout": "elk",
|
||||||
|
"theme": "forest",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle nested config objects properly', () => {
|
||||||
|
const initConfig: MermaidConfig = {
|
||||||
|
flowchart: { nodeSpacing: 50, rankSpacing: 100 },
|
||||||
|
theme: 'default',
|
||||||
|
};
|
||||||
|
const directive: MermaidConfig = {
|
||||||
|
flowchart: { nodeSpacing: 75, curve: 'basis' },
|
||||||
|
mindmap: { padding: 20 },
|
||||||
|
};
|
||||||
|
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
configApi.addDirective(directive);
|
||||||
|
|
||||||
|
const userConfig = configApi.getUserDefinedConfig();
|
||||||
|
expect(userConfig).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"flowchart": {
|
||||||
|
"curve": "basis",
|
||||||
|
"nodeSpacing": 75,
|
||||||
|
"rankSpacing": 100,
|
||||||
|
},
|
||||||
|
"mindmap": {
|
||||||
|
"padding": 20,
|
||||||
|
},
|
||||||
|
"theme": "default",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle complex nested overrides', () => {
|
||||||
|
const initConfig: MermaidConfig = {
|
||||||
|
flowchart: {
|
||||||
|
nodeSpacing: 50,
|
||||||
|
rankSpacing: 100,
|
||||||
|
curve: 'linear',
|
||||||
|
},
|
||||||
|
theme: 'default',
|
||||||
|
};
|
||||||
|
const directive1: MermaidConfig = {
|
||||||
|
flowchart: {
|
||||||
|
nodeSpacing: 75,
|
||||||
|
},
|
||||||
|
fontSize: 12,
|
||||||
|
};
|
||||||
|
const directive2: MermaidConfig = {
|
||||||
|
flowchart: {
|
||||||
|
curve: 'basis',
|
||||||
|
nodeSpacing: 100,
|
||||||
|
},
|
||||||
|
mindmap: {
|
||||||
|
padding: 15,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
configApi.addDirective(directive1);
|
||||||
|
configApi.addDirective(directive2);
|
||||||
|
|
||||||
|
const userConfig = configApi.getUserDefinedConfig();
|
||||||
|
expect(userConfig).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"flowchart": {
|
||||||
|
"curve": "basis",
|
||||||
|
"nodeSpacing": 100,
|
||||||
|
"rankSpacing": 100,
|
||||||
|
},
|
||||||
|
"fontSize": 12,
|
||||||
|
"mindmap": {
|
||||||
|
"padding": 15,
|
||||||
|
},
|
||||||
|
"theme": "default",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return independent copies (not references)', () => {
|
||||||
|
const initConfig: MermaidConfig = { theme: 'dark', flowchart: { nodeSpacing: 50 } };
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
|
||||||
|
const userConfig1 = configApi.getUserDefinedConfig();
|
||||||
|
const userConfig2 = configApi.getUserDefinedConfig();
|
||||||
|
|
||||||
|
userConfig1.theme = 'neutral';
|
||||||
|
userConfig1.flowchart!.nodeSpacing = 999;
|
||||||
|
|
||||||
|
expect(userConfig2).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"flowchart": {
|
||||||
|
"nodeSpacing": 50,
|
||||||
|
},
|
||||||
|
"theme": "dark",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle edge cases with undefined values', () => {
|
||||||
|
const initConfig: MermaidConfig = { theme: 'dark', layout: undefined };
|
||||||
|
const directive: MermaidConfig = { fontSize: 14, fontFamily: undefined };
|
||||||
|
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
configApi.addDirective(directive);
|
||||||
|
|
||||||
|
expect(configApi.getUserDefinedConfig()).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"fontSize": 14,
|
||||||
|
"layout": undefined,
|
||||||
|
"theme": "dark",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should retain config from initialize after reset', () => {
|
||||||
|
const initConfig: MermaidConfig = { theme: 'dark' };
|
||||||
|
const directive: MermaidConfig = { layout: 'elk' };
|
||||||
|
|
||||||
|
configApi.saveConfigFromInitialize(initConfig);
|
||||||
|
configApi.addDirective(directive);
|
||||||
|
|
||||||
|
expect(configApi.getUserDefinedConfig()).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"layout": "elk",
|
||||||
|
"theme": "dark",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
configApi.reset();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@@ -248,3 +248,17 @@ const checkConfig = (config: MermaidConfig) => {
|
|||||||
issueWarning('LAZY_LOAD_DEPRECATED');
|
issueWarning('LAZY_LOAD_DEPRECATED');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getUserDefinedConfig = (): MermaidConfig => {
|
||||||
|
let userConfig: MermaidConfig = {};
|
||||||
|
|
||||||
|
if (configFromInitialize) {
|
||||||
|
userConfig = assignWithDepth(userConfig, configFromInitialize);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const d of directives) {
|
||||||
|
userConfig = assignWithDepth(userConfig, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
return userConfig;
|
||||||
|
};
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
// Special states for recognizing aliases
|
// Special states for recognizing aliases
|
||||||
// A special state for grabbing text up to the first comment/newline
|
// A special state for grabbing text up to the first comment/newline
|
||||||
%x ID ALIAS LINE
|
%x ID ALIAS LINE CONFIG CONFIG_DATA
|
||||||
|
|
||||||
%x acc_title
|
%x acc_title
|
||||||
%x acc_descr
|
%x acc_descr
|
||||||
@@ -28,6 +28,11 @@
|
|||||||
\%%(?!\{)[^\n]* /* skip comments */
|
\%%(?!\{)[^\n]* /* skip comments */
|
||||||
[^\}]\%\%[^\n]* /* skip comments */
|
[^\}]\%\%[^\n]* /* skip comments */
|
||||||
[0-9]+(?=[ \n]+) return 'NUM';
|
[0-9]+(?=[ \n]+) return 'NUM';
|
||||||
|
<ID>\@\{ { this.begin('CONFIG'); return 'CONFIG_START'; }
|
||||||
|
<CONFIG>[^\}]+ { return 'CONFIG_CONTENT'; }
|
||||||
|
<CONFIG>\} { this.popState(); this.popState(); return 'CONFIG_END'; }
|
||||||
|
<ID>[^\<->\->:\n,;@\s]+(?=\@\{) { yytext = yytext.trim(); return 'ACTOR'; }
|
||||||
|
<ID>[^\<->\->:\n,;@]+?([\-]*[^\<->\->:\n,;@]+?)*?(?=((?!\n)\s)+"as"(?!\n)\s|[#\n;]|$) { yytext = yytext.trim(); this.begin('ALIAS'); return 'ACTOR'; }
|
||||||
"box" { this.begin('LINE'); return 'box'; }
|
"box" { this.begin('LINE'); return 'box'; }
|
||||||
"participant" { this.begin('ID'); return 'participant'; }
|
"participant" { this.begin('ID'); return 'participant'; }
|
||||||
"actor" { this.begin('ID'); return 'participant_actor'; }
|
"actor" { this.begin('ID'); return 'participant_actor'; }
|
||||||
@@ -73,7 +78,7 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili
|
|||||||
"off" return 'off';
|
"off" return 'off';
|
||||||
"," return ',';
|
"," return ',';
|
||||||
";" return 'NEWLINE';
|
";" return 'NEWLINE';
|
||||||
[^+<\->\->:\n,;]+((?!(\-x|\-\-x|\-\)|\-\-\)))[\-]*[^\+<\->\->:\n,;]+)* { yytext = yytext.trim(); return 'ACTOR'; }
|
[^\/\\\+\()\+<\->\->:\n,;]+((?!(\-x|\-\-x|\-\)|\-\-\)|\-\|\\|\-\\|\-\/|\-\/\/|\-\|\/|\/\|\-|\\\|\-|\/\/\-|\\\\\-|\/\|\-|\-\-\|\\|\-\-|\(\)))[\-]*[^\+<\->\->:\n,;]+)* { yytext = yytext.trim(); return 'ACTOR'; } //final_4.11
|
||||||
"->>" return 'SOLID_ARROW';
|
"->>" return 'SOLID_ARROW';
|
||||||
"<<->>" return 'BIDIRECTIONAL_SOLID_ARROW';
|
"<<->>" return 'BIDIRECTIONAL_SOLID_ARROW';
|
||||||
"-->>" return 'DOTTED_ARROW';
|
"-->>" return 'DOTTED_ARROW';
|
||||||
@@ -84,10 +89,36 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili
|
|||||||
\-\-[x] return 'DOTTED_CROSS';
|
\-\-[x] return 'DOTTED_CROSS';
|
||||||
\-[\)] return 'SOLID_POINT';
|
\-[\)] return 'SOLID_POINT';
|
||||||
\-\-[\)] return 'DOTTED_POINT';
|
\-\-[\)] return 'DOTTED_POINT';
|
||||||
|
|
||||||
|
//normal-dotted
|
||||||
|
\-\-\|\\ return 'SOLID_ARROW_TOP_DOTTED';
|
||||||
|
\-\-\|\/ return 'SOLID_ARROW_BOTTOM_DOTTED';
|
||||||
|
\-\-\\\\ return 'STICK_ARROW_TOP_DOTTED';
|
||||||
|
\-\-\/\/ return 'STICK_ARROW_BOTTOM_DOTTED';
|
||||||
|
|
||||||
|
//reverse-dotted
|
||||||
|
\/\|\-\- return 'SOLID_ARROW_TOP_REVERSE_DOTTED';
|
||||||
|
\\\|\-\- return 'SOLID_ARROW_BOTTOM_REVERSE_DOTTED';
|
||||||
|
\/\/\-\- return 'STICK_ARROW_TOP_REVERSE_DOTTED';
|
||||||
|
\\\\\-\- return 'STICK_ARROW_BOTTOM_REVERSE_DOTTED';
|
||||||
|
|
||||||
|
//normal
|
||||||
|
\-\|\\ return 'SOLID_ARROW_TOP';
|
||||||
|
\-\|\/ return 'SOLID_ARROW_BOTTOM';
|
||||||
|
\-\\\\ return 'STICK_ARROW_TOP';
|
||||||
|
\-\/\/ return 'STICK_ARROW_BOTTOM';
|
||||||
|
|
||||||
|
//reverse
|
||||||
|
\/\|\- return 'SOLID_ARROW_TOP_REVERSE';
|
||||||
|
\\\|\- return 'SOLID_ARROW_BOTTOM_REVERSE';
|
||||||
|
\/\/\- return 'STICK_ARROW_TOP_REVERSE';
|
||||||
|
\\\\\- return 'STICK_ARROW_BOTTOM_REVERSE';
|
||||||
|
|
||||||
":"(?:(?:no)?wrap:)?[^#\n;]* return 'TXT';
|
":"(?:(?:no)?wrap:)?[^#\n;]* return 'TXT';
|
||||||
":" return 'TXT';
|
":" return 'TXT';
|
||||||
"+" return '+';
|
"+" return '+';
|
||||||
"-" return '-';
|
"-" return '-';
|
||||||
|
"()" return '()';
|
||||||
<<EOF>> return 'NEWLINE';
|
<<EOF>> return 'NEWLINE';
|
||||||
. return 'INVALID';
|
. return 'INVALID';
|
||||||
|
|
||||||
@@ -231,6 +262,8 @@ participant_statement
|
|||||||
| 'participant_actor' actor 'AS' restOfLine 'NEWLINE' {$2.draw='actor'; $2.type='addParticipant';$2.description=yy.parseMessage($4); $$=$2;}
|
| 'participant_actor' actor 'AS' restOfLine 'NEWLINE' {$2.draw='actor'; $2.type='addParticipant';$2.description=yy.parseMessage($4); $$=$2;}
|
||||||
| 'participant_actor' actor 'NEWLINE' {$2.draw='actor'; $2.type='addParticipant'; $$=$2;}
|
| 'participant_actor' actor 'NEWLINE' {$2.draw='actor'; $2.type='addParticipant'; $$=$2;}
|
||||||
| 'destroy' actor 'NEWLINE' {$2.type='destroyParticipant'; $$=$2;}
|
| 'destroy' actor 'NEWLINE' {$2.type='destroyParticipant'; $$=$2;}
|
||||||
|
| 'participant' actor_with_config 'NEWLINE' {$2.draw='participant'; $2.type='addParticipant'; $$=$2;}
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
note_statement
|
note_statement
|
||||||
@@ -297,10 +330,41 @@ signal
|
|||||||
{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$2, msg:$5},
|
{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$2, msg:$5},
|
||||||
{type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $1.actor}
|
{type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $1.actor}
|
||||||
]}
|
]}
|
||||||
|
| actor signaltype '()' actor text2
|
||||||
|
{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$2, msg:$5, activate: true, centralConnection: yy.LINETYPE.CENTRAL_CONNECTION},
|
||||||
|
{type: 'centralConnection', signalType: yy.LINETYPE.CENTRAL_CONNECTION, actor: $4.actor, }
|
||||||
|
]}
|
||||||
|
|
||||||
|
| actor '()' signaltype actor text2
|
||||||
|
{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$3, msg:$5, activate: false, centralConnection: yy.LINETYPE.CENTRAL_CONNECTION_REVERSE},
|
||||||
|
{type: 'centralConnectionReverse', signalType: yy.LINETYPE.CENTRAL_CONNECTION_REVERSE, actor: $1.actor}
|
||||||
|
]}
|
||||||
|
| actor '()' signaltype '()' actor text2
|
||||||
|
{ $$ = [$1,$5,{type: 'addMessage', from:$1.actor, to:$5.actor, signalType:$3, msg:$6, activate: true, centralConnection: yy.LINETYPE.CENTRAL_CONNECTION_DUAL},
|
||||||
|
{type: 'centralConnection', signalType: yy.LINETYPE.CENTRAL_CONNECTION, actor: $5.actor, },
|
||||||
|
{type: 'centralConnectionReverse', signalType: yy.LINETYPE.CENTRAL_CONNECTION_REVERSE, actor: $1.actor}
|
||||||
|
]}
|
||||||
| actor signaltype actor text2
|
| actor signaltype actor text2
|
||||||
{ $$ = [$1,$3,{type: 'addMessage', from:$1.actor, to:$3.actor, signalType:$2, msg:$4}]}
|
{ $$ = [$1,$3,{type: 'addMessage', from:$1.actor, to:$3.actor, signalType:$2, msg:$4}]}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
actor_with_config
|
||||||
|
: ACTOR config_object
|
||||||
|
{
|
||||||
|
$$ = {
|
||||||
|
type: 'addParticipant',
|
||||||
|
actor: $1,
|
||||||
|
config: $2
|
||||||
|
};
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
config_object
|
||||||
|
: CONFIG_START CONFIG_CONTENT CONFIG_END
|
||||||
|
{
|
||||||
|
$$ = $2.trim();
|
||||||
|
}
|
||||||
|
;
|
||||||
// actor
|
// actor
|
||||||
// : actor_participant
|
// : actor_participant
|
||||||
// | actor_actor
|
// | actor_actor
|
||||||
@@ -313,6 +377,27 @@ signaltype
|
|||||||
: SOLID_OPEN_ARROW { $$ = yy.LINETYPE.SOLID_OPEN; }
|
: SOLID_OPEN_ARROW { $$ = yy.LINETYPE.SOLID_OPEN; }
|
||||||
| DOTTED_OPEN_ARROW { $$ = yy.LINETYPE.DOTTED_OPEN; }
|
| DOTTED_OPEN_ARROW { $$ = yy.LINETYPE.DOTTED_OPEN; }
|
||||||
| SOLID_ARROW { $$ = yy.LINETYPE.SOLID; }
|
| SOLID_ARROW { $$ = yy.LINETYPE.SOLID; }
|
||||||
|
|
||||||
|
| SOLID_ARROW_TOP { $$ = yy.LINETYPE.SOLID_TOP; }
|
||||||
|
| SOLID_ARROW_BOTTOM { $$ = yy.LINETYPE.SOLID_BOTTOM; }
|
||||||
|
| STICK_ARROW_TOP { $$ = yy.LINETYPE.STICK_TOP; }
|
||||||
|
| STICK_ARROW_BOTTOM { $$ = yy.LINETYPE.STICK_BOTTOM; }
|
||||||
|
|
||||||
|
| SOLID_ARROW_TOP_DOTTED { $$ = yy.LINETYPE.SOLID_TOP_DOTTED; }
|
||||||
|
| SOLID_ARROW_BOTTOM_DOTTED { $$ = yy.LINETYPE.SOLID_BOTTOM_DOTTED; }
|
||||||
|
| STICK_ARROW_TOP_DOTTED { $$ = yy.LINETYPE.STICK_TOP_DOTTED; }
|
||||||
|
| STICK_ARROW_BOTTOM_DOTTED { $$ = yy.LINETYPE.STICK_BOTTOM_DOTTED; }
|
||||||
|
|
||||||
|
| SOLID_ARROW_TOP_REVERSE { $$ = yy.LINETYPE.SOLID_ARROW_TOP_REVERSE; }
|
||||||
|
| SOLID_ARROW_BOTTOM_REVERSE { $$ = yy.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE; }
|
||||||
|
| STICK_ARROW_TOP_REVERSE { $$ = yy.LINETYPE.STICK_ARROW_TOP_REVERSE; }
|
||||||
|
| STICK_ARROW_BOTTOM_REVERSE { $$ = yy.LINETYPE.STICK_ARROW_BOTTOM_REVERSE; }
|
||||||
|
|
||||||
|
| SOLID_ARROW_TOP_REVERSE_DOTTED { $$ = yy.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED; }
|
||||||
|
| SOLID_ARROW_BOTTOM_REVERSE_DOTTED { $$ = yy.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED; }
|
||||||
|
| STICK_ARROW_TOP_REVERSE_DOTTED { $$ = yy.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED; }
|
||||||
|
| STICK_ARROW_BOTTOM_REVERSE_DOTTED { $$ = yy.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED; }
|
||||||
|
|
||||||
| BIDIRECTIONAL_SOLID_ARROW { $$ = yy.LINETYPE.BIDIRECTIONAL_SOLID; }
|
| BIDIRECTIONAL_SOLID_ARROW { $$ = yy.LINETYPE.BIDIRECTIONAL_SOLID; }
|
||||||
| DOTTED_ARROW { $$ = yy.LINETYPE.DOTTED; }
|
| DOTTED_ARROW { $$ = yy.LINETYPE.DOTTED; }
|
||||||
| BIDIRECTIONAL_DOTTED_ARROW { $$ = yy.LINETYPE.BIDIRECTIONAL_DOTTED; }
|
| BIDIRECTIONAL_DOTTED_ARROW { $$ = yy.LINETYPE.BIDIRECTIONAL_DOTTED; }
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { getConfig } from '../../diagram-api/diagramAPI.js';
|
import { getConfig } from '../../diagram-api/diagramAPI.js';
|
||||||
|
import * as yaml from 'js-yaml';
|
||||||
import type { DiagramDB } from '../../diagram-api/types.js';
|
import type { DiagramDB } from '../../diagram-api/types.js';
|
||||||
import { log } from '../../logger.js';
|
import { log } from '../../logger.js';
|
||||||
import { ImperativeState } from '../../utils/imperativeState.js';
|
import { ImperativeState } from '../../utils/imperativeState.js';
|
||||||
@@ -13,6 +14,7 @@ import {
|
|||||||
setDiagramTitle,
|
setDiagramTitle,
|
||||||
} from '../common/commonDb.js';
|
} from '../common/commonDb.js';
|
||||||
import type { Actor, AddMessageParams, Box, Message, Note } from './types.js';
|
import type { Actor, AddMessageParams, Box, Message, Note } from './types.js';
|
||||||
|
import type { ParticipantMetaData } from '../../types.js';
|
||||||
|
|
||||||
interface SequenceState {
|
interface SequenceState {
|
||||||
prevActor?: string;
|
prevActor?: string;
|
||||||
@@ -62,6 +64,30 @@ const LINETYPE = {
|
|||||||
PAR_OVER_START: 32,
|
PAR_OVER_START: 32,
|
||||||
BIDIRECTIONAL_SOLID: 33,
|
BIDIRECTIONAL_SOLID: 33,
|
||||||
BIDIRECTIONAL_DOTTED: 34,
|
BIDIRECTIONAL_DOTTED: 34,
|
||||||
|
|
||||||
|
SOLID_TOP: 41,
|
||||||
|
SOLID_BOTTOM: 42,
|
||||||
|
STICK_TOP: 43,
|
||||||
|
STICK_BOTTOM: 44,
|
||||||
|
|
||||||
|
SOLID_ARROW_TOP_REVERSE: 45,
|
||||||
|
SOLID_ARROW_BOTTOM_REVERSE: 46,
|
||||||
|
STICK_ARROW_TOP_REVERSE: 47,
|
||||||
|
STICK_ARROW_BOTTOM_REVERSE: 48,
|
||||||
|
|
||||||
|
SOLID_TOP_DOTTED: 51,
|
||||||
|
SOLID_BOTTOM_DOTTED: 52,
|
||||||
|
STICK_TOP_DOTTED: 53,
|
||||||
|
STICK_BOTTOM_DOTTED: 54,
|
||||||
|
|
||||||
|
SOLID_ARROW_TOP_REVERSE_DOTTED: 55,
|
||||||
|
SOLID_ARROW_BOTTOM_REVERSE_DOTTED: 56,
|
||||||
|
STICK_ARROW_TOP_REVERSE_DOTTED: 57,
|
||||||
|
STICK_ARROW_BOTTOM_REVERSE_DOTTED: 58,
|
||||||
|
|
||||||
|
CENTRAL_CONNECTION: 59,
|
||||||
|
CENTRAL_CONNECTION_REVERSE: 60,
|
||||||
|
CENTRAL_CONNECTION_DUAL: 61,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const ARROWTYPE = {
|
const ARROWTYPE = {
|
||||||
@@ -75,6 +101,17 @@ const PLACEMENT = {
|
|||||||
OVER: 2,
|
OVER: 2,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
export const PARTICIPANT_TYPE = {
|
||||||
|
ACTOR: 'actor',
|
||||||
|
BOUNDARY: 'boundary',
|
||||||
|
COLLECTIONS: 'collections',
|
||||||
|
CONTROL: 'control',
|
||||||
|
DATABASE: 'database',
|
||||||
|
ENTITY: 'entity',
|
||||||
|
PARTICIPANT: 'participant',
|
||||||
|
QUEUE: 'queue',
|
||||||
|
} as const;
|
||||||
|
|
||||||
export class SequenceDB implements DiagramDB {
|
export class SequenceDB implements DiagramDB {
|
||||||
private readonly state = new ImperativeState<SequenceState>(() => ({
|
private readonly state = new ImperativeState<SequenceState>(() => ({
|
||||||
prevActor: undefined,
|
prevActor: undefined,
|
||||||
@@ -119,9 +156,22 @@ export class SequenceDB implements DiagramDB {
|
|||||||
id: string,
|
id: string,
|
||||||
name: string,
|
name: string,
|
||||||
description: { text: string; wrap?: boolean | null; type: string },
|
description: { text: string; wrap?: boolean | null; type: string },
|
||||||
type: string
|
type: string,
|
||||||
|
metadata?: any
|
||||||
) {
|
) {
|
||||||
let assignedBox = this.state.records.currentBox;
|
let assignedBox = this.state.records.currentBox;
|
||||||
|
let doc;
|
||||||
|
if (metadata !== undefined) {
|
||||||
|
let yamlData;
|
||||||
|
// detect if shapeData contains a newline character
|
||||||
|
if (!metadata.includes('\n')) {
|
||||||
|
yamlData = '{\n' + metadata + '\n}';
|
||||||
|
} else {
|
||||||
|
yamlData = metadata + '\n';
|
||||||
|
}
|
||||||
|
doc = yaml.load(yamlData, { schema: yaml.JSON_SCHEMA }) as ParticipantMetaData;
|
||||||
|
}
|
||||||
|
type = doc?.type ?? type;
|
||||||
const old = this.state.records.actors.get(id);
|
const old = this.state.records.actors.get(id);
|
||||||
if (old) {
|
if (old) {
|
||||||
// If already set and trying to set to a new one throw error
|
// If already set and trying to set to a new one throw error
|
||||||
@@ -218,7 +268,8 @@ export class SequenceDB implements DiagramDB {
|
|||||||
idTo?: Message['to'],
|
idTo?: Message['to'],
|
||||||
message?: { text: string; wrap: boolean },
|
message?: { text: string; wrap: boolean },
|
||||||
messageType?: number,
|
messageType?: number,
|
||||||
activate = false
|
activate = false,
|
||||||
|
centralConnection?: number
|
||||||
) {
|
) {
|
||||||
if (messageType === this.LINETYPE.ACTIVE_END) {
|
if (messageType === this.LINETYPE.ACTIVE_END) {
|
||||||
const cnt = this.activationCount(idFrom ?? '');
|
const cnt = this.activationCount(idFrom ?? '');
|
||||||
@@ -245,6 +296,7 @@ export class SequenceDB implements DiagramDB {
|
|||||||
wrap: message?.wrap ?? this.autoWrap(),
|
wrap: message?.wrap ?? this.autoWrap(),
|
||||||
type: messageType,
|
type: messageType,
|
||||||
activate,
|
activate,
|
||||||
|
centralConnection: centralConnection ?? 0,
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -518,7 +570,7 @@ export class SequenceDB implements DiagramDB {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'addParticipant':
|
case 'addParticipant':
|
||||||
this.addActor(param.actor, param.actor, param.description, param.draw);
|
this.addActor(param.actor, param.actor, param.description, param.draw, param.config);
|
||||||
break;
|
break;
|
||||||
case 'createParticipant':
|
case 'createParticipant':
|
||||||
if (this.state.records.actors.has(param.actor)) {
|
if (this.state.records.actors.has(param.actor)) {
|
||||||
@@ -527,7 +579,7 @@ export class SequenceDB implements DiagramDB {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.state.records.lastCreated = param.actor;
|
this.state.records.lastCreated = param.actor;
|
||||||
this.addActor(param.actor, param.actor, param.description, param.draw);
|
this.addActor(param.actor, param.actor, param.description, param.draw, param.config);
|
||||||
this.state.records.createdActors.set(param.actor, this.state.records.messages.length);
|
this.state.records.createdActors.set(param.actor, this.state.records.messages.length);
|
||||||
break;
|
break;
|
||||||
case 'destroyParticipant':
|
case 'destroyParticipant':
|
||||||
@@ -537,6 +589,12 @@ export class SequenceDB implements DiagramDB {
|
|||||||
case 'activeStart':
|
case 'activeStart':
|
||||||
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
||||||
break;
|
break;
|
||||||
|
case 'centralConnection':
|
||||||
|
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
||||||
|
break;
|
||||||
|
case 'centralConnectionReverse':
|
||||||
|
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
||||||
|
break;
|
||||||
case 'activeEnd':
|
case 'activeEnd':
|
||||||
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
this.addSignal(param.actor, undefined, undefined, param.signalType);
|
||||||
break;
|
break;
|
||||||
@@ -580,7 +638,14 @@ export class SequenceDB implements DiagramDB {
|
|||||||
this.state.records.lastDestroyed = undefined;
|
this.state.records.lastDestroyed = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.addSignal(param.from, param.to, param.msg, param.signalType, param.activate);
|
this.addSignal(
|
||||||
|
param.from,
|
||||||
|
param.to,
|
||||||
|
param.msg,
|
||||||
|
param.signalType,
|
||||||
|
param.activate,
|
||||||
|
param.centralConnection
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
case 'boxStart':
|
case 'boxStart':
|
||||||
this.addBox(param.boxData);
|
this.addBox(param.boxData);
|
||||||
|
@@ -104,6 +104,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "Alice",
|
"from": "Alice",
|
||||||
"id": "0",
|
"id": "0",
|
||||||
"message": "Hello Bob, how are you?",
|
"message": "Hello Bob, how are you?",
|
||||||
@@ -113,6 +114,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "Bob",
|
"from": "Bob",
|
||||||
"id": "1",
|
"id": "1",
|
||||||
"message": "I am good thanks!",
|
"message": "I am good thanks!",
|
||||||
@@ -131,6 +133,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "Alice",
|
"from": "Alice",
|
||||||
"id": "0",
|
"id": "0",
|
||||||
"message": "Hello Bob, how are you?",
|
"message": "Hello Bob, how are you?",
|
||||||
@@ -140,6 +143,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "Bob",
|
"from": "Bob",
|
||||||
"id": "1",
|
"id": "1",
|
||||||
"message": "I am good thanks!",
|
"message": "I am good thanks!",
|
||||||
@@ -160,6 +164,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "Alice",
|
"from": "Alice",
|
||||||
"id": "0",
|
"id": "0",
|
||||||
"message": "Hello John, how are you?",
|
"message": "Hello John, how are you?",
|
||||||
@@ -169,6 +174,7 @@ describe('more than one sequence diagram', () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"activate": false,
|
"activate": false,
|
||||||
|
"centralConnection": 0,
|
||||||
"from": "John",
|
"from": "John",
|
||||||
"id": "1",
|
"id": "1",
|
||||||
"message": "I am good thanks!",
|
"message": "I am good thanks!",
|
||||||
@@ -2058,4 +2064,302 @@ Bob->>Alice:Got it!
|
|||||||
expect(messages[0].from).toBe('Alice');
|
expect(messages[0].from).toBe('Alice');
|
||||||
expect(messages[0].to).toBe('Bob');
|
expect(messages[0].to).toBe('Bob');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('1 should parse ', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Bob
|
||||||
|
actor Alice
|
||||||
|
Bob -|\\ Alice: Hello Alice, how are you?
|
||||||
|
Bob -|/ Alice: Hello Alice, how are you?
|
||||||
|
Bob -// Alice: Hello Alice, how are you?
|
||||||
|
Bob -\\\\ Alice: Hello Alice, how are you?
|
||||||
|
|
||||||
|
Bob \\|- Alice: Hello Alice, how are you?
|
||||||
|
Bob /|- Alice: Hello Alice, how are you?
|
||||||
|
Bob //- Alice: Hello Alice, how are you?
|
||||||
|
Bob \\\\- Alice: Hello Alice, how are you?
|
||||||
|
`);
|
||||||
|
|
||||||
|
const messages = diagram.db.getMessages();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('2 should parse ', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Bob
|
||||||
|
actor Alice
|
||||||
|
Alice ()<<->>() Bob: hey?
|
||||||
|
`);
|
||||||
|
|
||||||
|
const messages = diagram.db.getMessages();
|
||||||
|
});
|
||||||
|
describe('when parsing extended participant syntax', () => {
|
||||||
|
it('should parse participants with different quote styles and whitespace', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
participant Bob@{ "type" : "database" }
|
||||||
|
participant Carl@{ type: "database" }
|
||||||
|
participant David@{ "type" : 'database' }
|
||||||
|
participant Eve@{ type: 'database' }
|
||||||
|
participant Favela@{ "type" : "database" }
|
||||||
|
Bob->>+Alice: Hi Alice
|
||||||
|
Alice->>+Bob: Hi Bob
|
||||||
|
`);
|
||||||
|
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
|
||||||
|
expect(actors.get('Alice').type).toBe('database');
|
||||||
|
expect(actors.get('Alice').description).toBe('Alice');
|
||||||
|
|
||||||
|
expect(actors.get('Bob').type).toBe('database');
|
||||||
|
expect(actors.get('Bob').description).toBe('Bob');
|
||||||
|
|
||||||
|
expect(actors.get('Carl').type).toBe('database');
|
||||||
|
expect(actors.get('Carl').description).toBe('Carl');
|
||||||
|
|
||||||
|
expect(actors.get('David').type).toBe('database');
|
||||||
|
expect(actors.get('David').description).toBe('David');
|
||||||
|
|
||||||
|
expect(actors.get('Eve').type).toBe('database');
|
||||||
|
expect(actors.get('Eve').description).toBe('Eve');
|
||||||
|
|
||||||
|
expect(actors.get('Favela').type).toBe('database');
|
||||||
|
expect(actors.get('Favela').description).toBe('Favela');
|
||||||
|
|
||||||
|
// Verify messages were parsed correctly
|
||||||
|
const messages = diagram.db.getMessages();
|
||||||
|
expect(messages.length).toBe(4); // 2 messages + 2 activation messages
|
||||||
|
expect(messages[0].from).toBe('Bob');
|
||||||
|
expect(messages[0].to).toBe('Alice');
|
||||||
|
expect(messages[0].message).toBe('Hi Alice');
|
||||||
|
expect(messages[2].from).toBe('Alice'); // Second message (index 2 due to activation)
|
||||||
|
expect(messages[2].to).toBe('Bob');
|
||||||
|
expect(messages[2].message).toBe('Hi Bob');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse mixed participant types with extended syntax', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant lead
|
||||||
|
participant dsa@{ "type" : "queue" }
|
||||||
|
API->>+Database: getUserb
|
||||||
|
Database-->>-API: userb
|
||||||
|
dsa --> Database: hello
|
||||||
|
`);
|
||||||
|
|
||||||
|
// Verify actors were created
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
|
||||||
|
expect(actors.get('lead').type).toBe('participant');
|
||||||
|
expect(actors.get('lead').description).toBe('lead');
|
||||||
|
|
||||||
|
// Participant with extended syntax
|
||||||
|
expect(actors.get('dsa').type).toBe('queue');
|
||||||
|
expect(actors.get('dsa').description).toBe('dsa');
|
||||||
|
|
||||||
|
// Implicitly created actors (from messages)
|
||||||
|
expect(actors.get('API').type).toBe('participant');
|
||||||
|
expect(actors.get('API').description).toBe('API');
|
||||||
|
|
||||||
|
expect(actors.get('Database').type).toBe('participant');
|
||||||
|
expect(actors.get('Database').description).toBe('Database');
|
||||||
|
|
||||||
|
// Verify messages were parsed correctly
|
||||||
|
const messages = diagram.db.getMessages();
|
||||||
|
expect(messages.length).toBe(5); // 3 messages + 2 activation messages
|
||||||
|
|
||||||
|
// First message with activation
|
||||||
|
expect(messages[0].from).toBe('API');
|
||||||
|
expect(messages[0].to).toBe('Database');
|
||||||
|
expect(messages[0].message).toBe('getUserb');
|
||||||
|
expect(messages[0].activate).toBe(true);
|
||||||
|
|
||||||
|
// Second message with deactivation
|
||||||
|
expect(messages[2].from).toBe('Database');
|
||||||
|
expect(messages[2].to).toBe('API');
|
||||||
|
expect(messages[2].message).toBe('userb');
|
||||||
|
|
||||||
|
// Third message
|
||||||
|
expect(messages[4].from).toBe('dsa');
|
||||||
|
expect(messages[4].to).toBe('Database');
|
||||||
|
expect(messages[4].message).toBe('hello');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail for malformed JSON in participant definition', async () => {
|
||||||
|
const invalidDiagram = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant D@{ "type: "entity" }
|
||||||
|
participant E@{ "type": "dat
|
||||||
|
abase }
|
||||||
|
`;
|
||||||
|
|
||||||
|
let error = false;
|
||||||
|
try {
|
||||||
|
await mermaidAPI.parse(invalidDiagram);
|
||||||
|
} catch (e) {
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
expect(error).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail for missing colon separator', async () => {
|
||||||
|
const invalidDiagram = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant C@{ "type" "control" }
|
||||||
|
C ->> C: action
|
||||||
|
`;
|
||||||
|
|
||||||
|
let error = false;
|
||||||
|
try {
|
||||||
|
await mermaidAPI.parse(invalidDiagram);
|
||||||
|
} catch (e) {
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
expect(error).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail for missing closing brace', async () => {
|
||||||
|
const invalidDiagram = `
|
||||||
|
sequenceDiagram
|
||||||
|
participant E@{ "type": "entity"
|
||||||
|
E ->> E: process
|
||||||
|
`;
|
||||||
|
|
||||||
|
let error = false;
|
||||||
|
try {
|
||||||
|
await mermaidAPI.parse(invalidDiagram);
|
||||||
|
} catch (e) {
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
expect(error).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('participant type parsing', () => {
|
||||||
|
it('should parse boundary participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant boundary@{ "type" : "boundary" }
|
||||||
|
boundary->boundary: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('boundary').type).toBe('boundary');
|
||||||
|
expect(actors.get('boundary').description).toBe('boundary');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse control participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant C@{ "type" : "control" }
|
||||||
|
C->C: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('C').type).toBe('control');
|
||||||
|
expect(actors.get('C').description).toBe('C');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse entity participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant E@{ "type" : "entity" }
|
||||||
|
E->E: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('E').type).toBe('entity');
|
||||||
|
expect(actors.get('E').description).toBe('E');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse database participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant D@{ "type" : "database" }
|
||||||
|
D->D: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('D').type).toBe('database');
|
||||||
|
expect(actors.get('D').description).toBe('D');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse collections participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant L@{ "type" : "collections" }
|
||||||
|
L->L: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('L').type).toBe('collections');
|
||||||
|
expect(actors.get('L').description).toBe('L');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse queue participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Q@{ "type" : "queue" }
|
||||||
|
Q->Q: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('Q').type).toBe('queue');
|
||||||
|
expect(actors.get('Q').description).toBe('Q');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('participant type parsing', () => {
|
||||||
|
it('should parse actor participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant A@{ "type" : "queue" }
|
||||||
|
A->A: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('A').type).toBe('queue');
|
||||||
|
expect(actors.get('A').description).toBe('A');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse participant participant', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant P@{ "type" : "database" }
|
||||||
|
P->P: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('P').type).toBe('database');
|
||||||
|
expect(actors.get('P').description).toBe('P');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse boundary using actor keyword', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "collections" }
|
||||||
|
participant Bob@{ "type" : "control" }
|
||||||
|
Alice->>Bob: Hello Bob, how are you?
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('Alice').type).toBe('collections');
|
||||||
|
expect(actors.get('Bob').type).toBe('control');
|
||||||
|
expect(actors.get('Bob').description).toBe('Bob');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse control using participant keyword', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant C@{ "type" : "control" }
|
||||||
|
C->C: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('C').type).toBe('control');
|
||||||
|
expect(actors.get('C').description).toBe('C');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse entity using actor keyword', async () => {
|
||||||
|
const diagram = await Diagram.fromText(`
|
||||||
|
sequenceDiagram
|
||||||
|
participant E@{ "type" : "entity" }
|
||||||
|
E->E: test
|
||||||
|
`);
|
||||||
|
const actors = diagram.db.getActors();
|
||||||
|
expect(actors.get('E').type).toBe('entity');
|
||||||
|
expect(actors.get('E').description).toBe('E');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -10,6 +10,7 @@ import assignWithDepth from '../../assignWithDepth.js';
|
|||||||
import utils from '../../utils.js';
|
import utils from '../../utils.js';
|
||||||
import { configureSvgSize } from '../../setupGraphViewbox.js';
|
import { configureSvgSize } from '../../setupGraphViewbox.js';
|
||||||
import type { Diagram } from '../../Diagram.js';
|
import type { Diagram } from '../../Diagram.js';
|
||||||
|
import { PARTICIPANT_TYPE } from './sequenceDb.js';
|
||||||
|
|
||||||
let conf = {};
|
let conf = {};
|
||||||
|
|
||||||
@@ -281,6 +282,44 @@ const drawNote = async function (elem: any, noteModel: NoteModel) {
|
|||||||
bounds.models.addNote(noteModel);
|
bounds.models.addNote(noteModel);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const drawCentralConnection = function (
|
||||||
|
elem: any,
|
||||||
|
msg: any,
|
||||||
|
msgModel: any,
|
||||||
|
diagObj: Diagram,
|
||||||
|
startx: number,
|
||||||
|
stopx: number,
|
||||||
|
lineStartY: number
|
||||||
|
) {
|
||||||
|
const actors = diagObj.db.getActors();
|
||||||
|
const [fromLeft] = activationBounds(msg.from, actors);
|
||||||
|
const [toLeft] = activationBounds(msg.to, actors);
|
||||||
|
const isArrowToRight = fromLeft <= toLeft;
|
||||||
|
|
||||||
|
const g = elem.append('g');
|
||||||
|
|
||||||
|
const drawCircle = (cx: number) => {
|
||||||
|
g.append('circle')
|
||||||
|
.attr('cx', cx)
|
||||||
|
.attr('cy', lineStartY)
|
||||||
|
.attr('r', 5)
|
||||||
|
.attr('width', 10)
|
||||||
|
.attr('height', 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (msg.centralConnection === diagObj.db.LINETYPE.CENTRAL_CONNECTION) {
|
||||||
|
const cx = isArrowToRight ? stopx + 5 : stopx - 8;
|
||||||
|
drawCircle(cx);
|
||||||
|
} else if (msg.centralConnection === diagObj.db.LINETYPE.CENTRAL_CONNECTION_REVERSE) {
|
||||||
|
const cx = isArrowToRight ? startx - 5 : stopx + 8;
|
||||||
|
drawCircle(cx);
|
||||||
|
} else if (msg.centralConnection === diagObj.db.LINETYPE.CENTRAL_CONNECTION_DUAL) {
|
||||||
|
const offset = isArrowToRight ? 5 : -5;
|
||||||
|
drawCircle(stopx + offset);
|
||||||
|
drawCircle(startx - offset);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const messageFont = (cnf) => {
|
const messageFont = (cnf) => {
|
||||||
return {
|
return {
|
||||||
fontFamily: cnf.messageFontFamily,
|
fontFamily: cnf.messageFontFamily,
|
||||||
@@ -366,7 +405,7 @@ async function boundMessage(_diagram, msgModel): Promise<number> {
|
|||||||
* @param lineStartY - The Y coordinate at which the message line starts
|
* @param lineStartY - The Y coordinate at which the message line starts
|
||||||
* @param diagObj - The diagram object.
|
* @param diagObj - The diagram object.
|
||||||
*/
|
*/
|
||||||
const drawMessage = async function (diagram, msgModel, lineStartY: number, diagObj: Diagram) {
|
const drawMessage = async function (diagram, msgModel, lineStartY: number, diagObj: Diagram, msg) {
|
||||||
const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel;
|
const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel;
|
||||||
const textDims = utils.calculateTextDimensions(message, messageFont(conf));
|
const textDims = utils.calculateTextDimensions(message, messageFont(conf));
|
||||||
const textObj = svgDrawCommon.getTextObj();
|
const textObj = svgDrawCommon.getTextObj();
|
||||||
@@ -432,6 +471,9 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
line.attr('y1', lineStartY);
|
line.attr('y1', lineStartY);
|
||||||
line.attr('x2', stopx);
|
line.attr('x2', stopx);
|
||||||
line.attr('y2', lineStartY);
|
line.attr('y2', lineStartY);
|
||||||
|
if (msg.centralConnection) {
|
||||||
|
drawCentralConnection(diagram, msg, msgModel, diagObj, startx, stopx, lineStartY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Make an SVG Container
|
// Make an SVG Container
|
||||||
// Draw the line
|
// Draw the line
|
||||||
@@ -440,7 +482,15 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
type === diagObj.db.LINETYPE.DOTTED_CROSS ||
|
type === diagObj.db.LINETYPE.DOTTED_CROSS ||
|
||||||
type === diagObj.db.LINETYPE.DOTTED_POINT ||
|
type === diagObj.db.LINETYPE.DOTTED_POINT ||
|
||||||
type === diagObj.db.LINETYPE.DOTTED_OPEN ||
|
type === diagObj.db.LINETYPE.DOTTED_OPEN ||
|
||||||
type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED
|
type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_TOP_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_BOTTOM_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_TOP_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_BOTTOM_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED
|
||||||
) {
|
) {
|
||||||
line.style('stroke-dasharray', '3, 3');
|
line.style('stroke-dasharray', '3, 3');
|
||||||
line.attr('class', 'messageLine1');
|
line.attr('class', 'messageLine1');
|
||||||
@@ -456,6 +506,51 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
line.attr('stroke-width', 2);
|
line.attr('stroke-width', 2);
|
||||||
line.attr('stroke', 'none'); // handled by theme/css anyway
|
line.attr('stroke', 'none'); // handled by theme/css anyway
|
||||||
line.style('fill', 'none'); // remove any fill colour
|
line.style('fill', 'none'); // remove any fill colour
|
||||||
|
|
||||||
|
if (type === diagObj.db.LINETYPE.SOLID_TOP || type === diagObj.db.LINETYPE.SOLID_TOP_DOTTED) {
|
||||||
|
line.attr('marker-end', 'url(' + url + '#solidTopArrowHead)');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_BOTTOM ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_BOTTOM_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-end', 'url(' + url + '#solidBottomArrowHead)');
|
||||||
|
}
|
||||||
|
if (type === diagObj.db.LINETYPE.STICK_TOP || type === diagObj.db.LINETYPE.STICK_TOP_DOTTED) {
|
||||||
|
line.attr('marker-end', 'url(' + url + '#stickTopArrowHead)');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.STICK_BOTTOM ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_BOTTOM_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-end', 'url(' + url + '#stickBottomArrowHead)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-start', 'url(' + url + '#solidBottomArrowHead)');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-start', 'url(' + url + '#solidTopArrowHead)');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-start', 'url(' + url + '#stickBottomArrowHead)');
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED
|
||||||
|
) {
|
||||||
|
line.attr('marker-start', 'url(' + url + '#stickTopArrowHead)');
|
||||||
|
}
|
||||||
|
|
||||||
if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) {
|
if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) {
|
||||||
line.attr('marker-end', 'url(' + url + '#arrowhead)');
|
line.attr('marker-end', 'url(' + url + '#arrowhead)');
|
||||||
}
|
}
|
||||||
@@ -476,7 +571,42 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
|
|
||||||
// add node number
|
// add node number
|
||||||
if (sequenceVisible || conf.showSequenceNumbers) {
|
if (sequenceVisible || conf.showSequenceNumbers) {
|
||||||
line.attr('marker-start', 'url(' + url + '#sequencenumber)');
|
const isBidirectional =
|
||||||
|
type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID ||
|
||||||
|
type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED;
|
||||||
|
|
||||||
|
const isReverseArrowType =
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE ||
|
||||||
|
type === diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED;
|
||||||
|
|
||||||
|
let x = 0;
|
||||||
|
if (isBidirectional || isReverseArrowType) {
|
||||||
|
const SEQUENCE_NUMBER_RADIUS = 6;
|
||||||
|
|
||||||
|
if (startx < stopx) {
|
||||||
|
line.attr('x1', startx + 2 * SEQUENCE_NUMBER_RADIUS);
|
||||||
|
} else {
|
||||||
|
line.attr('x1', startx + SEQUENCE_NUMBER_RADIUS);
|
||||||
|
}
|
||||||
|
x = 3.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
diagram
|
||||||
|
.append('line')
|
||||||
|
.attr('x1', startx)
|
||||||
|
.attr('y1', lineStartY)
|
||||||
|
.attr('x2', startx)
|
||||||
|
.attr('y2', lineStartY)
|
||||||
|
.attr('stroke-width', 0)
|
||||||
|
.attr('marker-start', 'url(' + url + '#sequencenumber)')
|
||||||
|
.attr('transform', `translate(-${x}, 0)`);
|
||||||
|
|
||||||
diagram
|
diagram
|
||||||
.append('text')
|
.append('text')
|
||||||
.attr('x', startx)
|
.attr('x', startx)
|
||||||
@@ -485,7 +615,8 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
.attr('font-size', '12px')
|
.attr('font-size', '12px')
|
||||||
.attr('text-anchor', 'middle')
|
.attr('text-anchor', 'middle')
|
||||||
.attr('class', 'sequenceNumber')
|
.attr('class', 'sequenceNumber')
|
||||||
.text(sequenceIndex);
|
.text(sequenceIndex)
|
||||||
|
.attr('transform', `translate(-${x}, 0)`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -724,11 +855,19 @@ function adjustCreatedDestroyedData(
|
|||||||
msgModel.startx = msgModel.startx - adjustment;
|
msgModel.startx = msgModel.startx - adjustment;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const actorArray = [
|
||||||
|
PARTICIPANT_TYPE.ACTOR,
|
||||||
|
PARTICIPANT_TYPE.CONTROL,
|
||||||
|
PARTICIPANT_TYPE.ENTITY,
|
||||||
|
PARTICIPANT_TYPE.DATABASE,
|
||||||
|
];
|
||||||
|
|
||||||
// if it is a create message
|
// if it is a create message
|
||||||
if (createdActors.get(msg.to) == index) {
|
if (createdActors.get(msg.to) == index) {
|
||||||
const actor = actors.get(msg.to);
|
const actor = actors.get(msg.to);
|
||||||
const adjustment = actor.type == 'actor' ? ACTOR_TYPE_WIDTH / 2 + 3 : actor.width / 2 + 3;
|
const adjustment = actorArray.includes(actor.type)
|
||||||
|
? ACTOR_TYPE_WIDTH / 2 + 3
|
||||||
|
: actor.width / 2 + 3;
|
||||||
receiverAdjustment(actor, adjustment);
|
receiverAdjustment(actor, adjustment);
|
||||||
actor.starty = lineStartY - actor.height / 2;
|
actor.starty = lineStartY - actor.height / 2;
|
||||||
bounds.bumpVerticalPos(actor.height / 2);
|
bounds.bumpVerticalPos(actor.height / 2);
|
||||||
@@ -737,7 +876,7 @@ function adjustCreatedDestroyedData(
|
|||||||
else if (destroyedActors.get(msg.from) == index) {
|
else if (destroyedActors.get(msg.from) == index) {
|
||||||
const actor = actors.get(msg.from);
|
const actor = actors.get(msg.from);
|
||||||
if (conf.mirrorActors) {
|
if (conf.mirrorActors) {
|
||||||
const adjustment = actor.type == 'actor' ? ACTOR_TYPE_WIDTH / 2 : actor.width / 2;
|
const adjustment = actorArray.includes(actor.type) ? ACTOR_TYPE_WIDTH / 2 : actor.width / 2;
|
||||||
senderAdjustment(actor, adjustment);
|
senderAdjustment(actor, adjustment);
|
||||||
}
|
}
|
||||||
actor.stopy = lineStartY - actor.height / 2;
|
actor.stopy = lineStartY - actor.height / 2;
|
||||||
@@ -747,7 +886,9 @@ function adjustCreatedDestroyedData(
|
|||||||
else if (destroyedActors.get(msg.to) == index) {
|
else if (destroyedActors.get(msg.to) == index) {
|
||||||
const actor = actors.get(msg.to);
|
const actor = actors.get(msg.to);
|
||||||
if (conf.mirrorActors) {
|
if (conf.mirrorActors) {
|
||||||
const adjustment = actor.type == 'actor' ? ACTOR_TYPE_WIDTH / 2 + 3 : actor.width / 2 + 3;
|
const adjustment = actorArray.includes(actor.type)
|
||||||
|
? ACTOR_TYPE_WIDTH / 2 + 3
|
||||||
|
: actor.width / 2 + 3;
|
||||||
receiverAdjustment(actor, adjustment);
|
receiverAdjustment(actor, adjustment);
|
||||||
}
|
}
|
||||||
actor.stopy = lineStartY - actor.height / 2;
|
actor.stopy = lineStartY - actor.height / 2;
|
||||||
@@ -824,6 +965,10 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
svgDraw.insertArrowCrossHead(diagram);
|
svgDraw.insertArrowCrossHead(diagram);
|
||||||
svgDraw.insertArrowFilledHead(diagram);
|
svgDraw.insertArrowFilledHead(diagram);
|
||||||
svgDraw.insertSequenceNumber(diagram);
|
svgDraw.insertSequenceNumber(diagram);
|
||||||
|
svgDraw.insertSolidTopArrowHead(diagram);
|
||||||
|
svgDraw.insertSolidBottomArrowHead(diagram);
|
||||||
|
svgDraw.insertStickTopArrowHead(diagram);
|
||||||
|
svgDraw.insertStickBottomArrowHead(diagram);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param msg - The message to draw.
|
* @param msg - The message to draw.
|
||||||
@@ -864,6 +1009,12 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
case diagObj.db.LINETYPE.ACTIVE_START:
|
case diagObj.db.LINETYPE.ACTIVE_START:
|
||||||
bounds.newActivation(msg, diagram, actors);
|
bounds.newActivation(msg, diagram, actors);
|
||||||
break;
|
break;
|
||||||
|
case diagObj.db.LINETYPE.CENTRAL_CONNECTION:
|
||||||
|
bounds.newActivation(msg, diagram, actors);
|
||||||
|
break;
|
||||||
|
case diagObj.db.LINETYPE.CENTRAL_CONNECTION_REVERSE:
|
||||||
|
bounds.newActivation(msg, diagram, actors);
|
||||||
|
break;
|
||||||
case diagObj.db.LINETYPE.ACTIVE_END:
|
case diagObj.db.LINETYPE.ACTIVE_END:
|
||||||
activeEnd(msg, bounds.getVerticalPos());
|
activeEnd(msg, bounds.getVerticalPos());
|
||||||
break;
|
break;
|
||||||
@@ -1022,7 +1173,7 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
createdActors,
|
createdActors,
|
||||||
destroyedActors
|
destroyedActors
|
||||||
);
|
);
|
||||||
messagesToDraw.push({ messageModel: msgModel, lineStartY: lineStartY });
|
messagesToDraw.push({ messageModel: msgModel, lineStartY: lineStartY, msg });
|
||||||
bounds.models.addMessage(msgModel);
|
bounds.models.addMessage(msgModel);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.error('error while drawing message', e);
|
log.error('error while drawing message', e);
|
||||||
@@ -1035,6 +1186,27 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
diagObj.db.LINETYPE.SOLID_OPEN,
|
diagObj.db.LINETYPE.SOLID_OPEN,
|
||||||
diagObj.db.LINETYPE.DOTTED_OPEN,
|
diagObj.db.LINETYPE.DOTTED_OPEN,
|
||||||
diagObj.db.LINETYPE.SOLID,
|
diagObj.db.LINETYPE.SOLID,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_TOP,
|
||||||
|
diagObj.db.LINETYPE.SOLID_BOTTOM,
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_TOP_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_BOTTOM_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM_DOTTED,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
|
||||||
diagObj.db.LINETYPE.DOTTED,
|
diagObj.db.LINETYPE.DOTTED,
|
||||||
diagObj.db.LINETYPE.SOLID_CROSS,
|
diagObj.db.LINETYPE.SOLID_CROSS,
|
||||||
diagObj.db.LINETYPE.DOTTED_CROSS,
|
diagObj.db.LINETYPE.DOTTED_CROSS,
|
||||||
@@ -1054,7 +1226,7 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
await drawActors(diagram, actors, actorKeys, false);
|
await drawActors(diagram, actors, actorKeys, false);
|
||||||
|
|
||||||
for (const e of messagesToDraw) {
|
for (const e of messagesToDraw) {
|
||||||
await drawMessage(diagram, e.messageModel, e.lineStartY, diagObj);
|
await drawMessage(diagram, e.messageModel, e.lineStartY, diagObj, e.msg);
|
||||||
}
|
}
|
||||||
if (conf.mirrorActors) {
|
if (conf.mirrorActors) {
|
||||||
await drawActors(diagram, actors, actorKeys, true);
|
await drawActors(diagram, actors, actorKeys, true);
|
||||||
@@ -1065,10 +1237,11 @@ export const draw = async function (_text: string, id: string, _version: string,
|
|||||||
for (const box of bounds.models.boxes) {
|
for (const box of bounds.models.boxes) {
|
||||||
box.height = bounds.getVerticalPos() - box.y;
|
box.height = bounds.getVerticalPos() - box.y;
|
||||||
bounds.insert(box.x, box.y, box.x + box.width, box.height);
|
bounds.insert(box.x, box.y, box.x + box.width, box.height);
|
||||||
box.startx = box.x;
|
const boxPadding = conf.boxMargin * 2;
|
||||||
box.starty = box.y;
|
box.startx = box.x - boxPadding;
|
||||||
box.stopx = box.startx + box.width;
|
box.starty = box.y - boxPadding * 0.25;
|
||||||
box.stopy = box.starty + box.height;
|
box.stopx = box.startx + box.width + 2 * boxPadding;
|
||||||
|
box.stopy = box.starty + box.height + boxPadding * 0.75;
|
||||||
box.stroke = 'rgb(0,0,0, 0.5)';
|
box.stroke = 'rgb(0,0,0, 0.5)';
|
||||||
svgDraw.drawBox(diagram, box, conf);
|
svgDraw.drawBox(diagram, box, conf);
|
||||||
}
|
}
|
||||||
@@ -1333,6 +1506,9 @@ async function calculateActorMargins(
|
|||||||
return (total += actors.get(aKey).width + (actors.get(aKey).margin || 0));
|
return (total += actors.get(aKey).width + (actors.get(aKey).margin || 0));
|
||||||
}, 0);
|
}, 0);
|
||||||
|
|
||||||
|
const standardBoxPadding = conf.boxMargin * 8;
|
||||||
|
totalWidth += standardBoxPadding;
|
||||||
|
|
||||||
totalWidth -= 2 * conf.boxTextMargin;
|
totalWidth -= 2 * conf.boxTextMargin;
|
||||||
if (box.wrap) {
|
if (box.wrap) {
|
||||||
box.name = utils.wrapLabel(box.name, totalWidth - 2 * conf.wrapPadding, textFont);
|
box.name = utils.wrapLabel(box.name, totalWidth - 2 * conf.wrapPadding, textFont);
|
||||||
@@ -1430,6 +1606,27 @@ const buildMessageModel = function (msg, actors, diagObj) {
|
|||||||
diagObj.db.LINETYPE.SOLID_OPEN,
|
diagObj.db.LINETYPE.SOLID_OPEN,
|
||||||
diagObj.db.LINETYPE.DOTTED_OPEN,
|
diagObj.db.LINETYPE.DOTTED_OPEN,
|
||||||
diagObj.db.LINETYPE.SOLID,
|
diagObj.db.LINETYPE.SOLID,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_TOP,
|
||||||
|
diagObj.db.LINETYPE.SOLID_BOTTOM,
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_TOP_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_BOTTOM_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM_DOTTED,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
|
||||||
diagObj.db.LINETYPE.DOTTED,
|
diagObj.db.LINETYPE.DOTTED,
|
||||||
diagObj.db.LINETYPE.SOLID_CROSS,
|
diagObj.db.LINETYPE.SOLID_CROSS,
|
||||||
diagObj.db.LINETYPE.DOTTED_CROSS,
|
diagObj.db.LINETYPE.DOTTED_CROSS,
|
||||||
@@ -1447,6 +1644,12 @@ const buildMessageModel = function (msg, actors, diagObj) {
|
|||||||
let startx = isArrowToRight ? fromRight : fromLeft;
|
let startx = isArrowToRight ? fromRight : fromLeft;
|
||||||
let stopx = isArrowToRight ? toLeft : toRight;
|
let stopx = isArrowToRight ? toLeft : toRight;
|
||||||
|
|
||||||
|
if (
|
||||||
|
msg.centralConnection === diagObj.db.LINETYPE.CENTRAL_CONNECTION_REVERSE ||
|
||||||
|
msg.centralConnection === diagObj.db.LINETYPE.CENTRAL_CONNECTION_DUAL
|
||||||
|
) {
|
||||||
|
startx += 4;
|
||||||
|
}
|
||||||
// As the line width is considered, the left and right values will be off by 2.
|
// As the line width is considered, the left and right values will be off by 2.
|
||||||
const isArrowToActivation = Math.abs(toLeft - toRight) > 2;
|
const isArrowToActivation = Math.abs(toLeft - toRight) > 2;
|
||||||
|
|
||||||
@@ -1480,7 +1683,30 @@ const buildMessageModel = function (msg, actors, diagObj) {
|
|||||||
* Shorten the length of arrow at the end and move the marker forward (using refX) to have a clean arrowhead
|
* Shorten the length of arrow at the end and move the marker forward (using refX) to have a clean arrowhead
|
||||||
* This is not required for open arrows that don't have arrowheads
|
* This is not required for open arrows that don't have arrowheads
|
||||||
*/
|
*/
|
||||||
if (![diagObj.db.LINETYPE.SOLID_OPEN, diagObj.db.LINETYPE.DOTTED_OPEN].includes(msg.type)) {
|
if (
|
||||||
|
![
|
||||||
|
diagObj.db.LINETYPE.SOLID_OPEN,
|
||||||
|
diagObj.db.LINETYPE.DOTTED_OPEN,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.STICK_TOP_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_BOTTOM_DOTTED,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,
|
||||||
|
].includes(msg.type)
|
||||||
|
) {
|
||||||
stopx += adjustValue(3);
|
stopx += adjustValue(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1488,9 +1714,14 @@ const buildMessageModel = function (msg, actors, diagObj) {
|
|||||||
* Shorten start position of bidirectional arrow to accommodate for second arrowhead
|
* Shorten start position of bidirectional arrow to accommodate for second arrowhead
|
||||||
*/
|
*/
|
||||||
if (
|
if (
|
||||||
[diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(
|
[
|
||||||
msg.type
|
diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID,
|
||||||
)
|
diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,
|
||||||
|
diagObj.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,
|
||||||
|
].includes(msg.type)
|
||||||
) {
|
) {
|
||||||
startx -= adjustValue(3);
|
startx -= adjustValue(3);
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,11 @@ const getStyles = (options) =>
|
|||||||
.actor-line {
|
.actor-line {
|
||||||
stroke: ${options.actorLineColor};
|
stroke: ${options.actorLineColor};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.innerArc {
|
||||||
|
stroke-width: 1.5;
|
||||||
|
stroke-dasharray: none;
|
||||||
|
}
|
||||||
|
|
||||||
.messageLine0 {
|
.messageLine0 {
|
||||||
stroke-width: 1.5;
|
stroke-width: 1.5;
|
||||||
@@ -115,6 +120,7 @@ const getStyles = (options) =>
|
|||||||
fill: ${options.actorBkg};
|
fill: ${options.actorBkg};
|
||||||
stroke-width: 2px;
|
stroke-width: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default getStyles;
|
export default getStyles;
|
||||||
|
@@ -415,6 +415,600 @@ const drawActorTypeParticipant = function (elem, actor, conf, isFooter) {
|
|||||||
return height;
|
return height;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws an actor in the diagram with the attached line
|
||||||
|
*
|
||||||
|
* @param {any} elem - The diagram we'll draw to.
|
||||||
|
* @param {any} actor - The actor to draw.
|
||||||
|
* @param {any} conf - DrawText implementation discriminator object
|
||||||
|
* @param {boolean} isFooter - If the actor is the footer one
|
||||||
|
*/
|
||||||
|
const drawActorTypeCollections = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + actor.height;
|
||||||
|
|
||||||
|
const boxplusLineGroup = elem.append('g').lower();
|
||||||
|
var g = boxplusLineGroup;
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
if (Object.keys(actor.links || {}).length && !conf.forceMenus) {
|
||||||
|
g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');
|
||||||
|
}
|
||||||
|
g.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
g = boxplusLineGroup.append('g');
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
|
||||||
|
if (actor.links != null) {
|
||||||
|
g.attr('id', 'root-' + actorCnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
var cssclass = 'actor';
|
||||||
|
if (actor.properties?.class) {
|
||||||
|
cssclass = actor.properties.class;
|
||||||
|
} else {
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
}
|
||||||
|
if (isFooter) {
|
||||||
|
cssclass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssclass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = cssclass;
|
||||||
|
rect.name = actor.name;
|
||||||
|
|
||||||
|
// DRAW STACKED RECTANGLES
|
||||||
|
const offset = 6;
|
||||||
|
const shadowRect = {
|
||||||
|
...rect,
|
||||||
|
x: rect.x + (isFooter ? -offset : -offset),
|
||||||
|
y: rect.y + (isFooter ? +offset : +offset),
|
||||||
|
class: 'actor',
|
||||||
|
};
|
||||||
|
const rectElem = drawRect(g, rect); // draw main rectangle on top
|
||||||
|
drawRect(g, shadowRect);
|
||||||
|
actor.rectData = rect;
|
||||||
|
|
||||||
|
if (actor.properties?.icon) {
|
||||||
|
const iconSrc = actor.properties.icon.trim();
|
||||||
|
if (iconSrc.charAt(0) === '@') {
|
||||||
|
svgDrawCommon.drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1));
|
||||||
|
} else {
|
||||||
|
svgDrawCommon.drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
g,
|
||||||
|
rect.x - offset,
|
||||||
|
rect.y + offset,
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_BOX_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
let height = actor.height;
|
||||||
|
if (rectElem.node) {
|
||||||
|
const bounds = rectElem.node().getBBox();
|
||||||
|
actor.height = bounds.height;
|
||||||
|
height = bounds.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return height;
|
||||||
|
};
|
||||||
|
|
||||||
|
const drawActorTypeQueue = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + actor.height;
|
||||||
|
|
||||||
|
const boxplusLineGroup = elem.append('g').lower();
|
||||||
|
let g = boxplusLineGroup;
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
if (Object.keys(actor.links || {}).length && !conf.forceMenus) {
|
||||||
|
g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');
|
||||||
|
}
|
||||||
|
g.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
g = boxplusLineGroup.append('g');
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
|
||||||
|
if (actor.links != null) {
|
||||||
|
g.attr('id', 'root-' + actorCnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
let cssclass = 'actor';
|
||||||
|
if (actor.properties?.class) {
|
||||||
|
cssclass = actor.properties.class;
|
||||||
|
} else {
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFooter) {
|
||||||
|
cssclass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssclass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = cssclass;
|
||||||
|
rect.name = actor.name;
|
||||||
|
|
||||||
|
// Cylinder dimensions
|
||||||
|
const ry = rect.height / 2;
|
||||||
|
const rx = ry / (2.5 + rect.height / 50);
|
||||||
|
|
||||||
|
// Cylinder base group
|
||||||
|
const cylinderGroup = g.append('g');
|
||||||
|
const cylinderArc = g.append('g');
|
||||||
|
|
||||||
|
// Main cylinder body
|
||||||
|
cylinderGroup
|
||||||
|
.append('path')
|
||||||
|
.attr(
|
||||||
|
'd',
|
||||||
|
`M ${rect.x},${rect.y + ry}
|
||||||
|
a ${rx},${ry} 0 0 0 0,${rect.height}
|
||||||
|
h ${rect.width - 2 * rx}
|
||||||
|
a ${rx},${ry} 0 0 0 0,-${rect.height}
|
||||||
|
Z
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.attr('class', cssclass);
|
||||||
|
cylinderArc
|
||||||
|
.append('path')
|
||||||
|
.attr(
|
||||||
|
'd',
|
||||||
|
`M ${rect.x},${rect.y + ry}
|
||||||
|
a ${rx},${ry} 0 0 0 0,${rect.height}`
|
||||||
|
)
|
||||||
|
.attr('stroke', '#666')
|
||||||
|
.attr('stroke-width', '1px')
|
||||||
|
.attr('class', cssclass);
|
||||||
|
|
||||||
|
cylinderGroup.attr('transform', `translate(${rx}, ${-(rect.height / 2)})`);
|
||||||
|
cylinderArc.attr('transform', `translate(${rect.width - rx}, ${-rect.height / 2})`);
|
||||||
|
|
||||||
|
actor.rectData = rect;
|
||||||
|
|
||||||
|
if (actor.properties?.icon) {
|
||||||
|
const iconSrc = actor.properties.icon.trim();
|
||||||
|
const iconX = rect.x + rect.width - 20;
|
||||||
|
const iconY = rect.y + 10;
|
||||||
|
if (iconSrc.charAt(0) === '@') {
|
||||||
|
svgDrawCommon.drawEmbeddedImage(g, iconX, iconY, iconSrc.substr(1));
|
||||||
|
} else {
|
||||||
|
svgDrawCommon.drawImage(g, iconX, iconY, iconSrc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
g,
|
||||||
|
rect.x,
|
||||||
|
rect.y,
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_BOX_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
let height = actor.height;
|
||||||
|
const lastPath = cylinderGroup.select('path:last-child');
|
||||||
|
if (lastPath.node()) {
|
||||||
|
const bounds = lastPath.node().getBBox();
|
||||||
|
actor.height = bounds.height;
|
||||||
|
height = bounds.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return height;
|
||||||
|
};
|
||||||
|
|
||||||
|
const drawActorTypeControl = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + 75;
|
||||||
|
|
||||||
|
const line = elem.append('g').lower();
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
line
|
||||||
|
.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
}
|
||||||
|
const actElem = elem.append('g');
|
||||||
|
let cssClass = ACTOR_MAN_FIGURE_CLASS;
|
||||||
|
if (isFooter) {
|
||||||
|
cssClass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssClass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
actElem.attr('class', cssClass);
|
||||||
|
actElem.attr('name', actor.name);
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = 'actor';
|
||||||
|
|
||||||
|
const cx = actor.x + actor.width / 2;
|
||||||
|
const cy = actorY + 30;
|
||||||
|
const r = 18;
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', 'filled-head-control')
|
||||||
|
.attr('refX', 11)
|
||||||
|
.attr('refY', 5.8)
|
||||||
|
.attr('markerWidth', 20)
|
||||||
|
.attr('markerHeight', 28)
|
||||||
|
.attr('orient', '172.5')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z');
|
||||||
|
|
||||||
|
// Draw the base circle
|
||||||
|
actElem
|
||||||
|
.append('circle')
|
||||||
|
.attr('cx', cx)
|
||||||
|
.attr('cy', cy)
|
||||||
|
.attr('r', r)
|
||||||
|
.attr('fill', '#eaeaf7')
|
||||||
|
.attr('stroke', '#666')
|
||||||
|
.attr('stroke-width', 1.2);
|
||||||
|
|
||||||
|
// Draw looping arrow as arc path
|
||||||
|
actElem
|
||||||
|
.append('line')
|
||||||
|
.attr('marker-end', 'url(#filled-head-control)')
|
||||||
|
.attr('transform', `translate(${cx}, ${cy - r})`);
|
||||||
|
|
||||||
|
const bounds = actElem.node().getBBox();
|
||||||
|
actor.height = bounds.height + 2 * (conf?.sequence?.labelBoxHeight ?? 0);
|
||||||
|
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
actElem,
|
||||||
|
rect.x,
|
||||||
|
rect.y + r + (isFooter ? 5 : 10),
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
return actor.height;
|
||||||
|
};
|
||||||
|
|
||||||
|
const drawActorTypeEntity = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + 75;
|
||||||
|
|
||||||
|
const line = elem.append('g').lower();
|
||||||
|
|
||||||
|
const actElem = elem.append('g');
|
||||||
|
let cssClass = ACTOR_MAN_FIGURE_CLASS;
|
||||||
|
if (isFooter) {
|
||||||
|
cssClass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssClass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
actElem.attr('class', cssClass);
|
||||||
|
actElem.attr('name', actor.name);
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = 'actor';
|
||||||
|
|
||||||
|
const cx = actor.x + actor.width / 2;
|
||||||
|
const cy = actorY + (!isFooter ? 25 : 10);
|
||||||
|
const r = 18;
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('circle')
|
||||||
|
.attr('cx', cx)
|
||||||
|
.attr('cy', cy)
|
||||||
|
.attr('r', r)
|
||||||
|
.attr('width', actor.width)
|
||||||
|
.attr('height', actor.height);
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('line')
|
||||||
|
.attr('x1', cx - r)
|
||||||
|
.attr('x2', cx + r)
|
||||||
|
.attr('y1', cy + r)
|
||||||
|
.attr('y2', cy + r)
|
||||||
|
.attr('stroke', '#333')
|
||||||
|
.attr('stroke-width', 2);
|
||||||
|
|
||||||
|
const bounds = actElem.node().getBBox();
|
||||||
|
actor.height = bounds.height + (conf?.sequence?.labelBoxHeight ?? 0);
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
line
|
||||||
|
.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
actElem,
|
||||||
|
rect.x,
|
||||||
|
rect.y + (!isFooter ? (cy + r - actorY) / 2 : (cy - actorY + r - 5) / 2),
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actElem.attr('transform', `translate(${0}, ${r / 2})`);
|
||||||
|
} else {
|
||||||
|
actElem.attr('transform', `translate(${0}, ${r / 2})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actor.height;
|
||||||
|
};
|
||||||
|
|
||||||
|
const drawActorTypeDatabase = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + actor.height + 2 * conf.boxTextMargin;
|
||||||
|
|
||||||
|
const boxplusLineGroup = elem.append('g').lower();
|
||||||
|
let g = boxplusLineGroup;
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
if (Object.keys(actor.links || {}).length && !conf.forceMenus) {
|
||||||
|
g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');
|
||||||
|
}
|
||||||
|
g.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
g = boxplusLineGroup.append('g');
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
|
||||||
|
if (actor.links != null) {
|
||||||
|
g.attr('id', 'root-' + actorCnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
|
||||||
|
let cssclass = 'actor';
|
||||||
|
if (actor.properties?.class) {
|
||||||
|
cssclass = actor.properties.class;
|
||||||
|
} else {
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFooter) {
|
||||||
|
cssclass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssclass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = cssclass;
|
||||||
|
rect.name = actor.name;
|
||||||
|
|
||||||
|
// Cylinder dimensions
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
const w = rect.width / 4;
|
||||||
|
const h = rect.width / 4;
|
||||||
|
const rx = w / 2;
|
||||||
|
const ry = rx / (2.5 + w / 50);
|
||||||
|
|
||||||
|
// Cylinder base group
|
||||||
|
const cylinderGroup = g.append('g');
|
||||||
|
|
||||||
|
const d = `
|
||||||
|
M ${rect.x},${rect.y + ry}
|
||||||
|
a ${rx},${ry} 0 0 0 ${w},0
|
||||||
|
a ${rx},${ry} 0 0 0 -${w},0
|
||||||
|
l 0,${h - 2 * ry}
|
||||||
|
a ${rx},${ry} 0 0 0 ${w},0
|
||||||
|
l 0,-${h - 2 * ry}
|
||||||
|
`;
|
||||||
|
// Draw the main cylinder body
|
||||||
|
cylinderGroup
|
||||||
|
.append('path')
|
||||||
|
.attr('d', d)
|
||||||
|
.attr('fill', '#eaeaea')
|
||||||
|
.attr('stroke', '#000')
|
||||||
|
.attr('stroke-width', 1)
|
||||||
|
.attr('class', cssclass);
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
cylinderGroup.attr('transform', `translate(${w * 1.5}, ${(rect.height + ry) / 4})`);
|
||||||
|
} else {
|
||||||
|
cylinderGroup.attr('transform', `translate(${w * 1.5}, ${rect.height / 4 - 2 * ry})`);
|
||||||
|
}
|
||||||
|
actor.rectData = rect;
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
g,
|
||||||
|
rect.x,
|
||||||
|
rect.y + (!isFooter ? (rect.height + ry) / 2 : (rect.height + h) / 4),
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_BOX_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
const lastPath = cylinderGroup.select('path:last-child');
|
||||||
|
if (lastPath.node()) {
|
||||||
|
const bounds = lastPath.node().getBBox();
|
||||||
|
actor.height = bounds.height + (conf.sequence.labelBoxHeight ?? 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actor.height;
|
||||||
|
};
|
||||||
|
|
||||||
|
const drawActorTypeBoundary = function (elem, actor, conf, isFooter) {
|
||||||
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
|
const center = actor.x + actor.width / 2;
|
||||||
|
const centerY = actorY + 80;
|
||||||
|
const radius = 30;
|
||||||
|
const line = elem.append('g').lower();
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actorCnt++;
|
||||||
|
line
|
||||||
|
.append('line')
|
||||||
|
.attr('id', 'actor' + actorCnt)
|
||||||
|
.attr('x1', center)
|
||||||
|
.attr('y1', centerY)
|
||||||
|
.attr('x2', center)
|
||||||
|
.attr('y2', 2000)
|
||||||
|
.attr('class', 'actor-line 200')
|
||||||
|
.attr('stroke-width', '0.5px')
|
||||||
|
.attr('stroke', '#999')
|
||||||
|
.attr('name', actor.name);
|
||||||
|
|
||||||
|
actor.actorCnt = actorCnt;
|
||||||
|
}
|
||||||
|
const actElem = elem.append('g');
|
||||||
|
let cssClass = ACTOR_MAN_FIGURE_CLASS;
|
||||||
|
if (isFooter) {
|
||||||
|
cssClass += ` ${BOTTOM_ACTOR_CLASS}`;
|
||||||
|
} else {
|
||||||
|
cssClass += ` ${TOP_ACTOR_CLASS}`;
|
||||||
|
}
|
||||||
|
actElem.attr('class', cssClass);
|
||||||
|
actElem.attr('name', actor.name);
|
||||||
|
|
||||||
|
const rect = svgDrawCommon.getNoteRect();
|
||||||
|
rect.x = actor.x;
|
||||||
|
rect.y = actorY;
|
||||||
|
rect.fill = '#eaeaea';
|
||||||
|
rect.width = actor.width;
|
||||||
|
rect.height = actor.height;
|
||||||
|
rect.class = 'actor';
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('line')
|
||||||
|
.attr('id', 'actor-man-torso' + actorCnt)
|
||||||
|
.attr('x1', actor.x + actor.width / 2 - radius * 2.5)
|
||||||
|
.attr('y1', actorY + 10)
|
||||||
|
.attr('x2', actor.x + actor.width / 2 - 15)
|
||||||
|
.attr('y2', actorY + 10);
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('line')
|
||||||
|
.attr('id', 'actor-man-arms' + actorCnt)
|
||||||
|
.attr('x1', actor.x + actor.width / 2 - radius * 2.5)
|
||||||
|
.attr('y1', actorY + 0) // starting Y
|
||||||
|
.attr('x2', actor.x + actor.width / 2 - radius * 2.5)
|
||||||
|
.attr('y2', actorY + 20); // ending Y (26px long, adjust as needed)
|
||||||
|
|
||||||
|
actElem
|
||||||
|
.append('circle')
|
||||||
|
.attr('cx', actor.x + actor.width / 2)
|
||||||
|
.attr('cy', actorY + 10)
|
||||||
|
.attr('r', radius);
|
||||||
|
|
||||||
|
const bounds = actElem.node().getBBox();
|
||||||
|
actor.height = bounds.height + (conf.sequence.labelBoxHeight ?? 0);
|
||||||
|
|
||||||
|
_drawTextCandidateFunc(conf, hasKatex(actor.description))(
|
||||||
|
actor.description,
|
||||||
|
actElem,
|
||||||
|
rect.x,
|
||||||
|
rect.y + (!isFooter ? radius / 2 + 3 : radius / 2 - 4),
|
||||||
|
rect.width,
|
||||||
|
rect.height,
|
||||||
|
{ class: `actor ${ACTOR_MAN_FIGURE_CLASS}` },
|
||||||
|
conf
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isFooter) {
|
||||||
|
actElem.attr('transform', `translate(0,${radius / 2 + 7})`);
|
||||||
|
} else {
|
||||||
|
actElem.attr('transform', `translate(0,${radius / 2 + 7})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actor.height;
|
||||||
|
};
|
||||||
|
|
||||||
const drawActorTypeActor = function (elem, actor, conf, isFooter) {
|
const drawActorTypeActor = function (elem, actor, conf, isFooter) {
|
||||||
const actorY = isFooter ? actor.stopy : actor.starty;
|
const actorY = isFooter ? actor.stopy : actor.starty;
|
||||||
const center = actor.x + actor.width / 2;
|
const center = actor.x + actor.width / 2;
|
||||||
@@ -516,6 +1110,18 @@ export const drawActor = async function (elem, actor, conf, isFooter) {
|
|||||||
return await drawActorTypeActor(elem, actor, conf, isFooter);
|
return await drawActorTypeActor(elem, actor, conf, isFooter);
|
||||||
case 'participant':
|
case 'participant':
|
||||||
return await drawActorTypeParticipant(elem, actor, conf, isFooter);
|
return await drawActorTypeParticipant(elem, actor, conf, isFooter);
|
||||||
|
case 'boundary':
|
||||||
|
return await drawActorTypeBoundary(elem, actor, conf, isFooter);
|
||||||
|
case 'control':
|
||||||
|
return await drawActorTypeControl(elem, actor, conf, isFooter);
|
||||||
|
case 'entity':
|
||||||
|
return await drawActorTypeEntity(elem, actor, conf, isFooter);
|
||||||
|
case 'database':
|
||||||
|
return await drawActorTypeDatabase(elem, actor, conf, isFooter);
|
||||||
|
case 'collections':
|
||||||
|
return await drawActorTypeCollections(elem, actor, conf, isFooter);
|
||||||
|
case 'queue':
|
||||||
|
return await drawActorTypeQueue(elem, actor, conf, isFooter);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1103,6 +1709,77 @@ const _drawMenuItemTextCandidateFunc = (function () {
|
|||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup arrow head and define the marker. The result is appended to the svg.
|
||||||
|
*
|
||||||
|
* @param elem
|
||||||
|
*/
|
||||||
|
export const insertSolidTopArrowHead = function (elem) {
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', 'solidTopArrowHead')
|
||||||
|
.attr('refX', 7.9)
|
||||||
|
.attr('refY', 7.25)
|
||||||
|
.attr('markerUnits', 'userSpaceOnUse')
|
||||||
|
.attr('markerWidth', 12)
|
||||||
|
.attr('markerHeight', 12)
|
||||||
|
.attr('orient', 'auto-start-reverse')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 0 0 L 10 8 L 0 8 z'); // this is actual shape for arrowhead
|
||||||
|
};
|
||||||
|
|
||||||
|
export const insertSolidBottomArrowHead = function (elem) {
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', 'solidBottomArrowHead')
|
||||||
|
.attr('refX', 7.9)
|
||||||
|
.attr('refY', 0.75)
|
||||||
|
.attr('markerUnits', 'userSpaceOnUse')
|
||||||
|
.attr('markerWidth', 12)
|
||||||
|
.attr('markerHeight', 12)
|
||||||
|
.attr('orient', 'auto-start-reverse')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 0 0 L 10 0 L 0 8 z');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const insertStickTopArrowHead = function (elem) {
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', 'stickTopArrowHead')
|
||||||
|
.attr('refX', 7.5)
|
||||||
|
.attr('refY', 7)
|
||||||
|
.attr('markerUnits', 'userSpaceOnUse')
|
||||||
|
.attr('markerWidth', 12)
|
||||||
|
.attr('markerHeight', 12)
|
||||||
|
.attr('orient', 'auto-start-reverse')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 0 0 L 7 7')
|
||||||
|
.attr('stroke', 'black')
|
||||||
|
.attr('stroke-width', 1.5)
|
||||||
|
.attr('fill', 'none');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const insertStickBottomArrowHead = function (elem) {
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', 'stickBottomArrowHead')
|
||||||
|
.attr('refX', 7.5)
|
||||||
|
.attr('refY', 0)
|
||||||
|
.attr('markerUnits', 'userSpaceOnUse')
|
||||||
|
.attr('markerWidth', 12)
|
||||||
|
.attr('markerHeight', 12)
|
||||||
|
.attr('orient', 'auto-start-reverse')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 0 7 L 7 0')
|
||||||
|
.attr('stroke', 'black')
|
||||||
|
.attr('stroke-width', 1.5)
|
||||||
|
.attr('fill', 'none');
|
||||||
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
drawRect,
|
drawRect,
|
||||||
drawText,
|
drawText,
|
||||||
@@ -1125,4 +1802,8 @@ export default {
|
|||||||
getNoteRect,
|
getNoteRect,
|
||||||
fixLifeLineHeights,
|
fixLifeLineHeights,
|
||||||
sanitizeUrl,
|
sanitizeUrl,
|
||||||
|
insertSolidTopArrowHead,
|
||||||
|
insertSolidBottomArrowHead,
|
||||||
|
insertStickTopArrowHead,
|
||||||
|
insertStickBottomArrowHead,
|
||||||
};
|
};
|
||||||
|
@@ -35,6 +35,7 @@ export interface Message {
|
|||||||
type?: number;
|
type?: number;
|
||||||
activate?: boolean;
|
activate?: boolean;
|
||||||
placement?: string;
|
placement?: string;
|
||||||
|
centralConnection?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AddMessageParams {
|
export interface AddMessageParams {
|
||||||
@@ -50,6 +51,8 @@ export interface AddMessageParams {
|
|||||||
| 'destroyParticipant'
|
| 'destroyParticipant'
|
||||||
| 'activeStart'
|
| 'activeStart'
|
||||||
| 'activeEnd'
|
| 'activeEnd'
|
||||||
|
| 'centralConnection'
|
||||||
|
| 'centralConnectionReverse'
|
||||||
| 'addNote'
|
| 'addNote'
|
||||||
| 'addLinks'
|
| 'addLinks'
|
||||||
| 'addALink'
|
| 'addALink'
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
"fast-glob": "^3.3.3",
|
"fast-glob": "^3.3.3",
|
||||||
"https-localhost": "^4.7.1",
|
"https-localhost": "^4.7.1",
|
||||||
"pathe": "^2.0.3",
|
"pathe": "^2.0.3",
|
||||||
"unocss": "^66.0.0",
|
"unocss": "^66.4.2",
|
||||||
"unplugin-vue-components": "^28.4.0",
|
"unplugin-vue-components": "^28.4.0",
|
||||||
"vite": "^6.1.1",
|
"vite": "^6.1.1",
|
||||||
"vite-plugin-pwa": "^1.0.0",
|
"vite-plugin-pwa": "^1.0.0",
|
||||||
|
@@ -590,11 +590,17 @@ flowchart TD
|
|||||||
- `b`
|
- `b`
|
||||||
- **w**: The width of the image. If not defined, this will default to the natural width of the image.
|
- **w**: The width of the image. If not defined, this will default to the natural width of the image.
|
||||||
- **h**: The height of the image. If not defined, this will default to the natural height of the image.
|
- **h**: The height of the image. If not defined, this will default to the natural height of the image.
|
||||||
- **constraint**: Determines if the image should constrain the node size. This setting also ensures the image maintains its original aspect ratio, adjusting the height (`h`) accordingly to the width (`w`). If not defined, this will default to `off` Possible values are:
|
- **constraint**: Determines if the image should constrain the node size. This setting also ensures the image maintains its original aspect ratio, adjusting the width (`w`) accordingly to the height (`h`). If not defined, this will default to `off` Possible values are:
|
||||||
- `on`
|
- `on`
|
||||||
- `off`
|
- `off`
|
||||||
|
|
||||||
These new shapes provide additional flexibility and visual appeal to your flowcharts, making them more informative and engaging.
|
If you want to resize an image, but keep the same aspect ratio, set `h`, and set `constraint: on` to constrain the aspect ratio. E.g.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
%% My image with a constrained aspect ratio
|
||||||
|
A@{ img: "https://mermaid.js.org/favicon.svg", label: "My example image label", pos: "t", h: 60, constraint: "on" }
|
||||||
|
```
|
||||||
|
|
||||||
## Links between nodes
|
## Links between nodes
|
||||||
|
|
||||||
|
@@ -46,6 +46,78 @@ sequenceDiagram
|
|||||||
Bob->>Alice: Hi Alice
|
Bob->>Alice: Hi Alice
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Boundary
|
||||||
|
|
||||||
|
If you want to use the boundary symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "boundary" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Request from boundary
|
||||||
|
Bob->>Alice: Response to boundary
|
||||||
|
```
|
||||||
|
|
||||||
|
### Control
|
||||||
|
|
||||||
|
If you want to use the control symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "control" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Control request
|
||||||
|
Bob->>Alice: Control response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Entity
|
||||||
|
|
||||||
|
If you want to use the entity symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "entity" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Entity request
|
||||||
|
Bob->>Alice: Entity response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
If you want to use the database symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "database" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: DB query
|
||||||
|
Bob->>Alice: DB result
|
||||||
|
```
|
||||||
|
|
||||||
|
### Collections
|
||||||
|
|
||||||
|
If you want to use the collections symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "collections" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Collections request
|
||||||
|
Bob->>Alice: Collections response
|
||||||
|
```
|
||||||
|
|
||||||
|
### Queue
|
||||||
|
|
||||||
|
If you want to use the queue symbol for a participant, use the JSON configuration syntax as shown below.
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice@{ "type" : "queue" }
|
||||||
|
participant Bob
|
||||||
|
Alice->>Bob: Queue message
|
||||||
|
Bob->>Alice: Queue response
|
||||||
|
```
|
||||||
|
|
||||||
### Aliases
|
### Aliases
|
||||||
|
|
||||||
The actor can have a convenient identifier and a descriptive label.
|
The actor can have a convenient identifier and a descriptive label.
|
||||||
@@ -144,7 +216,11 @@ Messages can be of two displayed either solid or with a dotted line.
|
|||||||
[Actor][Arrow][Actor]:Message text
|
[Actor][Arrow][Actor]:Message text
|
||||||
```
|
```
|
||||||
|
|
||||||
There are ten types of arrows currently supported:
|
Lines can be solid or dotted, and can end with various types of arrowheads, crosses, or open arrows.
|
||||||
|
|
||||||
|
#### Supported Arrow Types
|
||||||
|
|
||||||
|
**Standard Arrow Types**
|
||||||
|
|
||||||
| Type | Description |
|
| Type | Description |
|
||||||
| -------- | ---------------------------------------------------- |
|
| -------- | ---------------------------------------------------- |
|
||||||
@@ -159,6 +235,49 @@ There are ten types of arrows currently supported:
|
|||||||
| `-)` | Solid line with an open arrow at the end (async) |
|
| `-)` | Solid line with an open arrow at the end (async) |
|
||||||
| `--)` | Dotted line with a open arrow at the end (async) |
|
| `--)` | Dotted line with a open arrow at the end (async) |
|
||||||
|
|
||||||
|
**Half-Arrows**
|
||||||
|
|
||||||
|
The following half-arrow types are now supported for more expressive sequence diagrams. Both solid and dotted variants are available by increasing the number of dashes (`-` → `--`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
| ------- | ---------------------------------------------------- |
|
||||||
|
| `-\|\` | Solid line with top half arrowhead |
|
||||||
|
| `--\|\` | Dotted line with top half arrowhead |
|
||||||
|
| `-\|/` | Solid line with bottom half arrowhead |
|
||||||
|
| `--\|/` | Dotted line with bottom half arrowhead |
|
||||||
|
| `/\|-` | Solid line with reverse top half arrowhead |
|
||||||
|
| `/\|--` | Dotted line with reverse top half arrowhead |
|
||||||
|
| `\\-` | Solid line with reverse bottom half arrowhead |
|
||||||
|
| `\\--` | Dotted line with reverse bottom half arrowhead |
|
||||||
|
| `-\\` | Solid line with top stick half arrowhead |
|
||||||
|
| `--\\` | Dotted line with top stick half arrowhead |
|
||||||
|
| `-//` | Solid line with bottom stick half arrowhead |
|
||||||
|
| `--//` | Dotted line with bottom stick half arrowhead |
|
||||||
|
| `//-` | Solid line with reverse top stick half arrowhead |
|
||||||
|
| `//--` | Dotted line with reverse top stick half arrowhead |
|
||||||
|
| `\\-` | Solid line with reverse bottom stick half arrowhead |
|
||||||
|
| `\\--` | Dotted line with reverse bottom stick half arrowhead |
|
||||||
|
|
||||||
|
## Central Connections
|
||||||
|
|
||||||
|
Mermaid sequence diagrams now support **central lifeline connections** using a `()`.
|
||||||
|
This is useful to represent messages or signals that connect to a central point, rather than from one actor directly to another.
|
||||||
|
|
||||||
|
To indicate a central connection, append `()` to the arrow syntax.
|
||||||
|
|
||||||
|
#### Basic Syntax
|
||||||
|
|
||||||
|
```mermaid-example
|
||||||
|
sequenceDiagram
|
||||||
|
participant Alice
|
||||||
|
participant John
|
||||||
|
Alice->>()John: Hello John
|
||||||
|
Alice()->>John: How are you?
|
||||||
|
John()->>()Alice: Great!
|
||||||
|
```
|
||||||
|
|
||||||
## Activations
|
## Activations
|
||||||
|
|
||||||
It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations:
|
It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations:
|
||||||
|
@@ -207,7 +207,7 @@ describe('when using mermaid and ', () => {
|
|||||||
[Error: Parse error on line 2:
|
[Error: Parse error on line 2:
|
||||||
...equenceDiagramAlice:->Bob: Hello Bob, h...
|
...equenceDiagramAlice:->Bob: Hello Bob, h...
|
||||||
----------------------^
|
----------------------^
|
||||||
Expecting 'SOLID_OPEN_ARROW', 'DOTTED_OPEN_ARROW', 'SOLID_ARROW', 'BIDIRECTIONAL_SOLID_ARROW', 'DOTTED_ARROW', 'BIDIRECTIONAL_DOTTED_ARROW', 'SOLID_CROSS', 'DOTTED_CROSS', 'SOLID_POINT', 'DOTTED_POINT', got 'TXT']
|
Expecting '()', 'SOLID_OPEN_ARROW', 'DOTTED_OPEN_ARROW', 'SOLID_ARROW', 'SOLID_ARROW_TOP', 'SOLID_ARROW_BOTTOM', 'STICK_ARROW_TOP', 'STICK_ARROW_BOTTOM', 'SOLID_ARROW_TOP_DOTTED', 'SOLID_ARROW_BOTTOM_DOTTED', 'STICK_ARROW_TOP_DOTTED', 'STICK_ARROW_BOTTOM_DOTTED', 'SOLID_ARROW_TOP_REVERSE', 'SOLID_ARROW_BOTTOM_REVERSE', 'STICK_ARROW_TOP_REVERSE', 'STICK_ARROW_BOTTOM_REVERSE', 'SOLID_ARROW_TOP_REVERSE_DOTTED', 'SOLID_ARROW_BOTTOM_REVERSE_DOTTED', 'STICK_ARROW_TOP_REVERSE_DOTTED', 'STICK_ARROW_BOTTOM_REVERSE_DOTTED', 'BIDIRECTIONAL_SOLID_ARROW', 'DOTTED_ARROW', 'BIDIRECTIONAL_DOTTED_ARROW', 'SOLID_CROSS', 'DOTTED_CROSS', 'SOLID_POINT', 'DOTTED_POINT', got 'TXT']
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -41,7 +41,6 @@ import { decodeEntities, encodeEntities } from './utils.js';
|
|||||||
import { toBase64 } from './utils/base64.js';
|
import { toBase64 } from './utils/base64.js';
|
||||||
import { StateDB } from './diagrams/state/stateDb.js';
|
import { StateDB } from './diagrams/state/stateDb.js';
|
||||||
import { ensureNodeFromSelector, jsdomIt } from './tests/util.js';
|
import { ensureNodeFromSelector, jsdomIt } from './tests/util.js';
|
||||||
import { select } from 'd3';
|
|
||||||
import { JSDOM } from 'jsdom';
|
import { JSDOM } from 'jsdom';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,7 +49,6 @@ import { JSDOM } from 'jsdom';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
describe('mermaidAPI', () => {
|
describe('mermaidAPI', () => {
|
||||||
describe('encodeEntities', () => {
|
describe('encodeEntities', () => {
|
||||||
it('removes the ending ; from style [text1]:[optional word]#[text2]; with ', () => {
|
it('removes the ending ; from style [text1]:[optional word]#[text2]; with ', () => {
|
||||||
@@ -913,4 +911,241 @@ graph TD;A--x|text including URL space|B;`)
|
|||||||
expect(sequenceDiagram1.db.getActors()).not.toEqual(sequenceDiagram2.db.getActors());
|
expect(sequenceDiagram1.db.getActors()).not.toEqual(sequenceDiagram2.db.getActors());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('mermaidAPI config precedence', () => {
|
||||||
|
const id = 'mermaid-config-test';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mermaidAPI.globalReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
jsdomIt('renders with YAML config taking precedence over initialize config', async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
fontFamily: 'Arial',
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
flowchart: { htmlLabels: false },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
fontFamily: Courier
|
||||||
|
themeVariables:
|
||||||
|
fontFamily: "Courier New"
|
||||||
|
fontSize: "20px"
|
||||||
|
flowchart:
|
||||||
|
htmlLabels: true
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
const { svg } = await mermaidAPI.render('yaml-over-init', diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.theme).toBe('base');
|
||||||
|
expect(config.fontFamily).toBe('Courier');
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Courier New');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('20px');
|
||||||
|
expect(config.flowchart?.htmlLabels).toBe(true);
|
||||||
|
|
||||||
|
const svgNode = ensureNodeFromSelector('svg', new JSDOM(svg).window.document);
|
||||||
|
expect(svgNode).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with YAML themeVariables fully overriding initialize themeVariables',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
themeVariables:
|
||||||
|
fontFamily: "Courier New"
|
||||||
|
fontSize: "20px"
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
const { svg } = await mermaidAPI.render(id, diagramText);
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Courier New');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('20px');
|
||||||
|
expect(config.themeVariables.fontFamily).not.toBe('Arial');
|
||||||
|
expect(config.themeVariables.fontSize).not.toBe('16px');
|
||||||
|
|
||||||
|
const svgNode = ensureNodeFromSelector('svg', new JSDOM(svg).window.document);
|
||||||
|
expect(svgNode).not.toBeNull();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with YAML themeVariables overriding only provided keys and keeping others from initialize',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
fontFamily: 'Arial',
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px', colorPrimary: '#ff0000' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
themeVariables:
|
||||||
|
fontFamily: "Courier New"
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
const { svg } = await mermaidAPI.render(id, diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Courier New');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('16px');
|
||||||
|
expect(config.themeVariables.colorPrimary).toBe('#ff0000');
|
||||||
|
|
||||||
|
const svgNode = ensureNodeFromSelector('svg', new JSDOM(svg).window.document);
|
||||||
|
expect(svgNode).not.toBeNull();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with YAML config (no themeVariables) and falls back to initialize themeVariables',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
const { svg } = await mermaidAPI.render(id, diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Arial');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('16px');
|
||||||
|
expect(config.theme).toBe('base');
|
||||||
|
|
||||||
|
const svgNode = ensureNodeFromSelector('svg', new JSDOM(svg).window.document);
|
||||||
|
expect(svgNode).not.toBeNull();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with full YAML config block taking full precedence over initialize config',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
fontFamily: 'Arial',
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
flowchart: { htmlLabels: false },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
fontFamily: Courier
|
||||||
|
themeVariables:
|
||||||
|
fontFamily: "Courier New"
|
||||||
|
fontSize: "20px"
|
||||||
|
flowchart:
|
||||||
|
htmlLabels: true
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
const { svg } = await mermaidAPI.render('yaml-over-init', diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.theme).toBe('base');
|
||||||
|
expect(config.fontFamily).toBe('Courier');
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Courier New');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('20px');
|
||||||
|
expect(config.flowchart?.htmlLabels).toBe(true);
|
||||||
|
|
||||||
|
const svgNode = ensureNodeFromSelector('svg', new JSDOM(svg).window.document);
|
||||||
|
expect(svgNode).not.toBeNull();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with YAML config (no themeVariables) and falls back to initialize themeVariables (duplicate scenario)',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
await mermaidAPI.render(id, diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Arial');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('16px');
|
||||||
|
expect(config.theme).toBe('base');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jsdomIt('renders with no YAML config so initialize config is fully applied', async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
fontFamily: 'Arial',
|
||||||
|
themeVariables: { fontFamily: 'Arial', fontSize: '16px' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
await mermaidAPI.render(id, diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.theme).toBe('forest');
|
||||||
|
expect(config.fontFamily).toBe('Arial');
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Arial');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('16px');
|
||||||
|
});
|
||||||
|
|
||||||
|
jsdomIt(
|
||||||
|
'renders with empty YAML config block and falls back to initialize config',
|
||||||
|
async () => {
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'dark',
|
||||||
|
themeVariables: { fontFamily: 'Times', fontSize: '14px' },
|
||||||
|
});
|
||||||
|
|
||||||
|
const diagramText = `---
|
||||||
|
config: {}
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
A --> B
|
||||||
|
`;
|
||||||
|
|
||||||
|
await mermaidAPI.render(id, diagramText);
|
||||||
|
|
||||||
|
const config = mermaidAPI.getConfig();
|
||||||
|
expect(config.theme).toBe('dark');
|
||||||
|
expect(config.themeVariables.fontFamily).toBe('Times');
|
||||||
|
expect(config.themeVariables.fontSize).toBe('14px');
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -13,6 +13,18 @@ export interface NodeMetaData {
|
|||||||
ticket?: string;
|
ticket?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ParticipantMetaData {
|
||||||
|
type?:
|
||||||
|
| 'actor'
|
||||||
|
| 'participant'
|
||||||
|
| 'boundary'
|
||||||
|
| 'control'
|
||||||
|
| 'entity'
|
||||||
|
| 'database'
|
||||||
|
| 'collections'
|
||||||
|
| 'queue';
|
||||||
|
}
|
||||||
|
|
||||||
export interface EdgeMetaData {
|
export interface EdgeMetaData {
|
||||||
animation?: 'fast' | 'slow';
|
animation?: 'fast' | 'slow';
|
||||||
animate?: boolean;
|
animate?: boolean;
|
||||||
|
440
pnpm-lock.yaml
generated
440
pnpm-lock.yaml
generated
@@ -227,8 +227,8 @@ importers:
|
|||||||
specifier: ^7.0.4
|
specifier: ^7.0.4
|
||||||
version: 7.1.0
|
version: 7.1.0
|
||||||
'@iconify/utils':
|
'@iconify/utils':
|
||||||
specifier: ^2.1.33
|
specifier: ^3.0.1
|
||||||
version: 2.3.0
|
version: 3.0.1
|
||||||
'@mermaid-js/parser':
|
'@mermaid-js/parser':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../parser
|
version: link:../parser
|
||||||
@@ -499,8 +499,8 @@ importers:
|
|||||||
specifier: ^2.0.3
|
specifier: ^2.0.3
|
||||||
version: 2.0.3
|
version: 2.0.3
|
||||||
unocss:
|
unocss:
|
||||||
specifier: ^66.0.0
|
specifier: ^66.4.2
|
||||||
version: 66.0.0(postcss@8.5.6)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
|
version: 66.4.2(postcss@8.5.6)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))
|
||||||
unplugin-vue-components:
|
unplugin-vue-components:
|
||||||
specifier: ^28.4.0
|
specifier: ^28.4.0
|
||||||
version: 28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3))
|
version: 28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3))
|
||||||
@@ -647,11 +647,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
|
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
|
|
||||||
'@antfu/install-pkg@1.0.0':
|
'@antfu/install-pkg@1.1.0':
|
||||||
resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==}
|
resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
|
||||||
|
|
||||||
'@antfu/utils@8.1.1':
|
'@antfu/utils@9.2.0':
|
||||||
resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
|
resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==}
|
||||||
|
|
||||||
'@apideck/better-ajv-errors@0.3.6':
|
'@apideck/better-ajv-errors@0.3.6':
|
||||||
resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
|
resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
|
||||||
@@ -2460,8 +2460,8 @@ packages:
|
|||||||
'@iconify/types@2.0.0':
|
'@iconify/types@2.0.0':
|
||||||
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
|
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
|
||||||
|
|
||||||
'@iconify/utils@2.3.0':
|
'@iconify/utils@3.0.1':
|
||||||
resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
|
resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==}
|
||||||
|
|
||||||
'@img/sharp-darwin-arm64@0.33.5':
|
'@img/sharp-darwin-arm64@0.33.5':
|
||||||
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
|
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
|
||||||
@@ -2740,6 +2740,9 @@ packages:
|
|||||||
'@polka/url@1.0.0-next.28':
|
'@polka/url@1.0.0-next.28':
|
||||||
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
|
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
|
||||||
|
|
||||||
|
'@quansync/fs@0.1.4':
|
||||||
|
resolution: {integrity: sha512-vy/41FCdnIalPTQCb2Wl0ic1caMdzGus4ktDp+gpZesQNydXcx8nhh8qB3qMPbGkictOTaXgXEUUfQEm8DQYoA==}
|
||||||
|
|
||||||
'@react-aria/focus@3.21.0':
|
'@react-aria/focus@3.21.0':
|
||||||
resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==}
|
resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3538,88 +3541,94 @@ packages:
|
|||||||
'@ungap/structured-clone@1.3.0':
|
'@ungap/structured-clone@1.3.0':
|
||||||
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
|
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
|
||||||
|
|
||||||
'@unocss/astro@66.0.0':
|
'@unocss/astro@66.4.2':
|
||||||
resolution: {integrity: sha512-GBhXT6JPqXjDXoJZTXhySk83NgOt0UigChqrUUdG4x7Z+DVYkDBION8vZUJjw0OdIaxNQ4euGWu4GDsMF6gQQg==}
|
resolution: {integrity: sha512-En3AKHwkiPxtZT95vkVrNiRYrB+DFVCikew6/dMMCWDWVKK0+5tEVUTzR1ak3+YnzAXl0NpWj8D4zHb0PxOs/A==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
|
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@unocss/cli@66.0.0':
|
'@unocss/cli@66.4.2':
|
||||||
resolution: {integrity: sha512-KVQiskoOjVkLVpNaG6WpLa4grPplrZROYZJVIUYSTqZyZRFNSvjttHcsCwpoWUEUdEombPtVZl8FrXePjY5IiQ==}
|
resolution: {integrity: sha512-WsXzrB0SHbSt2nOHtD5QM91VN8j38+wObqyGcoIhtBSugqzsc+t7AdPkxV/ZaYgtPAz87bR0WFEVKcbiBRnmJw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
'@unocss/config@66.0.0':
|
'@unocss/config@66.4.2':
|
||||||
resolution: {integrity: sha512-nFRGop/guBa4jLkrgXjaRDm5JPz4x3YpP10m5IQkHpHwlnHUVn1L9smyPl04ohYWhYn9ZcAHgR28Ih2jwta8hw==}
|
resolution: {integrity: sha512-plji1gNGSzlWjuV2Uh0q6Dt5ZlNkOKCHpgxekW9J458WghGAMBeXgB9uNpWg6flilqP1g0GJQv+XvJcSkYRGpQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
'@unocss/core@66.0.0':
|
'@unocss/core@66.4.2':
|
||||||
resolution: {integrity: sha512-PdVbSMHNDDkr++9nkqzsZRAkaU84gxMTEgYbqI7dt2p1DXp/5tomVtmMsr2/whXGYKRiUc0xZ3p4Pzraz8TcXA==}
|
resolution: {integrity: sha512-cYgMQrLhB9nRekv5c+yPDDa+5dzlMkA2UMQRil0s5D9Lb5n7NsCMcr6+nfxkcSYVLy92SbwDV45c6T7vIxFTOA==}
|
||||||
|
|
||||||
'@unocss/extractor-arbitrary-variants@66.0.0':
|
'@unocss/extractor-arbitrary-variants@66.4.2':
|
||||||
resolution: {integrity: sha512-vlkOIOuwBfaFBJcN6o7+obXjigjOlzVFN/jT6pG1WXbQDTRZ021jeF3i9INdb9D/0cQHSeDvNgi1TJ5oUxfiow==}
|
resolution: {integrity: sha512-T/eSeodfAp7HaWnQGqVLOsW4PbKUAvuybNRyvFWThMneM2qo+dOo3kFnA5my9ULAmRSFsAlyB1DnupD3qv5Klg==}
|
||||||
|
|
||||||
'@unocss/inspector@66.0.0':
|
'@unocss/inspector@66.4.2':
|
||||||
resolution: {integrity: sha512-mkIxieVm0kMOKw+E4ABpIerihYMdjgq9A92RD5h2+W/ebpxTEw5lTTK1xcMLiAlmOrVYMQKjpgPeu3vQmDyGZQ==}
|
resolution: {integrity: sha512-ugcJK8r2ypM4eIdgetVn8RhfKrbA3AF3OQ/RohK5PPk2UPDAScqabzYpfdNW4eYQsBOZOgoiqWtnfc8weqo8LQ==}
|
||||||
|
|
||||||
'@unocss/postcss@66.0.0':
|
'@unocss/postcss@66.4.2':
|
||||||
resolution: {integrity: sha512-6bi+ujzh8I1PJwtmHX71LH8z/H9+vPxeYD4XgFihyU1k4Y6MVhjr7giGjLX4yP27IP+NsVyotD22V7by/dBVEA==}
|
resolution: {integrity: sha512-tu4lnh6K27pIAuaQHlFlhXin8korwC0r1kQl00YMmF3THiX7orXkTP6xWGcQwnkbx4uQz1dw+tBimYxeaAMrhA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
postcss: ^8.4.21
|
postcss: ^8.4.21
|
||||||
|
|
||||||
'@unocss/preset-attributify@66.0.0':
|
'@unocss/preset-attributify@66.4.2':
|
||||||
resolution: {integrity: sha512-eYsOgmcDoiIgGAepIwRX+DKGYxc/wm0r4JnDuZdz29AB+A6oY/FGHS1BVt4rq9ny4B5PofP4p6Rty+vwD9rigw==}
|
resolution: {integrity: sha512-DwFJJkkawmHpjo3pGQE8FyoPsvhbxh+QMvvaAdYpo+iZ5HRkeDml9SOj7u6SGTcmbNyI+QR61s0KM8fxx6HcVQ==}
|
||||||
|
|
||||||
'@unocss/preset-icons@66.0.0':
|
'@unocss/preset-icons@66.4.2':
|
||||||
resolution: {integrity: sha512-6ObwTvEGuPBbKWRoMMiDioHtwwQTFI5oojFLJ32Y8tW6TdXvBLkO88d7qpgQxEjgVt4nJrqF1WEfR4niRgBm0Q==}
|
resolution: {integrity: sha512-qJx9gmesrvrmoTe9Mqoidihad8hm2MSD4QAezhfDSAyllioJOgyT0Bev/IEWAbehe9jtqYIh8v1oCerBPbGn6Q==}
|
||||||
|
|
||||||
'@unocss/preset-mini@66.0.0':
|
'@unocss/preset-mini@66.4.2':
|
||||||
resolution: {integrity: sha512-d62eACnuKtR0dwCFOQXgvw5VLh5YSyK56xCzpHkh0j0GstgfDLfKTys0T/XVAAvdSvAy/8A8vhSNJ4PlIc9V2A==}
|
resolution: {integrity: sha512-Ry+5hM+XLmT8HrEb182mUfcZuyrZ8xR+TBe72DBcliJ1DhOV3K67TCxwQucfb0zHbGV71HNWdPmHsLKxPDgweQ==}
|
||||||
|
|
||||||
'@unocss/preset-tagify@66.0.0':
|
'@unocss/preset-tagify@66.4.2':
|
||||||
resolution: {integrity: sha512-GGYGyWxaevh0jN0NoATVO1Qe7DFXM3ykLxchlXmG6/zy963pZxItg/njrKnxE9la4seCdxpFH7wQBa68imwwdA==}
|
resolution: {integrity: sha512-dECS09LqWJY4sYpgPUH2OAUftWU/tiZPR2XDRoTngeGU37GxSN+1sWtSmB7vwDm3C7opsdVUN20he8F1LUNubw==}
|
||||||
|
|
||||||
'@unocss/preset-typography@66.0.0':
|
'@unocss/preset-typography@66.4.2':
|
||||||
resolution: {integrity: sha512-apjckP5nPU5mtaHTCzz5u/dK9KJWwJ2kOFCVk0+a/KhUWmnqnzmjRYZlEuWxxr5QxTdCW+9cIoRDSA0lYZS5tg==}
|
resolution: {integrity: sha512-ZOKRuR5+V0r30QTVq04/6ZoIw75me3V25v2dU2YWJXIzwpMKmQ9TUN/M1yeiEUFfXjOaruWX6Ad6CvAw2MlCew==}
|
||||||
|
|
||||||
'@unocss/preset-uno@66.0.0':
|
'@unocss/preset-uno@66.4.2':
|
||||||
resolution: {integrity: sha512-qgoZ/hzTI32bQvcyjcwvv1X/dbPlmQNehzgjUaL7QFT0q0/CN/SRpysfzoQ8DLl2se9T+YCOS9POx3KrpIiYSQ==}
|
resolution: {integrity: sha512-1MFtPivGcpqRQFWdjtP40Enop1y3XDb3tlZXoMQUX0IGLG8HJOT+lfQx/Xl9t73ShJ8aAJ/l6qTxC43ZGNACzA==}
|
||||||
|
|
||||||
'@unocss/preset-web-fonts@66.0.0':
|
'@unocss/preset-web-fonts@66.4.2':
|
||||||
resolution: {integrity: sha512-9MzfDc6AJILN4Kq7Z91FfFbizBOYgw3lJd2UwqIs3PDYWG5iH5Zv5zhx6jelZVqEW5uWcIARYEEg2m4stZO1ZA==}
|
resolution: {integrity: sha512-4FYmleeRoM8r2DqGl6dfIjnX57tepcfZCvVfeCqYnk7475Yddmv1OYkoMjkWMnkK9MzdSxsFwHMU6CIUTmFTzQ==}
|
||||||
|
|
||||||
'@unocss/preset-wind3@66.0.0':
|
'@unocss/preset-wind3@66.4.2':
|
||||||
resolution: {integrity: sha512-WAGRmpi1sb2skvYn9DBQUvhfqrJ+VmQmn5ZGsT2ewvsk7HFCvVLAMzZeKrrTQepeNBRhg6HzFDDi8yg6yB5c9g==}
|
resolution: {integrity: sha512-0Aye/PaT08M/cQhPnGKn93iEVoRJbym0/1eomMvXoL+8oc7DVry35ws06r5CLu5h1sXI6UmS6sejoePFlSkLJQ==}
|
||||||
|
|
||||||
'@unocss/preset-wind@66.0.0':
|
'@unocss/preset-wind4@66.4.2':
|
||||||
resolution: {integrity: sha512-FtvGpHnGC7FiyKJavPnn5y9lsaoWRhXlujCqlT5Bw63kKhMNr0ogKySBpenUhJOhWhVM0OQXn2nZ3GZRxW2qpw==}
|
resolution: {integrity: sha512-F4RZsDqIpnSevD9hY353+Tw5gxpJuHA5HwdKjLnC/TnT9VKKVmV7qUEZ6M0jEuAk1kz2x3/ngnQ9Ftw+C2L84A==}
|
||||||
|
|
||||||
|
'@unocss/preset-wind@66.4.2':
|
||||||
|
resolution: {integrity: sha512-z/rFYFINNqmBtl3Dh+7UCKpPnPkxM7IIUGszMnvdntky9uhLauJ11dt/Puir73sM2cAfywfgvnHyZ00m0pg7rA==}
|
||||||
|
|
||||||
'@unocss/reset@66.0.0':
|
'@unocss/reset@66.0.0':
|
||||||
resolution: {integrity: sha512-YLFz/5yT7mFJC8JSmIUA5+bS3CBCJbtztOw+8rWzjQr/BEVSGuihWUUpI2Df6VVxXIXxKanZR6mIl59yvf+GEA==}
|
resolution: {integrity: sha512-YLFz/5yT7mFJC8JSmIUA5+bS3CBCJbtztOw+8rWzjQr/BEVSGuihWUUpI2Df6VVxXIXxKanZR6mIl59yvf+GEA==}
|
||||||
|
|
||||||
'@unocss/rule-utils@66.0.0':
|
'@unocss/reset@66.4.2':
|
||||||
resolution: {integrity: sha512-UJ51YHbwxYTGyj35ugsPlOT4gaa7tCbXdywZ3m5Nn0JgywwIqGmBFyiN9ZjHBHfJuDxmmPd6lxojoBscih/WMQ==}
|
resolution: {integrity: sha512-s3Kq4Q6a/d3/jYe6HTCfXUx7zYAYufetId5n66DZHzQxpeu6CoBS83+b37STTKsw27SOgV28cPJlJtZ6/D6Bhw==}
|
||||||
|
|
||||||
|
'@unocss/rule-utils@66.4.2':
|
||||||
|
resolution: {integrity: sha512-7z3IuajwXhy2cx3E0IGOFXIiuKC79/jzm4Tt56TC68nXLh/etlH0fKhxVwkZ/HbcQRpVwWyDRNcbh29pmA3DwQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
'@unocss/transformer-attributify-jsx@66.0.0':
|
'@unocss/transformer-attributify-jsx@66.4.2':
|
||||||
resolution: {integrity: sha512-jS7szFXXC6RjTv9wo0NACskf618w981bkbyQ5izRO7Ha47sNpHhHDpaltnG7SR9qV4cCtGalOw4onVMHsRKwRg==}
|
resolution: {integrity: sha512-de6LzoyW1tkdOftlCrj6z8wEb4j6l1sqmOU1nYKkYHw7luLFGxRUELC7iujlI9KmylbM02bcKfLETAfJy/je2w==}
|
||||||
|
|
||||||
'@unocss/transformer-compile-class@66.0.0':
|
'@unocss/transformer-compile-class@66.4.2':
|
||||||
resolution: {integrity: sha512-ytUIE0nAcHRMACuTXkHp8auZ483DXrOZw99jk3FJ+aFjpD/pVSFmX14AWJ7bqPFObxb4SLFs6KhQma30ESC22A==}
|
resolution: {integrity: sha512-+oiIrV8c3T7qiJdICr6YsEWik5sjbWirXF0mlpcBvZu2HyV559hvHjzuWKr/fl7xYYZKDL9FvddbqWo3DOXh3Q==}
|
||||||
|
|
||||||
'@unocss/transformer-directives@66.0.0':
|
'@unocss/transformer-directives@66.4.2':
|
||||||
resolution: {integrity: sha512-utcg7m2Foi7uHrU5WHadNuJ0a3qWG8tZNkQMi+m0DQpX6KWfuDtDn0zDZ1X+z5lmiB3WGSJERRrsvZbj1q50Mw==}
|
resolution: {integrity: sha512-7m/dTrCUkBkZeSRKPxPEo65Rav239orQSLq6sztwZhoA4x/6H8r58xCkAK0qC9VEalyerpCpyarU3sKN4+ehNg==}
|
||||||
|
|
||||||
'@unocss/transformer-variant-group@66.0.0':
|
'@unocss/transformer-variant-group@66.4.2':
|
||||||
resolution: {integrity: sha512-1BLjNWtAnR1JAcQGw0TS+nGrVoB9aznzvVZRoTx23dtRr3btvgKPHb8LrD48eD/p8Dtw9j3WfuxMDKXKegKDLg==}
|
resolution: {integrity: sha512-SbPDbZUrhQyL4CpvnpvUfrr1DFq8AKf8ofPGbMJDm5S2TInQ34vFaIrhNroGR0szntMZRH5Zlkq6LtVUKDRs5g==}
|
||||||
|
|
||||||
'@unocss/vite@66.0.0':
|
'@unocss/vite@66.4.2':
|
||||||
resolution: {integrity: sha512-IVcPX8xL+2edyXKt4tp9yu5A6gcbPVCsspfcL0XgziCr01kS+4qSoZ90F3IUs3hXc/AyO5eCpRtGFMPLpOjXQg==}
|
resolution: {integrity: sha512-7eON9iPF3qWzuI+M6u0kq7K3y9nEbimZlLj01nGoqrgSGxEsyJpP01QQQsmT7FPRiZzRMJv7BiKMEyDQSuRRCA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
|
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
|
||||||
|
|
||||||
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
|
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
|
||||||
resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
|
resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
|
||||||
@@ -4779,12 +4788,15 @@ packages:
|
|||||||
confbox@0.1.8:
|
confbox@0.1.8:
|
||||||
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
|
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
|
||||||
|
|
||||||
|
confbox@0.2.2:
|
||||||
|
resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
|
||||||
|
|
||||||
connect-history-api-fallback@2.0.0:
|
connect-history-api-fallback@2.0.0:
|
||||||
resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
|
resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
|
||||||
engines: {node: '>=0.8'}
|
engines: {node: '>=0.8'}
|
||||||
|
|
||||||
consola@3.4.0:
|
consola@3.4.2:
|
||||||
resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==}
|
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
|
||||||
engines: {node: ^14.18.0 || >=16.10.0}
|
engines: {node: ^14.18.0 || >=16.10.0}
|
||||||
|
|
||||||
console.table@0.10.0:
|
console.table@0.10.0:
|
||||||
@@ -5852,6 +5864,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
|
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
|
||||||
engines: {node: '>= 18'}
|
engines: {node: '>= 18'}
|
||||||
|
|
||||||
|
exsolve@1.0.7:
|
||||||
|
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
|
||||||
|
|
||||||
extend@3.0.2:
|
extend@3.0.2:
|
||||||
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
|
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
|
||||||
|
|
||||||
@@ -7276,6 +7291,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==}
|
resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
local-pkg@1.1.1:
|
||||||
|
resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
|
||||||
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
locate-path@3.0.0:
|
locate-path@3.0.0:
|
||||||
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
|
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -8040,6 +8059,9 @@ packages:
|
|||||||
package-manager-detector@0.2.9:
|
package-manager-detector@0.2.9:
|
||||||
resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==}
|
resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==}
|
||||||
|
|
||||||
|
package-manager-detector@1.3.0:
|
||||||
|
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
|
||||||
|
|
||||||
pako@1.0.11:
|
pako@1.0.11:
|
||||||
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
|
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
|
||||||
|
|
||||||
@@ -8223,6 +8245,9 @@ packages:
|
|||||||
pkg-types@1.3.1:
|
pkg-types@1.3.1:
|
||||||
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
|
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
|
||||||
|
|
||||||
|
pkg-types@2.2.0:
|
||||||
|
resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==}
|
||||||
|
|
||||||
plist@3.1.0:
|
plist@3.1.0:
|
||||||
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
|
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
|
||||||
engines: {node: '>=10.4.0'}
|
engines: {node: '>=10.4.0'}
|
||||||
@@ -8405,6 +8430,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
|
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
|
||||||
engines: {node: '>=0.6'}
|
engines: {node: '>=0.6'}
|
||||||
|
|
||||||
|
quansync@0.2.10:
|
||||||
|
resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
|
||||||
|
|
||||||
queue-microtask@1.2.3:
|
queue-microtask@1.2.3:
|
||||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||||
|
|
||||||
@@ -8996,6 +9024,7 @@ packages:
|
|||||||
source-map@0.8.0-beta.0:
|
source-map@0.8.0-beta.0:
|
||||||
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
deprecated: The work that was done in this beta branch won't be included in future versions
|
||||||
|
|
||||||
sourcemap-codec@1.4.8:
|
sourcemap-codec@1.4.8:
|
||||||
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
|
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
|
||||||
@@ -9327,6 +9356,9 @@ packages:
|
|||||||
tinyexec@0.3.2:
|
tinyexec@0.3.2:
|
||||||
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
|
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
|
||||||
|
|
||||||
|
tinyexec@1.0.1:
|
||||||
|
resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==}
|
||||||
|
|
||||||
tinyglobby@0.2.12:
|
tinyglobby@0.2.12:
|
||||||
resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
|
resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
@@ -9547,8 +9579,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
|
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
unconfig@7.0.0:
|
unconfig@7.3.2:
|
||||||
resolution: {integrity: sha512-G5CJSoG6ZTxgzCJblEfgpdRK2tos9+UdD2WtecDUVfImzQ0hFjwpH5RVvGMhP4pRpC9ML7NrC4qBsBl0Ttj35A==}
|
resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==}
|
||||||
|
|
||||||
underscore@1.1.7:
|
underscore@1.1.7:
|
||||||
resolution: {integrity: sha512-w4QtCHoLBXw1mjofIDoMyexaEdWGMedWNDhlWTtT1V1lCRqi65Pnoygkh6+WRdr+Bm8ldkBNkNeCsXGMlQS9HQ==}
|
resolution: {integrity: sha512-w4QtCHoLBXw1mjofIDoMyexaEdWGMedWNDhlWTtT1V1lCRqi65Pnoygkh6+WRdr+Bm8ldkBNkNeCsXGMlQS9HQ==}
|
||||||
@@ -9625,12 +9657,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
||||||
engines: {node: '>= 10.0.0'}
|
engines: {node: '>= 10.0.0'}
|
||||||
|
|
||||||
unocss@66.0.0:
|
unocss@66.4.2:
|
||||||
resolution: {integrity: sha512-SHstiv1s7zGPSjzOsADzlwRhQM+6817+OqQE3Fv+N/nn2QLNx1bi3WXybFfz5tWkzBtyTZlwdPmeecsIs1yOCA==}
|
resolution: {integrity: sha512-PsZ+4XF/ekiParR7PZEM7AchvHJ78EIfOXlqTPflTOXCYgZ77kG9NaIaIf4lHRevY+rRTyrHrjxdg1Ern2j8qw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@unocss/webpack': 66.0.0
|
'@unocss/webpack': 66.4.2
|
||||||
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0
|
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
'@unocss/webpack':
|
'@unocss/webpack':
|
||||||
optional: true
|
optional: true
|
||||||
@@ -9974,10 +10006,8 @@ packages:
|
|||||||
vscode-uri@3.1.0:
|
vscode-uri@3.1.0:
|
||||||
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
|
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
|
||||||
|
|
||||||
vue-flow-layout@0.1.1:
|
vue-flow-layout@0.2.0:
|
||||||
resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==}
|
resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==}
|
||||||
peerDependencies:
|
|
||||||
vue: ^3.4.37
|
|
||||||
|
|
||||||
vue@3.5.13:
|
vue@3.5.13:
|
||||||
resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
|
resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
|
||||||
@@ -10498,12 +10528,12 @@ snapshots:
|
|||||||
'@jridgewell/gen-mapping': 0.3.8
|
'@jridgewell/gen-mapping': 0.3.8
|
||||||
'@jridgewell/trace-mapping': 0.3.25
|
'@jridgewell/trace-mapping': 0.3.25
|
||||||
|
|
||||||
'@antfu/install-pkg@1.0.0':
|
'@antfu/install-pkg@1.1.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
package-manager-detector: 0.2.9
|
package-manager-detector: 1.3.0
|
||||||
tinyexec: 0.3.2
|
tinyexec: 1.0.1
|
||||||
|
|
||||||
'@antfu/utils@8.1.1': {}
|
'@antfu/utils@9.2.0': {}
|
||||||
|
|
||||||
'@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)':
|
'@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -10856,7 +10886,7 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/generator@7.27.1':
|
'@babel/generator@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
'@jridgewell/gen-mapping': 0.3.8
|
'@jridgewell/gen-mapping': 0.3.8
|
||||||
'@jridgewell/trace-mapping': 0.3.25
|
'@jridgewell/trace-mapping': 0.3.25
|
||||||
@@ -10955,7 +10985,7 @@ snapshots:
|
|||||||
|
|
||||||
'@babel/helper-module-imports@7.27.1':
|
'@babel/helper-module-imports@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/traverse': 7.27.1
|
'@babel/traverse': 7.28.0
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -10965,7 +10995,7 @@ snapshots:
|
|||||||
'@babel/core': 7.27.1
|
'@babel/core': 7.27.1
|
||||||
'@babel/helper-module-imports': 7.27.1
|
'@babel/helper-module-imports': 7.27.1
|
||||||
'@babel/helper-validator-identifier': 7.27.1
|
'@babel/helper-validator-identifier': 7.27.1
|
||||||
'@babel/traverse': 7.27.1
|
'@babel/traverse': 7.28.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -12080,14 +12110,14 @@ snapshots:
|
|||||||
'@babel/template@7.27.2':
|
'@babel/template@7.27.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
|
|
||||||
'@babel/traverse@7.27.1':
|
'@babel/traverse@7.27.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
'@babel/generator': 7.27.1
|
'@babel/generator': 7.27.1
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
'@babel/template': 7.27.2
|
'@babel/template': 7.27.2
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
debug: 4.4.1(supports-color@8.1.1)
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
@@ -12673,7 +12703,7 @@ snapshots:
|
|||||||
'@babel/preset-env': 7.27.2(@babel/core@7.27.1)
|
'@babel/preset-env': 7.27.2(@babel/core@7.27.1)
|
||||||
babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.95.0(esbuild@0.25.0))
|
babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.95.0(esbuild@0.25.0))
|
||||||
bluebird: 3.7.1
|
bluebird: 3.7.1
|
||||||
debug: 4.4.0
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
webpack: 5.95.0(esbuild@0.25.0)
|
webpack: 5.95.0(esbuild@0.25.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -13111,15 +13141,15 @@ snapshots:
|
|||||||
|
|
||||||
'@iconify/types@2.0.0': {}
|
'@iconify/types@2.0.0': {}
|
||||||
|
|
||||||
'@iconify/utils@2.3.0':
|
'@iconify/utils@3.0.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@antfu/install-pkg': 1.0.0
|
'@antfu/install-pkg': 1.1.0
|
||||||
'@antfu/utils': 8.1.1
|
'@antfu/utils': 9.2.0
|
||||||
'@iconify/types': 2.0.0
|
'@iconify/types': 2.0.0
|
||||||
debug: 4.4.0
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
globals: 15.15.0
|
globals: 15.15.0
|
||||||
kolorist: 1.8.0
|
kolorist: 1.8.0
|
||||||
local-pkg: 1.0.0
|
local-pkg: 1.1.1
|
||||||
mlly: 1.7.4
|
mlly: 1.7.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -13501,6 +13531,10 @@ snapshots:
|
|||||||
|
|
||||||
'@polka/url@1.0.0-next.28': {}
|
'@polka/url@1.0.0-next.28': {}
|
||||||
|
|
||||||
|
'@quansync/fs@0.1.4':
|
||||||
|
dependencies:
|
||||||
|
quansync: 0.2.10
|
||||||
|
|
||||||
'@react-aria/focus@3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
|
'@react-aria/focus@3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
'@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||||
@@ -13840,7 +13874,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/babel__core@7.20.5':
|
'@types/babel__core@7.20.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
'@types/babel__generator': 7.6.8
|
'@types/babel__generator': 7.6.8
|
||||||
'@types/babel__template': 7.4.4
|
'@types/babel__template': 7.4.4
|
||||||
@@ -13852,7 +13886,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/babel__template@7.4.4':
|
'@types/babel__template@7.4.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
'@babel/types': 7.27.1
|
'@babel/types': 7.27.1
|
||||||
|
|
||||||
'@types/babel__traverse@7.20.6':
|
'@types/babel__traverse@7.20.6':
|
||||||
@@ -14358,150 +14392,157 @@ snapshots:
|
|||||||
|
|
||||||
'@ungap/structured-clone@1.3.0': {}
|
'@ungap/structured-clone@1.3.0': {}
|
||||||
|
|
||||||
'@unocss/astro@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
|
'@unocss/astro@66.4.2(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/reset': 66.0.0
|
'@unocss/reset': 66.4.2
|
||||||
'@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
|
'@unocss/vite': 66.4.2(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
||||||
transitivePeerDependencies:
|
|
||||||
- vue
|
|
||||||
|
|
||||||
'@unocss/cli@66.0.0':
|
'@unocss/cli@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.3.0
|
'@ampproject/remapping': 2.3.0
|
||||||
'@unocss/config': 66.0.0
|
'@unocss/config': 66.4.2
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/preset-uno': 66.0.0
|
'@unocss/preset-uno': 66.4.2
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
chokidar: 3.6.0
|
chokidar: 3.6.0
|
||||||
colorette: 2.0.20
|
colorette: 2.0.20
|
||||||
consola: 3.4.0
|
consola: 3.4.2
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
perfect-debounce: 1.0.0
|
perfect-debounce: 1.0.0
|
||||||
tinyglobby: 0.2.12
|
tinyglobby: 0.2.14
|
||||||
unplugin-utils: 0.2.4
|
unplugin-utils: 0.2.4
|
||||||
|
|
||||||
'@unocss/config@66.0.0':
|
'@unocss/config@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
unconfig: 7.0.0
|
unconfig: 7.3.2
|
||||||
|
|
||||||
'@unocss/core@66.0.0': {}
|
'@unocss/core@66.4.2': {}
|
||||||
|
|
||||||
'@unocss/extractor-arbitrary-variants@66.0.0':
|
'@unocss/extractor-arbitrary-variants@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
|
|
||||||
'@unocss/inspector@66.0.0(vue@3.5.13(typescript@5.7.3))':
|
'@unocss/inspector@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
colorette: 2.0.20
|
colorette: 2.0.20
|
||||||
gzip-size: 6.0.0
|
gzip-size: 6.0.0
|
||||||
sirv: 3.0.1
|
sirv: 3.0.1
|
||||||
vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.7.3))
|
vue-flow-layout: 0.2.0
|
||||||
transitivePeerDependencies:
|
|
||||||
- vue
|
|
||||||
|
|
||||||
'@unocss/postcss@66.0.0(postcss@8.5.6)':
|
'@unocss/postcss@66.4.2(postcss@8.5.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/config': 66.0.0
|
'@unocss/config': 66.4.2
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
css-tree: 3.1.0
|
css-tree: 3.1.0
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
tinyglobby: 0.2.12
|
tinyglobby: 0.2.14
|
||||||
|
|
||||||
'@unocss/preset-attributify@66.0.0':
|
'@unocss/preset-attributify@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-icons@66.0.0':
|
'@unocss/preset-icons@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@iconify/utils': 2.3.0
|
'@iconify/utils': 3.0.1
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
ofetch: 1.4.1
|
ofetch: 1.4.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@unocss/preset-mini@66.0.0':
|
'@unocss/preset-mini@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/extractor-arbitrary-variants': 66.0.0
|
'@unocss/extractor-arbitrary-variants': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-tagify@66.0.0':
|
'@unocss/preset-tagify@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-typography@66.0.0':
|
'@unocss/preset-typography@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/preset-mini': 66.0.0
|
'@unocss/preset-mini': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-uno@66.0.0':
|
'@unocss/preset-uno@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/preset-wind3': 66.0.0
|
'@unocss/preset-wind3': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-web-fonts@66.0.0':
|
'@unocss/preset-web-fonts@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
ofetch: 1.4.1
|
ofetch: 1.4.1
|
||||||
|
|
||||||
'@unocss/preset-wind3@66.0.0':
|
'@unocss/preset-wind3@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/preset-mini': 66.0.0
|
'@unocss/preset-mini': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
|
|
||||||
'@unocss/preset-wind@66.0.0':
|
'@unocss/preset-wind4@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/preset-wind3': 66.0.0
|
'@unocss/extractor-arbitrary-variants': 66.4.2
|
||||||
|
'@unocss/rule-utils': 66.4.2
|
||||||
|
|
||||||
|
'@unocss/preset-wind@66.4.2':
|
||||||
|
dependencies:
|
||||||
|
'@unocss/core': 66.4.2
|
||||||
|
'@unocss/preset-wind3': 66.4.2
|
||||||
|
|
||||||
'@unocss/reset@66.0.0': {}
|
'@unocss/reset@66.0.0': {}
|
||||||
|
|
||||||
'@unocss/rule-utils@66.0.0':
|
'@unocss/reset@66.4.2': {}
|
||||||
|
|
||||||
|
'@unocss/rule-utils@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
|
|
||||||
'@unocss/transformer-attributify-jsx@66.0.0':
|
'@unocss/transformer-attributify-jsx@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@babel/parser': 7.28.0
|
||||||
|
'@babel/traverse': 7.28.0
|
||||||
|
'@unocss/core': 66.4.2
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
'@unocss/transformer-compile-class@66.0.0':
|
'@unocss/transformer-compile-class@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
|
|
||||||
'@unocss/transformer-directives@66.0.0':
|
'@unocss/transformer-directives@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/rule-utils': 66.0.0
|
'@unocss/rule-utils': 66.4.2
|
||||||
css-tree: 3.1.0
|
css-tree: 3.1.0
|
||||||
|
|
||||||
'@unocss/transformer-variant-group@66.0.0':
|
'@unocss/transformer-variant-group@66.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
|
|
||||||
'@unocss/vite@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
|
'@unocss/vite@66.4.2(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.3.0
|
'@ampproject/remapping': 2.3.0
|
||||||
'@unocss/config': 66.0.0
|
'@unocss/config': 66.4.2
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/inspector': 66.0.0(vue@3.5.13(typescript@5.7.3))
|
'@unocss/inspector': 66.4.2
|
||||||
chokidar: 3.6.0
|
chokidar: 3.6.0
|
||||||
magic-string: 0.30.17
|
magic-string: 0.30.17
|
||||||
tinyglobby: 0.2.12
|
pathe: 2.0.3
|
||||||
|
tinyglobby: 0.2.14
|
||||||
unplugin-utils: 0.2.4
|
unplugin-utils: 0.2.4
|
||||||
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
||||||
transitivePeerDependencies:
|
|
||||||
- vue
|
|
||||||
|
|
||||||
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
|
'@unrs/resolver-binding-android-arm-eabi@1.11.1':
|
||||||
optional: true
|
optional: true
|
||||||
@@ -15771,9 +15812,11 @@ snapshots:
|
|||||||
|
|
||||||
confbox@0.1.8: {}
|
confbox@0.1.8: {}
|
||||||
|
|
||||||
|
confbox@0.2.2: {}
|
||||||
|
|
||||||
connect-history-api-fallback@2.0.0: {}
|
connect-history-api-fallback@2.0.0: {}
|
||||||
|
|
||||||
consola@3.4.0: {}
|
consola@3.4.2: {}
|
||||||
|
|
||||||
console.table@0.10.0:
|
console.table@0.10.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -17197,6 +17240,8 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
exsolve@1.0.7: {}
|
||||||
|
|
||||||
extend@3.0.2: {}
|
extend@3.0.2: {}
|
||||||
|
|
||||||
extendable-error@0.1.7: {}
|
extendable-error@0.1.7: {}
|
||||||
@@ -17402,7 +17447,7 @@ snapshots:
|
|||||||
'@actions/core': 1.11.1
|
'@actions/core': 1.11.1
|
||||||
arg: 5.0.2
|
arg: 5.0.2
|
||||||
console.table: 0.10.0
|
console.table: 0.10.0
|
||||||
debug: 4.4.0
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
find-test-names: 1.29.5(@babel/core@7.27.1)
|
find-test-names: 1.29.5(@babel/core@7.27.1)
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
minimatch: 3.1.2
|
minimatch: 3.1.2
|
||||||
@@ -18303,7 +18348,7 @@ snapshots:
|
|||||||
istanbul-lib-source-maps@5.0.6:
|
istanbul-lib-source-maps@5.0.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/trace-mapping': 0.3.25
|
'@jridgewell/trace-mapping': 0.3.25
|
||||||
debug: 4.4.0
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
istanbul-lib-coverage: 3.2.2
|
istanbul-lib-coverage: 3.2.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -18936,6 +18981,12 @@ snapshots:
|
|||||||
mlly: 1.7.4
|
mlly: 1.7.4
|
||||||
pkg-types: 1.3.1
|
pkg-types: 1.3.1
|
||||||
|
|
||||||
|
local-pkg@1.1.1:
|
||||||
|
dependencies:
|
||||||
|
mlly: 1.7.4
|
||||||
|
pkg-types: 2.2.0
|
||||||
|
quansync: 0.2.10
|
||||||
|
|
||||||
locate-path@3.0.0:
|
locate-path@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
p-locate: 3.0.0
|
p-locate: 3.0.0
|
||||||
@@ -19615,7 +19666,7 @@ snapshots:
|
|||||||
|
|
||||||
node-source-walk@7.0.0:
|
node-source-walk@7.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.27.2
|
'@babel/parser': 7.28.0
|
||||||
|
|
||||||
nomnom@1.5.2:
|
nomnom@1.5.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -19873,6 +19924,8 @@ snapshots:
|
|||||||
|
|
||||||
package-manager-detector@0.2.9: {}
|
package-manager-detector@0.2.9: {}
|
||||||
|
|
||||||
|
package-manager-detector@1.3.0: {}
|
||||||
|
|
||||||
pako@1.0.11: {}
|
pako@1.0.11: {}
|
||||||
|
|
||||||
pako@2.1.0: {}
|
pako@2.1.0: {}
|
||||||
@@ -20047,6 +20100,12 @@ snapshots:
|
|||||||
mlly: 1.7.4
|
mlly: 1.7.4
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
|
|
||||||
|
pkg-types@2.2.0:
|
||||||
|
dependencies:
|
||||||
|
confbox: 0.2.2
|
||||||
|
exsolve: 1.0.7
|
||||||
|
pathe: 2.0.3
|
||||||
|
|
||||||
plist@3.1.0:
|
plist@3.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@xmldom/xmldom': 0.8.10
|
'@xmldom/xmldom': 0.8.10
|
||||||
@@ -20228,6 +20287,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
side-channel: 1.1.0
|
side-channel: 1.1.0
|
||||||
|
|
||||||
|
quansync@0.2.10: {}
|
||||||
|
|
||||||
queue-microtask@1.2.3: {}
|
queue-microtask@1.2.3: {}
|
||||||
|
|
||||||
quick-format-unescaped@4.0.4: {}
|
quick-format-unescaped@4.0.4: {}
|
||||||
@@ -21017,7 +21078,7 @@ snapshots:
|
|||||||
|
|
||||||
spdy@4.0.2:
|
spdy@4.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.4.0
|
debug: 4.4.1(supports-color@8.1.1)
|
||||||
handle-thing: 2.0.1
|
handle-thing: 2.0.1
|
||||||
http-deceiver: 1.2.7
|
http-deceiver: 1.2.7
|
||||||
select-hose: 2.0.0
|
select-hose: 2.0.0
|
||||||
@@ -21397,6 +21458,8 @@ snapshots:
|
|||||||
|
|
||||||
tinyexec@0.3.2: {}
|
tinyexec@0.3.2: {}
|
||||||
|
|
||||||
|
tinyexec@1.0.1: {}
|
||||||
|
|
||||||
tinyglobby@0.2.12:
|
tinyglobby@0.2.12:
|
||||||
dependencies:
|
dependencies:
|
||||||
fdir: 6.4.3(picomatch@4.0.2)
|
fdir: 6.4.3(picomatch@4.0.2)
|
||||||
@@ -21599,11 +21662,12 @@ snapshots:
|
|||||||
has-symbols: 1.1.0
|
has-symbols: 1.1.0
|
||||||
which-boxed-primitive: 1.1.1
|
which-boxed-primitive: 1.1.1
|
||||||
|
|
||||||
unconfig@7.0.0:
|
unconfig@7.3.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@antfu/utils': 8.1.1
|
'@quansync/fs': 0.1.4
|
||||||
defu: 6.1.4
|
defu: 6.1.4
|
||||||
jiti: 2.4.2
|
jiti: 2.4.2
|
||||||
|
quansync: 0.2.10
|
||||||
|
|
||||||
underscore@1.1.7: {}
|
underscore@1.1.7: {}
|
||||||
|
|
||||||
@@ -21689,32 +21753,32 @@ snapshots:
|
|||||||
|
|
||||||
universalify@2.0.1: {}
|
universalify@2.0.1: {}
|
||||||
|
|
||||||
unocss@66.0.0(postcss@8.5.6)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3)):
|
unocss@66.4.2(postcss@8.5.6)(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@unocss/astro': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
|
'@unocss/astro': 66.4.2(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))
|
||||||
'@unocss/cli': 66.0.0
|
'@unocss/cli': 66.4.2
|
||||||
'@unocss/core': 66.0.0
|
'@unocss/core': 66.4.2
|
||||||
'@unocss/postcss': 66.0.0(postcss@8.5.6)
|
'@unocss/postcss': 66.4.2(postcss@8.5.6)
|
||||||
'@unocss/preset-attributify': 66.0.0
|
'@unocss/preset-attributify': 66.4.2
|
||||||
'@unocss/preset-icons': 66.0.0
|
'@unocss/preset-icons': 66.4.2
|
||||||
'@unocss/preset-mini': 66.0.0
|
'@unocss/preset-mini': 66.4.2
|
||||||
'@unocss/preset-tagify': 66.0.0
|
'@unocss/preset-tagify': 66.4.2
|
||||||
'@unocss/preset-typography': 66.0.0
|
'@unocss/preset-typography': 66.4.2
|
||||||
'@unocss/preset-uno': 66.0.0
|
'@unocss/preset-uno': 66.4.2
|
||||||
'@unocss/preset-web-fonts': 66.0.0
|
'@unocss/preset-web-fonts': 66.4.2
|
||||||
'@unocss/preset-wind': 66.0.0
|
'@unocss/preset-wind': 66.4.2
|
||||||
'@unocss/preset-wind3': 66.0.0
|
'@unocss/preset-wind3': 66.4.2
|
||||||
'@unocss/transformer-attributify-jsx': 66.0.0
|
'@unocss/preset-wind4': 66.4.2
|
||||||
'@unocss/transformer-compile-class': 66.0.0
|
'@unocss/transformer-attributify-jsx': 66.4.2
|
||||||
'@unocss/transformer-directives': 66.0.0
|
'@unocss/transformer-compile-class': 66.4.2
|
||||||
'@unocss/transformer-variant-group': 66.0.0
|
'@unocss/transformer-directives': 66.4.2
|
||||||
'@unocss/vite': 66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
|
'@unocss/transformer-variant-group': 66.4.2
|
||||||
|
'@unocss/vite': 66.4.2(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- postcss
|
- postcss
|
||||||
- supports-color
|
- supports-color
|
||||||
- vue
|
|
||||||
|
|
||||||
unpipe@1.0.0: {}
|
unpipe@1.0.0: {}
|
||||||
|
|
||||||
@@ -22051,9 +22115,7 @@ snapshots:
|
|||||||
|
|
||||||
vscode-uri@3.1.0: {}
|
vscode-uri@3.1.0: {}
|
||||||
|
|
||||||
vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)):
|
vue-flow-layout@0.2.0: {}
|
||||||
dependencies:
|
|
||||||
vue: 3.5.13(typescript@5.7.3)
|
|
||||||
|
|
||||||
vue@3.5.13(typescript@5.7.3):
|
vue@3.5.13(typescript@5.7.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
Reference in New Issue
Block a user