1 | #!/usr/bin/env node
|
2 | 'use strict';
|
3 |
|
4 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
5 |
|
6 | const commander = require('commander');
|
7 | const chalk = require('chalk');
|
8 | const fs = require('fs');
|
9 | const path = require('path');
|
10 | const puppeteer = require('puppeteer');
|
11 |
|
12 | const pkg = require('./package.json');
|
13 |
|
14 | const error = message => {
|
15 | console.log(chalk.red(`\n${message}\n`));
|
16 | process.exit(1);
|
17 | };
|
18 |
|
19 | commander.version(pkg.version).option('-t, --theme [name]', 'Theme of the chart, could be default, forest, dark or neutral. Optional. Default: default', /^default|forest|dark|neutral$/, 'default').option('-w, --width [width]', 'Width of the page. Optional. Default: 800', /^\d+$/, '800').option('-H, --height [height]', 'Height of the page. Optional. Default: 600', /^\d+$/, '600').option('-i, --input <input>', 'Input mermaid file. Required.').option('-o, --output [output]', 'Output file. It should be either svg, png or pdf. Optional. Default: input + ".svg"').parse(process.argv);
|
20 |
|
21 | let { theme, width, height, input, output } = commander;
|
22 |
|
23 |
|
24 | if (!input) {
|
25 | error('Please specify input file: -i <input>');
|
26 | }
|
27 | if (!fs.existsSync(input)) {
|
28 | error(`Input file "${input}" doesn't exist`);
|
29 | }
|
30 |
|
31 |
|
32 | if (!output) {
|
33 | output = input + '.svg';
|
34 | }
|
35 | if (!/\.(?:svg|png|pdf)$/.test(output)) {
|
36 | error(`Output file must end with ".svg", ".png" or ".pdf"`);
|
37 | }
|
38 | const outputDir = path.dirname(output);
|
39 | if (!fs.existsSync(outputDir)) {
|
40 | error(`Output directory "${outputDir}/" doesn't exist`);
|
41 | }
|
42 |
|
43 |
|
44 | width = parseInt(width);
|
45 | height = parseInt(height);_asyncToGenerator(function* () {
|
46 | const browser = yield puppeteer.launch();
|
47 | const page = yield browser.newPage();
|
48 | page.setViewport({ width, height });
|
49 | yield page.goto(`file://${path.join(__dirname, 'index.html')}`);
|
50 |
|
51 | const definition = fs.readFileSync(input, 'utf-8');
|
52 | yield page.$eval('#container', function (container, definition, theme) {
|
53 | container.innerHTML = definition;
|
54 | window.mermaid_config = { theme };
|
55 | window.mermaid.init(undefined, container);
|
56 | }, definition, theme);
|
57 |
|
58 | if (output.endsWith('svg')) {
|
59 | const svg = yield page.$eval('#container', function (container) {
|
60 | return container.innerHTML;
|
61 | });
|
62 | fs.writeFileSync(output, svg);
|
63 | } else if (output.endsWith('png')) {
|
64 | const clip = yield page.$eval('svg', function (svg) {
|
65 | const react = svg.getBoundingClientRect();
|
66 | return { x: react.left, y: react.top, width: react.width, height: react.height };
|
67 | });
|
68 | yield page.screenshot({ path: output, clip });
|
69 | } else {
|
70 |
|
71 | yield page.pdf({ path: output });
|
72 | }
|
73 |
|
74 | browser.close();
|
75 | })();
|