diff options
author | isaacs <i@izs.me> | 2013-04-29 07:24:30 +0400 |
---|---|---|
committer | isaacs <i@izs.me> | 2013-04-29 07:24:30 +0400 |
commit | 1bae59b49ae51b41ebbb03a65dc40e8567240924 (patch) | |
tree | a2e4c0154c6abea5245568929fa209948fa6ab98 /node_modules/read-package-json | |
parent | 0c77b6e5b6b84d1a0106b212cb331f5bcfc2bc7c (diff) |
read-package-json@0.4.0
Diffstat (limited to 'node_modules/read-package-json')
35 files changed, 1399 insertions, 302 deletions
diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/.npmignore b/node_modules/read-package-json/node_modules/normalize-package-data/.npmignore new file mode 100644 index 000000000..096746c14 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/.npmignore @@ -0,0 +1 @@ +/node_modules/
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/.travis.yml b/node_modules/read-package-json/node_modules/normalize-package-data/.travis.yml new file mode 100644 index 000000000..2ca91f289 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.10" + - "0.8"
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/AUTHORS b/node_modules/read-package-json/node_modules/normalize-package-data/AUTHORS new file mode 100644 index 000000000..c64debf74 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/AUTHORS @@ -0,0 +1,3 @@ +# Names sorted by how much code was originally theirs. +Isaac Z. Schlueter <i@izs.me> +Meryn Stol <merynstol@gmail.com>
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/README.md b/node_modules/read-package-json/node_modules/normalize-package-data/README.md new file mode 100644 index 000000000..59d132d12 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/README.md @@ -0,0 +1,73 @@ +# normalize-package-data [![Build Status](https://travis-ci.org/meryn/normalize-package-data.png?branch=master)](https://travis-ci.org/meryn/normalize-package-data) + +normalize-package data exports a function that normalizes package metadata. This data is typically found in a package.json file, but in principle could come from any source - for example the npm registry. + +## Installation + +``` +npm install normalize-package-data +``` + +## Usage + +Basic usage is really simple. You call the function that normalize-package-data exports. Let's call it `normalizeData`. + +```javascript +normalizeData = require('normalize-package-data') +packageData = fs.readfileSync("package.json") +normalizeData(packageData) +// packageData is now normalized +``` + +Optionally, you may pass a "warning" function. It gets called whenever the normalizeData function encounters something that doesn't look right. It indicates less than perfect input data. + +```javascript +normalizeData = require('normalize-package-data') +packageData = fs.readfileSync("package.json") +warnFn = function(msg) { console.error(msg) } +normalizeData(packageData, warnFn) +// packageData is now normalized. Any number of warnings may have been logged. +``` + +If you don't provide a warning function, `normalizeData` functions silently. + +### Potential exceptions + +If the supplied data has an invalid name or version vield, `normalizeData` will throw an error. Depending on where you call `normalizeData`, you may want to catch these errors so can pass them to a callback. + +## What normalization (currently) entails + +* The value of `name` field gets trimmed +* The value of the `version` field gets cleaned by `semver.clean`. See [documentation for the semver module](https://github.com/isaacs/node-semver). +* If `name` and/or `version` fields are missing, they are set to empty strings. +* If `repository` field is a string, it will become am object with `url` set to the original string value, and `type` set to `"git"`. +* If `files` field is not an array, it will be removed. +* If `bin` field is a string, then `bin` field will become an object with `name` set to the value of the `name` field, and `bin` set to the original string value. +* If `man` field is a string, it will become an array with the original string as its sole member +* If `keywords` field is string, it is considered to be a list of keywords separated by one or more white-space characters. It gets converted to an array by splitting on `\s+`. +* If `bundledDependencies` field (a typo) exists and `bundleDependencies` field does not, `bundledDependencies` will get renamed to `bundleDependencies`. +* All people fields (`author`, `maintainers`, `contributors`) get converted into objects with name, email and url properties. +* If the value of any of the depedencies fields (`dependencies`, `devDependencies`, `optionalDependencies`) are strings, they get converted into objects with familiar `name=>value` pairs. +* The values in `optionalDependencies` get added to `dependencies`. `optionalDependencies` array is left untouched. +* If `description` field does not exists, but `readme` field does, then (more or less) the first paragraph of text that's found in the readme is taken a value for `description`. +* If `bugs` field is a string, the value of `bugs` field is changed into an object with `url` set to the original string value. +* If `bugs` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `bugs` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]/issues . If the repository field points to a GitHub Gist repo url, the associated http url is chosen. +* If `bugs` field is an object, the resulting value only has email and url properties. If email and url properties are not strings, they are ignored. If no valid values for either email or url is found, bugs field will be removed. +* If `homepage` field is not a string, it will be removed. + +### Rules for name field + +If `name` field is given, the value of the name field must be a string. The string may not: + +* start with a period. +* contain the following characters: `/@\s+%` +* contain and characters that would need to be encoded for use in urls. +* resemble the word `node_modules` or `favicon.ico` (case doesn't matter). + +### Rules for version field + +If `version` field is given, the value of the version field must be a valid *semver* string, as determined by the `semver.valid` method. See [documentation for the semver module](https://github.com/isaacs/node-semver). + +## Credits + +This code is based on read-package-json written by Isaac Schlueter. diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/lib/extract_description.js b/node_modules/read-package-json/node_modules/normalize-package-data/lib/extract_description.js new file mode 100644 index 000000000..dbeef218b --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/lib/extract_description.js @@ -0,0 +1,13 @@ +module.exports = extractDescription + +// Extracts description from contents of a readme file in markdown format +function extractDescription (d) { + if (!d) return; + // the first block of text before the first heading + // that isn't the first line heading + d = d.trim().split('\n') + for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); + var l = d.length + for (var e = s + 1; e < l && d[e].trim(); e ++); + return d.slice(s, e).join(' ').trim() +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js b/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js new file mode 100644 index 000000000..d8d0bb7af --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js @@ -0,0 +1,249 @@ +var semver = require("semver") +var parseGitHubURL = require("github-url-from-git") +var depTypes = ["dependencies","devDependencies","optionalDependencies"] +var extractDescription = require("./extract_description") +var url = require("url") + +var fixer = module.exports = { + fixRepositoryField: function(data) { + if (data.repostories) { + this.warn("'repositories' (plural) Not supported.\n" + + "Please pick one as the 'repository' field"); + data.repository = data.repositories[0] + } + if (!data.repository) return; + if (typeof data.repository === "string") { + data.repository = { + type: "git", + url: data.repository + } + } + var r = data.repository.url || "" + if (r) { + var ghurl = parseGitHubURL(r) + if (ghurl) { + r = ghurl.replace(/^https?:\/\//, 'git://') + } + } + + if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { + this.warn("Probably broken git url: " + r) + } + } + +, fixFilesField: function(data) { + var files = data.files + if (files && !Array.isArray(files)) { + this.warn("Invalid 'files' member") + delete data.files + } + } + +, fixBinField: function(data) { + if (!data.bin) return; + if (typeof data.bin === "string") { + var b = {} + b[data.name] = data.bin + data.bin = b + } + } + +, fixManField: function(data) { + if (!data.man) return; + 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] + } + } + +, fixDependencies: function(data) { + objectifyDeps(data, this.warn) + addOptionalDepsToDeps(data, this.warn) + this.fixBundleDependenciesField(data) + } + +, fixKeywordsField: function (data, warn) { + if (typeof data.keywords === "string") { + data.keywords = data.keywords.split(/,\s+/) + } + } + +, fixVersionField: function(data) { + if (!data.version) { + data.version = "" + return true + } + if (!semver.valid(data.version)) { + throw new Error("invalid version: "+ data.version) + } + data.version = semver.clean(data.version) + return true + } + +, fixPeople: function(data) { + modifyPeople(data, unParsePerson) + modifyPeople(data, parsePerson) + } + +, fixNameField: function(data) { + if (!data.name) { + data.name = "" + return true + } + if (typeof data.name !== "string") { + throw new Error("name field must be a string.") + } + data.name = data.name.trim() + ensureValidName(data.name) + } + + +, fixDescriptionField: function (data) { + if (data.description && typeof data.description !== 'string') { + this.warn("'description' field should be a string") + delete data.description + } + if (data.readme && !data.description) + data.description = extractDescription(data.readme) + } + +, fixReadmeField: function (data) { + if (!data.readme) data.readme = "ERROR: No README data found!" + } + +, fixBugsField: function(data) { + if (!data.bugs && data.repository && data.repository.url) { + var gh = parseGitHubURL(data.repository.url) + if(gh) { + if(gh.match(/^https:\/\/github.com\//)) + data.bugs = {url: gh + "/issues"} + else // gist url + data.bugs = {url: gh} + } + } + 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) + data.bugs = {url: data.bugs} + else + this.warn("Bug string field must be url, email, or {email,url}") + } + else { + var oldBugs = data.bugs + data.bugs = {} + if(oldBugs.url) { + if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + data.bugs.url = oldBugs.url + else + this.warn("bugs.url field must be a string url. Deleted.") + } + if(oldBugs.email) { + if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + data.bugs.email = oldBugs.email + else + this.warn("bugs.email field must be a string email. Deleted.") + } + } + if(!data.bugs.email && !data.bugs.url) { + delete data.bugs + this.warn("Normalized value of bugs field is an empty object. Deleted.") + } + } + } + +, fixHomepageField: function(data) { + if(!data.homepage) return true; + if(typeof data.homepage !== "string" || !url.parse(data.homepage).protocol) { + this.warn("homepage field must be a string url. Deleted.") + delete data.homepage + } + } +} + +function ensureValidName (name) { + if (name.charAt(0) === "." || + name.match(/[\/@\s\+%:]/) || + name !== encodeURIComponent(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; + 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 +} + +function addOptionalDepsToDeps (data, warn) { + 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 depObjectify (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.filter(function (d) { + return typeof d === "string" + }).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 objectifyDeps (data, warn) { + depTypes.forEach(function (type) { + if (!data[type]) return; + data[type] = depObjectify(data[type]) + }) +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/lib/is_valid.js b/node_modules/read-package-json/node_modules/normalize-package-data/lib/is_valid.js new file mode 100644 index 000000000..34a399348 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/lib/is_valid.js @@ -0,0 +1,57 @@ +// a warning for deprecated or likely-incorrect fields + +module.exports = isValid + +var typos = require("./typos") + +function isValid (data, warnFunc) { + var hasWarned = false + function warn(msg) { + hasWarned = true + if(warnFunc) warnFunc(msg) + } + if (data.modules) warn("'modules' is deprecated") + Object.keys(typos.topLevel).forEach(function (d) { + if (data.hasOwnProperty(d)) { + warn(makeTypoWarning(d, typos.topLevel[d])) + } + }) + checkBugsField(data.bugs, warn) + checkScriptsField(data.scripts, warn) + if (!data.readme) warn("No readme data!") + if (data.description && typeof data.description !== 'string') { + warn("'description' field should be a string") + } + if (data[data.bundledDependencies] && + !Array.isArray(data.bundleDependencies)) { + warn("bundleDependencies must be an array") + } + return !hasWarned +} + +function checkBugsField (bugs, warn) { + if (!bugs || typeof bugs !== "object") return + Object.keys(bugs).forEach(function (k) { + if (typos.bugs[k]) { + bugs[typos.bugs[k]] = bugs[k] + delete bugs[k] + } + }) +} + +function checkScriptsField (scripts, warn) { + if (!scripts || typeof scripts !== "object") return + Object.keys(scripts).forEach(function (k) { + if (typos.script[k]) { + warn(makeTypoWarning(k, typos.script[k], "scripts")) + } + }) +} + +function makeTypoWarning (providedName, probableName, field) { + if (field) { + providedName = field + "['" + providedName + "']" + probableName = field + "['" + probableName + "']" + } + return providedName + " should probably be " + probableName +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js b/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js new file mode 100644 index 000000000..336334a47 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js @@ -0,0 +1,36 @@ +module.exports = normalize + +var isValid = require("./is_valid") +var fixer = require("./fixer") + +var fieldsToFix = ['name','version','description','repository' + ,'files','bin','man','bugs','keywords','readme','homepage'] +var otherThingsToFix = ['dependencies','people'] + +var thingsToFix = fieldsToFix.map(function(fieldName) { + return ucFirst(fieldName) + "Field" +}) +// two ways to do this in CoffeeScript on only one line, sub-70 chars: +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) +thingsToFix = thingsToFix.concat(otherThingsToFix) + +function normalize (data, warn) { + if(!warn) warn = function(msg) { /* noop */ } + isValid(data, warn) // don't care if it's valid, we'll make it valid + if (data.scripts && + data.scripts.install === "node-gyp rebuild" && + !data.scripts.preinstall) { + data.gypfile = true + } + fixer.warn = warn + thingsToFix.forEach(function(thingName) { + fixer["fix" + ucFirst(thingName)](data) + }) + data._id = data.name + "@" + data.version + if (data.modules) delete data.modules // modules field is deprecated +} + +function ucFirst (string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/lib/typos.json b/node_modules/read-package-json/node_modules/normalize-package-data/lib/typos.json new file mode 100644 index 000000000..dd2ec6614 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/lib/typos.json @@ -0,0 +1,23 @@ +{ + "topLevel": { + "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" + }, + "bugs": { "web": "url", "name": "url" }, + "script": { "server": "start", "tests": "test" } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/.npmignore b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/.npmignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/History.md b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/History.md new file mode 100644 index 000000000..fcb296bc6 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/History.md @@ -0,0 +1,10 @@ + +1.1.1 / 2013-04-23 +================== + + * package.json: Move test stuff to devDeps + +1.1.0 / 2013-04-19 +================== + + * Add support for gist urls diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Makefile b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Makefile new file mode 100644 index 000000000..37f330e81 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Makefile @@ -0,0 +1,5 @@ + +test: + @./node_modules/.bin/mocha test.js --reporter spec --require should + +.PHONY: test diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Readme.md b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Readme.md new file mode 100644 index 000000000..d027e8ec6 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/Readme.md @@ -0,0 +1,41 @@ + +# github-url-from-git + +```js +describe('parse(url)', function(){ + it('should support git://*', function(){ + var url = 'git://github.com/jamesor/mongoose-versioner'; + parse(url).should.equal('https://github.com/jamesor/mongoose-versioner'); + }) + + it('should support git://*.git', function(){ + var url = 'git://github.com/treygriffith/cellar.git'; + parse(url).should.equal('https://github.com/treygriffith/cellar'); + }) + + it('should support https://*', function(){ + var url = 'https://github.com/Empeeric/i18n-node'; + parse(url).should.equal('https://github.com/Empeeric/i18n-node'); + }) + + it('should support https://*.git', function(){ + var url = 'https://jpillora@github.com/banchee/tranquil.git'; + parse(url).should.equal('https://github.com/banchee/tranquil'); + }) + + it('should return undefined on failure', function(){ + var url = 'git://github.com/justgord/.git'; + assert(null == parse(url)); + }) + + it('should parse git@gist urls', function() { + var url = 'git@gist.github.com:3135914.git'; + parse(url).should.equal('https://gist.github.com/3135914') + }) + + it('should parse https://gist urls', function() { + var url = 'https://gist.github.com/3135914.git'; + parse(url).should.equal('https://gist.github.com/3135914') + }) +}) +``` diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/index.js b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/index.js new file mode 100644 index 000000000..9ccc215f0 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/index.js @@ -0,0 +1,12 @@ +var re = /^(?:https?:\/\/|git:\/\/)?(?:[^@]+@)?(gist.github.com|github.com)[:\/]([^\/]+\/[^\/]+?|[0-9]+)$/ + +module.exports = function(url){ + try { + var m = re.exec(url.replace(/\.git$/, '')); + var host = m[1]; + var path = m[2]; + return 'https://' + host + '/' + path; + } catch (err) { + // ignore + } +}; diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/package.json b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/package.json new file mode 100644 index 000000000..923045414 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/package.json @@ -0,0 +1,27 @@ +{ + "name": "github-url-from-git", + "version": "1.1.1", + "description": "Parse a github git url and return the github repo url", + "main": "index.js", + "scripts": { + "test": "mocha test.js --reporter spec --require should" + }, + "repository": "", + "keywords": [ + "github", + "git", + "url", + "parser" + ], + "author": "", + "license": "MIT", + "devDependencies": { + "better-assert": "~1.0.0", + "mocha": "~1.9.0", + "should": "~1.2.2" + }, + "readme": "\n# github-url-from-git\n\n```js\ndescribe('parse(url)', function(){\n it('should support git://*', function(){\n var url = 'git://github.com/jamesor/mongoose-versioner';\n parse(url).should.equal('https://github.com/jamesor/mongoose-versioner');\n })\n\n it('should support git://*.git', function(){\n var url = 'git://github.com/treygriffith/cellar.git';\n parse(url).should.equal('https://github.com/treygriffith/cellar');\n })\n\n it('should support https://*', function(){\n var url = 'https://github.com/Empeeric/i18n-node';\n parse(url).should.equal('https://github.com/Empeeric/i18n-node');\n })\n\n it('should support https://*.git', function(){\n var url = 'https://jpillora@github.com/banchee/tranquil.git';\n parse(url).should.equal('https://github.com/banchee/tranquil');\n })\n\n it('should return undefined on failure', function(){\n var url = 'git://github.com/justgord/.git';\n assert(null == parse(url));\n })\n\n it('should parse git@gist urls', function() {\n var url = 'git@gist.github.com:3135914.git';\n parse(url).should.equal('https://gist.github.com/3135914')\n })\n\n it('should parse https://gist urls', function() {\n var url = 'https://gist.github.com/3135914.git';\n parse(url).should.equal('https://gist.github.com/3135914')\n })\n})\n```\n", + "readmeFilename": "Readme.md", + "_id": "github-url-from-git@1.1.1", + "_from": "github-url-from-git@~1.1.1" +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/test.js b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/test.js new file mode 100644 index 000000000..e472302a0 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/node_modules/github-url-from-git/test.js @@ -0,0 +1,40 @@ + +var parse = require('./'); +var assert = require('better-assert'); + +describe('parse(url)', function(){ + it('should support git://*', function(){ + var url = 'git://github.com/jamesor/mongoose-versioner'; + parse(url).should.equal('https://github.com/jamesor/mongoose-versioner'); + }) + + it('should support git://*.git', function(){ + var url = 'git://github.com/treygriffith/cellar.git'; + parse(url).should.equal('https://github.com/treygriffith/cellar'); + }) + + it('should support https://*', function(){ + var url = 'https://github.com/Empeeric/i18n-node'; + parse(url).should.equal('https://github.com/Empeeric/i18n-node'); + }) + + it('should support https://*.git', function(){ + var url = 'https://jpillora@github.com/banchee/tranquil.git'; + parse(url).should.equal('https://github.com/banchee/tranquil'); + }) + + it('should return undefined on failure', function(){ + var url = 'git://github.com/justgord/.git'; + assert(null == parse(url)); + }) + + it('should parse git@gist urls', function() { + var url = 'git@gist.github.com:3135914.git'; + parse(url).should.equal('https://gist.github.com/3135914') + }) + + it('should parse https://gist urls', function() { + var url = 'https://gist.github.com/3135914.git'; + parse(url).should.equal('https://gist.github.com/3135914') + }) +}) diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/package.json b/node_modules/read-package-json/node_modules/normalize-package-data/package.json new file mode 100644 index 000000000..db537bc96 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/package.json @@ -0,0 +1,40 @@ +{ + "name": "normalize-package-data", + "version": "0.1.2", + "author": { + "name": "Meryn Stol", + "email": "merynstol@gmail.com" + }, + "description": "Normalizes data that can be found in package.json files.", + "repository": { + "type": "git", + "url": "git://github.com/meryn/normalize-package-data.git" + }, + "main": "lib/normalize.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "semver": "1.x", + "github-url-from-git": "~1.1.1" + }, + "devDependencies": { + "tap": "~0.2.5", + "underscore": "~1.4.4", + "async": "~0.2.7" + }, + "contributors": [ + { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + { + "name": "Meryn Stol", + "email": "merynstol@gmail.com" + } + ], + "readme": "# normalize-package-data [![Build Status](https://travis-ci.org/meryn/normalize-package-data.png?branch=master)](https://travis-ci.org/meryn/normalize-package-data)\n\nnormalize-package data exports a function that normalizes package metadata. This data is typically found in a package.json file, but in principle could come from any source - for example the npm registry.\n\n## Installation\n\n```\nnpm install normalize-package-data\n```\n\n## Usage\n\nBasic usage is really simple. You call the function that normalize-package-data exports. Let's call it `normalizeData`.\n\n```javascript\nnormalizeData = require('normalize-package-data')\npackageData = fs.readfileSync(\"package.json\")\nnormalizeData(packageData)\n// packageData is now normalized\n```\n\nOptionally, you may pass a \"warning\" function. It gets called whenever the normalizeData function encounters something that doesn't look right. It indicates less than perfect input data.\n\n```javascript\nnormalizeData = require('normalize-package-data')\npackageData = fs.readfileSync(\"package.json\")\nwarnFn = function(msg) { console.error(msg) }\nnormalizeData(packageData, warnFn)\n// packageData is now normalized. Any number of warnings may have been logged.\n```\n\nIf you don't provide a warning function, `normalizeData` functions silently.\n\n### Potential exceptions\n\nIf the supplied data has an invalid name or version vield, `normalizeData` will throw an error. Depending on where you call `normalizeData`, you may want to catch these errors so can pass them to a callback.\n\n## What normalization (currently) entails\n\n* The value of `name` field gets trimmed\n* The value of the `version` field gets cleaned by `semver.clean`. See [documentation for the semver module](https://github.com/isaacs/node-semver).\n* If `name` and/or `version` fields are missing, they are set to empty strings.\n* If `repository` field is a string, it will become am object with `url` set to the original string value, and `type` set to `\"git\"`.\n* If `files` field is not an array, it will be removed.\n* If `bin` field is a string, then `bin` field will become an object with `name` set to the value of the `name` field, and `bin` set to the original string value.\n* If `man` field is a string, it will become an array with the original string as its sole member\n* If `keywords` field is string, it is considered to be a list of keywords separated by one or more white-space characters. It gets converted to an array by splitting on `\\s+`.\n* If `bundledDependencies` field (a typo) exists and `bundleDependencies` field does not, `bundledDependencies` will get renamed to `bundleDependencies`.\n* All people fields (`author`, `maintainers`, `contributors`) get converted into objects with name, email and url properties.\n* If the value of any of the depedencies fields (`dependencies`, `devDependencies`, `optionalDependencies`) are strings, they get converted into objects with familiar `name=>value` pairs.\n* The values in `optionalDependencies` get added to `dependencies`. `optionalDependencies` array is left untouched.\n* If `description` field does not exists, but `readme` field does, then (more or less) the first paragraph of text that's found in the readme is taken a value for `description`.\n* If `bugs` field is a string, the value of `bugs` field is changed into an object with `url` set to the original string value.\n* If `bugs` field does not exist, but `repository` field points to a repository hosted on GitHub, the value of the `bugs` field gets set to an url in the form of https://github.com/[owner-name]/[repo-name]/issues . If the repository field points to a GitHub Gist repo url, the associated http url is chosen.\n* If `bugs` field is an object, the resulting value only has email and url properties. If email and url properties are not strings, they are ignored. If no valid values for either email or url is found, bugs field will be removed.\n* If `homepage` field is not a string, it will be removed.\n\n### Rules for name field\n\nIf `name` field is given, the value of the name field must be a string. The string may not:\n\n* start with a period.\n* contain the following characters: `/@\\s+%`\n* contain and characters that would need to be encoded for use in urls.\n* resemble the word `node_modules` or `favicon.ico` (case doesn't matter).\n\n### Rules for version field\n\nIf `version` field is given, the value of the version field must be a valid *semver* string, as determined by the `semver.valid` method. See [documentation for the semver module](https://github.com/isaacs/node-semver).\n\n## Credits\n\nThis code is based on read-package-json written by Isaac Schlueter.\n", + "readmeFilename": "README.md", + "_id": "normalize-package-data@0.1.2", + "_from": "normalize-package-data@~0.1.2" +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/basic.js b/node_modules/read-package-json/node_modules/normalize-package-data/test/basic.js new file mode 100644 index 000000000..12c403ec7 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/basic.js @@ -0,0 +1,34 @@ +var tap = require("tap") +var normalize = require("../lib/normalize") +var path = require("path") +var fs = require("fs") + +tap.test("basic test", function (t) { + var p = path.resolve(__dirname, "./fixtures/read-package-json.json") + fs.readFile (p, function (err, contents) { + if (err) throw err; + var originalData = JSON.parse(contents.toString()) + var data = JSON.parse(contents.toString()) + normalize(data) + t.ok(data) + verifyFields(t, data, originalData) + t.end() + }) +}) + +function verifyFields (t, normalized, original) { + t.equal(normalized.version, original.version, "Version field stays same") + t.equal(normalized._id, normalized.name + "@" + normalized.version, "It gets good id.") + t.equal(normalized.name, original.name, "Name stays the same.") + t.type(normalized.author, "object", "author field becomes object") + t.deepEqual(normalized.scripts, original.scripts, "scripts field (object) stays same") + t.equal(normalized.main, original.main) + // optional deps are folded in. + t.deepEqual(normalized.optionalDependencies, + original.optionalDependencies) + t.has(normalized.dependencies, original.optionalDependencies, "opt depedencies are copied into dependencies") + t.has(normalized.dependencies, original.dependencies, "regular depedencies stay in place") + t.deepEqual(normalized.devDependencies, original.devDependencies) + t.type(normalized.bugs, "object", "bugs should become object") + t.equal(normalized.bugs.url, "https://github.com/isaacs/read-package-json/issues") +} diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/consistency.js b/node_modules/read-package-json/node_modules/normalize-package-data/test/consistency.js new file mode 100644 index 000000000..8ae6b2730 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/consistency.js @@ -0,0 +1,36 @@ +var tap = require("tap") +var normalize = require("../lib/normalize") +var path = require("path") +var fs = require("fs") +var _ = require("underscore") +var async = require("async") + +var data, clonedData +var warn + +tap.test("consistent normalization", function(t) { + path.resolve(__dirname, "./fixtures/read-package-json.json") + fs.readdir (__dirname + "/fixtures", function (err, entries) { + // entries = ['coffee-script.json'] // uncomment to limit to a specific file + verifyConsistency = function(entryName, next) { + warn = function(msg) { + // t.equal("",msg) // uncomment to have some kind of logging of warnings + } + filename = __dirname + "/fixtures/" + entryName + fs.readFile(filename, function(err, contents) { + if (err) return next(err) + data = JSON.parse(contents.toString()) + normalize(data, warn) + clonedData = _.clone(data) + normalize(data, warn) + t.deepEqual(clonedData, data, + "Normalization of " + entryName + "is consistent.") + next(null) + }) // fs.readFile + } // verifyConsistency + async.forEach(entries, verifyConsistency, function(err) { + if (err) throw err + t.end() + }) + }) // fs.readdir +}) // tap.test
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/async.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/async.json new file mode 100644 index 000000000..5e652a6c6 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/async.json @@ -0,0 +1,36 @@ +{ + "name": "async", + "description": "Higher-order functions and common patterns for asynchronous code", + "main": "./lib/async", + "author": "Caolan McMahon", + "version": "0.2.6", + "repository" : { + "type" : "git", + "url" : "http://github.com/caolan/async.git" + }, + "bugs" : { + "url" : "http://github.com/caolan/async/issues" + }, + "licenses" : [ + { + "type" : "MIT", + "url" : "http://github.com/caolan/async/raw/master/LICENSE" + } + ], + "devDependencies": { + "nodeunit": ">0.0.0", + "uglify-js": "1.2.x", + "nodelint": ">0.0.0" + }, + "jam": { + "main": "lib/async.js", + "include": [ + "lib/async.js", + "README.md", + "LICENSE" + ] + }, + "scripts": { + "test": "nodeunit test/test-async.js" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/bcrypt.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/bcrypt.json new file mode 100644 index 000000000..56e6d81b3 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/bcrypt.json @@ -0,0 +1,56 @@ +{ + "name": "bcrypt", + "description": "A bcrypt library for NodeJS.", + "keywords": [ + "bcrypt", + "password", + "auth", + "authentication", + "encryption", + "crypt", + "crypto" + ], + "main": "./bcrypt", + "version": "0.7.5", + "author": "Nick Campbell (http://github.com/ncb000gt)", + "engines": { + "node": ">= 0.6.0" + }, + "repository": { + "type": "git", + "url": "http://github.com/ncb000gt/node.bcrypt.js.git" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "bugs": { + "url": "http://github.com/ncb000gt/node.bcrypt.js/issues" + }, + "scripts": { + "test": "node-gyp configure build && nodeunit test" + }, + "dependencies": { + "bindings": "1.0.0" + }, + "devDependencies": { + "nodeunit": ">=0.6.4" + }, + "contributors": [ + "Antonio Salazar Cardozo <savedfastcool@gmail.com> (https://github.com/Shadowfiend)", + "Van Nguyen <the.gol.effect@gmail.com> (https://github.com/thegoleffect)", + "David Trejo <david@dtrejo.com> (https://github.com/dtrejo)", + "Ben Glow <glen.low@pixelglow.com> (https://github.com/pixelglow)", + "NewITFarmer.com <> (https://github.com/newitfarmer)", + "Alfred Westerveld <alfredwesterveld@gmail.com> (https://github.com/alfredwesterveld)", + "Vincent Côté-Roy <vincentcr@gmail.com> (https://github.com/vincentcr)", + "Lloyd Hilaiel <lloyd@hilaiel.com> (https://github.com/lloyd)", + "Roman Shtylman <shtylman@gmail.com> (https://github.com/shtylman)", + "Vadim Graboys <dimva13@gmail.com> (https://github.com/vadimg)", + "Ben Noorduis <> (https://github.com/bnoordhuis)", + "Nate Rajlich <nathan@tootallnate.net> (https://github.com/tootallnate)", + "Sean McArthur <sean.monstar@gmail.com> (https://github.com/seanmonstar)", + "Fanie Oosthuysen <fanie.oosthuysen@gmail.com> (https://github.com/weareu)" + ] +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/coffee-script.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/coffee-script.json new file mode 100644 index 000000000..a0b60a9d3 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/coffee-script.json @@ -0,0 +1,35 @@ +{ + "name": "coffee-script", + "description": "Unfancy JavaScript", + "keywords": ["javascript", "language", "coffeescript", "compiler"], + "author": "Jeremy Ashkenas", + "version": "1.6.2", + "licenses": [{ + "type": "MIT", + "url": "https://raw.github.com/jashkenas/coffee-script/master/LICENSE" + }], + "engines": { + "node": ">=0.8.0" + }, + "directories" : { + "lib" : "./lib/coffee-script" + }, + "main" : "./lib/coffee-script/coffee-script", + "bin": { + "coffee": "./bin/coffee", + "cake": "./bin/cake" + }, + "scripts": { + "test": "node ./bin/cake test" + }, + "homepage": "http://coffeescript.org", + "bugs": "https://github.com/jashkenas/coffee-script/issues", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/coffee-script.git" + }, + "devDependencies": { + "uglify-js": "~2.2", + "jison": ">=0.2.0" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/http-server.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/http-server.json new file mode 100644 index 000000000..90c28863a --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/http-server.json @@ -0,0 +1,53 @@ +{ + "name": "http-server", + "preferGlobal": true, + "version": "0.3.0", + "author": "Nodejitsu <support@nodejitsu.com>", + "description": "a simple zero-configuration command-line http server", + "contributors": [ + { + "name": "Marak Squires", + "email": "marak@nodejitsu.com" + } + ], + "bin": { + "http-server": "./bin/http-server" + }, + "scripts": { + "start": "node ./bin/http-server", + "test": "vows --spec --isolate", + "predeploy": "echo This will be run before deploying the app", + "postdeploy": "echo This will be run after deploying the app" + }, + "main": "./lib/http-server", + "repository": { + "type": "git", + "url": "https://github.com/nodejitsu/http-server.git" + }, + "keywords": [ + "cli", + "http", + "server" + ], + "dependencies" : { + "colors" : "*", + "flatiron" : "0.1.x", + "optimist" : "0.2.x", + "union" : "0.1.x", + "ecstatic" : "0.1.x", + "plates" : "https://github.com/flatiron/plates/tarball/master" + }, + "analyze": false, + "devDependencies": { + "vows" : "0.5.x", + "request" : "2.1.x" + }, + "bundledDependencies": [ + "union", + "ecstatic" + ], + "license": "MIT", + "engines": { + "node": ">=0.6" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/movefile.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/movefile.json new file mode 100644 index 000000000..593387570 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/movefile.json @@ -0,0 +1,21 @@ +{ + "name": "movefile", + "description": "rename implementation working over devices", + "version": "0.2.0", + "author": "yazgazan <yazgazan@gmail.com>", + "main": "./build/Release/movefile", + "keywords": ["move", "file", "rename"], + "repository": "git://github.com/yazgazan/movefile.git", + "directories": { + "lib": "./build/Release/" + }, + "scripts": { + "install": "./node_modules/node-gyp/bin/node-gyp.js configure && ./node_modules/node-gyp/bin/node-gyp.js build" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "node-gyp": "~0.9.1" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/node-module_exist.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/node-module_exist.json new file mode 100644 index 000000000..acc053825 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/node-module_exist.json @@ -0,0 +1,26 @@ +{ + "name": "node-module_exist", + "description": "Find if a NodeJS module is available to require or not", + "version": "0.0.1", + "main": "module_exist.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@gist.github.com:3135914.git" + }, + "homepage": "https://github.com/FGRibreau", + "author": { + "name": "Francois-Guillaume Ribreau", + "url": "http://fgribreau.com.com/" + }, + "devDependencies": { + "nodeunit": "~0.7.4" + }, + "keywords": [ + "core", + "modules" + ], + "license": "MIT" +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/npm.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/npm.json new file mode 100644 index 000000000..2262b3139 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/npm.json @@ -0,0 +1,135 @@ +{ + "version": "1.2.17", + "name": "npm", + "publishConfig": { + "proprietary-attribs": false + }, + "description": "A package manager for node", + "keywords": [ + "package manager", + "modules", + "install", + "package.json" + ], + "preferGlobal": true, + "config": { + "publishtest": false + }, + "homepage": "https://npmjs.org/doc/", + "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", + "repository": { + "type": "git", + "url": "https://github.com/isaacs/npm" + }, + "bugs": { + "email": "npm-@googlegroups.com", + "url": "http://github.com/isaacs/npm/issues" + }, + "directories": { + "doc": "./doc", + "man": "./man", + "lib": "./lib", + "bin": "./bin" + }, + "main": "./lib/npm.js", + "bin": "./bin/npm-cli.js", + "dependencies": { + "semver": "~1.1.2", + "ini": "~1.1.0", + "slide": "1", + "abbrev": "~1.0.4", + "graceful-fs": "~1.2.0", + "minimatch": "~0.2.11", + "nopt": "~2.1.1", + "rimraf": "2", + "request": "~2.9", + "which": "1", + "tar": "~0.1.17", + "fstream": "~0.1.22", + "block-stream": "*", + "inherits": "1", + "mkdirp": "~0.3.3", + "read": "~1.0.4", + "lru-cache": "~2.3.0", + "node-gyp": "~0.9.3", + "fstream-npm": "~0.1.3", + "uid-number": "0", + "archy": "0", + "chownr": "0", + "npmlog": "0", + "ansi": "~0.1.2", + "npm-registry-client": "~0.2.18", + "read-package-json": "~0.3.0", + "read-installed": "0", + "glob": "~3.1.21", + "init-package-json": "0.0.6", + "osenv": "0", + "lockfile": "~0.3.0", + "retry": "~0.6.0", + "once": "~1.1.1", + "npmconf": "0", + "opener": "~1.3.0", + "chmodr": "~0.1.0", + "cmd-shim": "~1.1.0" + }, + "bundleDependencies": [ + "semver", + "ini", + "slide", + "abbrev", + "graceful-fs", + "minimatch", + "nopt", + "rimraf", + "request", + "which", + "tar", + "fstream", + "block-stream", + "inherits", + "mkdirp", + "read", + "lru-cache", + "node-gyp", + "fstream-npm", + "uid-number", + "archy", + "chownr", + "npmlog", + "ansi", + "npm-registry-client", + "read-package-json", + "read-installed", + "glob", + "init-package-json", + "osenv", + "lockfile", + "retry", + "once", + "npmconf", + "opener", + "chmodr", + "cmd-shim" + ], + "devDependencies": { + "ronn": "~0.3.6", + "tap": "~0.4.0" + }, + "engines": { + "node": ">=0.6", + "npm": "1" + }, + "scripts": { + "test": "node ./test/run.js && tap test/tap/*.js", + "tap": "tap test/tap/*.js", + "prepublish": "node bin/npm-cli.js prune ; rm -rf test/*/*/node_modules ; make -j4 doc", + "dumpconf": "env | grep npm | sort | uniq", + "echo": "node bin/npm-cli.js" + }, + "licenses": [ + { + "type": "MIT +no-false-attribs", + "url": "https://github.com/isaacs/npm/raw/master/LICENSE" + } + ] +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/read-package-json.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/read-package-json.json new file mode 100644 index 000000000..f4a2b96f4 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/read-package-json.json @@ -0,0 +1,27 @@ +{ + "name": "read-package-json", + "version": "0.1.1", + "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)", + "description": "The thing npm uses to read package.json files with semantics and defaults and validation", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/read-package-json.git" + }, + "main": "read-json.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "glob": "~3.1.9", + "lru-cache": "~1.1.0", + "semver": "~1.0.14", + "slide": "~1.1.3" + }, + "devDependencies": { + "tap": "~0.2.5" + }, + "optionalDependencies": { + "npmlog": "0", + "graceful-fs": "~1.1.8" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/request.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/request.json new file mode 100644 index 000000000..24189a551 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/request.json @@ -0,0 +1,39 @@ +{ + "name": "request", + "description": "Simplified HTTP request client.", + "tags": [ + "http", + "simple", + "util", + "utility" + ], + "version": "2.16.7", + "author": "Mikeal Rogers <mikeal.rogers@gmail.com>", + "repository": { + "type": "git", + "url": "http://github.com/mikeal/request.git" + }, + "bugs": { + "url": "http://github.com/mikeal/request/issues" + }, + "engines": [ + "node >= 0.8.0" + ], + "main": "index.js", + "dependencies": { + "form-data": "~0.0.3", + "mime": "~1.2.7", + "hawk": "~0.10.2", + "node-uuid": "~1.4.0", + "cookie-jar": "~0.2.0", + "aws-sign": "~0.2.0", + "oauth-sign": "~0.2.0", + "forever-agent": "~0.2.0", + "tunnel-agent": "~0.2.0", + "json-stringify-safe": "~3.0.0", + "qs": "~0.5.4" + }, + "scripts": { + "test": "node tests/run.js" + } +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/underscore.json b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/underscore.json new file mode 100644 index 000000000..bfc8b3d26 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/fixtures/underscore.json @@ -0,0 +1,17 @@ +{ + "name" : "underscore", + "description" : "JavaScript's functional programming helper library.", + "homepage" : "http://underscorejs.org", + "keywords" : ["util", "functional", "server", "client", "browser"], + "author" : "Jeremy Ashkenas <jeremy@documentcloud.org>", + "repository" : {"type": "git", "url": "git://github.com/documentcloud/underscore.git"}, + "main" : "underscore.js", + "version" : "1.4.4", + "devDependencies": { + "phantomjs": "1.9.0-1" + }, + "scripts": { + "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true" + }, + "license" : "MIT" +}
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/github-urls.js b/node_modules/read-package-json/node_modules/normalize-package-data/test/github-urls.js new file mode 100644 index 000000000..fd68d76e2 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/github-urls.js @@ -0,0 +1,46 @@ +var tap = require("tap") +var normalize = require("../lib/normalize") +var path = require("path") +var fs = require("fs") +var _ = require("underscore") +var async = require("async") + +var data, clonedData +var warn + +tap.test("consistent normalization", function(t) { + entries = [ + 'read-package-json.json', + 'http-server.json', + "movefile.json", + "node-module_exist.json" + ] + verifyConsistency = function(entryName, next) { + warn = function(msg) { + // t.equal("",msg) // uncomment to have some kind of logging of warnings + } + filename = __dirname + "/fixtures/" + entryName + fs.readFile(filename, function(err, contents) { + if (err) return next(err) + data = JSON.parse(contents.toString()) + normalize(data, warn) + if(data.name == "node-module_exist") { + t.same(data.bugs.url, "https://gist.github.com/3135914") + } + if(data.name == "read-package-json") { + t.same(data.bugs.url, "https://github.com/isaacs/read-package-json/issues") + } + if(data.name == "http-server") { + t.same(data.bugs.url, "https://github.com/nodejitsu/http-server/issues") + } + if(data.name == "movefile") { + t.same(data.bugs.url, "https://github.com/yazgazan/movefile/issues") + } + next(null) + }) // fs.readFile + } // verifyConsistency + async.forEach(entries, verifyConsistency, function(err) { + if (err) throw err + t.end() + }) +}) // tap.test
\ No newline at end of file diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/normalize.js b/node_modules/read-package-json/node_modules/normalize-package-data/test/normalize.js new file mode 100644 index 000000000..2d6d198d2 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/normalize.js @@ -0,0 +1,100 @@ +var tap = require("tap") +var fs = require("fs") +var path = require("path") + +var globals = Object.keys(global) + +var normalize = require("../lib/normalize") + +var rpjPath = path.resolve(__dirname,"./fixtures/read-package-json.json") +tap.test("normalize some package data", function(t) { + var packageData = require(rpjPath) + var warnings = [] + normalize(packageData, function(warning) { + warnings.push(warning) + }) + // there's no readme data in this particular object + t.equal( warnings.length, 1, "There's exactly one warning.") + fs.readFile(rpjPath, function(err, data) { + if(err) throw err + // Various changes have been made + t.notEqual(packageData, JSON.parse(data), "Output is different from input.") + t.end() + }) +}) + +tap.test("runs without passing warning function", function(t) { + var packageData = require(rpjPath) + fs.readFile(rpjPath, function(err, data) { + if(err) throw err + normalize(JSON.parse(data)) + t.ok(true, "If you read this, this means I'm still alive.") + t.end() + }) +}) + +tap.test("empty object", function(t) { + var packageData = {} + var expect = + { name: '', + version: '', + readme: 'ERROR: No README data found!', + _id: '@' } + + var warnings = [] + function warn(m) { + warnings.push(m) + } + normalize(packageData, warn) + t.same(packageData, expect) + t.same(warnings, ["No readme data!"]) + t.end() +}) + +tap.test("urls required", function(t) { + var warnings = [] + function warn(w) { + warnings.push(w) + } + normalize({ + bugs: { + url: "/1", + email: "not an email address" + } + }, warn) + var a + normalize(a={ + readme: "read yourself how about", + homepage: "stragle planarf", + bugs: "what is this i don't even", + repository: "Hello." + }, warn) + + console.error(a) + + var expect = + [ 'No readme data!', + 'bugs.url field must be a string url. Deleted.', + 'bugs.email field must be a string email. Deleted.', + 'Normalized value of bugs field is an empty object. Deleted.', + 'Bug string field must be url, email, or {email,url}', + 'Normalized value of bugs field is an empty object. Deleted.', + 'homepage field must be a string url. Deleted.' ] + t.same(warnings, expect) + t.end() +}) + +tap.test("gist bugs url", function(t) { + var d = { + repository: "git@gist.github.com:123456.git" + } + normalize(d) + t.same(d.repository, { type: 'git', url: 'git@gist.github.com:123456.git' }) + t.same(d.bugs, { url: 'https://gist.github.com/123456' }) + t.end(); +}); + +tap.test('no new globals', function(t) { + t.same(Object.keys(global), globals) + t.end() +}) diff --git a/node_modules/read-package-json/node_modules/normalize-package-data/test/typo.js b/node_modules/read-package-json/node_modules/normalize-package-data/test/typo.js new file mode 100644 index 000000000..565fd7c25 --- /dev/null +++ b/node_modules/read-package-json/node_modules/normalize-package-data/test/typo.js @@ -0,0 +1,64 @@ +var test = require('tap').test +var normalize = require('../') +var typos = require('../lib/typos.json') + +test('typos', function(t) { + var warnings = [] + function warn(m) { + warnings.push(m) + } + + var expect = + [ 'dependancies should probably be dependencies', + 'dependecies should probably be dependencies', + 'depdenencies should probably be dependencies', + 'devEependencies should probably be devDependencies', + 'depends should probably be dependencies', + 'dev-dependencies should probably be devDependencies', + 'devDependences should probably be devDependencies', + 'devDepenencies should probably be devDependencies', + 'devdependencies should probably be devDependencies', + 'repostitory should probably be repository', + 'prefereGlobal should probably be preferGlobal', + 'hompage should probably be homepage', + 'hampage should probably be homepage', + 'autohr should probably be author', + 'autor should probably be author', + 'contributers should probably be contributors', + 'publicationConfig should probably be publishConfig', + 'No readme data!', + 'bugs.url field must be a string url. Deleted.', + 'Normalized value of bugs field is an empty object. Deleted.', + 'No readme data!' ] + + normalize({"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" + ,readme:"asdf" + ,name:"name" + ,version:"1.2.5"}, warn) + + normalize({name:"name" + ,version:"1.2.5" + ,bugs:{web:"url",name:"url"}}, warn) + + normalize({name:"name" + ,version:"1.2.5" + ,script:{server:"start",tests:"test"}}, warn) + t.same(warnings, expect) + t.end(); +}) diff --git a/node_modules/read-package-json/package.json b/node_modules/read-package-json/package.json index c6bbfd9ce..e8bca0886 100644 --- a/node_modules/read-package-json/package.json +++ b/node_modules/read-package-json/package.json @@ -1,6 +1,6 @@ { "name": "read-package-json", - "version": "0.3.0", + "version": "0.4.0", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", @@ -18,8 +18,7 @@ "dependencies": { "glob": "~3.1.9", "lru-cache": "2", - "semver": "1.x", - "slide": "~1.1.3", + "normalize-package-data": "~0.1.2", "npmlog": "0", "graceful-fs": "~1.2" }, @@ -32,6 +31,10 @@ }, "readme": "# read-package-json\n\nThis is the thing that npm uses to read package.json files. It\nvalidates some stuff, and loads some default things.\n\nIt keeps a cache of the files you've read, so that you don't end\nup reading the same package.json file multiple times.\n\nNote that if you just want to see what's literally in the package.json\nfile, you can usually do `var data = require('some-module/package.json')`.\n\nThis module is basically only needed by npm, but it's handy to see what\nnpm will see when it looks at your package.\n\n## Usage\n\n```javascript\nvar readJson = require('read-package-json')\n\nreadJson('/path/to/package.json', function (er, data) {\n if (er) {\n console.error(\"There was an error reading the file\")\n return\n }\n\n console.error('the package data is', data)\n}\n```\n\n## readJson(file, cb)\n\n* `file` {String} The path to the package.json file\n* `cb` {Function}\n\nReads the JSON file and does the things.\n\n## `package.json` Fields\n\nSee `man 5 package.json` or `npm help json`.\n\n## readJson.log\n\nBy default this is a reference to the `npmlog` module. But if that\nmodule can't be found, then it'll be set to just a dummy thing that does\nnothing.\n\nReplace with your own `{log,warn,error}` object for fun loggy time.\n\n## readJson.extras(file, data, cb)\n\nRun all the extra stuff relative to the file, with the parsed data.\n\nModifies the data as it does stuff. Calls the cb when it's done.\n\n## readJson.extraSet = [fn, fn, ...]\n\nArray of functions that are called by `extras`. Each one receives the\narguments `fn(file, data, cb)` and is expected to call `cb(er, data)`\nwhen done or when an error occurs.\n\nOrder is indeterminate, so each function should be completely\nindependent.\n\nMix and match!\n\n## readJson.cache\n\nThe `lru-cache` object that readJson uses to not read the same file over\nand over again. See\n[lru-cache](https://github.com/isaacs/node-lru-cache) for details.\n\n## Other Relevant Files Besides `package.json`\n\nSome other files have an effect on the resulting data object, in the\nfollowing ways:\n\n### `README?(.*)`\n\nIf there is a `README` or `README.*` file present, then npm will attach\na `readme` field to the data with the contents of this file.\n\nOwing to the fact that roughly 100% of existing node modules have\nMarkdown README files, it will generally be assumed to be Markdown,\nregardless of the extension. Please plan accordingly.\n\n### `server.js`\n\nIf there is a `server.js` file, and there is not already a\n`scripts.start` field, then `scripts.start` will be set to `node\nserver.js`.\n\n### `AUTHORS`\n\nIf there is not already a `contributors` field, then the `contributors`\nfield will be set to the contents of the `AUTHORS` file, split by lines,\nand parsed.\n\n### `bindings.gyp`\n\nIf a bindings.gyp file exists, and there is not already a\n`scripts.install` field, then the `scripts.install` field will be set to\n`node-gyp rebuild`.\n\n### `wscript`\n\nIf a wscript file exists, and there is not already a `scripts.install`\nfield, then the `scripts.install` field will be set to `node-waf clean ;\nnode-waf configure build`.\n\nNote that the `bindings.gyp` file supercedes this, since node-waf has\nbeen deprecated in favor of node-gyp.\n\n### `index.js`\n\nIf the json file does not exist, but there is a `index.js` file\npresent instead, and that file has a package comment, then it will try\nto parse the package comment, and use that as the data instead.\n\nA package comment looks like this:\n\n```javascript\n/**package\n * { \"name\": \"my-bare-module\"\n * , \"version\": \"1.2.3\"\n * , \"description\": \"etc....\" }\n **/\n\n// or...\n\n/**package\n{ \"name\": \"my-bare-module\"\n, \"version\": \"1.2.3\"\n, \"description\": \"etc....\" }\n**/\n```\n\nThe important thing is that it starts with `/**package`, and ends with\n`**/`. If the package.json file exists, then the index.js is not\nparsed.\n\n### `{directories.man}/*.[0-9]`\n\nIf there is not already a `man` field defined as an array of files or a\nsingle file, and\nthere is a `directories.man` field defined, then that directory will\nbe searched for manpages.\n\nAny valid manpages found in that directory will be assigned to the `man`\narray, and installed in the appropriate man directory at package install\ntime, when installed globally on a Unix system.\n\n### `{directories.bin}/*`\n\nIf there is not already a `bin` field defined as a string filename or a\nhash of `<name> : <filename>` pairs, then the `directories.bin`\ndirectory will be searched and all the files within it will be linked as\nexecutables at install time.\n\nWhen installing locally, npm links bins into `node_modules/.bin`, which\nis in the `PATH` environ when npm runs scripts. When\ninstalling globally, they are linked into `{prefix}/bin`, which is\npresumably in the `PATH` environment variable.\n", "readmeFilename": "README.md", - "_id": "read-package-json@0.3.0", - "_from": "read-package-json@latest" + "_id": "read-package-json@0.4.0", + "dist": { + "shasum": "a55d5a0785c5ebb5f11ede328136b71a2000adf9" + }, + "_from": "read-package-json@0.4.0", + "_resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-0.4.0.tgz" } diff --git a/node_modules/read-package-json/read-json.js b/node_modules/read-package-json/read-json.js index 9ca3e4e7e..acb128680 100644 --- a/node_modules/read-package-json/read-json.js +++ b/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 -} diff --git a/node_modules/read-package-json/test/non-json.js b/node_modules/read-package-json/test/non-json.js index 8f8feb10d..09ee687d5 100644 --- a/node_modules/read-package-json/test/non-json.js +++ b/node_modules/read-package-json/test/non-json.js @@ -14,6 +14,7 @@ var expect = repository: { type: 'git', url: 'git://github.com/isaacs/read-package-json.git' }, + bugs: {url: "https://github.com/isaacs/read-package-json/issues" }, main: 'read-json.js', scripts: { test: 'tap test/*.js' }, dependencies: @@ -26,7 +27,7 @@ var expect = devDependencies: { tap: '~0.2.5' }, optionalDependencies: { npmlog: '0', 'graceful-fs': '~1.1.8' }, _id: 'read-package-json@0.1.1', - readme: 'ERROR: No README.md file found!' } + readme: 'ERROR: No README data found!' } tap.test('from css', function (t) { var c = path.join(__dirname, 'fixtures', 'not-json.css') |