JezK
Edit File: check.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.hasWrapper = hasWrapper; exports.requireLockfile = exports.noArguments = void 0; exports.run = run; exports.setFlags = setFlags; exports.verifyTreeCheck = verifyTreeCheck; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _slicedToArray2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); _slicedToArray2 = function _slicedToArray2() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _errors() { var data = require("../../errors.js"); _errors = function _errors() { return data; }; return data; } function _integrityChecker() { var data = _interopRequireWildcard(require("../../integrity-checker.js")); _integrityChecker = function _integrityChecker() { return data; }; return data; } function _lockfile() { var data = _interopRequireDefault(require("../../lockfile")); _lockfile = function _lockfile() { return data; }; return data; } function fs() { var data = _interopRequireWildcard(require("../../util/fs.js")); fs = function fs() { return data; }; return data; } function _install() { var data = require("./install.js"); _install = function _install() { return data; }; return data; } function _normalizePattern2() { var data = require("../../util/normalize-pattern.js"); _normalizePattern2 = function _normalizePattern2() { return data; }; return data; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var semver = require('semver'); var path = require('path'); var requireLockfile = false; exports.requireLockfile = requireLockfile; var noArguments = true; exports.noArguments = noArguments; function hasWrapper(commander) { return true; } function setFlags(commander) { commander.description('Verifies if versions in the current project’s package.json match that of yarn’s lock file.'); commander.option('--integrity'); commander.option('--verify-tree'); } function verifyTreeCheck(_x, _x2, _x3, _x4) { return _verifyTreeCheck.apply(this, arguments); } function _verifyTreeCheck() { _verifyTreeCheck = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(config, reporter, flags, args) { var errCount, reportError, registryName, registryFolder, cwd, rootManifest, dependenciesToCheckVersion, name, version, isLinkedDependency, _name, _version, _isLinkedDependency, locationsVisited, dep, manifestLoc, pkg, dependencies, subdep, subDepPath, found, relative, locations, possiblePath; return _regenerator()["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: reportError = function _reportError(msg) { for (var _len = arguments.length, vars = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { vars[_key - 1] = arguments[_key]; } reporter.error(reporter.lang.apply(reporter, [msg].concat(vars))); errCount++; }; errCount = 0; // check all dependencies recursively without relying on internal resolver registryName = 'yarn'; registryFolder = config.registryFolders[0]; cwd = config.workspaceRootFolder ? config.lockfileFolder : config.cwd; _context.next = 7; return config.readManifest(cwd, registryName); case 7: rootManifest = _context.sent; dependenciesToCheckVersion = []; if (!rootManifest.dependencies) { _context.next = 20; break; } _context.t0 = _regenerator()["default"].keys(rootManifest.dependencies); case 11: if ((_context.t1 = _context.t0()).done) { _context.next = 20; break; } name = _context.t1.value; version = rootManifest.dependencies[name]; // skip linked dependencies isLinkedDependency = /^link:/i.test(version) || /^file:/i.test(version) && config.linkFileDependencies; if (!isLinkedDependency) { _context.next = 17; break; } return _context.abrupt("continue", 11); case 17: dependenciesToCheckVersion.push({ name: name, originalKey: name, parentCwd: cwd, version: version }); _context.next = 11; break; case 20: if (!(rootManifest.devDependencies && !config.production)) { _context.next = 31; break; } _context.t2 = _regenerator()["default"].keys(rootManifest.devDependencies); case 22: if ((_context.t3 = _context.t2()).done) { _context.next = 31; break; } _name = _context.t3.value; _version = rootManifest.devDependencies[_name]; // skip linked dependencies _isLinkedDependency = /^link:/i.test(_version) || /^file:/i.test(_version) && config.linkFileDependencies; if (!_isLinkedDependency) { _context.next = 28; break; } return _context.abrupt("continue", 22); case 28: dependenciesToCheckVersion.push({ name: _name, originalKey: _name, parentCwd: cwd, version: _version }); _context.next = 22; break; case 31: locationsVisited = new Set(); case 32: if (!dependenciesToCheckVersion.length) { _context.next = 84; break; } dep = dependenciesToCheckVersion.shift(); manifestLoc = path.resolve(dep.parentCwd, registryFolder, dep.name); if (!locationsVisited.has(manifestLoc + "@".concat(dep.version))) { _context.next = 37; break; } return _context.abrupt("continue", 32); case 37: locationsVisited.add(manifestLoc + "@".concat(dep.version)); // When plugnplay is enabled, packages aren't copied to the node_modules folder, so this check doesn't make sense // TODO: We ideally should check that the packages are located inside the cache instead if (!config.plugnplayEnabled) { _context.next = 40; break; } return _context.abrupt("continue", 32); case 40: _context.next = 42; return fs().exists(manifestLoc); case 42: if (_context.sent) { _context.next = 45; break; } reportError('packageNotInstalled', "".concat(dep.originalKey)); return _context.abrupt("continue", 32); case 45: _context.next = 47; return fs().exists(path.join(manifestLoc, 'package.json')); case 47: if (_context.sent) { _context.next = 49; break; } return _context.abrupt("continue", 32); case 49: _context.next = 51; return config.readManifest(manifestLoc, registryName); case 51: pkg = _context.sent; if (!(semver.validRange(dep.version, config.looseSemver) && !semver.satisfies(pkg.version, dep.version, config.looseSemver))) { _context.next = 55; break; } reportError('packageWrongVersion', dep.originalKey, dep.version, pkg.version); return _context.abrupt("continue", 32); case 55: dependencies = pkg.dependencies; if (!dependencies) { _context.next = 82; break; } _context.t4 = _regenerator()["default"].keys(dependencies); case 58: if ((_context.t5 = _context.t4()).done) { _context.next = 82; break; } subdep = _context.t5.value; subDepPath = path.resolve(manifestLoc, registryFolder, subdep); found = false; relative = path.relative(cwd, subDepPath); locations = path.normalize(relative).split(registryFolder + path.sep).filter(function (dir) { return !!dir; }); locations.pop(); case 65: if (!(locations.length >= 0)) { _context.next = 79; break; } possiblePath = void 0; if (locations.length > 0) { possiblePath = path.join(cwd, registryFolder, locations.join(path.sep + registryFolder + path.sep)); } else { possiblePath = cwd; } _context.next = 70; return fs().exists(path.resolve(possiblePath, registryFolder, subdep)); case 70: if (!_context.sent) { _context.next = 74; break; } dependenciesToCheckVersion.push({ name: subdep, originalKey: "".concat(dep.originalKey, "#").concat(subdep), parentCwd: possiblePath, version: dependencies[subdep] }); found = true; return _context.abrupt("break", 79); case 74: if (locations.length) { _context.next = 76; break; } return _context.abrupt("break", 79); case 76: locations.pop(); _context.next = 65; break; case 79: if (!found) { reportError('packageNotInstalled', "".concat(dep.originalKey, "#").concat(subdep)); } _context.next = 58; break; case 82: _context.next = 32; break; case 84: if (!(errCount > 0)) { _context.next = 88; break; } throw new (_errors().MessageError)(reporter.lang('foundErrors', errCount)); case 88: reporter.success(reporter.lang('folderInSync')); case 89: case "end": return _context.stop(); } }, _callee); })); return _verifyTreeCheck.apply(this, arguments); } function integrityHashCheck(_x5, _x6, _x7, _x8) { return _integrityHashCheck.apply(this, arguments); } function _integrityHashCheck() { _integrityHashCheck = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee2(config, reporter, flags, args) { var errCount, reportError, integrityChecker, lockfile, install, _yield$install$fetchR, patterns, workspaceLayout, match, _iterator, _step, pattern; return _regenerator()["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: reportError = function _reportError2(msg) { for (var _len2 = arguments.length, vars = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { vars[_key2 - 1] = arguments[_key2]; } reporter.error(reporter.lang.apply(reporter, [msg].concat(vars))); errCount++; }; errCount = 0; integrityChecker = new (_integrityChecker()["default"])(config); _context2.next = 5; return _lockfile()["default"].fromDirectory(config.cwd); case 5: lockfile = _context2.sent; install = new (_install().Install)(flags, config, reporter, lockfile); // get patterns that are installed when running `yarn install` _context2.next = 9; return install.fetchRequestFromCwd(); case 9: _yield$install$fetchR = _context2.sent; patterns = _yield$install$fetchR.patterns; workspaceLayout = _yield$install$fetchR.workspaceLayout; _context2.next = 14; return integrityChecker.check(patterns, lockfile.cache, flags, workspaceLayout); case 14: match = _context2.sent; _iterator = _createForOfIteratorHelper(match.missingPatterns); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { pattern = _step.value; reportError('lockfileNotContainPattern', pattern); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (match.integrityFileMissing) { reportError('noIntegrityFile'); } if (match.integrityMatches === false) { reporter.warn(reporter.lang(_integrityChecker().integrityErrors[match.integrityError])); reportError('integrityCheckFailed'); } if (!(errCount > 0)) { _context2.next = 23; break; } throw new (_errors().MessageError)(reporter.lang('foundErrors', errCount)); case 23: reporter.success(reporter.lang('folderInSync')); case 24: case "end": return _context2.stop(); } }, _callee2); })); return _integrityHashCheck.apply(this, arguments); } function run(_x9, _x10, _x11, _x12, _x13) { return _run.apply(this, arguments); } function _run() { _run = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee3(config, reporter, commander, flags, args) { var lockfile, install, humaniseLocation, warningCount, errCount, reportError, _yield$install$hydrat, rawPatterns, workspaceLayout, patterns, _iterator2, _step2, pattern, bundledDeps, res, _iterator3, _step3, _step3$value, loc, _step3$value$, originalKey, pkg, ignore, parts, human, hoistedParts, hoistedKey, humanParts, i, humanPart, remoteType, isLinkedDependency, isResolution, pkgLoc, packageJson, deps, name, range, subHuman, possibles, depLoc, _i, myParts, myDepPkgLoc, _myDepPkgLoc, depPkgLoc, depPkg, foundHuman, resPattern, resHuman, _normalizePattern, resRange, _iterator4, _step4, _loc, locPkg, _packageJson, packagePath, rootDep, packageName, bundledDep; return _regenerator()["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: reportError = function _reportError3(msg) { for (var _len3 = arguments.length, vars = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { vars[_key3 - 1] = arguments[_key3]; } reporter.error(reporter.lang.apply(reporter, [msg].concat(vars))); errCount++; }; humaniseLocation = function _humaniseLocation(loc) { var relative = path.relative(path.join(config.cwd, 'node_modules'), loc); var normalized = path.normalize(relative).split(path.sep); return normalized.filter(function (p) { return p !== 'node_modules'; }).reduce(function (result, part) { var length = result.length; if (length && result[length - 1].startsWith('@') && result[length - 1].indexOf(path.sep) === -1) { result[length - 1] += path.sep + part; } else { result.push(part); } return result; }, []); }; if (!flags.verifyTree) { _context3.next = 8; break; } _context3.next = 5; return verifyTreeCheck(config, reporter, flags, args); case 5: return _context3.abrupt("return"); case 8: if (!flags.integrity) { _context3.next = 12; break; } _context3.next = 11; return integrityHashCheck(config, reporter, flags, args); case 11: return _context3.abrupt("return"); case 12: _context3.next = 14; return _lockfile()["default"].fromDirectory(config.cwd); case 14: lockfile = _context3.sent; install = new (_install().Install)(flags, config, reporter, lockfile); warningCount = 0; errCount = 0; _context3.next = 20; return install.hydrate(); case 20: _yield$install$hydrat = _context3.sent; rawPatterns = _yield$install$hydrat.patterns; workspaceLayout = _yield$install$hydrat.workspaceLayout; _context3.next = 25; return install.flatten(rawPatterns); case 25: patterns = _context3.sent; // check if patterns exist in lockfile _iterator2 = _createForOfIteratorHelper(patterns); try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { pattern = _step2.value; if (!lockfile.getLocked(pattern) && (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern))) { reportError('lockfileNotContainPattern', pattern); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } bundledDeps = {}; // check if any of the node_modules are out of sync _context3.next = 31; return install.linker.getFlatHoistedTree(patterns, workspaceLayout); case 31: res = _context3.sent; _iterator3 = _createForOfIteratorHelper(res); _context3.prev = 33; _iterator3.s(); case 35: if ((_step3 = _iterator3.n()).done) { _context3.next = 131; break; } _step3$value = (0, _slicedToArray2()["default"])(_step3.value, 2), loc = _step3$value[0], _step3$value$ = _step3$value[1], originalKey = _step3$value$.originalKey, pkg = _step3$value$.pkg, ignore = _step3$value$.ignore; if (!ignore) { _context3.next = 39; break; } return _context3.abrupt("continue", 129); case 39: parts = humaniseLocation(loc); // grey out hoisted portions of key human = originalKey; hoistedParts = parts.slice(); hoistedKey = parts.join('#'); if (human !== hoistedKey) { humanParts = human.split('#'); for (i = 0; i < humanParts.length; i++) { humanPart = humanParts[i]; if (hoistedParts[0] === humanPart) { hoistedParts.shift(); if (i < humanParts.length - 1) { humanParts[i] += '#'; } } else { humanParts[i] = reporter.format.dim("".concat(humanPart, "#")); } } human = humanParts.join(''); } // skip unnecessary checks for linked dependencies remoteType = pkg._reference.remote.type; isLinkedDependency = remoteType === 'link' || remoteType === 'workspace' || remoteType === 'file' && config.linkFileDependencies; isResolution = pkg._reference.hint === 'resolution'; if (!(isLinkedDependency || isResolution)) { _context3.next = 49; break; } return _context3.abrupt("continue", 129); case 49: _context3.next = 51; return fs().exists(loc); case 51: if (_context3.sent) { _context3.next = 54; break; } if (pkg._reference.optional) { reporter.warn(reporter.lang('optionalDepNotInstalled', human)); } else { reportError('packageNotInstalled', human); } return _context3.abrupt("continue", 129); case 54: pkgLoc = path.join(loc, 'package.json'); _context3.next = 57; return fs().exists(pkgLoc); case 57: if (!_context3.sent) { _context3.next = 129; break; } _context3.next = 60; return config.readJson(pkgLoc); case 60: packageJson = _context3.sent; packageJson.version = semver.clean(packageJson.version); if (pkg.version !== packageJson.version) { // node_modules contains wrong version reportError('packageWrongVersion', human, pkg.version, packageJson.version); } deps = Object.assign({}, packageJson.dependencies, packageJson.peerDependencies); bundledDeps[packageJson.name] = packageJson.bundledDependencies || []; _context3.t0 = _regenerator()["default"].keys(deps); case 66: if ((_context3.t1 = _context3.t0()).done) { _context3.next = 129; break; } name = _context3.t1.value; range = deps[name]; if (semver.validRange(range, config.looseSemver)) { _context3.next = 71; break; } return _context3.abrupt("continue", 66); case 71: subHuman = "".concat(human, "#").concat(name, "@").concat(range); // find the package that this will resolve to, factoring in hoisting possibles = []; depLoc = void 0; for (_i = parts.length; _i >= 0; _i--) { myParts = parts.slice(0, _i).concat(name); // build package.json location for this position myDepPkgLoc = path.join(config.cwd, 'node_modules', myParts.join("".concat(path.sep, "node_modules").concat(path.sep))); possibles.push(myDepPkgLoc); } case 75: if (!possibles.length) { _context3.next = 84; break; } _myDepPkgLoc = possibles.shift(); _context3.next = 79; return fs().exists(_myDepPkgLoc); case 79: if (!_context3.sent) { _context3.next = 82; break; } depLoc = _myDepPkgLoc; return _context3.abrupt("break", 84); case 82: _context3.next = 75; break; case 84: if (depLoc) { _context3.next = 86; break; } return _context3.abrupt("continue", 66); case 86: depPkgLoc = path.join(depLoc, 'package.json'); _context3.next = 89; return fs().exists(depPkgLoc); case 89: if (!_context3.sent) { _context3.next = 127; break; } _context3.next = 92; return config.readJson(depPkgLoc); case 92: depPkg = _context3.sent; foundHuman = "".concat(humaniseLocation(path.dirname(depPkgLoc)).join('#'), "@").concat(depPkg.version); if (semver.satisfies(depPkg.version, range, config.looseSemver)) { _context3.next = 98; break; } // module isn't correct semver resPattern = install.resolutionMap.find(name, originalKey.split('#')); if (resPattern) { resHuman = "".concat(human, "#").concat(resPattern); _normalizePattern = (0, _normalizePattern2().normalizePattern)(resPattern), resRange = _normalizePattern.range; if (semver.satisfies(depPkg.version, resRange, config.looseSemver)) { reporter.warn(reporter.lang('incompatibleResolutionVersion', foundHuman, subHuman)); warningCount++; } else { reportError('packageDontSatisfy', resHuman, foundHuman); } } else { reportError('packageDontSatisfy', subHuman, foundHuman); } return _context3.abrupt("continue", 66); case 98: // check for modules above us that this could be deduped to _iterator4 = _createForOfIteratorHelper(possibles); _context3.prev = 99; _iterator4.s(); case 101: if ((_step4 = _iterator4.n()).done) { _context3.next = 119; break; } _loc = _step4.value; locPkg = path.join(_loc, 'package.json'); _context3.next = 106; return fs().exists(locPkg); case 106: if (_context3.sent) { _context3.next = 108; break; } return _context3.abrupt("continue", 117); case 108: _context3.next = 110; return config.readJson(locPkg); case 110: _packageJson = _context3.sent; packagePath = originalKey.split('#'); rootDep = packagePath[0]; packageName = packagePath[1] || _packageJson.name; bundledDep = bundledDeps[rootDep] && bundledDeps[rootDep].indexOf(packageName) !== -1; if (!bundledDep && (_packageJson.version === depPkg.version || semver.satisfies(_packageJson.version, range, config.looseSemver) && semver.gt(_packageJson.version, depPkg.version, config.looseSemver))) { reporter.warn(reporter.lang('couldBeDeduped', subHuman, _packageJson.version, "".concat(humaniseLocation(path.dirname(locPkg)).join('#'), "@").concat(_packageJson.version))); warningCount++; } return _context3.abrupt("break", 119); case 117: _context3.next = 101; break; case 119: _context3.next = 124; break; case 121: _context3.prev = 121; _context3.t2 = _context3["catch"](99); _iterator4.e(_context3.t2); case 124: _context3.prev = 124; _iterator4.f(); return _context3.finish(124); case 127: _context3.next = 66; break; case 129: _context3.next = 35; break; case 131: _context3.next = 136; break; case 133: _context3.prev = 133; _context3.t3 = _context3["catch"](33); _iterator3.e(_context3.t3); case 136: _context3.prev = 136; _iterator3.f(); return _context3.finish(136); case 139: if (warningCount > 1) { reporter.info(reporter.lang('foundWarnings', warningCount)); } if (!(errCount > 0)) { _context3.next = 144; break; } throw new (_errors().MessageError)(reporter.lang('foundErrors', errCount)); case 144: reporter.success(reporter.lang('folderInSync')); case 145: case "end": return _context3.stop(); } }, _callee3, null, [[33, 133, 136, 139], [99, 121, 124, 127]]); })); return _run.apply(this, arguments); } //# sourceMappingURL=check.js.map