You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							265 lines
						
					
					
						
							7.4 KiB
						
					
					
				
			
		
		
	
	
							265 lines
						
					
					
						
							7.4 KiB
						
					
					
				/** | 
						|
 * 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; | 
						|
    }; | 
						|
};
 | 
						|
 |