UNPKG

@dependabot/yarn-lib

Version:

📦🐈 Fast, reliable, and secure dependency management.

444 lines (363 loc) 15.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _asyncToGenerator2; function _load_asyncToGenerator() { return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator')); } var _constants; function _load_constants() { return _constants = require('../../constants'); } var _util; function _load_util() { return _util = require('./util.js'); } var _index; function _load_index() { return _index = require('../../resolvers/index.js'); } var _inferLicense; function _load_inferLicense() { return _inferLicense = _interopRequireDefault(require('./infer-license.js')); } var _fs; function _load_fs() { return _fs = _interopRequireWildcard(require('../fs.js')); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const semver = require('semver'); const path = require('path'); const url = require('url'); const LICENSE_RENAMES = { 'MIT/X11': 'MIT', X11: 'MIT' }; exports.default = (() => { var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (info, moduleLoc, reporter, warn, looseSemver) { const files = yield (_fs || _load_fs()).readdir(moduleLoc); // clean info.version if (typeof info.version === 'string') { info.version = semver.clean(info.version, looseSemver) || info.version; } // if name or version aren't set then set them to empty strings info.name = info.name || ''; info.version = info.version || ''; // if the man field is a string then coerce it to an array if (typeof info.man === 'string') { info.man = [info.man]; } // if the keywords field is a string then split it on any whitespace if (typeof info.keywords === 'string') { info.keywords = info.keywords.split(/\s+/g); } // if there's no contributors field but an authors field then expand it if (!info.contributors && files.indexOf('AUTHORS') >= 0) { const authorsFilepath = path.join(moduleLoc, 'AUTHORS'); const authorsFilestats = yield (_fs || _load_fs()).stat(authorsFilepath); if (authorsFilestats.isFile()) { let authors = yield (_fs || _load_fs()).readFile(authorsFilepath); authors = authors.split(/\r?\n/g) // split on lines .map(function (line) { return line.replace(/^\s*#.*$/, '').trim(); }) // remove comments .filter(function (line) { return !!line; }); // remove empty lines info.contributors = authors; } } // expand people fields to objects if (typeof info.author === 'string' || typeof info.author === 'object') { info.author = (0, (_util || _load_util()).normalizePerson)(info.author); } if (Array.isArray(info.contributors)) { info.contributors = info.contributors.map((_util || _load_util()).normalizePerson); } if (Array.isArray(info.maintainers)) { info.maintainers = info.maintainers.map((_util || _load_util()).normalizePerson); } // if there's no readme field then load the README file from the cwd if (!info.readme) { const readmeCandidates = files.filter(function (filename) { const lower = filename.toLowerCase(); return lower === 'readme' || lower.indexOf('readme.') === 0; }).sort(function (filename1, filename2) { // favor files with extensions return filename2.indexOf('.') - filename1.indexOf('.'); }); for (var _iterator = readmeCandidates, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref2; if (_isArray) { if (_i >= _iterator.length) break; _ref2 = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref2 = _i.value; } const readmeFilename = _ref2; const readmeFilepath = path.join(moduleLoc, readmeFilename); const readmeFileStats = yield (_fs || _load_fs()).stat(readmeFilepath); if (readmeFileStats.isFile()) { info.readmeFilename = readmeFilename; info.readme = yield (_fs || _load_fs()).readFile(readmeFilepath); break; } } } // if there's no description then take the first paragraph from the readme if (!info.description && info.readme) { const desc = (0, (_util || _load_util()).extractDescription)(info.readme); if (desc) { info.description = desc; } } // support array of engine keys if (Array.isArray(info.engines)) { const engines = {}; for (var _iterator2 = info.engines, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref3; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref3 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref3 = _i2.value; } const str = _ref3; if (typeof str === 'string') { var _str$trim$split = str.trim().split(/ +/g); const name = _str$trim$split[0], patternParts = _str$trim$split.slice(1); engines[name] = patternParts.join(' '); } } info.engines = engines; } // if the repository field is a string then assume it's a git repo and expand it if (typeof info.repository === 'string') { info.repository = { type: 'git', url: info.repository }; } const repo = info.repository; // explode info.repository.url if it's a hosted git shorthand if (repo && typeof repo === 'object' && typeof repo.url === 'string') { repo.url = (0, (_index || _load_index()).hostedGitFragmentToGitUrl)(repo.url, reporter); } // allow bugs to be specified as a string, expand it to an object with a single url prop if (typeof info.bugs === 'string') { info.bugs = { url: info.bugs }; } // normalize homepage url to http if (typeof info.homepage === 'string') { const parts = url.parse(info.homepage); parts.protocol = parts.protocol || 'http:'; if (parts.pathname && !parts.hostname) { parts.hostname = parts.pathname; parts.pathname = ''; } info.homepage = url.format(parts); } // if the `bin` field is as string then expand it to an object with a single property // based on the original `bin` field and `name field` // { name: "foo", bin: "cli.js" } -> { name: "foo", bin: { foo: "cli.js" } } if (typeof info.name === 'string' && typeof info.bin === 'string') { // Remove scoped package name for consistency with NPM's bin field fixing behaviour const name = info.name.replace(/^@[^\/]+\//, ''); info.bin = { [name]: info.bin }; } // bundleDependencies is an alias for bundledDependencies if (info.bundledDependencies) { info.bundleDependencies = info.bundledDependencies; delete info.bundledDependencies; } let scripts; // dummy script object to shove file inferred scripts onto if (info.scripts && typeof info.scripts === 'object') { scripts = info.scripts; } else { scripts = {}; } // if there's a server.js file and no start script then set it to `node server.js` if (!scripts.start && files.indexOf('server.js') >= 0) { scripts.start = 'node server.js'; } // if there's a binding.gyp file and no install script then set it to `node-gyp rebuild` if (!scripts.install && files.indexOf('binding.gyp') >= 0) { scripts.install = 'node-gyp rebuild'; } // set scripts if we've polluted the empty object if (Object.keys(scripts).length) { info.scripts = scripts; } const dirs = info.directories; if (dirs && typeof dirs === 'object') { const binDir = dirs.bin; if (!info.bin && binDir && typeof binDir === 'string') { const bin = info.bin = {}; const fullBinDir = path.join(moduleLoc, binDir); if (yield (_fs || _load_fs()).exists(fullBinDir)) { for (var _iterator3 = yield (_fs || _load_fs()).readdir(fullBinDir), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref4; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref4 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref4 = _i3.value; } const scriptName = _ref4; if (scriptName[0] === '.') { continue; } bin[scriptName] = path.join('.', binDir, scriptName); } } else { warn(reporter.lang('manifestDirectoryNotFound', binDir, info.name)); } } const manDir = dirs.man; if (!info.man && typeof manDir === 'string') { const man = info.man = []; const fullManDir = path.join(moduleLoc, manDir); if (yield (_fs || _load_fs()).exists(fullManDir)) { for (var _iterator4 = yield (_fs || _load_fs()).readdir(fullManDir), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref5; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref5 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref5 = _i4.value; } const filename = _ref5; if (/^(.*?)\.[0-9]$/.test(filename)) { man.push(path.join('.', manDir, filename)); } } } else { warn(reporter.lang('manifestDirectoryNotFound', manDir, info.name)); } } } delete info.directories; // normalize licenses field const licenses = info.licenses; if (Array.isArray(licenses) && !info.license) { let licenseTypes = []; for (var _iterator5 = licenses, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref6; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref6 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref6 = _i5.value; } let license = _ref6; if (license && typeof license === 'object') { license = license.type; } if (typeof license === 'string') { licenseTypes.push(license); } } licenseTypes = licenseTypes.filter((_util || _load_util()).isValidLicense); if (licenseTypes.length === 1) { info.license = licenseTypes[0]; } else if (licenseTypes.length) { info.license = `(${licenseTypes.join(' OR ')})`; } } const license = info.license; // normalize license if (license && typeof license === 'object') { info.license = license.type; } // get license file const licenseFile = files.find(function (filename) { const lower = filename.toLowerCase(); return lower === 'license' || lower.startsWith('license.') || lower === 'unlicense' || lower.startsWith('unlicense.'); }); if (licenseFile) { const licenseFilepath = path.join(moduleLoc, licenseFile); const licenseFileStats = yield (_fs || _load_fs()).stat(licenseFilepath); if (licenseFileStats.isFile()) { const licenseContent = yield (_fs || _load_fs()).readFile(licenseFilepath); const inferredLicense = (0, (_inferLicense || _load_inferLicense()).default)(licenseContent); info.licenseText = licenseContent; const license = info.license; if (typeof license === 'string') { if (inferredLicense && (0, (_util || _load_util()).isValidLicense)(inferredLicense) && !(0, (_util || _load_util()).isValidLicense)(license)) { // some packages don't specify their license version but we can infer it based on their license file const basicLicense = license.toLowerCase().replace(/(-like|\*)$/g, ''); const expandedLicense = inferredLicense.toLowerCase(); if (expandedLicense.startsWith(basicLicense)) { // TODO consider doing something to notify the user info.license = inferredLicense; } } } else if (inferredLicense) { // if there's no license then infer it based on the license file info.license = inferredLicense; } else { // valid expression to refer to a license in a file info.license = `SEE LICENSE IN ${licenseFile}`; } } } if (typeof info.license === 'string') { // sometimes licenses are known by different names, reduce them info.license = LICENSE_RENAMES[info.license] || info.license; } else if (typeof info.readme === 'string') { // the license might be at the bottom of the README const inferredLicense = (0, (_inferLicense || _load_inferLicense()).default)(info.readme); if (inferredLicense) { info.license = inferredLicense; } } // get notice file const noticeFile = files.find(function (filename) { const lower = filename.toLowerCase(); return lower === 'notice' || lower.startsWith('notice.'); }); if (noticeFile) { const noticeFilepath = path.join(moduleLoc, noticeFile); const noticeFileStats = yield (_fs || _load_fs()).stat(noticeFilepath); if (noticeFileStats.isFile()) { info.noticeText = yield (_fs || _load_fs()).readFile(noticeFilepath); } } for (var _iterator6 = (_constants || _load_constants()).MANIFEST_FIELDS, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref7; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref7 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref7 = _i6.value; } const dependencyType = _ref7; const dependencyList = info[dependencyType]; if (dependencyList && typeof dependencyList === 'object') { delete dependencyList['//']; for (const name in dependencyList) { dependencyList[name] = dependencyList[name] || ''; } } } }); return function (_x, _x2, _x3, _x4, _x5) { return _ref.apply(this, arguments); }; })();