UNPKG

2.96 kBJavaScriptView Raw
1#!/usr/bin/env node
2'use strict';
3
4function _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
6const commander = require('commander');
7const chalk = require('chalk');
8const fs = require('fs');
9const path = require('path');
10const puppeteer = require('puppeteer');
11
12const pkg = require('./package.json');
13
14const error = message => {
15 console.log(chalk.red(`\n${message}\n`));
16 process.exit(1);
17};
18
19commander.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 image file. It should be either svg or png. Optional. Default: input + ".svg"').parse(process.argv);
20
21let { theme, width, height, input, output } = commander;
22
23// check input file
24if (!input) {
25 error('Please specify input file: -i <input>');
26}
27if (!fs.existsSync(input)) {
28 error(`Input file "${input}" doesn't exist`);
29}
30
31// check output file
32if (!output) {
33 output = input + '.svg';
34}
35if (!/\.(?:svg|png)$/.test(output)) {
36 error(`Output file must end with ".svg" or ".png"`);
37}
38const outputDir = path.dirname(output);
39if (!fs.existsSync(outputDir)) {
40 error(`Output directory "${outputDir}/" doesn't exist`);
41}
42
43// normalize args
44width = parseInt(width);
45height = 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 {
64 // png
65 const clip = yield page.$eval('svg', function (svg) {
66 const react = svg.getBoundingClientRect();
67 return { x: react.left, y: react.top, width: react.width, height: react.height };
68 });
69 yield page.screenshot({ path: output, clip });
70 }
71
72 browser.close();
73})();