123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #!/usr/bin/env node
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- const fs = require('fs');
- const config = require('./config.js');
- const commander = require('commander');
- const chalk = require('chalk');
- const rollup = require('rollup');
- const prePublish = require('./pre-publish');
- const transformDEV = require('./transform-dev');
- async function run() {
- /**
- * Tips for `commander`:
- * (1) If arg xxx not specified, `commander.xxx` is undefined.
- * Otherwise:
- * If '-x, --xxx', `commander.xxx` can only be true/false, even if '--xxx yyy' input.
- * If '-x, --xxx <some>', the 'some' string is required, or otherwise error will be thrown.
- * If '-x, --xxx [some]', the 'some' string is optional, that is, `commander.xxx` can be boolean or string.
- * (2) `node ./build/build.js --help` will print helper info and exit.
- */
- let descIndent = ' ';
- let egIndent = ' ';
- commander
- .usage('[options]')
- .description([
- 'Build echarts and generate result files in directory `echarts/dist`.',
- '',
- ' For example:',
- '',
- egIndent + 'node build/build.js --prepublish'
- + '\n' + descIndent + '# Only prepublish.',
- egIndent + 'node build/build.js --type ""'
- + '\n' + descIndent + '# Only generate `dist/echarts.js`.',
- egIndent + 'node build/build.js --type common --min'
- + '\n' + descIndent + '# Only generate `dist/echarts.common.min.js`.',
- egIndent + 'node build/build.js --type simple --min'
- + '\n' + descIndent + '# Only generate `dist/echarts-en.simple.min.js`.',
- ].join('\n'))
- .option(
- '--prepublish',
- 'Build all for release'
- )
- .option(
- '--min',
- 'Whether to compress the output file, and remove error-log-print code.'
- )
- .option(
- '--type <type name>', [
- 'Can be "simple" or "common" or "all" (default). Or can be simple,common,all to build multiple. For example,',
- descIndent + '`--type ""` or `--type "common"`.'
- ].join('\n'))
- .option(
- '--format <format>',
- 'The format of output bundle. Can be "umd", "amd", "iife", "cjs", "esm".'
- )
- .parse(process.argv);
- let isPrePublish = !!commander.prepublish;
- let buildType = commander.type || 'all';
- let opt = {
- min: commander.min,
- format: commander.format || 'umd'
- };
- validateIO(opt.input, opt.output);
- if (isPrePublish) {
- await prePublish();
- }
- else if (buildType === 'extension') {
- const cfgs = [
- config.createBMap(opt),
- config.createDataTool(opt)
- ];
- await build(cfgs);
- }
- else if (buildType === 'myTransform') {
- const cfgs = [
- config.createMyTransform(opt)
- ];
- await build(cfgs);
- }
- else {
- const types = buildType.split(',').map(a => a.trim());
- const cfgs = types.map(type =>
- config.createECharts({
- ...opt,
- type
- })
- );
- await build(cfgs);
- }
- }
- function checkBundleCode(cfg) {
- // Make sure process.env.NODE_ENV is eliminated.
- for (let output of cfg.output) {
- let code = fs.readFileSync(output.file, {encoding: 'utf-8'});
- if (!code) {
- throw new Error(`${output.file} is empty`);
- }
- transformDEV.recheckDEV(code);
- console.log(chalk.green.dim('Check code: correct.'));
- }
- }
- function validateIO(input, output) {
- if ((input != null && output == null)
- || (input == null && output != null)
- ) {
- throw new Error('`input` and `output` must be both set.');
- }
- }
- /**
- * @param {Array.<Object>} configs A list of rollup configs:
- * See: <https://rollupjs.org/#big-list-of-options>
- * For example:
- * [
- * {
- * ...inputOptions,
- * output: [outputOptions],
- * },
- * ...
- * ]
- */
- async function build(configs) {
- console.log(chalk.yellow(`
- NOTICE: If you are using 'npm run build'. Run 'npm run prepare' before build !!!
- `));
- console.log(chalk.yellow(`
- NOTICE: If you are using syslink on zrender. Run 'npm run prepare' in zrender first !!
- `));
- for (let singleConfig of configs) {
- console.log(
- chalk.cyan.dim('\Bundling '),
- chalk.cyan(singleConfig.input)
- );
- console.time('rollup build');
- const bundle = await rollup.rollup(singleConfig);
- for (let output of singleConfig.output) {
- console.log(
- chalk.green.dim('Created '),
- chalk.green(output.file),
- chalk.green.dim(' successfully.')
- );
- await bundle.write(output);
- };
- console.timeEnd('rollup build');
- checkBundleCode(singleConfig);
- }
- }
- async function main() {
- try {
- await run();
- }
- catch (err) {
- console.log(chalk.red('BUILD ERROR!'));
- // rollup parse error.
- if (err) {
- if (err.loc) {
- console.warn(chalk.red(`${err.loc.file} (${err.loc.line}:${err.loc.column})`));
- console.warn(chalk.red(err.message));
- }
- if (err.frame) {
- console.warn(chalk.red(err.frame));
- }
- console.log(chalk.red(err ? err.stack : err));
- err.id != null && console.warn(chalk.red(`id: ${err.id}`));
- err.hook != null && console.warn(chalk.red(`hook: ${err.hook}`));
- err.code != null && console.warn(chalk.red(`code: ${err.code}`));
- err.plugin != null && console.warn(chalk.red(`plugin: ${err.plugin}`));
- }
- // console.log(err);
- }
- }
- main();
|