blob: d6a8acce04e9d8f8a04b25377b501f289553fb38 [file] [log] [blame]
/* global BUILD_CONFIG, UglifyJS */
define(function (require) {
// var mangleString = require('./mangleString');
var saveAs = require('./lib/FileSaver');
var rollup = require('rollup');
var transformDev = require('transformDev');
var TOP_MODULE_NAME = 'topModuleInRequireES';
var RETRY_MAX = 2;
var TIMEOUT = 10000;
var RETRY_DELAY = 2000;
var $log = document.getElementById('log');
var version = BUILD_CONFIG.version + '';
var isVersion5 = version.startsWith('5');
var jsDelivrBase = 'https://cdn.jsdelivr.net/npm';
var urlArgs = '__v__=' + (+new Date());
var topCode = [`export * from "echarts/src/echarts";`];
var srcFolder = version.startsWith('5.0.0') ? 'esm' // Only 5.0.0 has esm folder
: isVersion5 ? 'lib' : 'src';
if (BUILD_CONFIG.api && (version.startsWith('5.0.0') || !isVersion5)) {
topCode.push(`export * from "echarts/src/export";`);
}
// Including charts
(BUILD_CONFIG.charts || '').split(',').forEach(function (chart) {
chart && topCode.push(`import "echarts/src/chart/${chart}";`);
});
if (topCode.indexOf(`echarts/src/chart/scatter`) >= 0) {
topCode.push(`import "echarts/src/chart/effectScatter"`);
}
// Including components
(BUILD_CONFIG.components || '').split(',').forEach(function (component) {
component && topCode.push(`import "echarts/src/component/${component}";`);
});
if (BUILD_CONFIG.vml && !isVersion5) {
topCode.push(`import "zrender/${srcFolder}/vml/vml";`);
}
if (BUILD_CONFIG.svg) {
topCode.push(`import "zrender/${srcFolder}/svg/svg";`);
}
// Always require log and time axis
topCode.push(
`import "echarts/src/scale/Time";`,
`import "echarts/src/scale/Log";`
);
var npmEntries = {};
var pathsConfig = {
'echarts/src': `/echarts@${version}/${srcFolder}`
};
function resolveNpmDependencies(pkg, version) {
return fetch(`${jsDelivrBase}/${pkg}@${version}/package.json`, { mode: 'cors' })
.then(response => response.json())
.then(pkgCfg => {
var entry = pkgCfg.module || pkgCfg.main || 'index.js';
if (!entry.endsWith('.js')) {
entry = entry + '.js';
}
npmEntries[pkg] = `/${pkg}@${version}/${entry}`;
var promises = [];
for (let pkgName in pkgCfg.dependencies) {
var depVersion = pkgCfg.dependencies[pkgName];
pathsConfig[pkgName] = `/${pkgName}@${depVersion}`;
promises.push(resolveNpmDependencies(pkgName, depVersion));
}
return Promise.all(promises);
});
}
resolveNpmDependencies('echarts', version)
.then(startRollup)
// Loading scripts and build
function startRollup() {
rollup.rollup({
input: TOP_MODULE_NAME,
legacy: true,
plugins: [{
resolveId: function (importee, importor) {
if (importee === TOP_MODULE_NAME) {
return importee;
}
// console.log('resolveid', importee, importor);
return getAbsolutePath(
importee,
importor !== TOP_MODULE_NAME ? importor : null
);
},
transform: function (code) {
return {
code: code.replace(/process.env.NODE_ENV/g, JSON.stringify(
!BUILD_CONFIG.source ? 'production' : 'development'
))
};
},
load: function (path) {
if (path === TOP_MODULE_NAME) {
return topCode.join('\n');
}
var retryCount = 0;
return new Promise(function (resolve, reject) {
function retryableLoad() {
// When using apache CDN, might fail to loading soource.
if (retryCount >= RETRY_MAX) {
var log = 'Loaded module failed: "' + path
+ '"<br><strong style="color:red">! Please reload page to retry. !</strong>';
builderLog(log);
return reject(log);
}
ajax(`${jsDelivrBase}/${path}`, TIMEOUT)
.then(function (content) {
builderLog('Loaded module: "' + path + '"');
resolve(content);
})
.catch(function () {
retryCount++;
setTimeout(retryableLoad, RETRY_DELAY);
});
}
retryableLoad();
});
}
}]
}).then(function (bundle) {
return bundle.generate({
name: 'echarts',
format: 'umd',
legacy: true
});
}).then(function (result) {
var code = result.code;
code = transformDev.transform(code, false, !BUILD_CONFIG.source ? 'false' : 'true').code;
if (!BUILD_CONFIG.source) {
builderLog('<br />Compressing code...');
// code = mangleString(code);
// Otherwise uglify will throw error.
code = code.replace(/\t/g, ' ');
code = jsCompress(code);
}
download(code);
builderLog('<br />Completed');
document.getElementById('tip').innerHTML = 'OK';
});
}
function download(code) {
try {
var blob = new Blob([code], {
type: 'text/plain;charset=utf8'
});
// var URL = window.URL || window.webkitURL;
// var scriptUrl = URL.createObjectURL(blob);
// URL.revokeObjectURL(blob);
// window.open(scriptUrl);
// return;
var fileName = ['echarts'];
if (!BUILD_CONFIG.source) {
fileName.push('min');
}
fileName.push('js');
saveAs(blob, fileName.join('.'));
}
catch (e) {
console.error(e);
window.open('data:text/plain;charset=utf-8,' + encodeURIComponent(code));
}
}
function builderLog(msg) {
$log.innerHTML += msg + '<br />';
$log.scrollTop = $log.scrollHeight;
}
function jsCompress(source) {
var ast = UglifyJS.parse(source);
/* jshint camelcase: false */
// compressor needs figure_out_scope too
ast.figure_out_scope();
ast = ast.transform(UglifyJS.Compressor());
// need to figure out scope again so mangler works optimally
ast.figure_out_scope();
ast.compute_char_frequency();
ast.mangle_names();
return ast.print_to_string();
}
// Get absolute path. `basePath` can be omitted if moduleId is absolute.
function getAbsolutePath(moduleId, basePath) {
if (npmEntries[moduleId]) {
return npmEntries[moduleId];
}
moduleId = addExt(moduleId);
for (var path in pathsConfig) {
if (pathsConfig.hasOwnProperty(path)) {
if (moduleId.indexOf(path) === 0) {
return moduleId.replace(path, pathsConfig[path]);
}
}
}
if (basePath) {
moduleId = resolve(dir(basePath), moduleId);
}
if (moduleId.charAt(0) !== '/') {
throw new Error('"' + moduleId + '" can not be found.');
}
return moduleId;
}
function addExt(moduleId) {
if (moduleId.split('/').pop().indexOf('.') < 0) {
moduleId += '.js';
}
return moduleId;
}
function ajax(toUrl, timeout) {
toUrl += '?' + urlArgs;
return fetch(toUrl, {
mode: 'cors'
}).then(response => response.text());
}
// Nodejs `path.resolve`.
function resolve() {
var resolvedPath = '';
var resolvedAbsolute;
for (var i = arguments.length - 1; i >= 0 && !resolvedAbsolute; i--) {
var path = arguments[i];
if (path) {
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path[0] === '/';
}
}
if (!resolvedAbsolute) {
throw new Error('At least one absolute path should be input.');
}
// Normalize the path
resolvedPath = normalizePathArray(resolvedPath.split('/'), false).join('/');
return '/' + resolvedPath;
}
// resolves . and .. elements in a path array with directory names there
// must be no slashes or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizePathArray(parts, allowAboveRoot) {
var res = [];
for (var i = 0; i < parts.length; i++) {
var p = parts[i];
// ignore empty parts
if (!p || p === '.') {
continue;
}
if (p === '..') {
if (res.length && res[res.length - 1] !== '..') {
res.pop();
}
else if (allowAboveRoot) {
res.push('..');
}
} else {
res.push(p);
}
}
return res;
}
function dir(path) {
if (path) {
return path.charAt(path.length - 1) === '/' ? path : resolve(path, '..');
}
}
});