blob: cf6016945e55cef0337e78634d5ed1514bc9a2b4 [file] [log] [blame]
'use strict';
// Update all the dependencies inside packages/node_modules/*/package.json
// to reflect the true dependencies (automatically determined by require())
// and update the version numbers to reflect the version from the top-level
// dependencies list. Also throw an error if a dep is not declared top-level.
var fs = require('fs');
var path = require('path');
var glob = require('glob');
var findRequires = require('find-requires');
var builtinModules = require('builtin-modules');
var uniq = require('lodash.uniq');
var flatten = require('lodash.flatten');
var topPkg = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
var modules = fs.readdirSync('./packages/node_modules');
modules.forEach(function (mod) {
var pkgDir = path.join('./packages/node_modules', mod);
var pkgPath = path.join(pkgDir, 'package.json');
var pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
// for the dependencies, find all require() calls
var srcFiles = glob.sync(path.join(pkgDir, 'lib/**/*.js'));
var uniqDeps = uniq(flatten(srcFiles.map(function (srcFile) {
var code = fs.readFileSync(srcFile, 'utf8');
try {
return findRequires(code);
} catch (e) {
return []; // happens if this is an es6 module, parsing fails
}
}))).filter(function (dep) {
// some modules require() themselves, e.g. for plugins
return dep !== pkg.name &&
// exclude built-ins like 'inherits', 'fs', etc.
builtinModules.indexOf(dep) === -1;
}).sort();
var deps = pkg.dependencies = {};
uniqDeps.forEach(function (dep) {
if (topPkg.dependencies[dep]) {
deps[dep] = topPkg.dependencies[dep];
} else if (modules.indexOf(dep) !== -1) { // core pouchdb-* module
deps[dep] = topPkg.version;
} else {
throw new Error('Unknown dependency ' + dep);
}
});
var jsonString = JSON.stringify(pkg, null, ' ') + '\n';
fs.writeFileSync(pkgPath, jsonString, 'utf8');
});