blob: b116c49202bfb4132e5ab73b7411c7fb5d61b0c0 [file] [log] [blame]
/*
* 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 path = require('path');
const fse = require('fs-extra');
const https = require('https');
const fs = require('fs');
const rollup = require('rollup');
const {nodeResolve} = require('@rollup/plugin-node-resolve');
const commonjs = require('@rollup/plugin-commonjs');
const config = require('./config');
function modifyEChartsCode(code) {
return code.replace(/Math\.random/g, '__random__inner__')
// https://github.com/apache/echarts/blob/737e23c0054e6b501ecc6f562920cffae953b5c6/src/core/echarts.ts#L537
// This code will cause infinite loop if we reduce the precision of Date in the visual regression test.
// TODO: This is a very dirty HACK.
.replace('remainTime > 0', 'false');
}
module.exports.testNameFromFile = function(fileName) {
return path.basename(fileName, '.html');
};
module.exports.fileNameFromTest = function (testName) {
return testName + '.html';
};
function getVersionDir(version) {
version = version || 'local';
return `tmp/__version__/${version}`;
};
module.exports.getVersionDir = getVersionDir;
module.exports.getActionsFullPath = function (testName) {
return path.join(__dirname, 'actions', testName + '.json');
};
module.exports.getEChartsTestFileName = function () {
return `echarts.test-${config.testVersion}.js`;
};
module.exports.prepareEChartsLib = function (version) {
const versionFolder = path.join(__dirname, getVersionDir(version));
const ecDownloadPath = `${versionFolder}/echarts.js`;
fse.ensureDirSync(versionFolder);
if (!version || version === 'local') {
// Developing version, make sure it's new build
fse.copySync(path.join(__dirname, '../../dist/echarts.js'), `${versionFolder}/echarts.js`);
let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
fs.writeFileSync(`${versionFolder}/${module.exports.getEChartsTestFileName()}`, code, 'utf-8');
return Promise.resolve();
}
return new Promise(resolve => {
const testLibPath = `${versionFolder}/${module.exports.getEChartsTestFileName()}`;
if (!fs.existsSync(ecDownloadPath)) {
const file = fs.createWriteStream(ecDownloadPath);
const isNightly = version.includes('-dev');
const packageName = isNightly ? 'echarts-nightly' : 'echarts'
console.log(`Downloading ${packageName}@${version} from `, `https://cdn.jsdelivr.net/npm/${packageName}@${version}/dist/echarts.js`);
https.get(`https://cdn.jsdelivr.net/npm/${packageName}@${version}/dist/echarts.js`, response => {
response.pipe(file);
file.on('finish', () => {
let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
fs.writeFileSync(testLibPath, code, 'utf-8');
resolve();
});
});
}
else {
// Always do code modifaction.
// In case we need to do replacement on old downloads.
let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
fs.writeFileSync(testLibPath, code, 'utf-8');
resolve();
}
});
};
module.exports.fetchVersions = function (isNighlty) {
return new Promise((resolve, reject) => {
https.get(
isNighlty
? `https://registry.npmjs.org/echarts-nightly`
: `https://registry.npmjs.org/echarts`
, res => {
if (res.statusCode !== 200) {
res.destroy();
reject('Failed fetch versions from https://registry.npmjs.org/echarts');
return;
}
var buffers = [];
res.on('data', buffers.push.bind(buffers));
res.on('end', function () {
try {
var data = Buffer.concat(buffers);
resolve(Object.keys(JSON.parse(data).versions).reverse());
}
catch (e) {
reject(e.toString());
}
});
});
});
};
module.exports.buildRuntimeCode = async function () {
const bundle = await rollup.rollup({
input: path.join(__dirname, 'runtime/main.js'),
plugins: [
{
// https://rollupjs.org/guide/en/#a-simple-example
resolveId(source, importer) {
return source === 'crypto' ? source : null;
},
load(id) {
// seedrandom use crypto as external module
return id === 'crypto' ? 'export default null;' : null;
}
},
nodeResolve(),
commonjs()
]
});
const { output } = await bundle.generate({
format: 'iife',
name: 'autorun'
});
return output[0].code;
};
module.exports.waitTime = function (time) {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
});
};