common/scripts/package-utils.js (84 lines of code) (raw):

const path = require('path'); const fs = require('fs'); const PACKAGES_DIR = path.join(__dirname, '..', '..', 'packages'); const SAMPLES_DIR = path.join(__dirname, '..', '..', 'samples'); const TOOLS_DIR = path.join(__dirname, '..', '..', 'tools'); function findAllPackageJSON(root) { return fs.readdirSync(root).map( (pkg) => { const packageJSON = path.join(root, pkg, 'package.json'); const stat = fs.lstatSync(packageJSON); if (!stat.isFile()) { throw new Error(packageJSON + ' does not exist!'); } return packageJSON; } ) } function parsePackage(packagePath) { return JSON.parse(fs.readFileSync(packagePath)); } function overrideAllPackages(packagePaths, packageProcessFunc) { for (const path of packagePaths) { const packageJson = parsePackage(path); const newPackageJson = packageProcessFunc(packageJson); require('fs').writeFileSync(path, JSON.stringify(newPackageJson, null, 2)); } } const updateAllVersions = (versionUpdater) => { const packagePaths = findAllPackageJSON(PACKAGES_DIR); const packageProcessFunc = (packageJson) => { const result = { ...packageJson, version: versionUpdater(packageJson.version) }; return result; } overrideAllPackages(packagePaths, packageProcessFunc); } const updateAllDepVersions = (versionUpdater, deps/* dependency names to update version*/) => { const packagePaths = [...findAllPackageJSON(PACKAGES_DIR), ...findAllPackageJSON(SAMPLES_DIR), ...findAllPackageJSON(TOOLS_DIR)]; const packageProcessFunc = (packageJson) => { const result = { ...packageJson }; updateDependencies(result.dependencies); updateDependencies(result.devDependencies); updateDependencies(result.peerDependencies); return result; } const updateDependencies = (dependencies) => { for (const depName in dependencies) { if (deps.includes(depName)) { dependencies[depName] = versionUpdater(dependencies[depName]); } } } overrideAllPackages(packagePaths, packageProcessFunc); } /** * Remove depedency by name from all packages (packlets, samples and tools) in the repo. * This removes the dependency from dependencies, devDependencies and peerDependencies. * @param {string[]} deps - the name of the dependencies to remove * @internal */ const removeDepsFromAllPackages = (deps) => { const packagePaths = findAllPackageJSON(PACKAGES_DIR); const removeDependencyByName = (dependencies, depName) => { if (typeof dependencies === 'object') { delete dependencies[depName]; } } const packageProcessFunc = (packageJson) => { const result = { ...packageJson }; for (const depName of deps) { removeDependencyByName(result.dependencies, depName); removeDependencyByName(result.devDependencies, depName); removeDependencyByName(result.peerDependencies, depName); }; return result; } overrideAllPackages(packagePaths, packageProcessFunc); } function getAllNames(packagePaths) { return packagePaths.map(path => parsePackage(path).name); } module.exports = { updateAllVersions, updateAllDepVersions, findAllPackageJSON, getAllNames, removeDepsFromAllPackages }