diff options
Diffstat (limited to 'deps/npm/node_modules/read-package-json/read-json.js')
| -rw-r--r-- | deps/npm/node_modules/read-package-json/read-json.js | 325 |
1 files changed, 29 insertions, 296 deletions
diff --git a/deps/npm/node_modules/read-package-json/read-json.js b/deps/npm/node_modules/read-package-json/read-json.js index 9ca3e4e7e1..acb1286800 100644 --- a/deps/npm/node_modules/read-package-json/read-json.js +++ b/deps/npm/node_modules/read-package-json/read-json.js @@ -24,9 +24,7 @@ var LRU = require("lru-cache") readJson.cache = new LRU({max: 1000}) var path = require("path") var glob = require("glob") -var slide = require("slide") -var asyncMap = slide.asyncMap -var semver = require("semver") +var normalizeData = require("normalize-package-data") // put more stuff on here to customize. readJson.extraSet = [ @@ -40,30 +38,6 @@ readJson.extraSet = [ ] var typoWarned = {} -// http://registry.npmjs.org/-/fields -var typos = { "dependancies": "dependencies" - , "dependecies": "dependencies" - , "depdenencies": "dependencies" - , "devEependencies": "devDependencies" - , "depends": "dependencies" - , "dev-dependencies": "devDependencies" - , "devDependences": "devDependencies" - , "devDepenencies": "devDependencies" - , "devdependencies": "devDependencies" - , "repostitory": "repository" - , "prefereGlobal": "preferGlobal" - , "hompage": "homepage" - , "hampage": "homepage" - , "autohr": "author" - , "autor": "author" - , "contributers": "contributors" - , "publicationConfig": "publishConfig" - } -var bugsTypos = { "web": "url", "name": "url" } -var scriptTypos = { "server": "start", "tests": "test" } -var depTypes = [ "dependencies" - , "devDependencies" - , "optionalDependencies" ] function readJson (file, cb) { @@ -132,19 +106,22 @@ function indexjs (file, er, cb) { readJson.extras = extras function extras (file, data, cb) { - asyncMap(readJson.extraSet, function (fn, cb) { - return fn(file, data, cb) - }, function (er) { - if (er) return cb(er); - final(file, data, cb) + var set = readJson.extraSet + var n = set.length + var errState = null + set.forEach(function (fn) { + fn(file, data, then) }) + function then(er) { + if (errState) return; + if (er) return cb(errState = er); + if (--n === 0) final(file, data, cb); + } } function gypfile (file, data, cb) { var dir = path.dirname(file) var s = data.scripts || {} - if (s.install === "node-gyp rebuild" && !s.preinstall) - data.gypfile = true if (s.install || s.preinstall) return cb(null, data); glob("*.gyp", { cwd: dir }, function (er, files) { @@ -318,36 +295,29 @@ function githead_ (file, data, dir, head, cb) { } function final (file, data, cb) { - var ret = validName(file, data) - if (ret !== true) return cb(ret); - ret = validVersion(file, data) - if (ret !== true) return cb(ret); - - data._id = data.name + "@" + data.version - typoWarn(file, data) - validRepo(file, data) - validFiles(file, data) - validBin(file, data) - validMan(file, data) - validBundled(file, data) - objectifyDeps(file, data) - unParsePeople(file, data) - parsePeople(file, data) - - if (data.description && - typeof data.description !== 'string') { - warn(file, data, - "'description' field should be a string") - delete data.description + var pId = makePackageId(data) + function warn(msg) { + if (typoWarned[pId]) return; + readJson.log.warn("package.json", pId, msg) } - - if (data.readme && !data.description) - readmeDescription(file, data) - + try { + normalizeData(data, warn) + } + catch (error) { + return cb(error) + } + typoWarned[pId] = true readJson.cache.set(file, data) cb(null, data) } +function makePackageId (data) { + return cleanString(data.name) + "@" + cleanString(data.version) +} + +function cleanString(str) { + return (!str || typeof(str) !== "string") ? "" : str.trim() +} // /**package { "name": "foo", "version": "1.2.3", ... } **/ function parseIndex (data) { @@ -371,240 +341,3 @@ function parseError (ex, file) { e.file = file return e } - -// a warning for deprecated or likely-incorrect fields -function typoWarn (file, data) { - if (data.modules) { - warn(file, data, - "'modules' is deprecated") - delete data.modules - } - Object.keys(typos).forEach(function (d) { - checkTypo(file, data, d) - }) - bugsTypoWarn(file, data) - scriptTypoWarn(file, data) - noreadmeWarn(file, data) - typoWarned[data._id] = true -} - -function noreadmeWarn (file, data) { - if (data.readme) return; - warn(file, data, "No README.md file found!") - data.readme = "ERROR: No README.md file found!" -} - -function checkTypo (file, data, d) { - if (!data.hasOwnProperty(d)) return; - warn(file, data, - "'" + d + "' should probably be '" + typos[d] + "'" ) -} - -function bugsTypoWarn (file, data) { - var b = data.bugs - if (!b || typeof b !== "object") return - Object.keys(b).forEach(function (k) { - if (bugsTypos[k]) { - b[bugsTypos[k]] = b[k] - delete b[k] - } - }) -} - -function scriptTypoWarn (file, data) { - var s = data.scripts - if (!s || typeof s !== "object") return - Object.keys(s).forEach(function (k) { - if (scriptTypos[k]) { - scriptWarn_(file, data, k) - } - }) -} -function scriptWarn_ (file, data, k) { - warn(file, data, "scripts['" + k + "'] should probably " + - "be scripts['" + scriptTypos[k] + "']") -} - -function validRepo (file, data) { - if (data.repostories) { - warnRepositories(file, data) - } - if (!data.repository) return; - if (typeof data.repository === "string") { - data.repository = { - type: "git", - url: data.repository - } - } - var r = data.repository.url || "" - // use the non-private urls - r = r.replace(/^(https?|git):\/\/[^\@]+\@github.com/, - '$1://github.com') - r = r.replace(/^https?:\/\/github.com/, - 'git://github.com') - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - warn(file, data, "Probably broken git " + - "url: " + r) - } -} -function warnRepostories (file, data) { - warn(file, data, - "'repositories' (plural) Not supported.\n" + - "Please pick one as the 'repository' field"); - data.repository = data.repositories[0] -} - -function validFiles (file, data) { - var files = data.files - if (files && !Array.isArray(files)) { - warn(file, data, "Invalid 'files' member") - delete data.files - } -} - -function validBin (file, data) { - if (!data.bin) return; - if (typeof data.bin === "string") { - var b = {} - b[data.name] = data.bin - data.bin = b - } -} - -function validMan (file, data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] - } -} - -function validBundled (file, 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])) { - warn(file, data, "bundleDependencies " + - "must be an array") - } -} - -function objectifyDeps (file, data) { - depTypes.forEach(function (d) { - objectifyDep_(file, data, d) - }) - - var o = data.optionalDependencies - if (!o) return; - var d = data.dependencies || {} - Object.keys(o).forEach(function (k) { - d[k] = o[k] - }) - data.dependencies = d -} -function objectifyDep_ (file, data, type) { - if (!data[type]) return; - data[type] = depObjectify(file, data, data[type]) -} -function depObjectify (file, data, deps) { - if (!deps) return {} - if (typeof deps === "string") { - deps = deps.trim().split(/[\n\r\s\t ,]+/) - } - if (!Array.isArray(deps)) return deps - var o = {} - deps.forEach(function (d) { - d = d.trim().split(/(:?[@\s><=])/) - var dn = d.shift() - var dv = d.join("") - dv = dv.trim() - dv = dv.replace(/^@/, "") - o[dn] = dv - }) - return o -} - - -function warn (f, d, m) { - if (typoWarned[d._id]) return; - readJson.log.warn("package.json", d._id, m) -} - - -function validName (file, data) { - if (!data.name) { - data.name = "" - return true - } - data.name = data.name.trim() - if (data.name.charAt(0) === "." || - data.name.match(/[\/@\s\+%:]/) || - data.name !== encodeURIComponent(data.name) || - data.name.toLowerCase() === "node_modules" || - data.name.toLowerCase() === "favicon.ico") { - var m = "Invalid name: " - m += JSON.stringify(data.name) - return new Error(m) - } - return true -} - - -function parseKeywords (file, data) { - var kw = data.keywords - if (typeof kw === "string") { - kw = kw.split(/,\s+/) - data.keywords = kw - } -} - -function validVersion (file, data) { - var v = data.version - if (!v) { - data.version = "" - return true - } - if (!semver.valid(v)) { - return new Error("invalid version: "+v) - } - data.version = semver.clean(data.version) - return true -} -function unParsePeople (file, data) { - return parsePeople(file, data, true) -} - -function parsePeople (file, data, un) { - var fn = un ? unParsePerson : parsePerson - 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 || "" - var u = person.url || person.web - var url = u ? (" ("+u+")") : "" - var e = person.email || person.mail - 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(/\(([^\)]+)\)/) - 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]; - return obj -} |
