|  | /* | 
|  | * 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' | 
|  |  | 
|  | const url = `https://unpkg.com/${packageName}@${version}/dist/echarts.js`; | 
|  | console.log(`Downloading ${packageName}@${version} from ${url}`, ); | 
|  | https.get(url, 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); | 
|  | }); | 
|  | }; |