Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions draftlogs/8001_fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Include type defs in appropriate partial bundles [[#8001](https://github.com/plotly/plotly.js/pull/8001)]
253 changes: 142 additions & 111 deletions tasks/sync_packages.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ 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 tag = rc ? ' --tag ' + rc.split('.')[0] : '';

var year = (new Date()).getFullYear();
var year = new Date().getFullYear();

var copyrightAndLicense = [
'## Copyright and license',
Expand All @@ -23,11 +23,15 @@ var copyrightAndLicense = [
''
].join('\n');

// Type info for the packages that carry types (plotly.js-dist and plotly.js-dist-min)
const TYPES_MAIN = 'lib/index.d.ts';
const TYPES_FILES = [TYPES_MAIN, 'src/types'];

var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);

// sync "partial bundle" packages
partialBundlePaths
.map(function(d) {
.map(function (d) {
return {
name: 'plotly.js-' + d.name + '-dist',
index: d.index,
Expand All @@ -37,19 +41,22 @@ partialBundlePaths
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
}])
.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,
includeTypes: true
}
])
.forEach(syncPartialBundlePkg);

// sync "minified partial bundle" packages
partialBundlePaths
.map(function(d) {
.map(function (d) {
return {
name: 'plotly.js-' + d.name + '-dist-min',
index: d.index,
Expand All @@ -59,22 +66,25 @@ partialBundlePaths
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
}])
.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,
includeTypes: true
}
])
.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',
desc: 'Ready-to-use plotly.js locales'
});

function syncPartialBundlePkg(d) {
Expand All @@ -93,21 +103,16 @@ function syncPartialBundlePkg(d) {
bugs: pkg.bugs,
author: pkg.author,
keywords: pkg.keywords,
files: [
'LICENSE',
'README.md',
d.main
]
files: ['LICENSE', 'README.md', d.main]
};
if (d.includeTypes) {
cnt.types = TYPES_MAIN;
cnt.files.push(...TYPES_FILES);
}

fs.writeFile(
path.join(pkgPath, 'package.json'),
JSON.stringify(cnt, null, 2) + '\n',
cb
);
fs.writeFile(path.join(pkgPath, 'package.json'), JSON.stringify(cnt, null, 2) + '\n', cb);
}


function writeREADME(cb) {
var cnt = [
'# ' + d.name,
Expand All @@ -127,40 +132,74 @@ function syncPartialBundlePkg(d) {
'',
'```js',
'// ES6 module',
'import Plotly from \'' + d.name + '\'',
"import Plotly from '" + d.name + "'",
'',
'// CommonJS',
'var Plotly = require(\'' + d.name + '\')',
"var Plotly = require('" + d.name + "')",
'```',
'',
...(d.includeTypes
? [
'## TypeScript',
'',
'This package includes its own TypeScript declarations.',
'',
'```ts',
"import Plotly from '" + d.name + "'",
"import type { Data, Layout } from '" + d.name + "'",
'',
"const data: Data[] = [{ type: 'scatter', x: [1, 2, 3], y: [4, 5, 6] }]",
"const layout: Partial<Layout> = { title: { text: 'Demo' } }",
'',
'await Plotly.newPlot(div, data, layout)',
'```',
''
]
: []),
copyrightAndLicense,
'Please visit [complete list of dependencies](https://www.npmjs.com/package/plotly.js/v/' + pkg.version + '?activeTab=dependencies).'
'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
);
fs.writeFile(path.join(pkgPath, 'README.md'), cnt.join('\n'), cb);
}

function copyMain(cb) {
fs.copy(d.dist, path.join(pkgPath, d.main), cb);
}

function copyTypes(cb) {
if (!d.includeTypes) {
cb();
return;
}

// Only include type related files in copy
const isDeclaration = (src) => fs.statSync(src).isDirectory() || src.endsWith('.d.ts');

// Match the type file structure from the full library
runSeries(
[
(cb) => fs.copy(path.join(constants.pathToLib, 'index.d.ts'), path.join(pkgPath, TYPES_MAIN), cb),
(cb) =>
fs.copy(
path.join(constants.pathToSrc, 'types'),
path.join(pkgPath, 'src', 'types'),
{ filter: isDeclaration },
cb
)
],
cb
);
}

var copyLicense = _copyLicense(d, pkgPath);

var publishToNPM = _publishToNPM(d, pkgPath);

runSeries([
initDirectory,
writePackageJSON,
writeREADME,
copyMain,
copyLicense,
publishToNPM
], function(err) {
if(err) throw err;
runSeries([initDirectory, writePackageJSON, writeREADME, copyMain, copyTypes, copyLicense, publishToNPM], (err) => {
if (err) throw err;
});
}

Expand All @@ -172,12 +211,14 @@ function syncLocalesPkg(d) {
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);
});
glob(localeGlob)
.then(function (_localeFiles) {
localeFiles = _localeFiles;
cb();
})
.catch(function (err) {
cb(null);
});
}

