diff options
Diffstat (limited to 'node_modules/normalize-package-data/lib/fixer.js')
-rw-r--r-- | node_modules/normalize-package-data/lib/fixer.js | 434 |
1 files changed, 245 insertions, 189 deletions
diff --git a/node_modules/normalize-package-data/lib/fixer.js b/node_modules/normalize-package-data/lib/fixer.js index 27682e961..97c26b26b 100644 --- a/node_modules/normalize-package-data/lib/fixer.js +++ b/node_modules/normalize-package-data/lib/fixer.js @@ -1,87 +1,94 @@ -var semver = require("semver") -var validateLicense = require('validate-npm-package-license'); -var hostedGitInfo = require("hosted-git-info") -var isBuiltinModule = require("resolve").isCore -var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = require("./extract_description") -var url = require("url") -var typos = require("./typos.json") - -var fixer = module.exports = { +var isValidSemver = require('semver/functions/valid') +var cleanSemver = require('semver/functions/clean') +var validateLicense = require('validate-npm-package-license') +var hostedGitInfo = require('hosted-git-info') +var isBuiltinModule = require('is-core-module') +var depTypes = ['dependencies', 'devDependencies', 'optionalDependencies'] +var extractDescription = require('./extract_description') +var url = require('url') +var typos = require('./typos.json') + +module.exports = { // default warning function - warn: function() {}, + warn: function () {}, - fixRepositoryField: function(data) { + fixRepositoryField: function (data) { if (data.repositories) { - this.warn("repositories"); + this.warn('repositories') data.repository = data.repositories[0] } - if (!data.repository) return this.warn("missingRepository") - if (typeof data.repository === "string") { + if (!data.repository) { + return this.warn('missingRepository') + } + if (typeof data.repository === 'string') { data.repository = { - type: "git", - url: data.repository + type: 'git', + url: data.repository, } } - var r = data.repository.url || "" + var r = data.repository.url || '' if (r) { var hosted = hostedGitInfo.fromUrl(r) if (hosted) { r = data.repository.url - = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + = hosted.getDefaultRepresentation() === 'shortcut' ? hosted.https() : hosted.toString() } } - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - this.warn("brokenGitUrl", r) + if (r.match(/github.com\/[^/]+\/[^/]+\.git\.git$/)) { + this.warn('brokenGitUrl', r) } - } + }, -, fixTypos: function(data) { + fixTypos: function (data) { Object.keys(typos.topLevel).forEach(function (d) { - if (data.hasOwnProperty(d)) { - this.warn("typo", d, typos.topLevel[d]) + if (Object.prototype.hasOwnProperty.call(data, d)) { + this.warn('typo', d, typos.topLevel[d]) } }, this) - } + }, -, fixScriptsField: function(data) { - if (!data.scripts) return - if (typeof data.scripts !== "object") { - this.warn("nonObjectScripts") + fixScriptsField: function (data) { + if (!data.scripts) { + return + } + if (typeof data.scripts !== 'object') { + this.warn('nonObjectScripts') delete data.scripts return } Object.keys(data.scripts).forEach(function (k) { - if (typeof data.scripts[k] !== "string") { - this.warn("nonStringScript") + if (typeof data.scripts[k] !== 'string') { + this.warn('nonStringScript') delete data.scripts[k] } else if (typos.script[k] && !data.scripts[typos.script[k]]) { - this.warn("typo", k, typos.script[k], "scripts") + this.warn('typo', k, typos.script[k], 'scripts') } }, this) - } + }, -, fixFilesField: function(data) { + fixFilesField: function (data) { var files = data.files if (files && !Array.isArray(files)) { - this.warn("nonArrayFiles") + this.warn('nonArrayFiles') delete data.files } else if (data.files) { - data.files = data.files.filter(function(file) { - if (!file || typeof file !== "string") { - this.warn("invalidFilename", file) + data.files = data.files.filter(function (file) { + if (!file || typeof file !== 'string') { + this.warn('invalidFilename', file) return false } else { return true } }, this) } - } + }, -, fixBinField: function(data) { - if (!data.bin) return; - if (typeof data.bin === "string") { + fixBinField: function (data) { + if (!data.bin) { + return + } + if (typeof data.bin === 'string') { var b = {} var match if (match = data.name.match(/^@[^/]+[/](.*)$/)) { @@ -91,286 +98,327 @@ var fixer = module.exports = { } data.bin = b } - } + }, -, fixManField: function(data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] + fixManField: function (data) { + if (!data.man) { + return } - } -, fixBundleDependenciesField: function(data) { - var bdd = "bundledDependencies" - var bd = "bundleDependencies" + if (typeof data.man === 'string') { + data.man = [data.man] + } + }, + fixBundleDependenciesField: function (data) { + var bdd = 'bundledDependencies' + var bd = 'bundleDependencies' if (data[bdd] && !data[bd]) { data[bd] = data[bdd] delete data[bdd] } if (data[bd] && !Array.isArray(data[bd])) { - this.warn("nonArrayBundleDependencies") + this.warn('nonArrayBundleDependencies') delete data[bd] } else if (data[bd]) { - data[bd] = data[bd].filter(function(bd) { + data[bd] = data[bd].filter(function (bd) { if (!bd || typeof bd !== 'string') { - this.warn("nonStringBundleDependency", bd) + this.warn('nonStringBundleDependency', bd) return false } else { if (!data.dependencies) { data.dependencies = {} } - if (!data.dependencies.hasOwnProperty(bd)) { - this.warn("nonDependencyBundleDependency", bd) - data.dependencies[bd] = "*" + if (Object.prototype.hasOwnProperty.call(data.dependencies, bd)) { + this.warn('nonDependencyBundleDependency', bd) + data.dependencies[bd] = '*' } return true } }, this) } - } + }, -, fixDependencies: function(data, strict) { - var loose = !strict + fixDependencies: function (data, strict) { objectifyDeps(data, this.warn) addOptionalDepsToDeps(data, this.warn) this.fixBundleDependenciesField(data) - ;['dependencies','devDependencies'].forEach(function(deps) { - if (!(deps in data)) return - if (!data[deps] || typeof data[deps] !== "object") { - this.warn("nonObjectDependencies", deps) + ;['dependencies', 'devDependencies'].forEach(function (deps) { + if (!(deps in data)) { + return + } + if (!data[deps] || typeof data[deps] !== 'object') { + this.warn('nonObjectDependencies', deps) delete data[deps] return } Object.keys(data[deps]).forEach(function (d) { var r = data[deps][d] if (typeof r !== 'string') { - this.warn("nonStringDependency", d, JSON.stringify(r)) + this.warn('nonStringDependency', d, JSON.stringify(r)) delete data[deps][d] } var hosted = hostedGitInfo.fromUrl(data[deps][d]) - if (hosted) data[deps][d] = hosted.toString() + if (hosted) { + data[deps][d] = hosted.toString() + } }, this) }, this) - } + }, -, fixModulesField: function (data) { + fixModulesField: function (data) { if (data.modules) { - this.warn("deprecatedModules") + this.warn('deprecatedModules') delete data.modules } - } + }, -, fixKeywordsField: function (data) { - if (typeof data.keywords === "string") { + fixKeywordsField: function (data) { + if (typeof data.keywords === 'string') { data.keywords = data.keywords.split(/,\s+/) } if (data.keywords && !Array.isArray(data.keywords)) { delete data.keywords - this.warn("nonArrayKeywords") + this.warn('nonArrayKeywords') } else if (data.keywords) { - data.keywords = data.keywords.filter(function(kw) { - if (typeof kw !== "string" || !kw) { - this.warn("nonStringKeyword"); + data.keywords = data.keywords.filter(function (kw) { + if (typeof kw !== 'string' || !kw) { + this.warn('nonStringKeyword') return false } else { return true } }, this) } - } + }, -, fixVersionField: function(data, strict) { + fixVersionField: function (data, strict) { // allow "loose" semver 1.0 versions in non-strict mode // enforce strict semver 2.0 compliance in strict mode var loose = !strict if (!data.version) { - data.version = "" + data.version = '' return true } - if (!semver.valid(data.version, loose)) { - throw new Error('Invalid version: "'+ data.version + '"') + if (!isValidSemver(data.version, loose)) { + throw new Error('Invalid version: "' + data.version + '"') } - data.version = semver.clean(data.version, loose) + data.version = cleanSemver(data.version, loose) return true - } + }, -, fixPeople: function(data) { + fixPeople: function (data) { modifyPeople(data, unParsePerson) modifyPeople(data, parsePerson) - } + }, -, fixNameField: function(data, options) { - if (typeof options === "boolean") options = {strict: options} - else if (typeof options === "undefined") options = {} + fixNameField: function (data, options) { + if (typeof options === 'boolean') { + options = {strict: options} + } else if (typeof options === 'undefined') { + options = {} + } var strict = options.strict if (!data.name && !strict) { - data.name = "" + data.name = '' return } - if (typeof data.name !== "string") { - throw new Error("name field must be a string.") + if (typeof data.name !== 'string') { + throw new Error('name field must be a string.') } - if (!strict) + if (!strict) { data.name = data.name.trim() + } ensureValidName(data.name, strict, options.allowLegacyCase) - if (isBuiltinModule(data.name)) - this.warn("conflictingName", data.name) - } - + if (isBuiltinModule(data.name)) { + this.warn('conflictingName', data.name) + } + }, -, fixDescriptionField: function (data) { + fixDescriptionField: function (data) { if (data.description && typeof data.description !== 'string') { - this.warn("nonStringDescription") + this.warn('nonStringDescription') delete data.description } - if (data.readme && !data.description) + if (data.readme && !data.description) { data.description = extractDescription(data.readme) - if(data.description === undefined) delete data.description; - if (!data.description) this.warn("missingDescription") - } + } + if (data.description === undefined) { + delete data.description + } + if (!data.description) { + this.warn('missingDescription') + } + }, -, fixReadmeField: function (data) { + fixReadmeField: function (data) { if (!data.readme) { - this.warn("missingReadme") - data.readme = "ERROR: No README data found!" + this.warn('missingReadme') + data.readme = 'ERROR: No README data found!' } - } + }, -, fixBugsField: function(data) { + fixBugsField: function (data) { if (!data.bugs && data.repository && data.repository.url) { var hosted = hostedGitInfo.fromUrl(data.repository.url) - if(hosted && hosted.bugs()) { + if (hosted && hosted.bugs()) { data.bugs = {url: hosted.bugs()} } - } - else if(data.bugs) { + } else if (data.bugs) { var emailRe = /^.+@.*\..+$/ - if(typeof data.bugs == "string") { - if(emailRe.test(data.bugs)) - data.bugs = {email:data.bugs} - else if(url.parse(data.bugs).protocol) + if (typeof data.bugs === 'string') { + if (emailRe.test(data.bugs)) { + data.bugs = {email: data.bugs} + /* eslint-disable-next-line node/no-deprecated-api */ + } else if (url.parse(data.bugs).protocol) { data.bugs = {url: data.bugs} - else - this.warn("nonEmailUrlBugsString") - } - else { + } else { + this.warn('nonEmailUrlBugsString') + } + } else { bugsTypos(data.bugs, this.warn) var oldBugs = data.bugs data.bugs = {} - if(oldBugs.url) { - if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + if (oldBugs.url) { + /* eslint-disable-next-line node/no-deprecated-api */ + if (typeof (oldBugs.url) === 'string' && url.parse(oldBugs.url).protocol) { data.bugs.url = oldBugs.url - else - this.warn("nonUrlBugsUrlField") + } else { + this.warn('nonUrlBugsUrlField') + } } - if(oldBugs.email) { - if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + if (oldBugs.email) { + if (typeof (oldBugs.email) === 'string' && emailRe.test(oldBugs.email)) { data.bugs.email = oldBugs.email - else - this.warn("nonEmailBugsEmailField") + } else { + this.warn('nonEmailBugsEmailField') + } } } - if(!data.bugs.email && !data.bugs.url) { + if (!data.bugs.email && !data.bugs.url) { delete data.bugs - this.warn("emptyNormalizedBugs") + this.warn('emptyNormalizedBugs') } } - } + }, -, fixHomepageField: function(data) { + fixHomepageField: function (data) { if (!data.homepage && data.repository && data.repository.url) { var hosted = hostedGitInfo.fromUrl(data.repository.url) - if (hosted && hosted.docs()) data.homepage = hosted.docs() + if (hosted && hosted.docs()) { + data.homepage = hosted.docs() + } + } + if (!data.homepage) { + return } - if (!data.homepage) return - if(typeof data.homepage !== "string") { - this.warn("nonUrlHomepage") + if (typeof data.homepage !== 'string') { + this.warn('nonUrlHomepage') return delete data.homepage } - if(!url.parse(data.homepage).protocol) { - data.homepage = "http://" + data.homepage + /* eslint-disable-next-line node/no-deprecated-api */ + if (!url.parse(data.homepage).protocol) { + data.homepage = 'http://' + data.homepage } - } + }, -, fixLicenseField: function(data) { - if (!data.license) { - return this.warn("missingLicense") - } else{ - if ( - typeof(data.license) !== 'string' || - data.license.length < 1 || - data.license.trim() === '' - ) { - this.warn("invalidLicense") - } else { - if (!validateLicense(data.license).validForNewPackages) - this.warn("invalidLicense") - } + fixLicenseField: function (data) { + const license = data.license || data.licence + if (!license) { + return this.warn('missingLicense') } - } + if ( + typeof (license) !== 'string' || + license.length < 1 || + license.trim() === '' + ) { + return this.warn('invalidLicense') + } + if (!validateLicense(license).validForNewPackages) { + return this.warn('invalidLicense') + } + }, } -function isValidScopedPackageName(spec) { - if (spec.charAt(0) !== '@') return false +function isValidScopedPackageName (spec) { + if (spec.charAt(0) !== '@') { + return false + } var rest = spec.slice(1).split('/') - if (rest.length !== 2) return false + if (rest.length !== 2) { + return false + } return rest[0] && rest[1] && rest[0] === encodeURIComponent(rest[0]) && rest[1] === encodeURIComponent(rest[1]) } -function isCorrectlyEncodedName(spec) { - return !spec.match(/[\/@\s\+%:]/) && +function isCorrectlyEncodedName (spec) { + return !spec.match(/[/@\s+%:]/) && spec === encodeURIComponent(spec) } function ensureValidName (name, strict, allowLegacyCase) { - if (name.charAt(0) === "." || + if (name.charAt(0) === '.' || !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || - name.toLowerCase() === "node_modules" || - name.toLowerCase() === "favicon.ico") { - throw new Error("Invalid name: " + JSON.stringify(name)) + name.toLowerCase() === 'node_modules' || + name.toLowerCase() === 'favicon.ico') { + throw new Error('Invalid name: ' + JSON.stringify(name)) } } function modifyPeople (data, fn) { - if (data.author) data.author = fn(data.author) - ;["maintainers", "contributors"].forEach(function (set) { - if (!Array.isArray(data[set])) return; + if (data.author) { + data.author = fn(data.author) + }['maintainers', 'contributors'].forEach(function (set) { + if (!Array.isArray(data[set])) { + return + } data[set] = data[set].map(fn) }) return data } function unParsePerson (person) { - if (typeof person === "string") return person - var name = person.name || "" + if (typeof person === 'string') { + return person + } + var name = person.name || '' var u = person.url || person.web - var url = u ? (" ("+u+")") : "" + var url = u ? (' (' + u + ')') : '' var e = person.email || person.mail - var email = e ? (" <"+e+">") : "" - return name+email+url + var email = e ? (' <' + e + '>') : '' + return name + email + url } function parsePerson (person) { - if (typeof person !== "string") return person - var name = person.match(/^([^\(<]+)/) - var url = person.match(/\(([^\)]+)\)/) + if (typeof person !== 'string') { + return person + } + var name = person.match(/^([^(<]+)/) + var url = person.match(/\(([^)]+)\)/) var email = person.match(/<([^>]+)>/) var obj = {} - if (name && name[0].trim()) obj.name = name[0].trim() - if (email) obj.email = email[1]; - if (url) obj.url = url[1]; + if (name && name[0].trim()) { + obj.name = name[0].trim() + } + if (email) { + obj.email = email[1] + } + if (url) { + obj.url = url[1] + } return obj } function addOptionalDepsToDeps (data, warn) { var o = data.optionalDependencies - if (!o) return; + if (!o) { + return + } var d = data.dependencies || {} Object.keys(o).forEach(function (k) { d[k] = o[k] @@ -379,21 +427,25 @@ function addOptionalDepsToDeps (data, warn) { } function depObjectify (deps, type, warn) { - if (!deps) return {} - if (typeof deps === "string") { + if (!deps) { + return {} + } + if (typeof deps === 'string') { deps = deps.trim().split(/[\n\r\s\t ,]+/) } - if (!Array.isArray(deps)) return deps - warn("deprecatedArrayDependencies", type) + if (!Array.isArray(deps)) { + return deps + } + warn('deprecatedArrayDependencies', type) var o = {} deps.filter(function (d) { - return typeof d === "string" - }).forEach(function(d) { + return typeof d === 'string' + }).forEach(function (d) { d = d.trim().split(/(:?[@\s><=])/) var dn = d.shift() - var dv = d.join("") + var dv = d.join('') dv = dv.trim() - dv = dv.replace(/^@/, "") + dv = dv.replace(/^@/, '') o[dn] = dv }) return o @@ -401,16 +453,20 @@ function depObjectify (deps, type, warn) { function objectifyDeps (data, warn) { depTypes.forEach(function (type) { - if (!data[type]) return; + if (!data[type]) { + return + } data[type] = depObjectify(data[type], type, warn) }) } -function bugsTypos(bugs, warn) { - if (!bugs) return +function bugsTypos (bugs, warn) { + if (!bugs) { + return + } Object.keys(bugs).forEach(function (k) { if (typos.bugs[k]) { - warn("typo", k, typos.bugs[k], "bugs") + warn('typo', k, typos.bugs[k], 'bugs') bugs[typos.bugs[k]] = bugs[k] delete bugs[k] } |