| /* |
| * 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 path = require('path'); |
| const { execSync } = require('child_process'); |
| |
| /** |
| * Install dependencies before build if needed. |
| * If no `node_modules` directory, run `npm install` |
| * |
| * @param {string} dirName directory name under ./custom-series/ |
| */ |
| function beforeBuild(dirName) { |
| const seriesPath = path.join(__dirname, '../custom-series', dirName); |
| const nodeModulesPath = path.join(seriesPath, 'node_modules'); |
| if (!fs.existsSync(nodeModulesPath)) { |
| console.log(`Installing dependencies for custom series ${dirName}...`); |
| execSync(`npm install`, { cwd: seriesPath }); |
| } |
| } |
| |
| /** |
| * Build one custom series |
| * |
| * @param {string} dirName directory name under ./custom-series/ |
| */ |
| function buildCustomSeries(dirName) { |
| const seriesPath = path.join(__dirname, '../custom-series', dirName); |
| if (fs.statSync(seriesPath).isDirectory() === false) { |
| return; |
| } |
| if (!fs.existsSync(seriesPath)) { |
| console.error(`Custom series ${dirName} does not exist`); |
| return; |
| } |
| |
| beforeBuild(dirName); |
| |
| console.log(`Building custom series ${dirName}...`); |
| |
| compileTypeScript(seriesPath, dirName); |
| bundleWithRollup(seriesPath, dirName); |
| minifyWithTerser(seriesPath, dirName); |
| } |
| |
| function compileTypeScript(seriesPath, dirName) { |
| const tscPath = path.join(__dirname, '../node_modules/.bin/tsc'); |
| // Remove dir of lib |
| if (fs.existsSync(path.join(seriesPath, 'lib'))) { |
| fs.rmSync(path.join(seriesPath, 'lib'), { recursive: true, force: true }); |
| } |
| |
| try { |
| execSync( |
| `${tscPath} ${seriesPath}/src/index.ts \ |
| --outDir ${seriesPath}/lib \ |
| --target ES5 \ |
| --noImplicitAny \ |
| --noImplicitThis \ |
| --strictBindCallApply \ |
| --removeComments true \ |
| --sourceMap \ |
| --moduleResolution node \ |
| --esModuleInterop \ |
| --declaration \ |
| --declarationMap false \ |
| --importHelpers \ |
| --pretty \ |
| --ignoreDeprecations 5.0 \ |
| --module es2015` |
| ); |
| } catch (e) { |
| // There may be some error compiling ECharts, which can be ignored |
| // as long as `lib/index.js` exists |
| } |
| if (!fs.existsSync(path.join(seriesPath, 'lib/index.js'))) { |
| console.error(`Error compiling TypeScript for custom series ${dirName}:`); |
| console.error(e); |
| process.exit(1); |
| } |
| console.log(`Compiled TypeScript for custom series ${dirName}`); |
| } |
| |
| function bundleWithRollup(seriesPath, dirName) { |
| const rollupPath = path.join(__dirname, '../node_modules/.bin/rollup'); |
| const configPath = path.join(seriesPath, 'rollup.config.js'); |
| const distPath = path.join(seriesPath, 'dist'); |
| |
| // Create dist directory if it doesn't exist |
| if (!fs.existsSync(distPath)) { |
| fs.mkdirSync(distPath, { recursive: true }); |
| } |
| |
| try { |
| const result = execSync( |
| `${rollupPath} -c ${configPath} \ |
| --input ${seriesPath}/lib/index.js \ |
| --file ${seriesPath}/dist/index.js \ |
| --name ${dirName}CustomSeriesInstaller`, |
| { encoding: 'utf8', stdio: 'pipe' } |
| ); |
| |
| console.log(`Rollup bundling completed for ${dirName}`); |
| console.log(result); |
| |
| // Check if the output file was created |
| if (!fs.existsSync(path.join(seriesPath, 'dist', 'index.js'))) { |
| console.error(`Error: Output file not created for ${dirName}`); |
| } |
| } catch (e) { |
| console.error(`Error bundling custom series ${dirName}:`); |
| console.error(e.message); |
| if (e.stdout) console.error('Rollup stdout:', e.stdout.toString()); |
| if (e.stderr) console.error('Rollup stderr:', e.stderr.toString()); |
| } |
| } |
| |
| function minifyWithTerser(seriesPath, dirName) { |
| const terserPath = path.join(__dirname, '../node_modules/.bin/terser'); |
| try { |
| execSync( |
| `${terserPath} ${seriesPath}/dist/index.js \ |
| --compress \ |
| --mangle \ |
| --ecma 3 \ |
| --comments all \ |
| --source-map \ |
| --output ${seriesPath}/dist/index.min.js` |
| ); |
| console.log(`Minified custom series ${dirName} using Terser`); |
| } catch (e) { |
| console.error(`Error minifying custom series ${dirName}:`); |
| console.error(e.message); |
| } |
| } |
| |
| /** |
| * `npm run build` to build all |
| * `npm run build <series-name>` to build one custom series |
| */ |
| function build() { |
| const args = process.argv.slice(2); |
| if (args.length === 0) { |
| // Build all custom series |
| fs.readdirSync(path.join(__dirname, '../custom-series')).forEach( |
| buildCustomSeries |
| ); |
| } else { |
| // Build custom series from args |
| args.forEach(buildCustomSeries); |
| } |
| console.log('Build successfully.'); |
| } |
| |
| build(); |