function writePackageJSON(cb) {
Expand All @@ -191,18 +232,14 @@ function syncLocalesPkg(d) {
bugs: pkg.bugs,
author: pkg.author,
keywords: pkg.keywords,
files: [
'LICENSE',
'README.md',
d.main
].concat(localeFiles.map(function(f) { return path.basename(f); }))
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
);
fs.writeFile(path.join(pkgPath, 'package.json'), JSON.stringify(cnt, null, 2) + '\n', cb);
}

function writeREADME(cb) {
Expand All @@ -224,72 +261,70 @@ function syncLocalesPkg(d) {
'',
'```js',
'// ES6 module',
'import Plotly from \'plotly.js\'',
'import locale from \'' + d.name + '/fr' + '\'',
"import Plotly from 'plotly.js'",
"import locale from '" + d.name + '/fr' + "'",
'',
'// CommonJS',
'var Plotly = require(\'plotly.js\')',
'var locale = require(\'' + d.name + '/fr\')',
"var Plotly = require('plotly.js')",
"var locale = require('" + d.name + "/fr')",
'',
'// then',
'Plotly.register(locale)',
'Plotly.setPlotConfig({locale: \'fr\'})',
"Plotly.setPlotConfig({locale: 'fr'})",
'```',
'',
copyrightAndLicense
];

fs.writeFile(
path.join(pkgPath, 'README.md'),
cnt.join('\n'),
cb
);
fs.writeFile(path.join(pkgPath, 'README.md'), cnt.join('\n'), cb);
}

function writeMain(cb) {
var cnt = [constants.licenseDist, ''];
localeFiles.forEach(function(f) {
localeFiles.forEach(function (f) {
var n = path.basename(f, '.js');
cnt.push('exports[\'' + n + '\'] = require(\'./' + n + '.js\')');
cnt.push("exports['" + n + "'] = require('./" + n + ".js')");
});
cnt.push('');

fs.writeFile(
path.join(pkgPath, d.main),
cnt.join('\n'),
cb
);
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);
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;
});
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)) {
return function (cb) {
if (common.doesDirExist(pkgPath)) {
cb();
} else {
fs.mkdir(pkgPath, cb);
Expand All @@ -298,22 +333,18 @@ function _initDirectory(d, pkgPath) {
}

function _copyLicense(d, pkgPath) {
return function(cb) {
fs.copy(
path.join(constants.pathToRoot, 'LICENSE'),
path.join(pkgPath, 'LICENSE'),
cb
);
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) {
return function (cb) {
if (process.env.DRYRUN) {
console.log('dry run, did not publish ' + d.name);
cb();
exec('npm publish --dry-run' + tag, { cwd: pkgPath }, cb).stderr.pipe(process.stderr);
return;
}
exec('npm publish' + tag, {cwd: pkgPath}, cb).stdout.pipe(process.stdout);
exec('npm publish' + tag, { cwd: pkgPath }, cb).stdout.pipe(process.stdout);
};
}
Loading