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.
210 lines
6.5 KiB
210 lines
6.5 KiB
#!/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();
|
|
|