| 1 | #!/usr/bin/env node |
| 2 | |
| 3 | 'use strict'; |
| 4 | |
| 5 | const {readJson} = require('fs-extra'); |
| 6 | const {join} = require('path'); |
| 7 | const theme = require('../theme'); |
| 8 | const {execRead} = require('../utils'); |
| 9 | |
| 10 | const readPackageJSON = async (cwd, name) => { |
| 11 | const packageJSONPath = join( |
| 12 | cwd, |
| 13 | 'build', |
| 14 | 'node_modules', |
| 15 | name, |
| 16 | 'package.json' |
| 17 | ); |
| 18 | return await readJson(packageJSONPath); |
| 19 | }; |
| 20 | |
| 21 | const run = async ({cwd, packages, skipPackages}) => { |
| 22 | if (skipPackages.length === 0) { |
| 23 | return; |
| 24 | } |
| 25 | |
| 26 | const validateDependencies = async (name, dependencies) => { |
| 27 | if (!dependencies) { |
| 28 | return; |
| 29 | } |
| 30 | |
| 31 | for (let dependency in dependencies) { |
| 32 | // Do we depend on a package that has been skipped? |
| 33 | if (skipPackages.includes(dependency)) { |
| 34 | const version = dependencies[dependency]; |
| 35 | // Do we depend on a version of the package that has not been published to NPM? |
| 36 | const info = await execRead(`npm view ${dependency}@${version}`); |
| 37 | if (!info) { |
| 38 | console.log( |
| 39 | theme`{error Package} {package ${name}} {error depends on an unpublished skipped package}`, |
| 40 | theme`{package ${dependency}}@{version ${version}}` |
| 41 | ); |
| 42 | process.exit(1); |
| 43 | } |
| 44 | } |
| 45 | } |
| 46 | }; |
| 47 | |
| 48 | // Make sure none of the other packages depend on a skipped package, |
| 49 | // unless the dependency has already been published to NPM. |
| 50 | for (let i = 0; i < packages.length; i++) { |
| 51 | const name = packages[i]; |
| 52 | const {dependencies, peerDependencies} = await readPackageJSON(cwd, name); |
| 53 | |
| 54 | validateDependencies(name, dependencies); |
| 55 | validateDependencies(name, peerDependencies); |
| 56 | } |
| 57 | }; |
| 58 | |
| 59 | module.exports = run; |