Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | 2x 2x 2x 2x 2x 50x 50x 9x 9x 9x 50x 15x 35x 35x 8x 2x 6x 27x 27x 27x 6x 21x 44x 44x 30x 11x 9x 32x 1x 32x 17x 22x 32x 18x 2x | const { resolve } = require('path') const fs = require('fs') const semver = require('semver') const { OPTIONS } = require('./constants') /** * Regex used to extract the real name and version from an npm alias */ const NPM_ALIAS_REGEX = /npm:(.+)@(.+)/ /** * Checks that the given node module is installed and satisfies version (throws if not) * @param {string} name - The name of the node module to check * @param {string} version - The version to check against * @returns {[string, string, string, string]} - The [name, version, aliased, installed] installed and checked successfully */ function checkModuleVersion (name, version, optional) { // Update with npm alias if needed ("my-react": "npm:react@^18.2.0") let aliased = '' if (NPM_ALIAS_REGEX.test(version)) { const [, realName, realVersion] = version.match(NPM_ALIAS_REGEX) aliased = `${realName} ` version = realVersion } // Ignore git URLs version if (/^(file:|https?:\/\/|git.*:\/\/|github:|gitlab:|bitbucket:|gist:)/.test(version)) { return [name, version, aliased, 'skipped'] } const jsonPath = resolve('node_modules', name, 'package.json') // Check if module is installed and contains a `package.json` (throw if not optional) if (!fs.existsSync(jsonPath)) { if (optional) { return [name, version, aliased, 'none'] } else { throw new Error(`check-installed module failed for ${name}: installed none, expected ${aliased}${version}`) } } const json = require(jsonPath) const installed = json.version if (version !== 'latest' && !semver.satisfies(json.version, version)) { throw new Error(`check-installed module failed for ${name}: installed ${installed}, expected ${aliased}${version}`) } return [name, version, aliased, installed] } /** * Checks node modules in `package.json` are installed * @param {object} json - The `package.json` JSON object * @param {Partial<typeof import('./constants').OPTIONS>} options - Options for the CLI * @returns {Promise<void>} - Resolves when all modules are checked (throws on check fail) */ async function checkModules (json = {}, options = {}) { const { showSuccess, showModules } = { ...OPTIONS, ...options } // Check modules const modules = [ ...Object.entries(json.dependencies || {}) .map(([name, version]) => checkModuleVersion(name, version, false)), ...Object.entries(json.devDependencies || {}) .map(([name, version]) => checkModuleVersion(name, version, false)), ...Object.entries(json.optionalDependencies || {}) .map(([name, version]) => checkModuleVersion(name, version, true)) ] if (showSuccess) { console.log('check-installed modules successful') } if (showModules) { for (const [name, version, aliased, installed] of modules) { console.log(`${name}: ${installed} (${aliased}${version})`) } } if (showSuccess || showModules) { console.log('') } } module.exports = { checkModules } |