plotly.js
Version:
The open source javascript graphing library that powers plotly
320 lines (285 loc) • 8.79 kB
JavaScript
var path = require('path');
var fs = require('fs-extra');
var exec = require('child_process').exec;
var runSeries = require('run-series');
var { glob } = require('glob');
var common = require('./util/common');
var constants = require('./util/constants');
var pkg = require('../package.json');
var rc = pkg.version.split('-')[1];
var tag = rc ? (' --tag ' + rc.split('.')[0]) : '';
var year = (new Date()).getFullYear();
var copyrightAndLicense = [
'## Copyright and license',
'',
'Code and documentation copyright ' + year + ' Plotly, Inc.',
'',
'Code released under the [MIT license](https://github.com/plotly/plotly.js/blob/master/LICENSE).',
'',
'Docs released under the [Creative Commons license](https://github.com/plotly/documentation/blob/source/LICENSE).',
''
].join('\n');
var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);
// sync "partial bundle" packages
partialBundlePaths
.map(function(d) {
return {
name: 'plotly.js-' + d.name + '-dist',
index: d.index,
main: 'plotly-' + d.name + '.js',
dist: d.dist,
desc: 'Ready-to-use plotly.js ' + d.name + ' distributed bundle.',
traceList: constants.partialBundleTraces[d.name]
};
})
.concat([{
name: 'plotly.js-dist',
index: path.join(constants.pathToLib, 'index.js'),
main: 'plotly.js',
dist: constants.pathToPlotlyDist,
desc: 'Ready-to-use plotly.js distributed bundle.',
traceList: constants.allTraces
}])
.forEach(syncPartialBundlePkg);
// sync "minified partial bundle" packages
partialBundlePaths
.map(function(d) {
return {
name: 'plotly.js-' + d.name + '-dist-min',
index: d.index,
main: 'plotly-' + d.name + '.min.js',
dist: d.distMin,
desc: 'Ready-to-use minified plotly.js ' + d.name + ' distributed bundle.',
traceList: constants.partialBundleTraces[d.name]
};
})
.concat([{
name: 'plotly.js-dist-min',
index: path.join(constants.pathToLib, 'index.js'),
main: 'plotly.min.js',
dist: constants.pathToPlotlyDistMin,
desc: 'Ready-to-use minified plotly.js distributed bundle.',
traceList: constants.allTraces
}])
.forEach(syncPartialBundlePkg);
// sync "locales" package
syncLocalesPkg({
name: 'plotly.js-locales',
dir: path.join(constants.pathToLib, 'locales'),
main: 'index.js',
desc: 'Ready-to-use plotly.js locales',
});
function syncPartialBundlePkg(d) {
var pkgPath = path.join(constants.pathToBuild, d.name);
var initDirectory = _initDirectory(d, pkgPath);
function writePackageJSON(cb) {
var cnt = {
name: d.name,
version: pkg.version,
description: d.desc,
license: pkg.license,
main: d.main,
repository: pkg.repository,
bugs: pkg.bugs,
author: pkg.author,
keywords: pkg.keywords,
files: [
'LICENSE',
'README.md',
d.main
]
};
fs.writeFile(
path.join(pkgPath, 'package.json'),
JSON.stringify(cnt, null, 2) + '\n',
cb
);
}
function writeREADME(cb) {
var cnt = [
'# ' + d.name,
'',
d.desc,
'',
'Contains trace modules ' + common.formatEnumeration(d.traceList) + '.',
'',
'For more info on plotly.js, go to https://github.com/plotly/plotly.js#readme',
'',
'## Installation',
'',
'```',
'npm install ' + d.name,
'```',
'## Usage',
'',
'```js',
'// ES6 module',
'import Plotly from \'' + d.name + '\'',
'',
'// CommonJS',
'var Plotly = require(\'' + d.name + '\')',
'```',
'',
copyrightAndLicense,
'Please visit [complete list of dependencies](https://www.npmjs.com/package/plotly.js/v/' + pkg.version + '?activeTab=dependencies).'
];
fs.writeFile(
path.join(pkgPath, 'README.md'),
cnt.join('\n'),
cb
);
}
function copyMain(cb) {
fs.copy(d.dist, path.join(pkgPath, d.main), cb);
}
var copyLicense = _copyLicense(d, pkgPath);
var publishToNPM = _publishToNPM(d, pkgPath);
runSeries([
initDirectory,
writePackageJSON,
writeREADME,
copyMain,
copyLicense,
publishToNPM
], function(err) {
if(err) throw err;
});
}
function syncLocalesPkg(d) {
var pkgPath = path.join(constants.pathToBuild, d.name);
var initDirectory = _initDirectory(d, pkgPath);
var localeFiles;
function listLocalFiles(cb) {
var localeGlob = path.join(constants.pathToLib, 'locales', '*.js');
glob(localeGlob).then(function(_localeFiles) {
localeFiles = _localeFiles;
cb();
}).catch(function(err) {
cb(null);
});
}
function writePackageJSON(cb) {
var cnt = {
name: d.name,
version: pkg.version,
description: d.desc,
license: pkg.license,
main: d.main,
repository: pkg.repository,
bugs: pkg.bugs,
author: pkg.author,
keywords: pkg.keywords,
files: [
'LICENSE',
'README.md',
d.main
].concat(localeFiles.map(function(f) { return path.basename(f); }))
};
fs.writeFile(
path.join(pkgPath, 'package.json'),
JSON.stringify(cnt, null, 2) + '\n',
cb
);
}
function writeREADME(cb) {
var cnt = [
'# ' + d.name,
'',
d.desc,
'',
'For more info on plotly.js, go to https://github.com/plotly/plotly.js#readme',
'',
'## Installation',
'',
'```',
'npm install ' + d.name,
'```',
'## Usage',
'',
'For example to setup the `fr` locale:',
'',
'```js',
'// ES6 module',
'import Plotly from \'plotly.js\'',
'import locale from \'' + d.name + '/fr' + '\'',
'',
'// CommonJS',
'var Plotly = require(\'plotly.js\')',
'var locale = require(\'' + d.name + '/fr\')',
'',
'// then',
'Plotly.register(locale)',
'Plotly.setPlotConfig({locale: \'fr\'})',
'```',
'',
copyrightAndLicense
];
fs.writeFile(
path.join(pkgPath, 'README.md'),
cnt.join('\n'),
cb
);
}
function writeMain(cb) {
var cnt = [constants.licenseDist, ''];
localeFiles.forEach(function(f) {
var n = path.basename(f, '.js');
cnt.push('exports[\'' + n + '\'] = require(\'./' + n + '.js\')');
});
cnt.push('');
fs.writeFile(
path.join(pkgPath, d.main),
cnt.join('\n'),
cb
);
}
function copyLocaleFiles(cb) {
runSeries(localeFiles.map(function(f) {
return function(cb) {
fs.copy(f, path.join(pkgPath, path.basename(f)), cb);
};
}), cb);
}
var copyLicense = _copyLicense(d, pkgPath);
var publishToNPM = _publishToNPM(d, pkgPath);
runSeries([
initDirectory,
listLocalFiles,
writePackageJSON,
writeREADME,
writeMain,
copyLocaleFiles,
copyLicense,
publishToNPM
], function(err) {
if(err) throw err;
});
}
function _initDirectory(d, pkgPath) {
return function(cb) {
if(common.doesDirExist(pkgPath)) {
cb();
} else {
fs.mkdir(pkgPath, cb);
}
};
}
function _copyLicense(d, pkgPath) {
return function(cb) {
fs.copy(
path.join(constants.pathToRoot, 'LICENSE'),
path.join(pkgPath, 'LICENSE'),
cb
);
};
}
function _publishToNPM(d, pkgPath) {
return function(cb) {
if(process.env.DRYRUN) {
console.log('dry run, did not publish ' + d.name);
cb();
return;
}
exec('npm publish' + tag, {cwd: pkgPath}, cb).stdout.pipe(process.stdout);
};
}