Compare commits
226
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e5e2518fb | ||
|
|
f6b34c7903 | ||
|
|
b9aa9cb2d9 | ||
|
|
b593e9ba47 | ||
|
|
12a8e332cf | ||
|
|
2612727d07 | ||
|
|
a81322e495 | ||
|
|
7bdbcd57af | ||
|
|
ae739ca0e8 | ||
|
|
2cd6cc056f | ||
|
|
5845ff1957 | ||
|
|
02d33d1d15 | ||
|
|
8488517168 | ||
|
|
bfa3a8a788 | ||
|
|
8e41cf1db6 | ||
|
|
1f1ef5da64 | ||
|
|
01b3b000db | ||
|
|
3117665b10 | ||
|
|
02d4fb2847 | ||
|
|
d4a2b910b1 | ||
|
|
f371ff7d57 | ||
|
|
4e0a2d69a4 | ||
|
|
68feebce35 | ||
|
|
54c770e979 | ||
|
|
5380e3abf3 | ||
|
|
3932e3f8f0 | ||
|
|
5ba2337ad5 | ||
|
|
8c7886802e | ||
|
|
d0cee21b8d | ||
|
|
8ab9a6fb87 | ||
|
|
99e6f5718d | ||
|
|
2699145013 | ||
|
|
5472c70629 | ||
|
|
48ed8d3ea3 | ||
|
|
8092793bd1 | ||
|
|
9e054b9e6e | ||
|
|
d281f87b12 | ||
|
|
667c03e4e1 | ||
|
|
f721899871 | ||
|
|
bec5ca32aa | ||
|
|
b46e954b60 | ||
|
|
d5f9e3dfe2 | ||
|
|
ac22e2649f | ||
|
|
2b5f16163c | ||
|
|
626e76dae6 | ||
|
|
004cd5bdda | ||
|
|
7ccb86aee3 | ||
|
|
06e1706581 | ||
|
|
1ba0791579 | ||
|
|
0f1deb290b | ||
|
|
e3fb1821bc | ||
|
|
193a543d1f | ||
|
|
316049d673 | ||
|
|
428181047d | ||
|
|
952e53c702 | ||
|
|
3b36b94861 | ||
|
|
2b34c381cc | ||
|
|
41fe902ce1 | ||
|
|
d8eee74010 | ||
|
|
283a75502a | ||
|
|
b9f3675671 | ||
|
|
0883ad599a | ||
|
|
49021cc756 | ||
|
|
8e6d851bb7 | ||
|
|
a9faa507fe | ||
|
|
fe81602f23 | ||
|
|
f5d0e88369 | ||
|
|
92adfac06c | ||
|
|
4fcc3d31df | ||
|
|
5aeb4e80b1 | ||
|
|
7445f5f008 | ||
|
|
617c20f221 | ||
|
|
c9ad0a5a6d | ||
|
|
184ce03195 | ||
|
|
cba10bbcc0 | ||
|
|
60265f816a | ||
|
|
5922b75f08 | ||
|
|
13d5916996 | ||
|
|
e12a05b892 | ||
|
|
0365e40c0a | ||
|
|
3456ad33c1 | ||
|
|
3d3b4b0e56 | ||
|
|
9741968ab7 | ||
|
|
79c14647be | ||
|
|
33ded995e6 | ||
|
|
b8c0b28112 | ||
|
|
2796def222 | ||
|
|
47f21dabfa | ||
|
|
7e15d8734c | ||
|
|
a1e0238b15 | ||
|
|
d799c18133 | ||
|
|
d866d00901 | ||
|
|
36e12f520d | ||
|
|
0986cce16b | ||
|
|
3b89fff0ef | ||
|
|
7ccf417793 | ||
|
|
8b602ecea1 | ||
|
|
df2425188d | ||
|
|
8a3a914162 | ||
|
|
6377fb376d | ||
|
|
fcfb915e68 | ||
|
|
23afba7612 | ||
|
|
b4928339c6 | ||
|
|
e25a5c7230 | ||
|
|
b75d8585ef | ||
|
|
a1042eaad9 | ||
|
|
03aab93bcd | ||
|
|
e7ab3e05aa | ||
|
|
3392c02184 | ||
|
|
3a63ad9080 | ||
|
|
278982c246 | ||
|
|
a49e8e93bc | ||
|
|
60292f0170 | ||
|
|
4cc2062eef | ||
|
|
cfb3d93cab | ||
|
|
4f430bed19 | ||
|
|
8143e4824e | ||
|
|
ba9f42e27f | ||
|
|
b0d774ee94 | ||
|
|
a6e8aa82ab | ||
|
|
8cd6098ebc | ||
|
|
9565d93ebe | ||
|
|
6df116a073 | ||
|
|
cf2e6f4645 | ||
|
|
bb5f8d0523 | ||
|
|
a900eb4cf4 | ||
|
|
eb32c4aedc | ||
|
|
8f8667aad5 | ||
|
|
fe8e8cdb32 | ||
|
|
64934dcfae | ||
|
|
987b7cfbde | ||
|
|
988e0d61a9 | ||
|
|
54690ba507 | ||
|
|
5920dfbc69 | ||
|
|
8bcb5857dc | ||
|
|
2f2e567163 | ||
|
|
968bb81b30 | ||
|
|
d7f0ee5f94 | ||
|
|
812f9b566d | ||
|
|
3801d931f3 | ||
|
|
0f2821b664 | ||
|
|
394409c6c2 | ||
|
|
d72df81de9 | ||
|
|
073bee0ee6 | ||
|
|
cd296ad9c4 | ||
|
|
83c16b487c | ||
|
|
251704767d | ||
|
|
6339c2da57 | ||
|
|
7b88e440ea | ||
|
|
1ce8970a52 | ||
|
|
8ba3dfbb50 | ||
|
|
4528d8ce8c | ||
|
|
54c3a08043 | ||
|
|
0175955f9b | ||
|
|
534b9fb08b | ||
|
|
5efa473e2d | ||
|
|
a7ffaeea9a | ||
|
|
4a6a4906e1 | ||
|
|
f2113162f4 | ||
|
|
b5978e6faf | ||
|
|
44ebcd3725 | ||
|
|
47902536ab | ||
|
|
4cdcb51dcb | ||
|
|
e2461f2c69 | ||
|
|
8cbd5a2b36 | ||
|
|
4c7cc04ec3 | ||
|
|
571b345265 | ||
|
|
d603927242 | ||
|
|
6689df1cb9 | ||
|
|
84261b40bc | ||
|
|
db1cba2a8d | ||
|
|
b5f90ba2b1 | ||
|
|
f107838241 | ||
|
|
73168de160 | ||
|
|
9fb7c4a176 | ||
|
|
fc78a26245 | ||
|
|
aee4460458 | ||
|
|
b52f2c4220 | ||
|
|
ad108a3dab | ||
|
|
d9a0209fac | ||
|
|
4628a670c8 | ||
|
|
ea4e0a0d2d | ||
|
|
f75182106a | ||
|
|
597a396def | ||
|
|
5c6f5cf0e7 | ||
|
|
9cc2ea05bb | ||
|
|
df4964ab83 | ||
|
|
33a9491def | ||
|
|
208b397378 | ||
|
|
e67628e321 | ||
|
|
9997efdad1 | ||
|
|
d576e45ed5 | ||
|
|
749828fc9b | ||
|
|
38e0b2c9d6 | ||
|
|
1fb24aa4ce | ||
|
|
f0d5550c0c | ||
|
|
e16a57de0e | ||
|
|
a8b27fc815 | ||
|
|
3c9706f8e6 | ||
|
|
311fbd785e | ||
|
|
52e533dc52 | ||
|
|
399b2a338f | ||
|
|
642c247686 | ||
|
|
5e1c37271e | ||
|
|
5b3b659ea2 | ||
|
|
cbb354f43e | ||
|
|
652d4c67ea | ||
|
|
a2442e287e | ||
|
|
05c5b3bf2d | ||
|
|
c18a3b520e | ||
|
|
e5ab129e28 | ||
|
|
c59351c84f | ||
|
|
ea9e2fc0e0 | ||
|
|
e0b2b762c5 | ||
|
|
6f09bc6872 | ||
|
|
a3a9828ac8 | ||
|
|
432e12e083 | ||
|
|
a29568b42d | ||
|
|
6bdf8af2f1 | ||
|
|
6ab1b296b8 | ||
|
|
4472b1921c | ||
|
|
787c6df2ed | ||
|
|
b0cb4e6a0e | ||
|
|
f8f7db6a77 | ||
|
|
36bcd32ee3 | ||
|
|
18a83a807a |
+2
-1
@@ -27,7 +27,8 @@ module.exports = {
|
||||
ecmaVersion: 2019,
|
||||
tsconfigRootDir: __dirname,
|
||||
project: ['./tsconfig.json'],
|
||||
extraFileExtensions: ['.svelte']
|
||||
extraFileExtensions: ['.svelte'],
|
||||
allowAutomaticSingleRunInference: true
|
||||
},
|
||||
env: {
|
||||
browser: true,
|
||||
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
|
||||
@@ -14,9 +14,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/cache@v2
|
||||
- uses: actions/cache@v3
|
||||
id: yarn-and-build-cache
|
||||
with:
|
||||
path: |
|
||||
@@ -27,17 +27,17 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-node_modules-build-
|
||||
|
||||
- name: Lint
|
||||
- name: Build & Lint
|
||||
run: |
|
||||
yarn install
|
||||
yarn run lint
|
||||
yarn build
|
||||
yarn lint
|
||||
|
||||
# Install NPM dependencies, cache them correctly
|
||||
# and run all Cypress tests
|
||||
- name: Cypress run
|
||||
uses: cypress-io/github-action@v2
|
||||
with:
|
||||
build: yarn build
|
||||
start: yarn preview
|
||||
wait-on: 'http://localhost:3000'
|
||||
record: true
|
||||
|
||||
@@ -11,37 +11,23 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-node@v2
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '16'
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Get yarn cache directory path
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
|
||||
- uses: actions/cache@v2
|
||||
id: yarn-cache
|
||||
with:
|
||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-yarn-
|
||||
cache: yarn
|
||||
|
||||
- name: Build & Deploy
|
||||
run: |
|
||||
npm i -g yarn
|
||||
export DEPLOY=true
|
||||
[ "$GITHUB_EVENT_NAME" == "pull_request" ] && export BETA=true && rm -rf docs/beta/
|
||||
[ "$GITHUB_EVENT_NAME" != "pull_request" ] && rm -rf docs/_app/
|
||||
yarn install
|
||||
yarn run lint
|
||||
version=$(yarn version --patch --no-git-tag-version | grep "New version" | cut -d':' -f 2)
|
||||
yarn build
|
||||
cd bin
|
||||
./fix-path
|
||||
yarn run lint
|
||||
cd ..
|
||||
|
||||
- name: Deploy
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
if: github.event_name == 'push'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Build image
|
||||
run: docker build . --file Dockerfile --tag $IMAGE_NAME
|
||||
|
||||
@@ -13,5 +13,8 @@ jobs:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
exempt-issue-labels: 'retained'
|
||||
exempt-pr-labels: 'retained'
|
||||
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days'
|
||||
stale-pr-message: 'This pr is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days'
|
||||
stale-issue-message: 'This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 14 days'
|
||||
stale-pr-message: 'This pr is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 14 days'
|
||||
days-before-stale: 90
|
||||
days-before-close: 14
|
||||
days-before-pr-close: -1
|
||||
|
||||
@@ -6,10 +6,10 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- run: npx browserslist@latest --update-db
|
||||
- name: Commit changes
|
||||
uses: EndBug/add-and-commit@v7
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
author_name: ${{ github.actor }}
|
||||
author_email: ${{ github.actor }}@users.noreply.github.com
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
name: Update Monaco-editor
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
types: [opened]
|
||||
push:
|
||||
branches:
|
||||
- 'dependabot/npm_and_yarn/develop/monaco-editor-**'
|
||||
|
||||
@@ -10,10 +9,10 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- run: ./bin/update-monaco
|
||||
- name: Commit changes
|
||||
uses: EndBug/add-and-commit@v7
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
author_name: ${{ github.actor }}
|
||||
author_email: ${{ github.actor }}@users.noreply.github.com
|
||||
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"editor.formatOnSave": true,
|
||||
"cSpell.words": ["pako", "Serde", "serdes"]
|
||||
}
|
||||
+2
-1
@@ -6,11 +6,12 @@
|
||||
# Stop : press ctrl + c
|
||||
# or
|
||||
# docker stop mermaid-live-editor
|
||||
FROM node:17.3.1 as mermaid-live-editor-builder
|
||||
FROM node:17.8.0 as mermaid-live-editor-builder
|
||||
COPY --chown=node:node . /home
|
||||
WORKDIR /home
|
||||
RUN yarn install
|
||||
RUN yarn build
|
||||
|
||||
FROM nginx:alpine as mermaid-live-editor-runner
|
||||
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
|
||||
COPY --from=mermaid-live-editor-builder --chown=nginx:nginx /home/docs /usr/share/nginx/html
|
||||
|
||||
@@ -32,6 +32,11 @@ docker run --publish 8000:80 ghcr.io/mermaid-js/mermaid-live-editor
|
||||
When building, Set the Environment variable MERMAID_RENDERER_URL to the rendering service.
|
||||
Default is `https://mermaid.ink`
|
||||
|
||||
### To configure Kroki Instance URL
|
||||
|
||||
When building, Set the Environment variable MERMAID_KROKI_RENDERER_URL to your Kroki instance.
|
||||
Default is `https://kroki.io`
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
|
||||
@@ -30,4 +30,14 @@ describe('Auto sync tests', () => {
|
||||
cy.get('#view').should('not.have.class', 'outOfSync');
|
||||
cy.getLocalStorage('codeStore').snapshot();
|
||||
});
|
||||
|
||||
it('supports commenting code out/in', () => {
|
||||
const cmd = Cypress.platform === 'darwin' ? 'meta' : 'ctrl';
|
||||
|
||||
cy.get('#editor').type(`{uparrow}{${cmd}}/`);
|
||||
cy.get('#view').contains('Car').should('not.exist');
|
||||
|
||||
cy.get('#editor').type(`{uparrow}{${cmd}}/`);
|
||||
cy.get('#view').contains('Car').should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
describe('Editor docs tests', () => {
|
||||
beforeEach(() => {
|
||||
cy.on('uncaught:exception', () => {
|
||||
return false;
|
||||
});
|
||||
cy.clearLocalStorage();
|
||||
cy.visit('/edit');
|
||||
cy.contains('Sample Diagrams').click();
|
||||
});
|
||||
|
||||
it('Test default loading', () => {
|
||||
cy.get(`[data-cy=docs][href^="https://mermaid-js.github.io/mermaid"]`).should('exist');
|
||||
});
|
||||
|
||||
it('Test to see if the correct URL loads when changing from one diagram to other', () => {
|
||||
cy.contains('Flow Chart').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/flowchart"]`).should('exist');
|
||||
|
||||
cy.contains('Config').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/flowchart?id=configuration"]`).should('exist');
|
||||
|
||||
cy.contains('Sequence Diagram').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/sequenceDiagram?id=configuration"]`).should('exist');
|
||||
|
||||
cy.contains('Code').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/sequenceDiagram"]`).should('exist');
|
||||
});
|
||||
|
||||
it("Test to check URLs for a case where config URL doesn't exist", () => {
|
||||
cy.contains('State Diagram').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/stateDiagram"]`).should('exist');
|
||||
|
||||
cy.contains('Config').click();
|
||||
cy.get(`[data-cy=docs][href$="/#/stateDiagram"]`).should('exist');
|
||||
});
|
||||
});
|
||||
@@ -46,7 +46,9 @@ describe('Save History', () => {
|
||||
cy.get('#historyList').contains('No items in History');
|
||||
});
|
||||
|
||||
it('should auto save history', () => {
|
||||
// TODO: Fix #639
|
||||
// eslint-disable-next-line mocha/no-skipped-tests
|
||||
xit('should auto save history', () => {
|
||||
cy.get('#editor').type(' C --> HistoryTest');
|
||||
cy.tick(70000);
|
||||
cy.contains('Timeline').click();
|
||||
|
||||
@@ -17,7 +17,7 @@ describe('Site Loads', () => {
|
||||
);
|
||||
cy.url().should(
|
||||
'include',
|
||||
'/edit#eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0NocmlzdG1hc10gLS0-fEdldCBtb25leXwgQihHbyBzaG9wcGluZylcbiAgICBCIC0tPiBDe0xldCBtZSB0aGlua31cbiAgICBDIC0tPnxPbmV8IERbTGFwdG9wXVxuICAgIEMgLS0-fFR3b3wgRVtpUGhvbmVdXG4gICAgQyAtLT58VGhyZWV8IEZbZmE6ZmEtY2FyIENhcl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ'
|
||||
'/edit#pako:eNpVkM1qw0AMhF9F6NRC_AI-FBo7zSXQQHLz-iC8cnZJ9oe1TAm2373rmkKrk9B8MwyasAuascRbomjgWisPed6byiQ7iKOhhaJ4m48s4ILn5wz7l2OAwYQYrb-9bvx-haCaTivGIMb6-7JJ1Y__0_MMdXOiKCG2f5XrV5jh0NizyfH_FZM4uz6ansqeio4SVJRa3KHj5MjqXHtaDQrFsGOFZV419zQ-RKHyS0bHqEn4oK2EhDnmMfAOaZRwefoOS0kj_0K1pfwFtx2XbzAdW4g'
|
||||
);
|
||||
cy.contains('History').click();
|
||||
cy.getLocalStorage('codeStore').snapshot();
|
||||
@@ -93,4 +93,31 @@ describe('Site Loads', () => {
|
||||
cy.visit('/#/edit/eyJjb2RlIjoiZ3JhcGggVERcbiAg');
|
||||
cy.contains('Please Click here to Raise an issue in github.');
|
||||
});
|
||||
|
||||
it('should load uncompressed URL', () => {
|
||||
cy.visit(
|
||||
'/edit/#eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW05ldyBZZWFyXSAtLT58R2V0IG1vbmV5fCBCKEdvIHNob3BwaW5nKVxuICAgIEIgLS0-IEN7TGV0IG1lIHRoaW5rfVxuICAgIEMgLS0-fE9uZXwgRFtMYXB0b3BdXG4gICAgQyAtLT58VHdvfCBFW2lQaG9uZV1cbiAgICBDIC0tPnxUaHJlZXwgRltmYTpmYS1jYXIgQ2FyXSIsIm1lcm1haWQiOiJ7XG4gIFwidGhlbWVcIjogXCJkZWZhdWx0XCJcbn0iLCJ1cGRhdGVFZGl0b3IiOmZhbHNlLCJhdXRvU3luYyI6dHJ1ZSwidXBkYXRlRGlhZ3JhbSI6ZmFsc2V9'
|
||||
);
|
||||
cy.contains('New Year');
|
||||
cy.visit(
|
||||
'/edit#eyJjb2RlIjoiY2xhc3NEaWFncmFtXG4gICAgQW5pbWFsIDx8LS0gRHVja1xuICAgIEFuaW1hbCA8fC0tIEZpc2hcbiAgICBBbmltYWwgPHwtLSBaZWJyYVxuICAgIEFuaW1hbCA6ICtpbnQgYWdlXG4gICAgQW5pbWFsIDogK1N0cmluZyBnZW5kZXJcbiAgICBBbmltYWw6ICtpc01hbW1hbCgpXG4gICAgQW5pbWFsOiArbWF0ZSgpXG4gICAgY2xhc3MgRHVja3tcbiAgICAgICtTdHJpbmcgYmVha0NvbG9yXG4gICAgICArc3dpbSgpXG4gICAgICArcXVhY2soKVxuICAgIH1cbiAgICBjbGFzcyBGaXNoe1xuICAgICAgLWludCBzaXplSW5GZWV0XG4gICAgICAtY2FuRWF0KClcbiAgICB9XG4gICAgY2xhc3MgWmVicmF7XG4gICAgICArYm9vbCBpc193aWxkXG4gICAgICArcnVuKClcbiAgICB9XG4gICAgICAgICAgICAiLCJtZXJtYWlkIjoie1xuICBcInRoZW1lXCI6IFwiZGFya1wiXG59IiwidXBkYXRlRWRpdG9yIjpmYWxzZSwiYXV0b1N5bmMiOnRydWUsInVwZGF0ZURpYWdyYW0iOmZhbHNlfQ'
|
||||
);
|
||||
cy.contains('Animal');
|
||||
cy.visit(
|
||||
'/edit/#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW05ldyBZZWFyXSAtLT58R2V0IG1vbmV5fCBCKEdvIHNob3BwaW5nKVxuICAgIEIgLS0-IEN7TGV0IG1lIHRoaW5rfVxuICAgIEMgLS0-fE9uZXwgRFtMYXB0b3BdXG4gICAgQyAtLT58VHdvfCBFW2lQaG9uZV1cbiAgICBDIC0tPnxUaHJlZXwgRltmYTpmYS1jYXIgQ2FyXSIsIm1lcm1haWQiOiJ7XG4gIFwidGhlbWVcIjogXCJkZWZhdWx0XCJcbn0iLCJ1cGRhdGVFZGl0b3IiOmZhbHNlLCJhdXRvU3luYyI6dHJ1ZSwidXBkYXRlRGlhZ3JhbSI6ZmFsc2V9'
|
||||
);
|
||||
cy.contains('New Year');
|
||||
});
|
||||
|
||||
it('should load compressed URL', () => {
|
||||
cy.visit(
|
||||
'/edit#pako:eNpVkM2KwkAQhF-l6dMK5gVyEDRxvYi7sF6WjIcm0zqDzg_jBJEk725Hd2G3Tw31VVFUj23QjCWeEkUD-1p5kFs2O77BN1M6QFEshg1ncMHzfYDV2ybA1YQYrT_NXvhqgqDqtxPGkI315_ElVU__h-cB6mZLMYd4-Kvsb2GAdWM_jcT_V0xicb03RyqPVLSUoJI-OEfHyZHV0rqfDAqzYccKS3k1pbNC5Ufhuqgp81rbHBJKxuXKc6Quh6-7b7HMqeNfqLYkC7gfanwAlW1ZvQ'
|
||||
);
|
||||
cy.contains('New Year');
|
||||
cy.visit(
|
||||
'/edit#pako:eNptkU1PwzAMhv9K5BOI9Q9EXBDbJA477YYqITcxndV8QD40weh_Jy1rGR0-OY_tV2_sEyivCSQogzGuGduAtnaixINji0bcf1WVWGfVXdMtx8M1faYm4B8sxR27JLClJd6nwK4VLTlN4bI4jMQd2pLe3C4KFhNNcLQ92jv9ADGLNoTdozc-zIV4ZDsNlud7RtVN7_5Sb_jYrFcN3iN_0pPbEqUZK3QbTP_Ojyv4NdR4bwTHlyMbPcOQ3WJ2CliBpWCRdbnLqFJDOpClGmRJNYauhtr1pS-_6bKMjebkA8hXNJFWgDn5_YdTIFPINDWdb3vu6r8BaWOZRQ'
|
||||
);
|
||||
cy.reload();
|
||||
cy.contains('Animal');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -16,7 +16,7 @@ module.exports = {
|
||||
"1": "{\"code\":\"graph TD\\n A[Party] -->|Get money| B(Go shopping!!)\\n \",\"mermaid\":\"{\\n \\\"theme\\\": \\\"forest\\\",\\n \\\"test\\\": \\\"hello world\\\"\\n}\",\"updateEditor\":false,\"autoSync\":true,\"updateDiagram\":true,\"loader\":{\"type\":\"files\",\"config\":{\"codeURL\":\"https://gist.githubusercontent.com/sidharthv96/6268a23e673a533dcb198f241fd7012a/raw/4eb03887e6a41397e80bdcdbf94017c498f8f1e2/code.mmd\",\"configURL\":\"https://gist.githubusercontent.com/sidharthv96/6268a23e673a533dcb198f241fd7012a/raw/4eb03887e6a41397e80bdcdbf94017c498f8f1e2/config.json\"}}}"
|
||||
}
|
||||
},
|
||||
"__version": "9.1.1",
|
||||
"__version": "9.5.1",
|
||||
"Auto sync tests": {
|
||||
"should dim diagram when code is edited": {
|
||||
"1": "{\"code\":\"graph TD\\n A[Christmas] -->|Get money| B(Go shopping)\\n B --> C{Let me think}\\n C -->|One| D[Laptop]\\n C -->|Two| E[iPhone]\\n C -->|Three| F[fa:fa-car Car]\\n C --> Test\",\"mermaid\":\"{\\n \\\"theme\\\": \\\"default\\\"\\n}\",\"updateEditor\":false,\"autoSync\":false,\"updateDiagram\":false}"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name mermaid;
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
# Fallback to index.html for other paths
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
}
|
||||
+33
-30
@@ -5,8 +5,8 @@
|
||||
"dev": "svelte-kit dev --host 0.0.0.0",
|
||||
"build": "svelte-kit build",
|
||||
"preview": "svelte-kit preview",
|
||||
"lint": "prettier --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
|
||||
"lint:fix": "prettier --write --plugin-search-dir=. . && eslint --fix --ignore-path .gitignore .",
|
||||
"lint": "prettier --check --plugin-search-dir=. .;eslint --ignore-path .gitignore .",
|
||||
"lint:fix": "prettier --write --plugin-search-dir=. .;eslint --fix --ignore-path .gitignore .",
|
||||
"format": "prettier --write --plugin-search-dir=. .",
|
||||
"pre-commit": "lint-staged",
|
||||
"postinstall": "husky install",
|
||||
@@ -15,48 +15,51 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cypress/snapshot": "^2.1.7",
|
||||
"@sveltejs/adapter-static": "1.0.0-next.22",
|
||||
"@sveltejs/kit": "1.0.0-next.202",
|
||||
"@types/mermaid": "^8.2.7",
|
||||
"@sveltejs/adapter-static": "1.0.0-next.29",
|
||||
"@sveltejs/kit": "1.0.0-next.310",
|
||||
"@types/mermaid": "^8.2.9",
|
||||
"@types/pako": "^1.0.3",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"autoprefixer": "^10.4.0",
|
||||
"chai": "^4.3.4",
|
||||
"cssnano": "^5.0.14",
|
||||
"cypress": "9.2.0",
|
||||
"cypress-localstorage-commands": "^1.6.1",
|
||||
"autoprefixer": "^10.4.4",
|
||||
"chai": "^4.3.6",
|
||||
"cssnano": "^5.1.7",
|
||||
"cypress": "9.5.3",
|
||||
"cypress-localstorage-commands": "^1.7.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.1.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-cypress": "^2.12.1",
|
||||
"eslint-plugin-es": "^4.1.0",
|
||||
"eslint-plugin-mocha": "^10.0.3",
|
||||
"eslint-plugin-postcss-modules": "^2.0.0",
|
||||
"eslint-plugin-svelte3": "^3.2.1",
|
||||
"eslint-plugin-tailwindcss": "^1.17.2",
|
||||
"eslint-plugin-svelte3": "^3.4.1",
|
||||
"eslint-plugin-tailwindcss": "^3.5.0",
|
||||
"husky": "^7.0.4",
|
||||
"lint-staged": "^12.1.4",
|
||||
"mocha": "^9.1.3",
|
||||
"node-html-parser": "^5.2.0",
|
||||
"postcss": "^8.4.5",
|
||||
"postcss-load-config": "^3.1.0",
|
||||
"prettier": "~2.5.1",
|
||||
"prettier-plugin-svelte": "^2.5.1",
|
||||
"svelte": "^3.46.1",
|
||||
"svelte-preprocess": "^4.10.1",
|
||||
"tailwindcss": "^3.0.13",
|
||||
"lint-staged": "^12.3.7",
|
||||
"mocha": "^9.2.2",
|
||||
"node-html-parser": "^5.3.3",
|
||||
"postcss": "^8.4.12",
|
||||
"postcss-load-config": "^3.1.4",
|
||||
"prettier": "~2.6.2",
|
||||
"prettier-plugin-svelte": "^2.7.0",
|
||||
"svelte": "^3.47.0",
|
||||
"svelte-preprocess": "^4.10.5",
|
||||
"tailwindcss": "^3.0.21",
|
||||
"tslib": "^2.3.1",
|
||||
"typescript": "^4.5.4"
|
||||
"typescript": "^4.6.3"
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@analytics/google-analytics": "^0.5.3",
|
||||
"@macfja/svelte-persistent-store": "^1.2.0",
|
||||
"analytics": "^0.7.19",
|
||||
"daisyui": "1.21.0",
|
||||
"@macfja/svelte-persistent-store": "^1.3.0",
|
||||
"analytics": "^0.8.1",
|
||||
"daisyui": "2.13.6",
|
||||
"js-base64": "^3.7.2",
|
||||
"mermaid": "8.13.8",
|
||||
"moment": "^2.29.1",
|
||||
"monaco-editor": "^0.31.1",
|
||||
"mermaid": "9.0.0",
|
||||
"moment": "^2.29.2",
|
||||
"monaco-editor": "^0.33.0",
|
||||
"monaco-mermaid": "^1.0.3",
|
||||
"pako": "2.0.4",
|
||||
"random-word-slugs": "^0.1.6"
|
||||
},
|
||||
"lint-staged": {
|
||||
|
||||
+7
-7
@@ -11,31 +11,31 @@
|
||||
<meta
|
||||
name="description"
|
||||
content="Simplify documentation and avoid heavy tools. Open source Visio Alternative. Commonly used for explaining your code! Mermaid is a simple markdown-like script language for generating charts from text via javascript." />
|
||||
<link rel="icon" type="image/png" href="favicon.png" />
|
||||
<link rel="manifest" href="manifest.json" />
|
||||
<link rel="icon" type="image/png" href="%svelte.assets%/favicon.png" />
|
||||
<link rel="manifest" href="%svelte.assets%/manifest.json" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.31.1/min/vs/editor/editor.main.min.css"
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.33.0/min/vs/editor/editor.main.min.css"
|
||||
crossorigin="anonymous"
|
||||
referrerpolicy="no-referrer" />
|
||||
<script>
|
||||
var require = {
|
||||
paths: { vs: 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.31.1/min/vs' }
|
||||
paths: { vs: 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.33.0/min/vs' }
|
||||
};
|
||||
</script>
|
||||
<script
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.31.1/min/vs/loader.min.js"
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.33.0/min/vs/loader.min.js"
|
||||
crossorigin="anonymous"
|
||||
referrerpolicy="no-referrer"></script>
|
||||
<script
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.31.1/min/vs/editor/editor.main.nls.min.js"
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.33.0/min/vs/editor/editor.main.nls.min.js"
|
||||
crossorigin="anonymous"
|
||||
referrerpolicy="no-referrer"></script>
|
||||
<script
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.31.1/min/vs/editor/editor.main.js"
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.33.0/min/vs/editor/editor.main.js"
|
||||
crossorigin="anonymous"
|
||||
referrerpolicy="no-referrer"></script>
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
import type { Handle } from '@sveltejs/kit/types/hooks';
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
const response = await resolve(event, {
|
||||
ssr: false
|
||||
});
|
||||
|
||||
return response;
|
||||
};
|
||||
@@ -2,8 +2,9 @@
|
||||
import { browser } from '$app/env';
|
||||
|
||||
import Card from '$lib/components/card/card.svelte';
|
||||
import { rendererUrl } from '$lib/util/env';
|
||||
import { base64State, codeStore } from '$lib/util/state';
|
||||
import { krokiRendererUrl, rendererUrl } from '$lib/util/env';
|
||||
import { pakoSerde } from '$lib/util/serde';
|
||||
import { serializedState, codeStore } from '$lib/util/state';
|
||||
import { toBase64 } from 'js-base64';
|
||||
import moment from 'moment';
|
||||
|
||||
@@ -17,7 +18,7 @@
|
||||
}
|
||||
const svgString = svg.outerHTML
|
||||
.replaceAll('<br>', '<br/>')
|
||||
.replaceAll(/<img([^>]*)>/g, (m, g) => `<img ${g} />`);
|
||||
.replaceAll(/<img([^>]*)>/g, (m, g: string) => `<img ${g} />`);
|
||||
return toBase64(svgString);
|
||||
};
|
||||
|
||||
@@ -78,7 +79,7 @@
|
||||
canvas.toBlob((blob) => {
|
||||
try {
|
||||
// @ts-ignore: https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1004/files
|
||||
navigator.clipboard.write([
|
||||
void navigator.clipboard.write([
|
||||
/* eslint-disable no-undef */
|
||||
// @ts-ignore: https://github.com/microsoft/TypeScript/issues/43821
|
||||
new ClipboardItem({
|
||||
@@ -108,7 +109,7 @@
|
||||
};
|
||||
|
||||
const onCopyMarkdown = () => {
|
||||
document.getElementById('markdown').select();
|
||||
(document.getElementById('markdown') as HTMLInputElement).select();
|
||||
document.execCommand('Copy');
|
||||
};
|
||||
|
||||
@@ -129,6 +130,7 @@
|
||||
|
||||
let iUrl: string;
|
||||
let svgUrl: string;
|
||||
let krokiUrl: string;
|
||||
let mdCode: string;
|
||||
let imagemodeselected = 'auto';
|
||||
let userimagesize = 1080;
|
||||
@@ -137,14 +139,10 @@
|
||||
if (browser && ['mermaid.live', 'netlify'].some((path) => window.location.host.includes(path))) {
|
||||
isNetlify = true;
|
||||
}
|
||||
base64State.subscribe((encodedState: string) => {
|
||||
const stateCopy = JSON.parse(JSON.stringify($codeStore));
|
||||
if (typeof stateCopy.mermaid === 'string') {
|
||||
stateCopy.mermaid = JSON.parse(stateCopy.mermaid);
|
||||
}
|
||||
const b64Code = toBase64(JSON.stringify(stateCopy), true);
|
||||
iUrl = `${rendererUrl}/img/${b64Code}`;
|
||||
svgUrl = `${rendererUrl}/svg/${b64Code}`;
|
||||
serializedState.subscribe((encodedState: string) => {
|
||||
iUrl = `${rendererUrl}/img/${encodedState}`;
|
||||
svgUrl = `${rendererUrl}/svg/${encodedState}`;
|
||||
krokiUrl = `${krokiRendererUrl}/mermaid/svg/${pakoSerde.serialize($codeStore.code)}`;
|
||||
mdCode = `[](${window.location.protocol}//${window.location.host}${window.location.pathname}#${encodedState})`;
|
||||
});
|
||||
</script>
|
||||
@@ -168,6 +166,9 @@
|
||||
<button class="action-btn flex-auto">
|
||||
<a target="_blank" href={svgUrl}><i class="fas fa-external-link-alt mr-2" /> SVG</a>
|
||||
</button>
|
||||
<button class="action-btn flex-auto">
|
||||
<a target="_blank" href={krokiUrl}><i class="fas fa-external-link-alt mr-2" /> Kroki</a>
|
||||
</button>
|
||||
|
||||
<div class="flex gap-2 items-center">
|
||||
PNG size
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<ul class="tabs" transition:fade>
|
||||
{#each tabs as tab}
|
||||
<div
|
||||
class="tab tab-lifted text-primary-content {activeTabID === tab.id ? 'tab-active' : ''}"
|
||||
class="tab tab-lifted {activeTabID === tab.id ? 'tab-active' : 'text-primary-content'}"
|
||||
on:click|stopPropagation={() => toggleTabs(tab)}>
|
||||
<i class="mr-1 {tab.icon}" />
|
||||
{tab.title}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { themeStore } from '$lib/util/theme';
|
||||
import type monaco from 'monaco-editor';
|
||||
import { createEventDispatcher, onMount } from 'svelte';
|
||||
import { initEditor } from './util';
|
||||
import initEditor from 'monaco-mermaid';
|
||||
|
||||
let divEl: HTMLDivElement = null;
|
||||
let editor: monaco.editor.IStandaloneCodeEditor;
|
||||
@@ -1,552 +0,0 @@
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
export const initEditor = (monacoEditor): void => {
|
||||
monacoEditor.languages.register({ id: 'mermaid' });
|
||||
|
||||
const requirementDiagrams = [
|
||||
'requirement',
|
||||
'functionalRequirement',
|
||||
'interfaceRequirement',
|
||||
'performanceRequirement',
|
||||
'physicalRequirement',
|
||||
'designConstraint'
|
||||
];
|
||||
|
||||
const keywords: {
|
||||
[key: string]: {
|
||||
typeKeywords: string[];
|
||||
blockKeywords: string[];
|
||||
keywords: string[];
|
||||
};
|
||||
} = {
|
||||
flowchart: {
|
||||
typeKeywords: ['flowchart', 'flowchart-v2', 'graph'],
|
||||
blockKeywords: ['subgraph', 'end'],
|
||||
keywords: [
|
||||
'TB',
|
||||
'TD',
|
||||
'BT',
|
||||
'RL',
|
||||
'LR',
|
||||
'click',
|
||||
'call',
|
||||
'href',
|
||||
'_self',
|
||||
'_blank',
|
||||
'_parent',
|
||||
'_top',
|
||||
'linkStyle',
|
||||
'style',
|
||||
'classDef',
|
||||
'class',
|
||||
'direction',
|
||||
'interpolate'
|
||||
]
|
||||
},
|
||||
sequenceDiagram: {
|
||||
typeKeywords: ['sequenceDiagram'],
|
||||
blockKeywords: ['alt', 'par', 'and', 'loop', 'else', 'end', 'rect', 'opt', 'alt', 'rect'],
|
||||
keywords: [
|
||||
'participant',
|
||||
'as',
|
||||
'Note',
|
||||
'note',
|
||||
'right of',
|
||||
'left of',
|
||||
'over',
|
||||
'activate',
|
||||
'deactivate',
|
||||
'autonumber',
|
||||
'title',
|
||||
'actor'
|
||||
]
|
||||
},
|
||||
classDiagram: {
|
||||
typeKeywords: ['classDiagram', 'classDiagram-v2'],
|
||||
blockKeywords: ['class'],
|
||||
keywords: [
|
||||
'link',
|
||||
'click',
|
||||
'callback',
|
||||
'call',
|
||||
'href',
|
||||
'cssClass',
|
||||
'direction',
|
||||
'TB',
|
||||
'BT',
|
||||
'RL',
|
||||
'LR'
|
||||
]
|
||||
},
|
||||
stateDiagram: {
|
||||
typeKeywords: ['stateDiagram', 'stateDiagram-v2'],
|
||||
blockKeywords: ['state', 'note', 'end'],
|
||||
keywords: ['state', 'as', 'hide empty description', 'direction', 'TB', 'BT', 'RL', 'LR']
|
||||
},
|
||||
erDiagram: {
|
||||
typeKeywords: ['erDiagram'],
|
||||
blockKeywords: [],
|
||||
keywords: []
|
||||
},
|
||||
journey: {
|
||||
typeKeywords: ['journey'],
|
||||
blockKeywords: ['section'],
|
||||
keywords: ['title']
|
||||
},
|
||||
info: {
|
||||
typeKeywords: ['info'],
|
||||
blockKeywords: [],
|
||||
keywords: ['showInfo']
|
||||
},
|
||||
gantt: {
|
||||
typeKeywords: ['gantt'],
|
||||
blockKeywords: [],
|
||||
keywords: [
|
||||
'title',
|
||||
'dateFormat',
|
||||
'axisFormat',
|
||||
'todayMarker',
|
||||
'section',
|
||||
'excludes',
|
||||
'inclusiveEndDates'
|
||||
]
|
||||
},
|
||||
requirementDiagram: {
|
||||
typeKeywords: ['requirement', 'requirementDiagram'],
|
||||
blockKeywords: requirementDiagrams.concat('element'),
|
||||
keywords: []
|
||||
},
|
||||
gitGraph: {
|
||||
typeKeywords: ['gitGraph'],
|
||||
blockKeywords: [],
|
||||
keywords: ['commit', 'branch', 'merge', 'reset', 'checkout', 'LR', 'BT']
|
||||
},
|
||||
pie: {
|
||||
typeKeywords: ['pie'],
|
||||
blockKeywords: [],
|
||||
keywords: ['title', 'showData']
|
||||
}
|
||||
};
|
||||
|
||||
// Register a tokens provider for the mermaid language
|
||||
monacoEditor.languages.setMonarchTokensProvider('mermaid', {
|
||||
...Object.entries(keywords)
|
||||
.map((entry) =>
|
||||
Object.fromEntries(
|
||||
Object.entries(entry[1]).map((deepEntry) => [
|
||||
entry[0] + deepEntry[0][0].toUpperCase() + deepEntry[0].slice(1),
|
||||
deepEntry[1]
|
||||
])
|
||||
)
|
||||
)
|
||||
.reduce((overallKeywords, nextKeyword) => ({ ...overallKeywords, ...nextKeyword }), {}),
|
||||
tokenizer: {
|
||||
root: [
|
||||
[/%%(?=.*%%$)/, { token: 'string', nextEmbedded: 'json' }],
|
||||
[/%%$/, { token: 'string', nextEmbedded: '@pop' }],
|
||||
[/^\s*gitGraph/m, 'typeKeyword', 'gitGraph'],
|
||||
[/^\s*info/m, 'typeKeyword', 'info'],
|
||||
[/^\s*pie/m, 'typeKeyword', 'pie'],
|
||||
[/^\s*(flowchart|flowchart-v2|graph)/m, 'typeKeyword', 'flowchart'],
|
||||
[/^\s*sequenceDiagram/, 'typeKeyword', 'sequenceDiagram'],
|
||||
[/^\s*classDiagram(-v2)?/, 'typeKeyword', 'classDiagram'],
|
||||
[/^\s*journey/, 'typeKeyword', 'journey'],
|
||||
[/^\s*gantt/, 'typeKeyword', 'gantt'],
|
||||
[/^\s*stateDiagram(-v2)?/, 'typeKeyword', 'stateDiagram'],
|
||||
[/^\s*erDiagram/, 'typeKeyword', 'erDiagram'],
|
||||
[/^\s*requirement(Diagram)?/, 'typeKeyword', 'requirementDiagram'],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment']
|
||||
],
|
||||
gitGraph: [
|
||||
[/option(?=s)/, { token: 'typeKeyword', next: 'optionsGitGraph' }],
|
||||
[/(^\s*branch|reset|merge|checkout)(.*$)/, ['keyword', 'variable']],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@gitGraphBlockKeywords': 'typeKeyword',
|
||||
'@gitGraphKeywords': 'keyword'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/".*?"/, 'string'],
|
||||
[/\^/, 'delimiter.bracket']
|
||||
],
|
||||
optionsGitGraph: [
|
||||
[/s$/, { token: 'typeKeyword', nextEmbedded: 'json', matchOnlyAtLineStart: false }],
|
||||
['end', { token: 'typeKeyword', next: '@pop', nextEmbedded: '@pop' }]
|
||||
],
|
||||
info: [
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@infoBlockKeywords': 'typeKeyword',
|
||||
'@infoKeywords': 'keyword'
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
pie: [
|
||||
[/(title)(.*$)/, ['keyword', 'string']],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@pieBlockKeywords': 'typeKeyword',
|
||||
'@pieKeywords': 'keyword'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/".*?"/, 'string'],
|
||||
[/\s*\d+/, 'number'],
|
||||
[/:/, 'delimiter.bracket'],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment']
|
||||
],
|
||||
flowchart: [
|
||||
[/[ox]?(--+|==+)[ox]/, 'transition'],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@flowchartBlockKeywords': 'typeKeyword',
|
||||
'@flowchartKeywords': 'keyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/\|+.+?\|+/, 'string'],
|
||||
[/\[+(\\.+?[\\/]|\/.+?[/\\])\]+/, 'string'],
|
||||
[/[[>]+[^\]|[]+?\]+/, 'string'],
|
||||
[/{+.+?}+/, 'string'],
|
||||
[/\(+.+?\)+/, 'string'],
|
||||
[/-\.+->?/, 'transition'],
|
||||
[/(-[-.])([^->]+?)(-{3,}|-{2,}>|\.-+>)/, ['transition', 'string', 'transition']],
|
||||
[/(==+)([^=]+?)(={3,}|={2,}>)/, ['transition', 'string', 'transition']],
|
||||
[/<?(--+|==+)>|===+|---+/, 'transition'],
|
||||
[/:::/, 'transition'],
|
||||
[/[;&]/, 'delimiter.bracket'],
|
||||
[/".*?"/, 'string'],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment']
|
||||
],
|
||||
sequenceDiagram: [
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@sequenceDiagramBlockKeywords': 'typeKeyword',
|
||||
'@sequenceDiagramKeywords': 'keyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/(--?>?>|--?[)x])[+-]?/, 'transition'],
|
||||
[/(:)([^:\n]*?$)/, ['delimiter.bracket', 'string']],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment']
|
||||
],
|
||||
classDiagram: [
|
||||
[/(?!class\s)([a-zA-Z]+)(\s+[a-zA-Z]+)/, ['type', 'variable']],
|
||||
[/(\*|<\|?|o)?(--|\.\.)(\*|\|?>|o)?/, 'transition'],
|
||||
[/^\s*class\s(?!.*\{)/, 'keyword'],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@classDiagramBlockKeywords': 'typeKeyword',
|
||||
'@classDiagramKeywords': 'keyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/(<<)(.+?)(>>)/, ['delimiter.bracket', 'annotation', 'delimiter.bracket']],
|
||||
[/".*?"/, 'string'],
|
||||
[/:::/, 'transition'],
|
||||
[/:|\+|-|#|~|\*\s*$|\$\s*$|\(|\)|{|}/, 'delimiter.bracket']
|
||||
],
|
||||
journey: [
|
||||
[/(title)(.*)/, ['keyword', 'string']],
|
||||
[/(section)(.*)/, ['typeKeyword', 'string']],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@journeyBlockKeywords': 'typeKeyword',
|
||||
'@journeyKeywords': 'keyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[
|
||||
/(^\s*.+?)(:)(.*?)(:)(.*?)([,$])/,
|
||||
[
|
||||
'string',
|
||||
'delimiter.bracket',
|
||||
'number',
|
||||
'delimiter.bracket',
|
||||
'variable',
|
||||
'delimiter.bracket'
|
||||
]
|
||||
],
|
||||
[/,/, 'delimiter.bracket'],
|
||||
[/(^\s*.+?)(:)([^:]*?)$/, ['string', 'delimiter.bracket', 'variable']],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment']
|
||||
],
|
||||
gantt: [
|
||||
[/(title)(.*)/, ['keyword', 'string']],
|
||||
[/(section)(.*)/, ['typeKeyword', 'string']],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@ganttBlockKeywords': 'typeKeyword',
|
||||
'@ganttKeywords': 'keyword'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/(^\s*.*?)(:)/, ['string', 'delimiter.bracket']],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/:/, 'delimiter.bracket']
|
||||
],
|
||||
stateDiagram: [
|
||||
[/note[^:]*$/, { token: 'typeKeyword', next: 'stateDiagramNote' }],
|
||||
['hide empty description', 'keyword'],
|
||||
[/^\s*state\s(?!.*\{)/, 'keyword'],
|
||||
[/(<<)(fork|join|choice)(>>)/, 'annotation'],
|
||||
[/(\[\[)(fork|join|choice)(]])/, ['delimiter.bracket', 'annotation', 'delimiter.bracket']],
|
||||
[
|
||||
/[a-zA-Z][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@stateDiagramBlockKeywords': 'typeKeyword',
|
||||
'@stateDiagramKeywords': 'keyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/".*?"/, 'string'],
|
||||
[/(:)([^:\n]*?$)/, ['delimiter.bracket', 'string']],
|
||||
[/{|}/, 'delimiter.bracket'],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/-->/, 'transition'],
|
||||
[/\[.*?]/, 'string']
|
||||
],
|
||||
stateDiagramNote: [
|
||||
[/^\s*end note$/, { token: 'typeKeyword', next: '@pop' }],
|
||||
[/.*/, 'string']
|
||||
],
|
||||
erDiagram: [
|
||||
[/[}|][o|](--|\.\.)[o|][{|]/, 'transition'],
|
||||
[/".*?"/, 'string'],
|
||||
[/(:)(.*?$)/, ['delimiter.bracket', 'string']],
|
||||
[/:|{|}/, 'delimiter.bracket'],
|
||||
[/([a-zA-Z]+)(\s+[a-zA-Z]+)/, ['type', 'variable']],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/[a-zA-Z_-][\w$]*/, 'variable']
|
||||
],
|
||||
requirementDiagram: [
|
||||
[/->|<-|-/, 'transition'],
|
||||
[/(\d+\.)*\d+/, 'number'],
|
||||
[
|
||||
/[a-zA-Z_-][\w$]*/,
|
||||
{
|
||||
cases: {
|
||||
'@requirementDiagramBlockKeywords': 'typeKeyword',
|
||||
'@default': 'variable'
|
||||
}
|
||||
}
|
||||
],
|
||||
[/:|{|}|\//, 'delimiter.bracket'],
|
||||
[/%%[^$]([^%]*(?!%%$)%?)*$/, 'comment'],
|
||||
[/".*?"/, 'string']
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
monacoEditor.editor.defineTheme('mermaid-dark', {
|
||||
base: 'vs-dark',
|
||||
inherit: true,
|
||||
rules: [
|
||||
{ token: 'typeKeyword', foreground: '9650c8', fontStyle: 'bold' },
|
||||
{ token: 'transition', foreground: '008800', fontStyle: 'bold' }
|
||||
],
|
||||
colors: {}
|
||||
});
|
||||
|
||||
monacoEditor.editor.defineTheme('mermaid', {
|
||||
base: 'vs',
|
||||
inherit: true,
|
||||
rules: [
|
||||
{ token: 'typeKeyword', foreground: '9650c8', fontStyle: 'bold' },
|
||||
{ token: 'keyword', foreground: '649696' },
|
||||
{ token: 'custom-error', foreground: 'ff0000', fontStyle: 'bold' },
|
||||
{ token: 'string', foreground: 'AA8500' },
|
||||
{ token: 'transition', foreground: '008800', fontStyle: 'bold' },
|
||||
{ token: 'delimiter.bracket', foreground: '000000', fontStyle: 'bold' },
|
||||
{ token: 'annotation', foreground: '4b4b96' },
|
||||
{ token: 'number', foreground: '4b4b96' },
|
||||
{ token: 'comment', foreground: '888c89' },
|
||||
{ token: 'variable', foreground: 'A22889' },
|
||||
{ token: 'type', foreground: '2BDEA8' }
|
||||
],
|
||||
colors: {}
|
||||
});
|
||||
|
||||
// Register a completion item provider for the mermaid language
|
||||
monacoEditor.languages.registerCompletionItemProvider('mermaid', {
|
||||
provideCompletionItems: () => {
|
||||
const suggestions = [
|
||||
{
|
||||
label: 'loop',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['loop ${1:Loop text}', '\t$0', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Sequence Diagram Loops'
|
||||
},
|
||||
{
|
||||
label: 'alt',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['alt ${1:Describing text}', '\t$0', 'else', '\t', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Alternative Path'
|
||||
},
|
||||
{
|
||||
label: 'opt',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['opt ${1:Describing text}', '\t$0', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Optional Path'
|
||||
},
|
||||
{
|
||||
label: 'par',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: [
|
||||
'par ${1:[Action 1]}',
|
||||
'\t$0',
|
||||
'and ${2:[Action 2]}',
|
||||
'\t',
|
||||
'and ${3:[Action 3]}',
|
||||
'\t',
|
||||
'end'
|
||||
].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Parallel Actions'
|
||||
},
|
||||
{
|
||||
label: 'rect',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['rect ${1:rgb(0, 255, 0)}', '\t$0', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Background Color'
|
||||
},
|
||||
{
|
||||
label: 'subgraph',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['subgraph ${1:title}', '\t$0', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Subgraph'
|
||||
},
|
||||
{
|
||||
label: 'class',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['class ${1:className} {', '\t$0', '}'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Class'
|
||||
},
|
||||
{
|
||||
label: 'state',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['state ${1:stateName} {', '\t$0', '}'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'State'
|
||||
},
|
||||
{
|
||||
label: 'note',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['note ${1:right of State1}', '\t$0', 'end note'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'State'
|
||||
},
|
||||
{
|
||||
label: 'section',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['section ${1:Go to work}', '\t$0'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'User-journey Section'
|
||||
},
|
||||
{
|
||||
label: 'element',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['element ${1:test_entity} {', '\t$0', '}'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Requirement Diagram Element'
|
||||
},
|
||||
{
|
||||
label: 'options',
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: ['options', '{', ' $0', '}', 'end'].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: 'Git Graph Options'
|
||||
},
|
||||
...requirementDiagrams.map((requirementDiagramType) => ({
|
||||
label: requirementDiagramType,
|
||||
kind: monacoEditor.languages.CompletionItemKind.Snippet,
|
||||
insertText: [
|
||||
requirementDiagramType + ' ${1:test_req} {',
|
||||
'\tid: 1',
|
||||
'\ttext: the test text.',
|
||||
'\trisk: high',
|
||||
'\tverifyMethod: test',
|
||||
'}'
|
||||
].join('\n'),
|
||||
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
|
||||
documentation: requirementDiagramType
|
||||
.split(/(?=[A-Z])/)
|
||||
.map((part) => part[0].toUpperCase() + part.slice(1))
|
||||
.join(' ')
|
||||
})),
|
||||
...[
|
||||
...new Set(
|
||||
Object.values(keywords)
|
||||
.map((diagramKeywords) =>
|
||||
Object.entries(diagramKeywords)
|
||||
.filter((keywordType) => keywordType[0] !== 'annotations')
|
||||
.map((entry) => entry[1])
|
||||
)
|
||||
.flat(2)
|
||||
)
|
||||
].map((keyword) => ({
|
||||
label: keyword,
|
||||
kind: monacoEditor.languages.CompletionItemKind.Keyword,
|
||||
insertText: keyword
|
||||
}))
|
||||
];
|
||||
return { suggestions: suggestions };
|
||||
}
|
||||
});
|
||||
|
||||
monacoEditor.languages.setLanguageConfiguration('mermaid', {
|
||||
autoClosingPairs: [
|
||||
{
|
||||
open: '(',
|
||||
close: ')'
|
||||
},
|
||||
{
|
||||
open: '{',
|
||||
close: '}'
|
||||
},
|
||||
{
|
||||
open: '[',
|
||||
close: ']'
|
||||
}
|
||||
],
|
||||
brackets: [
|
||||
['(', ')'],
|
||||
['{', '}'],
|
||||
['[', ']']
|
||||
]
|
||||
});
|
||||
};
|
||||
@@ -79,7 +79,19 @@
|
||||
section Go home
|
||||
Go downstairs: 5: Me
|
||||
Sit down: 3: Me
|
||||
`
|
||||
`,
|
||||
'Git Graph': ` gitGraph
|
||||
commit
|
||||
commit
|
||||
branch develop
|
||||
checkout develop
|
||||
commit
|
||||
commit
|
||||
checkout main
|
||||
merge develop
|
||||
commit
|
||||
commit
|
||||
`
|
||||
};
|
||||
|
||||
const loadSampleDiagram = (diagramType: string): void => {
|
||||
|
||||
Vendored
+7
@@ -57,4 +57,11 @@ export interface HistoryEntry {
|
||||
url?: string;
|
||||
}
|
||||
|
||||
export interface DocConfig {
|
||||
[key: string]: {
|
||||
code: string;
|
||||
config?: string;
|
||||
};
|
||||
}
|
||||
|
||||
type Loader = (url: string) => Promise<State>;
|
||||
|
||||
+4
-1
@@ -1 +1,4 @@
|
||||
export const rendererUrl = import.meta.env.MERMAID_RENDERER_URL ?? 'https://mermaid.ink';
|
||||
export const rendererUrl: string =
|
||||
(import.meta.env.MERMAID_RENDERER_URL as string) ?? 'https://mermaid.ink';
|
||||
export const krokiRendererUrl: string =
|
||||
(import.meta.env.MERMAID_KROKI_RENDERER_URL as string) ?? 'https://kroki.io';
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
import { deflate, inflate } from 'pako';
|
||||
import { toUint8Array, fromUint8Array, toBase64, fromBase64 } from 'js-base64';
|
||||
import type { State } from '$lib/types';
|
||||
|
||||
interface Serde {
|
||||
serialize: (state: string) => string;
|
||||
deserialize: (state: string) => string;
|
||||
}
|
||||
|
||||
const base64Serde: Serde = {
|
||||
serialize: (state: string): string => {
|
||||
return toBase64(state, true);
|
||||
},
|
||||
deserialize: (state: string): string => {
|
||||
return fromBase64(state);
|
||||
}
|
||||
};
|
||||
|
||||
export const pakoSerde: Serde = {
|
||||
serialize: (state: string): string => {
|
||||
const data = new TextEncoder().encode(state);
|
||||
const compressed = deflate(data, { level: 9 });
|
||||
return fromUint8Array(compressed, true);
|
||||
},
|
||||
deserialize: (state: string): string => {
|
||||
const data = toUint8Array(state);
|
||||
return inflate(data, { to: 'string' });
|
||||
}
|
||||
};
|
||||
|
||||
const serdes: { [key: string]: Serde } = {
|
||||
base64: base64Serde,
|
||||
pako: pakoSerde
|
||||
};
|
||||
|
||||
type SerdeType = keyof typeof serdes;
|
||||
|
||||
export const serializeState = (state: State): string => {
|
||||
const json = JSON.stringify(state);
|
||||
const defaultSerde: SerdeType = 'pako';
|
||||
const serialized = serdes[defaultSerde].serialize(json);
|
||||
return `${defaultSerde}:${serialized}`;
|
||||
};
|
||||
|
||||
export const deserializeState = (state: string): State => {
|
||||
let type: SerdeType, serialized: string;
|
||||
if (state.includes(':')) {
|
||||
let tempType: string;
|
||||
[tempType, serialized] = state.split(':');
|
||||
if (tempType in serdes) {
|
||||
type = tempType;
|
||||
} else {
|
||||
throw new Error(`Unknown serde type: ${tempType}`);
|
||||
}
|
||||
} else {
|
||||
type = 'base64';
|
||||
serialized = state;
|
||||
}
|
||||
const json = serdes[type].deserialize(serialized);
|
||||
return JSON.parse(json) as State;
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
import { writable, get, derived } from 'svelte/store';
|
||||
import type { Readable } from 'svelte/store';
|
||||
import { toBase64, fromBase64 } from 'js-base64';
|
||||
import { persist, localStorage } from '@macfja/svelte-persistent-store';
|
||||
import type { State } from '$lib/types';
|
||||
import { saveStatistics } from './stats';
|
||||
import { serializeState, deserializeState } from './serde';
|
||||
|
||||
export const defaultState: State = {
|
||||
code: `graph TD
|
||||
@@ -37,17 +37,16 @@ const urlParseFailedState = `graph TD
|
||||
click D href "https://github.com/mermaid-js/mermaid-live-editor/issues/new?assignees=&labels=bug&template=bug_report.md&title=Broken%20link" "Raise issue"`;
|
||||
|
||||
export const codeStore = persist(writable(defaultState), localStorage(), 'codeStore');
|
||||
export const base64State: Readable<string> = derived([codeStore], ([code], set) => {
|
||||
set(toBase64(JSON.stringify(code), true));
|
||||
export const serializedState: Readable<string> = derived([codeStore], ([code], set) => {
|
||||
set(serializeState(code));
|
||||
});
|
||||
|
||||
export const loadState = (data: string): void => {
|
||||
let state: State;
|
||||
console.log('Loading', data);
|
||||
try {
|
||||
const stateStr = fromBase64(data);
|
||||
console.log(`Trying to load state: ${stateStr}`);
|
||||
state = JSON.parse(stateStr);
|
||||
const mermaidConfig =
|
||||
state = deserializeState(data);
|
||||
const mermaidConfig: { [key: string]: string } =
|
||||
typeof state.mermaid === 'string' ? JSON.parse(state.mermaid) : state.mermaid;
|
||||
if (
|
||||
mermaidConfig.securityLevel &&
|
||||
@@ -116,7 +115,7 @@ export const toggleDarkTheme = (dark: boolean): void => {
|
||||
};
|
||||
|
||||
export const initURLSubscription = (): void => {
|
||||
base64State.subscribe((state: string) => {
|
||||
serializedState.subscribe((state: string) => {
|
||||
history.replaceState(undefined, undefined, `#${state}`);
|
||||
});
|
||||
};
|
||||
|
||||
+78
-23
@@ -1,28 +1,73 @@
|
||||
<script lang="ts">
|
||||
import Editor from '$lib/components/editor/editor.svelte';
|
||||
import Editor from '$lib/components/editor.svelte';
|
||||
import Navbar from '$lib/components/navbar.svelte';
|
||||
import Preset from '$lib/components/preset.svelte';
|
||||
import Actions from '$lib/components/actions.svelte';
|
||||
import View from '$lib/components/view.svelte';
|
||||
import Card from '$lib/components/card/card.svelte';
|
||||
import History from '$lib/components/history/history.svelte';
|
||||
import { updateCode, updateConfig, codeStore, base64State } from '$lib/util/state';
|
||||
import { updateCode, updateConfig, codeStore, serializedState } from '$lib/util/state';
|
||||
import { initHandler, syncDiagram } from '$lib/util/util';
|
||||
import { errorStore } from '$lib/util/error';
|
||||
import { onMount } from 'svelte';
|
||||
import mermaid from 'mermaid';
|
||||
import type monaco from 'monaco-editor';
|
||||
import type { EditorUpdateEvent, State, Tab } from '$lib/types';
|
||||
import type { EditorUpdateEvent, State, Tab, DocConfig } from '$lib/types';
|
||||
import { base } from '$app/paths';
|
||||
|
||||
base64State; // Weird fix for error > base64State is not defined. Treeshaking?
|
||||
let selectedMode = 'code';
|
||||
const languageMap = {
|
||||
serializedState; // Weird fix for error > serializedState is not defined. Treeshaking?
|
||||
|
||||
type Modes = 'code' | 'config';
|
||||
type Languages = 'mermaid' | 'json';
|
||||
|
||||
let selectedMode: Modes = 'code';
|
||||
const languageMap: { [key in Modes]: Languages } = {
|
||||
code: 'mermaid',
|
||||
config: 'json'
|
||||
};
|
||||
const docURLBase = 'https://mermaid-js.github.io/mermaid';
|
||||
const docMap: DocConfig = {
|
||||
graph: {
|
||||
code: '/#/flowchart',
|
||||
config: '/#/flowchart?id=configuration'
|
||||
},
|
||||
flowchart: {
|
||||
code: '/#/flowchart',
|
||||
config: '/#/flowchart?id=configuration'
|
||||
},
|
||||
sequenceDiagram: {
|
||||
code: '/#/sequenceDiagram',
|
||||
config: '/#/sequenceDiagram?id=configuration'
|
||||
},
|
||||
classDiagram: {
|
||||
code: '/#/classDiagram',
|
||||
config: '/#/classDiagram?id=configuration'
|
||||
},
|
||||
'stateDiagram-v2': {
|
||||
code: '/#/stateDiagram'
|
||||
},
|
||||
gantt: {
|
||||
code: '/#/gantt',
|
||||
config: '/#/gantt?id=configuration'
|
||||
},
|
||||
pie: {
|
||||
code: '/#/pie'
|
||||
},
|
||||
erDiagram: {
|
||||
code: '/#/entityRelationshipDiagram',
|
||||
config: '/#/entityRelationshipDiagram?id=styling'
|
||||
},
|
||||
journey: {
|
||||
code: '/#/user-journey'
|
||||
},
|
||||
gitGraph: {
|
||||
code: '/#/gitgraph',
|
||||
config: '/#/gitgraph?id=gitgraph-specific-configuration-options'
|
||||
}
|
||||
};
|
||||
let text = '';
|
||||
let language: 'mermaid' | 'json' = 'mermaid';
|
||||
let docURL = docURLBase;
|
||||
let language: Languages = 'mermaid';
|
||||
let errorMarkers: monaco.editor.IMarkerData[] = [];
|
||||
$: language = languageMap[selectedMode];
|
||||
$: {
|
||||
@@ -37,10 +82,16 @@
|
||||
if (state.updateEditor) {
|
||||
text = selectedMode === 'code' ? state.code : state.mermaid;
|
||||
}
|
||||
const codeTypeMatch = /([\S]+)[\s\n]/.exec(state.code);
|
||||
if (codeTypeMatch && codeTypeMatch.length > 1) {
|
||||
const docKey = codeTypeMatch[1];
|
||||
const docConfig = docMap[docKey] ?? { code: '' };
|
||||
docURL = docURLBase + (docConfig[selectedMode] ?? docConfig.code ?? '');
|
||||
}
|
||||
});
|
||||
const tabSelectHandler = (message: CustomEvent<Tab>) => {
|
||||
selectedMode = message.detail.id === 'code' ? 'code' : 'config';
|
||||
$codeStore.updateEditor = true;
|
||||
selectedMode = message.detail.id;
|
||||
};
|
||||
const tabs: Tab[] = [
|
||||
{
|
||||
@@ -82,7 +133,7 @@
|
||||
startLineNumber: e.hash.loc.first_line,
|
||||
startColumn: e.hash.loc.first_column,
|
||||
endLineNumber: e.hash.loc.last_line,
|
||||
endColumn: e.hash.loc.last_column + 1,
|
||||
endColumn: (e.hash.loc.last_column as number) + 1,
|
||||
message: e.str
|
||||
};
|
||||
errorMarkers.push(marker);
|
||||
@@ -96,7 +147,7 @@
|
||||
};
|
||||
|
||||
const viewDiagram = () => {
|
||||
window.open(`${base}/view#${$base64State}`, '_blank').focus();
|
||||
window.open(`${base}/view#${$serializedState}`, '_blank').focus();
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
@@ -128,24 +179,28 @@
|
||||
<Card on:select={tabSelectHandler} {tabs} isCloseable={false} title="Mermaid">
|
||||
<div slot="actions">
|
||||
<div class="flex flex-row items-center">
|
||||
<div class="form-control flex-row items-center">
|
||||
<label class="cursor-pointer label" for="autoSync">
|
||||
<span> Auto sync</span>
|
||||
<input
|
||||
type="checkbox"
|
||||
class="toggle {$codeStore.autoSync ? 'btn-secondary' : 'toggle-primary'} ml-1"
|
||||
id="autoSync"
|
||||
bind:checked={$codeStore.autoSync} />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{#if !$codeStore.autoSync}
|
||||
<button
|
||||
class="btn btn-secondary btn-xs"
|
||||
class="btn btn-secondary btn-xs mr-1"
|
||||
title="Sync Diagram"
|
||||
data-cy="sync"
|
||||
on:click={syncDiagram}><i class="fas fa-sync" /></button>
|
||||
{/if}
|
||||
|
||||
<div class="form-control">
|
||||
<label class="cursor-pointer label" for="autoSync">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="toggle toggle-primary mr-1"
|
||||
id="autoSync"
|
||||
bind:checked={$codeStore.autoSync} />
|
||||
<span> Auto sync</span>
|
||||
</label>
|
||||
</div>
|
||||
<button class="btn btn-secondary btn-xs" title="View documentation">
|
||||
<a target="_blank" href={docURL} data-cy="docs"><i class="fas fa-book mr-1" />Docs</a>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -163,9 +218,9 @@
|
||||
<Card title="Diagram" isCloseable={false}>
|
||||
<button
|
||||
slot="actions"
|
||||
class="btn btn-primary btn-xs shadow-lg"
|
||||
class="btn btn-secondary btn-xs"
|
||||
title="View diagram in new page"
|
||||
on:click|stopPropagation={() => viewDiagram()}><i class="far fa-eye mr-2" /> View</button>
|
||||
on:click|stopPropagation={() => viewDiagram()}><i class="far fa-eye mr-1" />View</button>
|
||||
|
||||
<div class="flex-1 overflow-auto">
|
||||
<View />
|
||||
|
||||
+2
-5
@@ -12,16 +12,13 @@ const config = {
|
||||
],
|
||||
kit: {
|
||||
adapter: adapter({
|
||||
pages: `docs${process.env['BETA'] ? '/beta' : ''}`
|
||||
pages: `docs`
|
||||
}),
|
||||
paths: process.env['DEPLOY']
|
||||
? {
|
||||
base: `/mermaid-live-editor${process.env['BETA'] ? '/beta' : ''}`
|
||||
base: `/mermaid-live-editor`
|
||||
}
|
||||
: {},
|
||||
ssr: false,
|
||||
// hydrate the <div id="svelte"> element in src/app.html
|
||||
target: '#svelte',
|
||||
trailingSlash: 'ignore',
|
||||
vite: {
|
||||
envPrefix: 'MERMAID_',
|
||||
|
||||
+2
-29
@@ -1,38 +1,11 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"moduleResolution": "node",
|
||||
"module": "es2020",
|
||||
"lib": ["es2020", "ESNext", "DOM.Iterable"],
|
||||
"target": "es2019",
|
||||
/**
|
||||
svelte-preprocess cannot figure out whether you have a value or a type, so tell TypeScript
|
||||
to enforce using \`import type\` instead of \`import\` for Types.
|
||||
*/
|
||||
"importsNotUsedAsValues": "error",
|
||||
"isolatedModules": true,
|
||||
"resolveJsonModule": true,
|
||||
/**
|
||||
To have warnings/errors of the Svelte compiler at the correct position,
|
||||
enable source maps by default.
|
||||
*/
|
||||
"sourceMap": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"baseUrl": ".",
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"paths": {
|
||||
"$lib/*": ["src/lib/*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.d.ts",
|
||||
"src/**/*.js",
|
||||
"src/**/*.ts",
|
||||
"src/**/*.svelte",
|
||||
"cypress/**/*.ts",
|
||||
"cypress/**/*.js",
|
||||
"static/**/*.js"
|
||||
]
|
||||
],
|
||||
"extends": "./.svelte-kit/tsconfig.json"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user