123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- /**
- * Both used by zrender and echarts.
- */
- const assert = require('assert');
- const rollup = require('rollup');
- const path = require('path');
- const fs = require('fs');
- const fsExtra = require('fs-extra');
- const babel = require('@babel/core');
- const esm2cjsPlugin = require('./babel-plugin-transform-modules-commonjs-ec');
- const removeDEVPlugin = require('./babel-plugin-transform-remove-dev');
- /**
- * @param {Array.<Object>} configs A list of rollup configs:
- * See: <https://rollupjs.org/#big-list-of-options>
- * For example:
- * [
- * {
- * ...inputOptions,
- * output: [outputOptions],
- * watch: {chokidar, include, exclude}
- * },
- * ...
- * ]
- * @return {Promise}
- */
- exports.build = function (configs) {
- return new Promise(function (promiseResolve, promiseReject) {
- let index = 0;
- buildSingle();
- function buildSingle() {
- let singleConfig = configs[index++];
- if (!singleConfig) {
- promiseResolve();
- return;
- }
- console.log(
- color('fgCyan', 'dim')('\nBundles '),
- color('fgCyan')(singleConfig.input),
- color('fgCyan', 'dim')('=>'),
- color('fgCyan')(singleConfig.output.file),
- color('fgCyan', 'dim')(' ...')
- );
- rollup
- .rollup(singleConfig)
- .then(function (bundle) {
- return bundle.write(singleConfig.output);
- })
- .then(function () {
- console.log(
- color('fgGreen', 'dim')('Created '),
- color('fgGreen')(singleConfig.output.file),
- color('fgGreen', 'dim')(' successfully.')
- );
- buildSingle();
- })
- .catch(function (err) {
- console.log(color('fgRed')(err));
- promiseReject();
- });
- }
- });
- };
- /**
- * @param {Object} singleConfig A single rollup config:
- * See: <https://rollupjs.org/#big-list-of-options>
- * For example:
- * {
- * ...inputOptions,
- * output: [outputOptions],
- * watch: {chokidar, include, exclude}
- * }
- */
- exports.watch = function (singleConfig) {
- let watcher = rollup.watch(singleConfig);
- watcher.on('event', function (event) {
- // event.code can be one of:
- // START — the watcher is (re)starting
- // BUNDLE_START — building an individual bundle
- // BUNDLE_END — finished building a bundle
- // END — finished building all bundles
- // ERROR — encountered an error while bundling
- // FATAL — encountered an unrecoverable error
- if (event.code !== 'START' && event.code !== 'END') {
- console.log(
- color('fgBlue')('[' + getTimeString() + ']'),
- color('dim')('build'),
- event.code.replace(/_/g, ' ').toLowerCase()
- );
- }
- if (event.code === 'ERROR' || event.code === 'FATAL') {
- printCodeError(event.error);
- }
- if (event.code === 'BUNDLE_END') {
- printWatchResult(event);
- }
- });
- };
- /**
- * @param {string} srcDir Absolute directory path.
- * @param {Function} [cb] Params: {
- * fileName: like 'some.js', without dir path.
- * relativePath: relative to srcDir.
- * absolutePath
- * }
- */
- exports.travelSrcDir = function (srcDir, cb) {
- assert(fs.statSync(srcDir).isDirectory());
- const regDir = /^[^.].*$/;
- const regSrc = /^[^.].*[.]js$/;
- doTravelSrcDir('.');
- function doTravelSrcDir(relativePath) {
- const absolutePath = path.resolve(srcDir, relativePath);
- fs.readdirSync(absolutePath).forEach(fileName => {
- const childAbsolutePath = path.resolve(absolutePath, fileName);
- const stat = fs.statSync(childAbsolutePath);
- if (stat.isDirectory()) {
- if (regDir.test(fileName)) {
- doTravelSrcDir(path.join(relativePath, fileName));
- }
- }
- else if (stat.isFile()) {
- if (regSrc.test(fileName)) {
- cb({fileName, relativePath, absolutePath: childAbsolutePath});
- }
- }
- });
- }
- };
- /**
- * @param {string} [opt]
- * @param {string} [opt.inputPath] Absolute input path.
- * @param {string} [opt.outputPath] Absolute output path.
- * @param {string} [opt.preamble]
- * @param {Function} [opt.transform]
- * @param {Function} [opt.reserveDEV]
- */
- exports.prePulishSrc = function ({inputPath, outputPath, preamble, transform, reserveDEV}) {
- assert(inputPath && outputPath);
- console.log(
- color('fgGreen', 'dim')('[transform] '),
- color('fgGreen')(inputPath),
- color('fgGreen', 'dim')('...')
- );
- let plugins = [];
- !reserveDEV && plugins.push(removeDEVPlugin);
- plugins.push(esm2cjsPlugin);
- let {code} = babel.transformFileSync(inputPath, {
- plugins: plugins
- });
- !reserveDEV && removeDEVPlugin.recheckDEV(code);
- if (transform) {
- code = transform({code, inputPath, outputPath});
- }
- if (preamble) {
- code = preamble + code;
- }
- fsExtra.ensureFileSync(outputPath);
- fs.writeFileSync(outputPath, code, {encoding:'utf-8'});
- };
- function printWatchResult(event) {
- console.log(
- color('fgGreen', 'dim')('Created'),
- color('fgGreen')(event.output.join(', ')),
- color('fgGreen', 'dim')('in'),
- color('fgGreen')(event.duration),
- color('fgGreen', 'dim')('ms.')
- );
- }
- function printCodeError(error) {
- console.log('\n' + color()(error.code));
- if (error.code === 'PARSE_ERROR') {
- console.log(
- color()('line'),
- color('fgCyan')(error.loc.line),
- color()('column'),
- color('fgCyan')(error.loc.column),
- color()('in'),
- color('fgCyan')(error.loc.file)
- );
- }
- if (error.frame) {
- console.log('\n' + color('fgRed')(error.frame));
- }
- console.log(color('dim')('\n' + error.stack));
- }
- function getTimeString() {
- return (new Date()).toLocaleString();
- }
- const COLOR_RESET = '\x1b[0m';
- const COLOR_MAP = {
- bright: '\x1b[1m',
- dim: '\x1b[2m',
- underscore: '\x1b[4m',
- blink: '\x1b[5m',
- reverse: '\x1b[7m',
- hidden: '\x1b[8m',
- fgBlack: '\x1b[30m',
- fgRed: '\x1b[31m',
- fgGreen: '\x1b[32m',
- fgYellow: '\x1b[33m',
- fgBlue: '\x1b[34m',
- fgMagenta: '\x1b[35m',
- fgCyan: '\x1b[36m',
- fgWhite: '\x1b[37m',
- bgBlack: '\x1b[40m',
- bgRed: '\x1b[41m',
- bgGreen: '\x1b[42m',
- bgYellow: '\x1b[43m',
- bgBlue: '\x1b[44m',
- bgMagenta: '\x1b[45m',
- bgCyan: '\x1b[46m',
- bgWhite: '\x1b[47m'
- };
- /**
- * Print colored text with `console.log`.
- *
- * Usage:
- * let color = require('colorConsole');
- * color('fgCyan')('some text'); // cyan text.
- * color('fgCyan', 'bright')('some text'); // bright cyan text.
- * color('fgCyan', 'bgRed')('some text') // cyan text and red background.
- */
- let color = exports.color = function () {
- let prefix = [];
- for (let i = 0; i < arguments.length; i++) {
- let color = COLOR_MAP[arguments[i]];
- color && prefix.push(color);
- }
- prefix = prefix.join('');
- return function (text) {
- return prefix + text + COLOR_RESET;
- };
- };
|