Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e5e2518fb |
@@ -11,7 +11,6 @@ module.exports = {
|
|||||||
ignorePatterns: [
|
ignorePatterns: [
|
||||||
'docs/*',
|
'docs/*',
|
||||||
'*.cjs',
|
'*.cjs',
|
||||||
'*.js',
|
|
||||||
'*.md',
|
'*.md',
|
||||||
'snapshots.js',
|
'snapshots.js',
|
||||||
'svelte.config.js',
|
'svelte.config.js',
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v1
|
||||||
with:
|
with:
|
||||||
config-file: ./.github/codeql/config.yml
|
config-file: ./.github/codeql/config.yml
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
@@ -65,4 +65,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v1
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
cypress-run:
|
cypress-run:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
# Update after https://github.com/cypress-io/cypress-docker-images/issues/487
|
||||||
|
container: cypress/browsers:node14.16.0-chrome90-ff88
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -25,11 +27,6 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-node_modules-build-
|
${{ runner.os }}-node_modules-build-
|
||||||
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
cache: 'yarn'
|
|
||||||
|
|
||||||
- name: Build & Lint
|
- name: Build & Lint
|
||||||
run: |
|
run: |
|
||||||
yarn install
|
yarn install
|
||||||
@@ -39,7 +36,7 @@ jobs:
|
|||||||
# Install NPM dependencies, cache them correctly
|
# Install NPM dependencies, cache them correctly
|
||||||
# and run all Cypress tests
|
# and run all Cypress tests
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v3
|
uses: cypress-io/github-action@v2
|
||||||
with:
|
with:
|
||||||
start: yarn preview
|
start: yarn preview
|
||||||
wait-on: 'http://localhost:3000'
|
wait-on: 'http://localhost:3000'
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build & Deploy
|
- name: Build & Deploy
|
||||||
run: |
|
run: |
|
||||||
|
npm i -g yarn
|
||||||
export DEPLOY=true
|
export DEPLOY=true
|
||||||
[ "$GITHUB_EVENT_NAME" != "pull_request" ] && rm -rf docs/_app/
|
[ "$GITHUB_EVENT_NAME" != "pull_request" ] && rm -rf docs/_app/
|
||||||
yarn install
|
yarn install
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ jobs:
|
|||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v5
|
- uses: actions/stale@v4
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
exempt-issue-labels: 'retained'
|
exempt-issue-labels: 'retained'
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
name: Update Browserslist
|
name: Update Browserslist
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -9,6 +9,5 @@ yarn-error.log
|
|||||||
/build
|
/build
|
||||||
/functions
|
/functions
|
||||||
/snapshots.js
|
/snapshots.js
|
||||||
/cypress/downloads
|
|
||||||
/cypress/videos
|
/cypress/videos
|
||||||
/cypress/screenshots
|
/cypress/screenshots
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
# Stop : press ctrl + c
|
# Stop : press ctrl + c
|
||||||
# or
|
# or
|
||||||
# docker stop mermaid-live-editor
|
# docker stop mermaid-live-editor
|
||||||
FROM node:18.4.0 as mermaid-live-editor-builder
|
FROM node:17.8.0 as mermaid-live-editor-builder
|
||||||
COPY --chown=node:node . /home
|
COPY --chown=node:node . /home
|
||||||
WORKDIR /home
|
WORKDIR /home
|
||||||
RUN yarn install
|
RUN yarn install
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
FROM node:18
|
FROM node:17
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json .
|
COPY package.json .
|
||||||
COPY yarn.lock .
|
COPY yarn.lock .
|
||||||
|
|||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
Live editor only has a single version, which will be maintained.
|
|
||||||
|
|
||||||
| Version | Supported |
|
|
||||||
| ------- | ------------------ |
|
|
||||||
| latest | :white_check_mark: |
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
To report a vulnerability, please e-mail security@mermaid.live with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import { defineConfig } from 'cypress';
|
|
||||||
import fs from 'fs';
|
|
||||||
import { isFileExist, findFiles } from 'cy-verify-downloads';
|
|
||||||
export default defineConfig({
|
|
||||||
projectId: '2ckppp',
|
|
||||||
viewportWidth: 1440,
|
|
||||||
viewportHeight: 768,
|
|
||||||
snapshotFileName: './cypress/snapshots.js',
|
|
||||||
defaultCommandTimeout: 16000,
|
|
||||||
requestTimeout: 16000,
|
|
||||||
e2e: {
|
|
||||||
setupNodeEvents(on, config) {
|
|
||||||
on('task', {
|
|
||||||
isFileExist,
|
|
||||||
findFiles,
|
|
||||||
deleteFile(path) {
|
|
||||||
fs.rmSync(path);
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
readFileMaybe(filename) {
|
|
||||||
if (fs.existsSync(filename)) {
|
|
||||||
return fs.readFileSync(filename, 'utf8');
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
baseUrl: 'http://localhost:3000',
|
|
||||||
specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"projectId": "2ckppp",
|
||||||
|
"$schema": "https://on.cypress.io/cypress.schema.json",
|
||||||
|
"baseUrl": "http://localhost:3000",
|
||||||
|
"pluginsFile": "./cypress/plugins/index.cjs",
|
||||||
|
"viewportWidth": 1440,
|
||||||
|
"viewportHeight": 768,
|
||||||
|
"snapshotFileName": "./cypress/snapshots.js",
|
||||||
|
"defaultCommandTimeout": 16000,
|
||||||
|
"requestTimeout": 16000
|
||||||
|
}
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
describe('Check actions', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.clearLocalStorage();
|
|
||||||
cy.visit('/edit');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should update markdown code', () => {
|
|
||||||
cy.get('#markdown')
|
|
||||||
.invoke('val')
|
|
||||||
.then((oldText) => {
|
|
||||||
cy.get('#editor').click('bottom').type('{enter}C --> HistoryTest');
|
|
||||||
cy.get('#markdown')
|
|
||||||
.invoke('val')
|
|
||||||
.then((newText) => {
|
|
||||||
expect(oldText).to.not.eq(newText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should load gists from URL', () => {
|
|
||||||
cy.get('#gist').type('https://gist.github.com/sidharthv96/6268a23e673a533dcb198f241fd7012a');
|
|
||||||
cy.contains('Load Gist').click();
|
|
||||||
cy.contains('Go shopping!!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should download png and svg', () => {
|
|
||||||
const now = new Date(2022, 0, 1).getTime();
|
|
||||||
cy.clock(now);
|
|
||||||
const downloadsFolder = Cypress.config('downloadsFolder');
|
|
||||||
|
|
||||||
const verifyFileSize = (fileType: string, size: number) => {
|
|
||||||
cy.get(`#download${fileType.toUpperCase()}`).click();
|
|
||||||
const fileName = `mermaid-diagram-2022-01-01-000000.${fileType}`;
|
|
||||||
const filePath = `${downloadsFolder}/${fileName}`;
|
|
||||||
cy.verifyDownload(fileName);
|
|
||||||
cy.readFile(filePath, null, {
|
|
||||||
log: false
|
|
||||||
}).then((buffer) => expect((buffer as ArrayBuffer).byteLength).to.be.gt(size));
|
|
||||||
cy.task('deleteFile', filePath);
|
|
||||||
};
|
|
||||||
|
|
||||||
verifyFileSize('png', 21_000);
|
|
||||||
verifyFileSize('svg', 11_000);
|
|
||||||
|
|
||||||
// Verify downloaded file is different for different diagrams
|
|
||||||
cy.contains('Sample Diagrams').click();
|
|
||||||
cy.contains('ER Diagram').click();
|
|
||||||
|
|
||||||
verifyFileSize('png', 46_000);
|
|
||||||
verifyFileSize('svg', 12_000);
|
|
||||||
|
|
||||||
cy.clock().invoke('restore');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
describe('Check actions', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.clearLocalStorage();
|
||||||
|
cy.visit('/edit');
|
||||||
|
});
|
||||||
|
it('should update markdown code', () => {
|
||||||
|
cy.get('#markdown')
|
||||||
|
.invoke('val')
|
||||||
|
.then((oldText) => {
|
||||||
|
cy.get('#editor').click('bottom').type('{enter}C --> HistoryTest');
|
||||||
|
cy.get('#markdown')
|
||||||
|
.invoke('val')
|
||||||
|
.then((newText) => {
|
||||||
|
expect(oldText).to.not.eq(newText);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should load gists from URL', () => {
|
||||||
|
cy.get('#gist').type('https://gist.github.com/sidharthv96/6268a23e673a533dcb198f241fd7012a');
|
||||||
|
cy.contains('Load Gist').click();
|
||||||
|
cy.contains('Go shopping!!');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/// <reference types="cypress" />
|
||||||
|
// ***********************************************************
|
||||||
|
// This example plugins/index.js can be used to load plugins
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off loading
|
||||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/plugins-guide
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||||
|
// the project's config changing)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Cypress.PluginConfig}
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
module.exports = (on, config) => {
|
||||||
|
on('task', {
|
||||||
|
readFileMaybe(filename) {
|
||||||
|
if (fs.existsSync(filename)) {
|
||||||
|
return fs.readFileSync(filename, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -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\"}}}"
|
"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": "10.2.0",
|
"__version": "9.5.1",
|
||||||
"Auto sync tests": {
|
"Auto sync tests": {
|
||||||
"should dim diagram when code is edited": {
|
"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}"
|
"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}"
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
// Import commands.js using ES2015 syntax:
|
// Import commands.js using ES2015 syntax:
|
||||||
import './commands';
|
import './commands';
|
||||||
require('cy-verify-downloads').addCustomCommand();
|
|
||||||
|
|
||||||
// Alternatively you can use CommonJS syntax:
|
// Alternatively you can use CommonJS syntax:
|
||||||
// require('./commands')
|
// require('./commands')
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"types": ["cypress", "cypress-localstorage-commands", "cy-verify-downloads"]
|
"types": ["cypress", "cypress-localstorage-commands"]
|
||||||
},
|
},
|
||||||
"include": ["**/*.ts"]
|
"include": ["**/*.ts"]
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-33
@@ -5,61 +5,60 @@
|
|||||||
"dev": "svelte-kit dev --host 0.0.0.0",
|
"dev": "svelte-kit dev --host 0.0.0.0",
|
||||||
"build": "svelte-kit build",
|
"build": "svelte-kit build",
|
||||||
"preview": "svelte-kit preview",
|
"preview": "svelte-kit preview",
|
||||||
"lint": "prettier --check --cache --plugin-search-dir=. .;eslint --ignore-path .gitignore .",
|
"lint": "prettier --check --plugin-search-dir=. .;eslint --ignore-path .gitignore .",
|
||||||
"lint:fix": "prettier --write --cache --plugin-search-dir=. .;eslint --fix --ignore-path .gitignore .",
|
"lint:fix": "prettier --write --plugin-search-dir=. .;eslint --fix --ignore-path .gitignore .",
|
||||||
"format": "prettier --write --cache --plugin-search-dir=. .",
|
"format": "prettier --write --plugin-search-dir=. .",
|
||||||
"pre-commit": "lint-staged",
|
"pre-commit": "lint-staged",
|
||||||
"postinstall": "husky install; cypress cache prune",
|
"postinstall": "husky install",
|
||||||
"test": "cypress run",
|
"test": "cypress run",
|
||||||
"cy": "cypress open"
|
"cy": "cypress open"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@cypress/snapshot": "^2.1.7",
|
"@cypress/snapshot": "^2.1.7",
|
||||||
"@sveltejs/adapter-static": "1.0.0-next.34",
|
"@sveltejs/adapter-static": "1.0.0-next.29",
|
||||||
"@sveltejs/kit": "1.0.0-next.354",
|
"@sveltejs/kit": "1.0.0-next.310",
|
||||||
"@types/mermaid": "^8.2.9",
|
"@types/mermaid": "^8.2.9",
|
||||||
"@types/pako": "^1.0.3",
|
"@types/pako": "^1.0.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||||
"@typescript-eslint/parser": "^4.33.0",
|
"@typescript-eslint/parser": "^4.33.0",
|
||||||
"autoprefixer": "^10.4.7",
|
"autoprefixer": "^10.4.4",
|
||||||
"chai": "^4.3.6",
|
"chai": "^4.3.6",
|
||||||
"cssnano": "^5.1.12",
|
"cssnano": "^5.1.7",
|
||||||
"cy-verify-downloads": "^0.1.8",
|
"cypress": "9.5.3",
|
||||||
"cypress": "10.2.0",
|
"cypress-localstorage-commands": "^1.7.0",
|
||||||
"cypress-localstorage-commands": "^2.1.0",
|
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-cypress": "^2.12.1",
|
"eslint-plugin-cypress": "^2.12.1",
|
||||||
"eslint-plugin-es": "^4.1.0",
|
"eslint-plugin-es": "^4.1.0",
|
||||||
"eslint-plugin-mocha": "^10.0.5",
|
"eslint-plugin-mocha": "^10.0.3",
|
||||||
"eslint-plugin-postcss-modules": "^2.0.0",
|
"eslint-plugin-postcss-modules": "^2.0.0",
|
||||||
"eslint-plugin-svelte3": "^3.4.1",
|
"eslint-plugin-svelte3": "^3.4.1",
|
||||||
"eslint-plugin-tailwindcss": "^3.5.2",
|
"eslint-plugin-tailwindcss": "^3.5.0",
|
||||||
"husky": "^8.0.1",
|
"husky": "^7.0.4",
|
||||||
"lint-staged": "13.0.2",
|
"lint-staged": "^12.3.7",
|
||||||
"mocha": "^10.0.0",
|
"mocha": "^9.2.2",
|
||||||
"node-html-parser": "^5.3.3",
|
"node-html-parser": "^5.3.3",
|
||||||
"postcss": "^8.4.14",
|
"postcss": "^8.4.12",
|
||||||
"postcss-load-config": "^4.0.1",
|
"postcss-load-config": "^3.1.4",
|
||||||
"prettier": "~2.7.1",
|
"prettier": "~2.6.2",
|
||||||
"prettier-plugin-svelte": "^2.7.0",
|
"prettier-plugin-svelte": "^2.7.0",
|
||||||
"svelte": "^3.48.0",
|
"svelte": "^3.47.0",
|
||||||
"svelte-preprocess": "4.10.7",
|
"svelte-preprocess": "^4.10.5",
|
||||||
"tailwindcss": "^3.1.4",
|
"tailwindcss": "^3.0.21",
|
||||||
"tslib": "^2.4.0",
|
"tslib": "^2.3.1",
|
||||||
"typescript": "^4.7.3"
|
"typescript": "^4.6.3"
|
||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@analytics/google-analytics": "^0.5.3",
|
"@analytics/google-analytics": "^0.5.3",
|
||||||
"@macfja/svelte-persistent-store": "^1.3.0",
|
"@macfja/svelte-persistent-store": "^1.3.0",
|
||||||
"analytics": "^0.8.1",
|
"analytics": "^0.8.1",
|
||||||
"daisyui": "2.17.0",
|
"daisyui": "2.13.6",
|
||||||
"js-base64": "^3.7.2",
|
"js-base64": "^3.7.2",
|
||||||
"mermaid": "9.1.2",
|
"mermaid": "9.0.0",
|
||||||
"moment": "^2.29.3",
|
"moment": "^2.29.2",
|
||||||
"monaco-editor": "^0.33.0",
|
"monaco-editor": "^0.33.0",
|
||||||
"monaco-mermaid": "^1.0.6",
|
"monaco-mermaid": "^1.0.3",
|
||||||
"pako": "2.0.4",
|
"pako": "2.0.4",
|
||||||
"random-word-slugs": "^0.1.6"
|
"random-word-slugs": "^0.1.6"
|
||||||
},
|
},
|
||||||
@@ -70,10 +69,8 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "16.15.0",
|
"node": "14.16.1",
|
||||||
"yarn": "1.22.10"
|
"yarn": "1.22.10",
|
||||||
},
|
"npm": "7.11.2"
|
||||||
"engines": {
|
|
||||||
"node": ">=16.7"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -11,8 +11,8 @@
|
|||||||
<meta
|
<meta
|
||||||
name="description"
|
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." />
|
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="%sveltekit.assets%/favicon.png" />
|
<link rel="icon" type="image/png" href="%svelte.assets%/favicon.png" />
|
||||||
<link rel="manifest" href="%sveltekit.assets%/manifest.json" />
|
<link rel="manifest" href="%svelte.assets%/manifest.json" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
|
||||||
@@ -39,9 +39,9 @@
|
|||||||
crossorigin="anonymous"
|
crossorigin="anonymous"
|
||||||
referrerpolicy="no-referrer"></script>
|
referrerpolicy="no-referrer"></script>
|
||||||
|
|
||||||
%sveltekit.head%
|
%svelte.head%
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="svelte">%sveltekit.body%</div>
|
<div id="svelte">%svelte.body%</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -10,14 +10,11 @@
|
|||||||
|
|
||||||
type Exporter = (context: CanvasRenderingContext2D, image: HTMLImageElement) => () => void;
|
type Exporter = (context: CanvasRenderingContext2D, image: HTMLImageElement) => () => void;
|
||||||
|
|
||||||
const getFileName = (ext: string) =>
|
|
||||||
`mermaid-diagram-${moment().format('YYYY-MM-DD-HHmmss')}.${ext}`;
|
|
||||||
|
|
||||||
const getBase64SVG = (svg?: HTMLElement, width?: number, height?: number): string => {
|
const getBase64SVG = (svg?: HTMLElement, width?: number, height?: number): string => {
|
||||||
svg?.setAttribute('height', `${height}px`);
|
svg?.setAttribute('height', `${height}px`);
|
||||||
svg?.setAttribute('width', `${width}px`); // Workaround https://stackoverflow.com/questions/28690643/firefox-error-rendering-an-svg-image-to-html5-canvas-with-drawimage
|
svg?.setAttribute('width', `${width}px`); // Workaround https://stackoverflow.com/questions/28690643/firefox-error-rendering-an-svg-image-to-html5-canvas-with-drawimage
|
||||||
if (!svg) {
|
if (!svg) {
|
||||||
svg = getSvgEl();
|
svg = document.querySelector('#container svg');
|
||||||
}
|
}
|
||||||
const svgString = svg.outerHTML
|
const svgString = svg.outerHTML
|
||||||
.replaceAll('<br>', '<br/>')
|
.replaceAll('<br>', '<br/>')
|
||||||
@@ -53,22 +50,6 @@
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
};
|
};
|
||||||
|
|
||||||
const getSvgEl = () => {
|
|
||||||
const svgEl: HTMLElement = document
|
|
||||||
.querySelector('#container svg')
|
|
||||||
.cloneNode(true) as HTMLElement;
|
|
||||||
const fontAwesomeCdnUrl = Array.from(document.head.getElementsByTagName('link'))
|
|
||||||
.map((l) => l.href)
|
|
||||||
.find((h) => h && h.includes('font-awesome'));
|
|
||||||
if (fontAwesomeCdnUrl == null) {
|
|
||||||
return svgEl;
|
|
||||||
}
|
|
||||||
const styleEl = document.createElement('style');
|
|
||||||
styleEl.innerText = `@import url("${fontAwesomeCdnUrl}");'`;
|
|
||||||
svgEl.prepend(styleEl);
|
|
||||||
return svgEl;
|
|
||||||
};
|
|
||||||
|
|
||||||
const simulateDownload = (download: string, href: string): void => {
|
const simulateDownload = (download: string, href: string): void => {
|
||||||
const a = document.createElement('a');
|
const a = document.createElement('a');
|
||||||
a.download = download;
|
a.download = download;
|
||||||
@@ -81,7 +62,7 @@
|
|||||||
const { canvas } = context;
|
const { canvas } = context;
|
||||||
context.drawImage(image, 0, 0, canvas.width, canvas.height);
|
context.drawImage(image, 0, 0, canvas.width, canvas.height);
|
||||||
simulateDownload(
|
simulateDownload(
|
||||||
getFileName('png'),
|
`mermaid-diagram-${moment().format('YYYYMMDDHHmmss')}.png`,
|
||||||
canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream')
|
canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream')
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -121,7 +102,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
const onDownloadSVG = () => {
|
const onDownloadSVG = () => {
|
||||||
simulateDownload(getFileName('svg'), `data:image/svg+xml;base64,${getBase64SVG()}`);
|
simulateDownload(
|
||||||
|
`mermaid-diagram-${moment().format('YYYYMMDDHHmmss')}.svg`,
|
||||||
|
`data:image/svg+xml;base64,${getBase64SVG()}`
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const onCopyMarkdown = () => {
|
const onCopyMarkdown = () => {
|
||||||
@@ -170,29 +154,21 @@
|
|||||||
><i class="far fa-copy mr-2" /> Copy Image to clipboard
|
><i class="far fa-copy mr-2" /> Copy Image to clipboard
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
<button id="downloadPNG" class="action-btn flex-auto" on:click={onDownloadPNG}>
|
<button class="action-btn flex-auto" on:click={onDownloadPNG}>
|
||||||
<i class="fas fa-download mr-2" /> PNG
|
<i class="fas fa-download mr-2" /> PNG
|
||||||
</button>
|
</button>
|
||||||
<button id="downloadSVG" class="action-btn flex-auto" on:click={onDownloadSVG}>
|
<button class="action-btn flex-auto" on:click={onDownloadSVG}>
|
||||||
<i class="fas fa-download mr-2" /> SVG
|
<i class="fas fa-download mr-2" /> SVG
|
||||||
</button>
|
</button>
|
||||||
<a target="_blank" href={iUrl}>
|
|
||||||
<button class="action-btn flex-auto">
|
<button class="action-btn flex-auto">
|
||||||
<i class="fas fa-external-link-alt mr-2" /> PNG
|
<a target="_blank" href={iUrl}><i class="fas fa-external-link-alt mr-2" /> PNG</a>
|
||||||
</button>
|
</button>
|
||||||
</a>
|
|
||||||
|
|
||||||
<a target="_blank" href={svgUrl}>
|
|
||||||
<button class="action-btn flex-auto">
|
<button class="action-btn flex-auto">
|
||||||
<i class="fas fa-external-link-alt mr-2" /> SVG
|
<a target="_blank" href={svgUrl}><i class="fas fa-external-link-alt mr-2" /> SVG</a>
|
||||||
</button>
|
</button>
|
||||||
</a>
|
|
||||||
|
|
||||||
<a target="_blank" href={krokiUrl}>
|
|
||||||
<button class="action-btn flex-auto">
|
<button class="action-btn flex-auto">
|
||||||
<i class="fas fa-external-link-alt mr-2" /> Kroki
|
<a target="_blank" href={krokiUrl}><i class="fas fa-external-link-alt mr-2" /> Kroki</a>
|
||||||
</button>
|
</button>
|
||||||
</a>
|
|
||||||
|
|
||||||
<div class="flex gap-2 items-center">
|
<div class="flex gap-2 items-center">
|
||||||
PNG size
|
PNG size
|
||||||
|
|||||||
@@ -23,9 +23,6 @@ const config = {
|
|||||||
vite: {
|
vite: {
|
||||||
envPrefix: 'MERMAID_',
|
envPrefix: 'MERMAID_',
|
||||||
optimizeDeps: { include: ['mermaid'] }
|
optimizeDeps: { include: ['mermaid'] }
|
||||||
},
|
|
||||||
prerender: {
|
|
||||||
default: true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,8 +7,5 @@
|
|||||||
"cypress/**/*.js",
|
"cypress/**/*.js",
|
||||||
"static/**/*.js"
|
"static/**/*.js"
|
||||||
],
|
],
|
||||||
"compilerOptions": {
|
|
||||||
"allowSyntheticDefaultImports": true
|
|
||||||
},
|
|
||||||
"extends": "./.svelte-kit/tsconfig.json"
|
"extends": "./.svelte-kit/tsconfig.json"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user