summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy J Fontaine <tjfontaine@gmail.com>2014-06-10 19:36:04 -0400
committerTimothy J Fontaine <tjfontaine@gmail.com>2014-06-10 19:36:04 -0400
commit1a09da6ec219883668564d5d6cd30e8867d7e97d (patch)
treefda9b632fa5ab280286a2f0c1076bbaa008be362
parentab50fad63bcbedd7c935a9c5d2ab9e4c7202c9f2 (diff)
parent1cb6f1a46ad24c60ab1fccfa3f88aad9401e6444 (diff)
downloadandroid-node-v8-1a09da6ec219883668564d5d6cd30e8867d7e97d.tar.gz
android-node-v8-1a09da6ec219883668564d5d6cd30e8867d7e97d.tar.bz2
android-node-v8-1a09da6ec219883668564d5d6cd30e8867d7e97d.zip
Merge remote-tracking branch 'upstream/v0.10'
Conflicts: AUTHORS ChangeLog deps/v8/src/api.cc deps/v8/src/unicode-inl.h deps/v8/src/unicode.h lib/_stream_readable.js lib/http.js src/cares_wrap.cc src/node.cc src/node_crypto.cc src/node_dtrace.cc src/node_file.cc src/node_stat_watcher.cc src/node_version.h src/process_wrap.cc src/string_bytes.cc src/string_bytes.h src/udp_wrap.cc src/util.h test/simple/test-buffer.js test/simple/test-stream2-compatibility.js
-rw-r--r--AUTHORS4
-rw-r--r--ChangeLog32
-rw-r--r--deps/npm/.npmrc2
-rw-r--r--deps/npm/LICENSE5
-rw-r--r--deps/npm/Makefile8
-rwxr-xr-xdeps/npm/bin/npm1
-rw-r--r--deps/npm/doc/api/npm-cache.md30
-rw-r--r--deps/npm/doc/cli/npm-cache.md8
-rw-r--r--deps/npm/doc/cli/npm-run-script.md1
-rw-r--r--deps/npm/doc/cli/npm.md16
-rw-r--r--deps/npm/doc/files/npmrc.md14
-rw-r--r--deps/npm/doc/misc/npm-config.md14
-rw-r--r--deps/npm/doc/misc/npm-faq.md4
-rw-r--r--deps/npm/doc/misc/npm-index.md4
-rw-r--r--deps/npm/doc/misc/npm-scripts.md2
-rw-r--r--deps/npm/doc/misc/semver.md90
-rw-r--r--deps/npm/html/doc/README.html6
-rw-r--r--deps/npm/html/doc/api/npm-bin.html2
-rw-r--r--deps/npm/html/doc/api/npm-bugs.html2
-rw-r--r--deps/npm/html/doc/api/npm-cache.html46
-rw-r--r--deps/npm/html/doc/api/npm-commands.html2
-rw-r--r--deps/npm/html/doc/api/npm-config.html2
-rw-r--r--deps/npm/html/doc/api/npm-deprecate.html2
-rw-r--r--deps/npm/html/doc/api/npm-docs.html2
-rw-r--r--deps/npm/html/doc/api/npm-edit.html2
-rw-r--r--deps/npm/html/doc/api/npm-explore.html2
-rw-r--r--deps/npm/html/doc/api/npm-help-search.html2
-rw-r--r--deps/npm/html/doc/api/npm-init.html2
-rw-r--r--deps/npm/html/doc/api/npm-install.html2
-rw-r--r--deps/npm/html/doc/api/npm-link.html2
-rw-r--r--deps/npm/html/doc/api/npm-load.html2
-rw-r--r--deps/npm/html/doc/api/npm-ls.html2
-rw-r--r--deps/npm/html/doc/api/npm-outdated.html2
-rw-r--r--deps/npm/html/doc/api/npm-owner.html2
-rw-r--r--deps/npm/html/doc/api/npm-pack.html2
-rw-r--r--deps/npm/html/doc/api/npm-prefix.html2
-rw-r--r--deps/npm/html/doc/api/npm-prune.html2
-rw-r--r--deps/npm/html/doc/api/npm-publish.html2
-rw-r--r--deps/npm/html/doc/api/npm-rebuild.html2
-rw-r--r--deps/npm/html/doc/api/npm-repo.html2
-rw-r--r--deps/npm/html/doc/api/npm-restart.html2
-rw-r--r--deps/npm/html/doc/api/npm-root.html2
-rw-r--r--deps/npm/html/doc/api/npm-run-script.html2
-rw-r--r--deps/npm/html/doc/api/npm-search.html2
-rw-r--r--deps/npm/html/doc/api/npm-shrinkwrap.html2
-rw-r--r--deps/npm/html/doc/api/npm-start.html2
-rw-r--r--deps/npm/html/doc/api/npm-stop.html2
-rw-r--r--deps/npm/html/doc/api/npm-submodule.html2
-rw-r--r--deps/npm/html/doc/api/npm-tag.html2
-rw-r--r--deps/npm/html/doc/api/npm-test.html2
-rw-r--r--deps/npm/html/doc/api/npm-uninstall.html2
-rw-r--r--deps/npm/html/doc/api/npm-unpublish.html2
-rw-r--r--deps/npm/html/doc/api/npm-update.html2
-rw-r--r--deps/npm/html/doc/api/npm-version.html2
-rw-r--r--deps/npm/html/doc/api/npm-view.html2
-rw-r--r--deps/npm/html/doc/api/npm-whoami.html2
-rw-r--r--deps/npm/html/doc/api/npm.html4
-rw-r--r--deps/npm/html/doc/cli/npm-adduser.html2
-rw-r--r--deps/npm/html/doc/cli/npm-bin.html2
-rw-r--r--deps/npm/html/doc/cli/npm-bugs.html2
-rw-r--r--deps/npm/html/doc/cli/npm-build.html2
-rw-r--r--deps/npm/html/doc/cli/npm-bundle.html2
-rw-r--r--deps/npm/html/doc/cli/npm-cache.html10
-rw-r--r--deps/npm/html/doc/cli/npm-completion.html2
-rw-r--r--deps/npm/html/doc/cli/npm-config.html2
-rw-r--r--deps/npm/html/doc/cli/npm-dedupe.html2
-rw-r--r--deps/npm/html/doc/cli/npm-deprecate.html2
-rw-r--r--deps/npm/html/doc/cli/npm-docs.html2
-rw-r--r--deps/npm/html/doc/cli/npm-edit.html2
-rw-r--r--deps/npm/html/doc/cli/npm-explore.html2
-rw-r--r--deps/npm/html/doc/cli/npm-help-search.html2
-rw-r--r--deps/npm/html/doc/cli/npm-help.html2
-rw-r--r--deps/npm/html/doc/cli/npm-init.html2
-rw-r--r--deps/npm/html/doc/cli/npm-install.html2
-rw-r--r--deps/npm/html/doc/cli/npm-link.html2
-rw-r--r--deps/npm/html/doc/cli/npm-ls.html4
-rw-r--r--deps/npm/html/doc/cli/npm-outdated.html2
-rw-r--r--deps/npm/html/doc/cli/npm-owner.html2
-rw-r--r--deps/npm/html/doc/cli/npm-pack.html2
-rw-r--r--deps/npm/html/doc/cli/npm-prefix.html2
-rw-r--r--deps/npm/html/doc/cli/npm-prune.html2
-rw-r--r--deps/npm/html/doc/cli/npm-publish.html2
-rw-r--r--deps/npm/html/doc/cli/npm-rebuild.html2
-rw-r--r--deps/npm/html/doc/cli/npm-repo.html2
-rw-r--r--deps/npm/html/doc/cli/npm-restart.html2
-rw-r--r--deps/npm/html/doc/cli/npm-rm.html2
-rw-r--r--deps/npm/html/doc/cli/npm-root.html2
-rw-r--r--deps/npm/html/doc/cli/npm-run-script.html3
-rw-r--r--deps/npm/html/doc/cli/npm-search.html2
-rw-r--r--deps/npm/html/doc/cli/npm-shrinkwrap.html2
-rw-r--r--deps/npm/html/doc/cli/npm-star.html2
-rw-r--r--deps/npm/html/doc/cli/npm-stars.html2
-rw-r--r--deps/npm/html/doc/cli/npm-start.html2
-rw-r--r--deps/npm/html/doc/cli/npm-stop.html2
-rw-r--r--deps/npm/html/doc/cli/npm-submodule.html2
-rw-r--r--deps/npm/html/doc/cli/npm-tag.html2
-rw-r--r--deps/npm/html/doc/cli/npm-test.html2
-rw-r--r--deps/npm/html/doc/cli/npm-uninstall.html2
-rw-r--r--deps/npm/html/doc/cli/npm-unpublish.html2
-rw-r--r--deps/npm/html/doc/cli/npm-update.html2
-rw-r--r--deps/npm/html/doc/cli/npm-version.html2
-rw-r--r--deps/npm/html/doc/cli/npm-view.html2
-rw-r--r--deps/npm/html/doc/cli/npm-whoami.html2
-rw-r--r--deps/npm/html/doc/cli/npm.html23
-rw-r--r--deps/npm/html/doc/files/npm-folders.html2
-rw-r--r--deps/npm/html/doc/files/npm-global.html2
-rw-r--r--deps/npm/html/doc/files/npm-json.html2
-rw-r--r--deps/npm/html/doc/files/npmrc.html13
-rw-r--r--deps/npm/html/doc/files/package.json.html2
-rw-r--r--deps/npm/html/doc/index.html4
-rw-r--r--deps/npm/html/doc/misc/npm-coding-style.html2
-rw-r--r--deps/npm/html/doc/misc/npm-config.html14
-rw-r--r--deps/npm/html/doc/misc/npm-developers.html2
-rw-r--r--deps/npm/html/doc/misc/npm-disputes.html8
-rw-r--r--deps/npm/html/doc/misc/npm-faq.html8
-rw-r--r--deps/npm/html/doc/misc/npm-index.html4
-rw-r--r--deps/npm/html/doc/misc/npm-registry.html2
-rw-r--r--deps/npm/html/doc/misc/npm-scripts.html4
-rw-r--r--deps/npm/html/doc/misc/removing-npm.html2
-rw-r--r--deps/npm/html/doc/misc/semver.html94
-rw-r--r--deps/npm/lib/adduser.js4
-rw-r--r--deps/npm/lib/cache.js1251
-rw-r--r--deps/npm/lib/cache/add-local-tarball.js223
-rw-r--r--deps/npm/lib/cache/add-local.js146
-rw-r--r--deps/npm/lib/cache/add-named.js275
-rw-r--r--deps/npm/lib/cache/add-remote-git.js285
-rw-r--r--deps/npm/lib/cache/add-remote-tarball.js106
-rw-r--r--deps/npm/lib/cache/get-stat.js63
-rw-r--r--deps/npm/lib/cache/maybe-github.js35
-rw-r--r--deps/npm/lib/explore.js1
-rw-r--r--deps/npm/lib/help.js1
-rw-r--r--deps/npm/lib/init.js5
-rw-r--r--deps/npm/lib/install.js3
-rw-r--r--deps/npm/lib/ls.js7
-rw-r--r--deps/npm/lib/npm.js146
-rw-r--r--deps/npm/lib/outdated.js23
-rw-r--r--deps/npm/lib/pack.js2
-rw-r--r--deps/npm/lib/publish.js2
-rw-r--r--deps/npm/lib/repo.js23
-rw-r--r--deps/npm/lib/submodule.js6
-rw-r--r--deps/npm/lib/utils/depr-check.js13
-rw-r--r--deps/npm/lib/utils/error-handler.js1
-rw-r--r--deps/npm/lib/utils/lifecycle.js3
-rw-r--r--deps/npm/lib/utils/locker.js52
-rw-r--r--deps/npm/lib/utils/tar.js6
-rw-r--r--deps/npm/lib/version.js7
-rw-r--r--deps/npm/lib/view.js2
-rw-r--r--deps/npm/man/man1/npm-README.12
-rw-r--r--deps/npm/man/man1/npm-adduser.12
-rw-r--r--deps/npm/man/man1/npm-bin.12
-rw-r--r--deps/npm/man/man1/npm-bugs.12
-rw-r--r--deps/npm/man/man1/npm-build.12
-rw-r--r--deps/npm/man/man1/npm-bundle.12
-rw-r--r--deps/npm/man/man1/npm-cache.112
-rw-r--r--deps/npm/man/man1/npm-completion.12
-rw-r--r--deps/npm/man/man1/npm-config.12
-rw-r--r--deps/npm/man/man1/npm-dedupe.12
-rw-r--r--deps/npm/man/man1/npm-deprecate.12
-rw-r--r--deps/npm/man/man1/npm-docs.12
-rw-r--r--deps/npm/man/man1/npm-edit.12
-rw-r--r--deps/npm/man/man1/npm-explore.12
-rw-r--r--deps/npm/man/man1/npm-help-search.12
-rw-r--r--deps/npm/man/man1/npm-help.12
-rw-r--r--deps/npm/man/man1/npm-init.12
-rw-r--r--deps/npm/man/man1/npm-install.12
-rw-r--r--deps/npm/man/man1/npm-link.12
-rw-r--r--deps/npm/man/man1/npm-ls.14
-rw-r--r--deps/npm/man/man1/npm-outdated.12
-rw-r--r--deps/npm/man/man1/npm-owner.12
-rw-r--r--deps/npm/man/man1/npm-pack.12
-rw-r--r--deps/npm/man/man1/npm-prefix.12
-rw-r--r--deps/npm/man/man1/npm-prune.12
-rw-r--r--deps/npm/man/man1/npm-publish.12
-rw-r--r--deps/npm/man/man1/npm-rebuild.12
-rw-r--r--deps/npm/man/man1/npm-repo.12
-rw-r--r--deps/npm/man/man1/npm-restart.12
-rw-r--r--deps/npm/man/man1/npm-rm.12
-rw-r--r--deps/npm/man/man1/npm-root.12
-rw-r--r--deps/npm/man/man1/npm-run-script.13
-rw-r--r--deps/npm/man/man1/npm-search.12
-rw-r--r--deps/npm/man/man1/npm-shrinkwrap.12
-rw-r--r--deps/npm/man/man1/npm-star.12
-rw-r--r--deps/npm/man/man1/npm-stars.12
-rw-r--r--deps/npm/man/man1/npm-start.12
-rw-r--r--deps/npm/man/man1/npm-stop.12
-rw-r--r--deps/npm/man/man1/npm-submodule.12
-rw-r--r--deps/npm/man/man1/npm-tag.12
-rw-r--r--deps/npm/man/man1/npm-test.12
-rw-r--r--deps/npm/man/man1/npm-uninstall.12
-rw-r--r--deps/npm/man/man1/npm-unpublish.12
-rw-r--r--deps/npm/man/man1/npm-update.12
-rw-r--r--deps/npm/man/man1/npm-version.12
-rw-r--r--deps/npm/man/man1/npm-view.12
-rw-r--r--deps/npm/man/man1/npm-whoami.12
-rw-r--r--deps/npm/man/man1/npm.118
-rw-r--r--deps/npm/man/man3/npm-bin.32
-rw-r--r--deps/npm/man/man3/npm-bugs.32
-rw-r--r--deps/npm/man/man3/npm-cache.340
-rw-r--r--deps/npm/man/man3/npm-commands.32
-rw-r--r--deps/npm/man/man3/npm-config.32
-rw-r--r--deps/npm/man/man3/npm-deprecate.32
-rw-r--r--deps/npm/man/man3/npm-docs.32
-rw-r--r--deps/npm/man/man3/npm-edit.32
-rw-r--r--deps/npm/man/man3/npm-explore.32
-rw-r--r--deps/npm/man/man3/npm-help-search.32
-rw-r--r--deps/npm/man/man3/npm-init.32
-rw-r--r--deps/npm/man/man3/npm-install.32
-rw-r--r--deps/npm/man/man3/npm-link.32
-rw-r--r--deps/npm/man/man3/npm-load.32
-rw-r--r--deps/npm/man/man3/npm-ls.32
-rw-r--r--deps/npm/man/man3/npm-outdated.32
-rw-r--r--deps/npm/man/man3/npm-owner.32
-rw-r--r--deps/npm/man/man3/npm-pack.32
-rw-r--r--deps/npm/man/man3/npm-prefix.32
-rw-r--r--deps/npm/man/man3/npm-prune.32
-rw-r--r--deps/npm/man/man3/npm-publish.32
-rw-r--r--deps/npm/man/man3/npm-rebuild.32
-rw-r--r--deps/npm/man/man3/npm-repo.32
-rw-r--r--deps/npm/man/man3/npm-restart.32
-rw-r--r--deps/npm/man/man3/npm-root.32
-rw-r--r--deps/npm/man/man3/npm-run-script.32
-rw-r--r--deps/npm/man/man3/npm-search.32
-rw-r--r--deps/npm/man/man3/npm-shrinkwrap.32
-rw-r--r--deps/npm/man/man3/npm-start.32
-rw-r--r--deps/npm/man/man3/npm-stop.32
-rw-r--r--deps/npm/man/man3/npm-submodule.32
-rw-r--r--deps/npm/man/man3/npm-tag.32
-rw-r--r--deps/npm/man/man3/npm-test.32
-rw-r--r--deps/npm/man/man3/npm-uninstall.32
-rw-r--r--deps/npm/man/man3/npm-unpublish.32
-rw-r--r--deps/npm/man/man3/npm-update.32
-rw-r--r--deps/npm/man/man3/npm-version.32
-rw-r--r--deps/npm/man/man3/npm-view.32
-rw-r--r--deps/npm/man/man3/npm-whoami.32
-rw-r--r--deps/npm/man/man3/npm.34
-rw-r--r--deps/npm/man/man5/npm-folders.52
-rw-r--r--deps/npm/man/man5/npm-global.52
-rw-r--r--deps/npm/man/man5/npm-json.52
-rw-r--r--deps/npm/man/man5/npmrc.518
-rw-r--r--deps/npm/man/man5/package.json.52
-rw-r--r--deps/npm/man/man7/npm-coding-style.72
-rw-r--r--deps/npm/man/man7/npm-config.725
-rw-r--r--deps/npm/man/man7/npm-developers.72
-rw-r--r--deps/npm/man/man7/npm-disputes.72
-rw-r--r--deps/npm/man/man7/npm-faq.76
-rw-r--r--deps/npm/man/man7/npm-index.75
-rw-r--r--deps/npm/man/man7/npm-registry.72
-rw-r--r--deps/npm/man/man7/npm-scripts.74
-rw-r--r--deps/npm/man/man7/removing-npm.72
-rw-r--r--deps/npm/man/man7/semver.7109
-rw-r--r--deps/npm/node_modules/abbrev/CONTRIBUTING.md3
-rw-r--r--deps/npm/node_modules/abbrev/abbrev.js (renamed from deps/npm/node_modules/abbrev/lib/abbrev.js)49
-rw-r--r--deps/npm/node_modules/abbrev/package.json34
-rw-r--r--deps/npm/node_modules/abbrev/test.js47
-rw-r--r--deps/npm/node_modules/char-spinner/LICENSE15
-rw-r--r--deps/npm/node_modules/char-spinner/README.md31
-rw-r--r--deps/npm/node_modules/char-spinner/package.json54
-rw-r--r--deps/npm/node_modules/char-spinner/spin.js51
-rw-r--r--deps/npm/node_modules/char-spinner/test/basic.js35
-rw-r--r--deps/npm/node_modules/columnify/package.json18
-rw-r--r--deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json33
-rw-r--r--deps/npm/node_modules/fstream-npm/package.json10
-rw-r--r--deps/npm/node_modules/github-url-from-username-repo/package.json23
-rw-r--r--deps/npm/node_modules/glob/package.json10
-rw-r--r--deps/npm/node_modules/inflight/LICENSE15
-rw-r--r--deps/npm/node_modules/inflight/README.md37
-rw-r--r--deps/npm/node_modules/inflight/inflight.js25
-rw-r--r--deps/npm/node_modules/inflight/package.json50
-rw-r--r--deps/npm/node_modules/inflight/test.js33
-rw-r--r--deps/npm/node_modules/ini/.npmignore1
-rw-r--r--deps/npm/node_modules/ini/ini.js30
-rw-r--r--deps/npm/node_modules/ini/package.json32
-rw-r--r--deps/npm/node_modules/ini/test/fixtures/foo.ini16
-rw-r--r--deps/npm/node_modules/ini/test/foo.js10
-rw-r--r--deps/npm/node_modules/init-package-json/default-input.js2
-rw-r--r--deps/npm/node_modules/init-package-json/node_modules/promzard/package.json26
-rw-r--r--deps/npm/node_modules/init-package-json/node_modules/promzard/promzard.js2
-rw-r--r--deps/npm/node_modules/init-package-json/node_modules/promzard/test/basic.js8
-rw-r--r--deps/npm/node_modules/init-package-json/node_modules/promzard/test/exports.js2
-rw-r--r--deps/npm/node_modules/init-package-json/node_modules/promzard/test/fn.js2
-rw-r--r--deps/npm/node_modules/init-package-json/package.json28
-rw-r--r--deps/npm/node_modules/minimatch/README.md4
-rw-r--r--deps/npm/node_modules/minimatch/minimatch.js14
-rw-r--r--deps/npm/node_modules/minimatch/node_modules/sigmund/package.json24
-rw-r--r--deps/npm/node_modules/minimatch/package.json26
-rw-r--r--deps/npm/node_modules/minimatch/test/defaults.js2
-rw-r--r--deps/npm/node_modules/node-gyp/README.md15
-rw-r--r--deps/npm/node_modules/node-gyp/lib/configure.js3
-rw-r--r--deps/npm/node_modules/node-gyp/lib/node-gyp.js3
-rw-r--r--deps/npm/node_modules/node-gyp/package.json33
-rw-r--r--deps/npm/node_modules/npm-cache-filename/LICENSE15
-rw-r--r--deps/npm/node_modules/npm-cache-filename/README.md21
-rw-r--r--deps/npm/node_modules/npm-cache-filename/index.js20
-rw-r--r--deps/npm/node_modules/npm-cache-filename/package.json33
-rw-r--r--deps/npm/node_modules/npm-cache-filename/test.js21
-rw-r--r--deps/npm/node_modules/npm-install-checks/LICENSE213
-rw-r--r--deps/npm/node_modules/npm-install-checks/package.json19
-rw-r--r--deps/npm/node_modules/npm-registry-client/README.md3
-rw-r--r--deps/npm/node_modules/npm-registry-client/index.js4
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/adduser.js13
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/deprecate.js2
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/get.js25
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/publish.js13
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/request.js30
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/star.js2
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/stars.js2
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/tag.js4
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/unpublish.js3
-rw-r--r--deps/npm/node_modules/npm-registry-client/package.json21
-rw-r--r--deps/npm/node_modules/npm-user-validate/README.md6
-rw-r--r--deps/npm/node_modules/npm-user-validate/npm-user-validate.js8
-rw-r--r--deps/npm/node_modules/npm-user-validate/package.json18
-rw-r--r--deps/npm/node_modules/npm-user-validate/test/pw.test.js10
-rw-r--r--deps/npm/node_modules/npmconf/config-defs.js4
-rw-r--r--deps/npm/node_modules/npmconf/lib/find-prefix.js (renamed from deps/npm/lib/utils/find-prefix.js)5
-rw-r--r--deps/npm/node_modules/npmconf/lib/load-prefix.js51
-rw-r--r--deps/npm/node_modules/npmconf/lib/load-uid.js15
-rw-r--r--deps/npm/node_modules/npmconf/lib/set-user.js23
-rw-r--r--deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json20
-rw-r--r--deps/npm/node_modules/npmconf/node_modules/config-chain/package.json22
-rw-r--r--deps/npm/node_modules/npmconf/npmconf.js103
-rw-r--r--deps/npm/node_modules/npmconf/package.json14
-rw-r--r--deps/npm/node_modules/npmconf/test/basic.js13
-rw-r--r--deps/npm/node_modules/npmconf/test/builtin.js13
-rw-r--r--deps/npm/node_modules/npmconf/test/fixtures/.npmrc1
-rw-r--r--deps/npm/node_modules/npmconf/test/fixtures/package.json0
-rw-r--r--deps/npm/node_modules/npmconf/test/project.js85
-rw-r--r--deps/npm/node_modules/npmlog/package.json20
-rw-r--r--deps/npm/node_modules/read-installed/node_modules/util-extend/package.json22
-rw-r--r--deps/npm/node_modules/read-installed/package.json6
-rw-r--r--deps/npm/node_modules/read-installed/read-installed.js26
-rw-r--r--deps/npm/node_modules/read-installed/test/depth-0.js2
-rw-r--r--deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer/package.json8
-rw-r--r--deps/npm/node_modules/read-installed/test/grandparent-peer.js24
-rw-r--r--deps/npm/node_modules/semver/README.md90
-rwxr-xr-xdeps/npm/node_modules/semver/bin/semver1
-rw-r--r--deps/npm/node_modules/semver/package.json7
-rw-r--r--deps/npm/node_modules/semver/semver.browser.js40
-rw-r--r--deps/npm/node_modules/semver/semver.browser.js.gzbin6903 -> 7180 bytes
-rw-r--r--deps/npm/node_modules/semver/semver.js40
-rw-r--r--deps/npm/node_modules/semver/semver.min.js2
-rw-r--r--deps/npm/node_modules/semver/semver.min.js.gzbin3231 -> 3295 bytes
-rw-r--r--deps/npm/node_modules/semver/test/index.js32
-rw-r--r--deps/npm/node_modules/uid-number/LICENCE25
-rw-r--r--deps/npm/node_modules/uid-number/package.json23
-rw-r--r--deps/npm/package.json36
-rw-r--r--deps/npm/test/tap/00-verify-bundle-deps.js27
-rw-r--r--deps/npm/test/tap/cache-shasum.js2
-rw-r--r--deps/npm/test/tap/config-meta.js7
-rw-r--r--deps/npm/test/tap/install-save-prefix.js2
-rw-r--r--deps/npm/test/tap/ls-depth-unmet.js97
-rw-r--r--deps/npm/test/tap/ls-depth-unmet/package.json10
-rw-r--r--deps/npm/test/tap/maybe-github.js76
-rw-r--r--deps/npm/test/tap/noargs-install-config-save.js6
-rw-r--r--deps/npm/test/tap/repo.js115
-rw-r--r--deps/npm/test/tap/update-save.js160
-rw-r--r--deps/npm/test/tap/update-save/README.md1
-rw-r--r--deps/npm/test/tap/update-save/index.js1
-rw-r--r--deps/npm/test/tap/update-save/package.json10
-rw-r--r--deps/npm/test/tap/url-dependencies.js1
-rw-r--r--lib/_http_server.js2
-rw-r--r--lib/_stream_readable.js12
-rw-r--r--lib/fs.js2
-rw-r--r--lib/string_decoder.js75
-rw-r--r--node.gyp1
-rw-r--r--src/cares_wrap.cc10
-rw-r--r--src/fs_event_wrap.cc2
-rw-r--r--src/node.cc52
-rw-r--r--src/node_buffer.cc2
-rw-r--r--src/node_crypto.cc34
-rw-r--r--src/node_dtrace.cc6
-rw-r--r--src/node_file.cc37
-rw-r--r--src/node_stat_watcher.cc2
-rw-r--r--src/pipe_wrap.cc4
-rw-r--r--src/process_wrap.cc8
-rw-r--r--src/string_bytes.cc4
-rw-r--r--src/string_bytes.h2
-rw-r--r--src/tcp_wrap.cc8
-rw-r--r--src/tls_wrap.cc2
-rw-r--r--src/udp_wrap.cc8
-rw-r--r--src/util.cc50
-rw-r--r--src/util.h26
-rw-r--r--test/disabled/test-http-abort-stream-end.js (renamed from test/simple/test-http-abort-stream-end.js)0
-rw-r--r--test/simple/test-buffer.js12
-rw-r--r--test/simple/test-stdout-close-unref.js12
-rw-r--r--test/simple/test-stream-readable-data-sync-race.js41
-rw-r--r--test/simple/test-stream2-readable-legacy-drain.js2
-rw-r--r--test/simple/test-string-decoder.js205
388 files changed, 4466 insertions, 2584 deletions
diff --git a/AUTHORS b/AUTHORS
index a42355f95b..65ddc6ac7a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -553,3 +553,7 @@ Farrin Reid <blakmatrix@gmail.com>
Denys Zariaiev <denys.zariaiev@gmail.com>
Sean McArthur <sean.monstar@gmail.com>
Rasmus Christian Pedersen <zerhacken@yahoo.com>
+Greg Sabia Tucker <greg@narrowlabs.com>
+Calvin Metcalf <calvin.metcalf@gmail.com>
+cjihrig <cjihrig@gmail.com>
+Chris Barber <chris@cb1inc.com>
diff --git a/ChangeLog b/ChangeLog
index e227188665..c79ab04afa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,4 @@
-2014.05.01, Version 0.11.13 (Unstable)
+2014.05.01, Version 0.11.13 (Unstable), 99c9930ad626e2796af23def7cac19b65c608d18
* v8: upgrade to 3.24.35.22
@@ -618,7 +618,35 @@
* console: `console.dir()` bypasses inspect() methods (Nathan Rajlich)
-2014.05.01, Version 0.10.28 (Stable)
+2014.06.05, Version 0.10.29 (Stable), ce82d6b8474bde7ac7df6d425fb88fb1bcba35bc
+
+* openssl: to 1.0.1h (CVE-2014-0224)
+
+* npm: upgrade to 1.4.10
+
+* utf8: Prevent Node from sending invalid UTF-8 (Felix Geisendörfer)
+ - *NOTE* this introduces a breaking change, previously you could construct
+ invalid UTF-8 and invoke an error in a client that was expecting valid
+ UTF-8, now unmatched surrogate pairs are replaced with the unknown UTF-8
+ character. To restore the old functionality simply have NODE_INVALID_UTF8
+ environment variable set.
+
+* child_process: do not set args before throwing (Greg Sabia Tucker)
+
+* child_process: spawn() does not throw TypeError (Greg Sabia Tucker)
+
+* constants: export O_NONBLOCK (Fedor Indutny)
+
+* crypto: improve memory usage (Alexis Campailla)
+
+* fs: close file if fstat() fails in readFile() (cjihrig)
+
+* lib: name EventEmitter prototype methods (Ben Noordhuis)
+
+* tls: fix performance issue (Alexis Campailla)
+
+
+2014.05.01, Version 0.10.28 (Stable), b148cbe09d4657766fdb61575ba985734c2ff0a8
* npm: upgrade to v1.4.9
diff --git a/deps/npm/.npmrc b/deps/npm/.npmrc
new file mode 100644
index 0000000000..ca0bc48dd5
--- /dev/null
+++ b/deps/npm/.npmrc
@@ -0,0 +1,2 @@
+save-prefix = ~
+proprietary-attribs = false
diff --git a/deps/npm/LICENSE b/deps/npm/LICENSE
index 2c0baba401..9505fc1199 100644
--- a/deps/npm/LICENSE
+++ b/deps/npm/LICENSE
@@ -214,9 +214,8 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------
-"Node.js" and "node" trademark Joyent, Inc. npm is not officially
-part of the Node.js project, and is neither owned by nor
-officially affiliated with Joyent, Inc.
+"Node.js" trademark Joyent, Inc. npm is not officially part of the Node.js
+project, and is neither owned by nor affiliated with Joyent, Inc.
Packages published in the npm registry (other than the Software and
its included dependencies) are not part of npm itself, are the sole
diff --git a/deps/npm/Makefile b/deps/npm/Makefile
index 870965b52e..c06734958c 100644
--- a/deps/npm/Makefile
+++ b/deps/npm/Makefile
@@ -169,8 +169,7 @@ publish: link doc
git push origin &&\
git push origin --tags &&\
npm publish &&\
- make doc-publish &&\
- make zip-publish
+ make doc-publish
docpublish: doc-publish
doc-publish: doc
@@ -202,13 +201,10 @@ doc-publish: doc
esac; \
done
-zip-publish: release
- scp release/* node@nodejs.org:dist/npm/
-
release:
@bash scripts/release.sh
sandwich:
@[ $$(whoami) = "root" ] && (echo "ok"; echo "ham" > sandwich) || (echo "make it yourself" && exit 13)
-.PHONY: all latest install dev link doc clean uninstall test man doc-publish doc-clean docclean docpublish release zip-publish
+.PHONY: all latest install dev link doc clean uninstall test man doc-publish doc-clean docclean docpublish release
diff --git a/deps/npm/bin/npm b/deps/npm/bin/npm
index 07ade35e08..d020ccfe7c 100755
--- a/deps/npm/bin/npm
+++ b/deps/npm/bin/npm
@@ -1,4 +1,5 @@
#!/bin/sh
+(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix
basedir=`dirname "$0"`
diff --git a/deps/npm/doc/api/npm-cache.md b/deps/npm/doc/api/npm-cache.md
new file mode 100644
index 0000000000..e7079d8c1e
--- /dev/null
+++ b/deps/npm/doc/api/npm-cache.md
@@ -0,0 +1,30 @@
+npm-cache(3) -- manage the npm cache programmatically
+=====================================================
+
+## SYNOPSIS
+
+ npm.commands.cache([args], callback)
+
+ // helpers
+ npm.commands.cache.clean([args], callback)
+ npm.commands.cache.add([args], callback)
+ npm.commands.cache.read(name, version, forceBypass, callback)
+
+## DESCRIPTION
+
+This acts much the same ways as the npm-cache(1) command line
+functionality.
+
+The callback is called with the package.json data of the thing that is
+eventually added to or read from the cache.
+
+The top level `npm.commands.cache(...)` functionality is a public
+interface, and like all commands on the `npm.commands` object, it will
+match the command line behavior exactly.
+
+However, the cache folder structure and the cache helper functions are
+considered **internal** API surface, and as such, may change in future
+releases of npm, potentially without warning or significant version
+incrementation.
+
+Use at your own risk.
diff --git a/deps/npm/doc/cli/npm-cache.md b/deps/npm/doc/cli/npm-cache.md
index af3cfac4da..03b5902bd4 100644
--- a/deps/npm/doc/cli/npm-cache.md
+++ b/deps/npm/doc/cli/npm-cache.md
@@ -37,16 +37,14 @@ npm stores cache data in the directory specified in `npm config get cache`.
For each package that is added to the cache, three pieces of information are
stored in `{cache}/{name}/{version}`:
-* .../package/:
- A folder containing the package contents as they appear in the tarball.
-* .../package.json:
- The package.json file, as npm sees it, with overlays applied and a _id attribute.
+* .../package/package.json:
+ The package.json file, as npm sees it.
* .../package.tgz:
The tarball for that version.
Additionally, whenever a registry request is made, a `.cache.json` file
is placed at the corresponding URI, to store the ETag and the requested
-data.
+data. This is stored in `{cache}/{hostname}/{path}/.cache.json`.
Commands that make non-essential registry requests (such as `search` and
`view`, or the completion scripts) generally specify a minimum timeout.
diff --git a/deps/npm/doc/cli/npm-run-script.md b/deps/npm/doc/cli/npm-run-script.md
index 783fab30e4..835dbf5df7 100644
--- a/deps/npm/doc/cli/npm-run-script.md
+++ b/deps/npm/doc/cli/npm-run-script.md
@@ -4,6 +4,7 @@ npm-run-script(1) -- Run arbitrary package scripts
## SYNOPSIS
npm run-script [<pkg>] [command]
+ npm run [<pkg>] [command]
## DESCRIPTION
diff --git a/deps/npm/doc/cli/npm.md b/deps/npm/doc/cli/npm.md
index 903aa1079e..ad16d419e8 100644
--- a/deps/npm/doc/cli/npm.md
+++ b/deps/npm/doc/cli/npm.md
@@ -31,6 +31,22 @@ Use `npm install blerg` to install the latest version of "blerg". Check out
Use the `npm search` command to show everything that's available.
Use `npm ls` to show everything you've installed.
+## DEPENDENCIES
+
+If a package references to another package with a git URL, npm depends
+on a preinstalled git.
+
+If one of the packages npm tries to install is a native node module and
+requires compiling of C++ Code, npm will use
+[node-gyp](https://github.com/TooTallNate/node-gyp) for that task.
+For a Unix system, [node-gyp](https://github.com/TooTallNate/node-gyp)
+needs Python, make and a buildchain like GCC. On Windows,
+Python and Microsoft Visual Studio C++ is needed. Python 3 is
+not supported by [node-gyp](https://github.com/TooTallNate/node-gyp).
+For more information visit
+[the node-gyp repository](https://github.com/TooTallNate/node-gyp) and
+the [node-gyp Wiki](https://github.com/TooTallNate/node-gyp/wiki).
+
## DIRECTORIES
See `npm-folders(5)` to learn about where npm puts stuff.
diff --git a/deps/npm/doc/files/npmrc.md b/deps/npm/doc/files/npmrc.md
index e65f722fdb..ba57a6f2c3 100644
--- a/deps/npm/doc/files/npmrc.md
+++ b/deps/npm/doc/files/npmrc.md
@@ -13,8 +13,9 @@ For a list of available configuration options, see npm-config(7).
## FILES
-The three relevant files are:
+The four relevant files are:
+* per-project config file (/path/to/my/project/.npmrc)
* per-user config file (~/.npmrc)
* global config file ($PREFIX/npmrc)
* npm builtin config file (/path/to/npm/npmrc)
@@ -29,6 +30,17 @@ Each of these files is loaded, and config options are resolved in
priority order. For example, a setting in the userconfig file would
override the setting in the globalconfig file.
+### Per-project config file
+
+When working locally in a project, a `.npmrc` file in the root of the
+project (ie, a sibling of `node_modules` and `package.json`) will set
+config values specific to this project.
+
+Note that this only applies to the root of the project that you're
+running npm in. It has no effect when your module is published. For
+example, you can't publish a module that forces itself to install
+globally, or in a different location.
+
### Per-user config file
`$HOME/.npmrc` (or the `userconfig` param, if set in the environment
diff --git a/deps/npm/doc/misc/npm-config.md b/deps/npm/doc/misc/npm-config.md
index a70de81216..b49e987360 100644
--- a/deps/npm/doc/misc/npm-config.md
+++ b/deps/npm/doc/misc/npm-config.md
@@ -24,8 +24,9 @@ same.
### npmrc Files
-The three relevant files are:
+The four relevant files are:
+* per-project config file (/path/to/my/project/.npmrc)
* per-user config file (~/.npmrc)
* global config file ($PREFIX/npmrc)
* npm builtin config file (/path/to/npm/npmrc)
@@ -712,6 +713,17 @@ using `-s` to add a signature.
Note that git requires you to have set up GPG keys in your git configs
for this to work properly.
+### spin
+
+* Default: true
+* Type: Boolean or `"always"`
+
+When set to `true`, npm will display an ascii spinner while it is doing
+things, if `process.stderr` is a TTY.
+
+Set to `false` to suppress the spinner, or set to `always` to output
+the spinner even for non-TTY outputs.
+
### strict-ssl
* Default: true
diff --git a/deps/npm/doc/misc/npm-faq.md b/deps/npm/doc/misc/npm-faq.md
index 0816052305..53fa03d629 100644
--- a/deps/npm/doc/misc/npm-faq.md
+++ b/deps/npm/doc/misc/npm-faq.md
@@ -258,7 +258,7 @@ change it again? npm doesn't currently track any state about past
configuration settings, so this would be rather difficult to do
properly. It would have to track every previous value for this
config, and always accept any of them, or else yesterday's install may
-be broken tomorrow. Complexity hurdle #5.
+be broken tomorrow. Complexity hurdle #4.
Never going to happen. The folder is named `node_modules`. It is
written indelibly in the Node Way, handed down from the ancient times
@@ -340,7 +340,7 @@ contributed to it, some of them quite substantially.
The npm open source project, The npm Registry, and [the community
website](https://www.npmjs.org) are maintained and operated by the
-good folks at [npm, Inc.](https://www.npmjs.com)
+good folks at [npm, Inc.](http://www.npmjs.com)
## I have a question or request not addressed here. Where should I put it?
diff --git a/deps/npm/doc/misc/npm-index.md b/deps/npm/doc/misc/npm-index.md
index 9f14e51b13..ebfdc5a8af 100644
--- a/deps/npm/doc/misc/npm-index.md
+++ b/deps/npm/doc/misc/npm-index.md
@@ -209,6 +209,10 @@ Display npm bin folder
Bugs for a package in a web browser maybe
+## npm-cache(3)
+
+manage the npm cache programmatically
+
## npm-commands(3)
npm commands
diff --git a/deps/npm/doc/misc/npm-scripts.md b/deps/npm/doc/misc/npm-scripts.md
index 02d76f1c4e..b49d9e23d1 100644
--- a/deps/npm/doc/misc/npm-scripts.md
+++ b/deps/npm/doc/misc/npm-scripts.md
@@ -34,7 +34,7 @@ following scripts:
stop and start scripts if no `restart` script is provided.
Additionally, arbitrary scripts can be run by doing
-`npm run-script <stage> <pkg>`.
+`npm run-script <pkg> <stage>`.
## NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN
diff --git a/deps/npm/doc/misc/semver.md b/deps/npm/doc/misc/semver.md
index 176fbcba93..6c7d28061c 100644
--- a/deps/npm/doc/misc/semver.md
+++ b/deps/npm/doc/misc/semver.md
@@ -34,7 +34,7 @@ As a command-line utility:
## Versions
-A "version" is described by the v2.0.0 specification found at
+A "version" is described by the `v2.0.0` specification found at
<http://semver.org/>.
A leading `"="` or `"v"` character is stripped off and ignored.
@@ -43,9 +43,10 @@ A leading `"="` or `"v"` character is stripped off and ignored.
The following range styles are supported:
-* `1.2.3` A specific version. When nothing else will do. Note that
- build metadata is still ignored, so `1.2.3+build2012` will satisfy
- this range.
+* `1.2.3` A specific version. When nothing else will do. Must be a full
+ version number, with major, minor, and patch versions specified.
+ Note that build metadata is still ignored, so `1.2.3+build2012` will
+ satisfy this range.
* `>1.2.3` Greater than a specific version.
* `<1.2.3` Less than a specific version. If there is no prerelease
tag on the version range, then no prerelease version will be allowed
@@ -56,26 +57,33 @@ The following range styles are supported:
* `<=1.2.3` Less than or equal to. In this case, prerelease versions
ARE allowed, so `1.2.3-beta` would satisfy.
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to 1.2.3". When
+* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When
using tilde operators, prerelease versions are supported as well,
but a prerelease of the next significant digit will NOT be
satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.
-* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with 1.2.3". When
+* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When
using caret operators, anything from the specified version (including
prerelease) will be supported up to, but not including, the next
major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,
while `1.2.2` and `2.0.0-beta` will not.
-* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with 0.1.3". 0.x.x versions are
+* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with `0.1.3`". `0.x.x` versions are
special: the first non-zero component indicates potentially breaking changes,
meaning the caret operator matches any version with the same first non-zero
component starting at the specified version.
-* `^0.0.2` := `=0.0.2` "Only the version 0.0.2 is considered compatible"
-* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
-* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with 1.2"
-* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
-* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
-* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with 1"
-* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
+* `^0.0.2` := `=0.0.2` "Only the version `0.0.2` is considered compatible"
+* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
+* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`"
+* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
+* `1.2.*` Same as `1.2.x`.
+* `1.2` Same as `1.2.x`.
+* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
+* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`"
+* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
+* `1.*` Same as `1.x`.
+* `1` Same as `1.x`.
+* `*` Any version whatsoever.
+* `x` Same as `*`.
+* `""` (just an empty string) Same as `*`.
Ranges can be joined with either a space (which implies "and") or a
@@ -90,42 +98,50 @@ The resulting output will always be 100% strict, of course.
Strict-mode Comparators and Ranges will be strict about the SemVer
strings that they parse.
-* valid(v): Return the parsed version, or null if it's not valid.
-* inc(v, release): Return the version incremented by the release type
- (major, minor, patch, or prerelease), or null if it's not valid.
+* `valid(v)`: Return the parsed version, or null if it's not valid.
+* `inc(v, release)`: Return the version incremented by the release
+ type (`major`, `premajor`, `minor`, `preminor`, `patch`,
+ `prepatch`, or `prerelease`), or null if it's not valid
+ * `premajor` in one call will bump the version up to the next major
+ version and down to a prerelease of that major version.
+ `preminor`, and `prepatch` work the same way.
+ * If called from a non-prerelease version, the `prerelease` will work the
+ same as `prepatch`. It increments the patch version, then makes a
+ prerelease. If the input version is already a prerelease it simply
+ increments it.
### Comparison
-* gt(v1, v2): `v1 > v2`
-* gte(v1, v2): `v1 >= v2`
-* lt(v1, v2): `v1 < v2`
-* lte(v1, v2): `v1 <= v2`
-* eq(v1, v2): `v1 == v2` This is true if they're logically equivalent,
+* `gt(v1, v2)`: `v1 > v2`
+* `gte(v1, v2)`: `v1 >= v2`
+* `lt(v1, v2)`: `v1 < v2`
+* `lte(v1, v2)`: `v1 <= v2`
+* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
even if they're not the exact same string. You already know how to
compare strings.
-* neq(v1, v2): `v1 != v2` The opposite of eq.
-* cmp(v1, comparator, v2): Pass in a comparison string, and it'll call
+* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
+* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
the corresponding function above. `"==="` and `"!=="` do simple
string comparison, but are included for completeness. Throws if an
invalid comparison string is provided.
-* compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if
- v2 is greater. Sorts in ascending order if passed to Array.sort().
-* rcompare(v1, v2): The reverse of compare. Sorts an array of versions
- in descending order when passed to Array.sort().
+* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
+ `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
+* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
+ in descending order when passed to `Array.sort()`.
### Ranges
-* validRange(range): Return the valid range or null if it's not valid
-* satisfies(version, range): Return true if the version satisfies the
+* `validRange(range)`: Return the valid range or null if it's not valid
+* `satisfies(version, range)`: Return true if the version satisfies the
range.
-* maxSatisfying(versions, range): Return the highest version in the list
- that satisfies the range, or null if none of them do.
-* gtr(version, range): Return true if version is greater than all the
+* `maxSatisfying(versions, range)`: Return the highest version in the list
+ that satisfies the range, or `null` if none of them do.
+* `gtr(version, range)`: Return `true` if version is greater than all the
versions possible in the range.
-* ltr(version, range): Return true if version is less than all the
+* `ltr(version, range)`: Return `true` if version is less than all the
versions possible in the range.
-* outside(version, range, hilo): Return true if the version is outside
+* `outside(version, range, hilo)`: Return true if the version is outside
the bounds of the range in either the high or low direction. The
`hilo` argument must be either the string `'>'` or `'<'`. (This is
the function called by `gtr` and `ltr`.)
@@ -134,8 +150,8 @@ Note that, since ranges may be non-contiguous, a version might not be
greater than a range, less than a range, *or* satisfy a range! For
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
until `2.0.0`, so the version `1.2.10` would not be greater than the
-range (because 2.0.1 satisfies, which is higher), nor less than the
-range (since 1.2.8 satisfies, which is lower), and it also does not
+range (because `2.0.1` satisfies, which is higher), nor less than the
+range (since `1.2.8` satisfies, which is lower), and it also does not
satisfy the range.
If you want to know if a version satisfies or does not satisfy a
diff --git a/deps/npm/html/doc/README.html b/deps/npm/html/doc/README.html
index df5c3ce038..0a192419a3 100644
--- a/deps/npm/html/doc/README.html
+++ b/deps/npm/html/doc/README.html
@@ -141,7 +141,7 @@ specific purpose, or lack of malice in any given npm package.</p>
<p>If you have a complaint about a package in the public npm registry,
and cannot <a href="https://www.npmjs.org/doc/misc/npm-disputes.html">resolve it with the package
owner</a>, please email
-<a href="&#109;&#x61;&#x69;&#x6c;&#x74;&#111;&#58;&#115;&#117;&#x70;&#112;&#x6f;&#x72;&#x74;&#x40;&#110;&#112;&#109;&#x6a;&#x73;&#46;&#x63;&#111;&#109;">&#115;&#117;&#x70;&#112;&#x6f;&#x72;&#x74;&#x40;&#110;&#112;&#109;&#x6a;&#x73;&#46;&#x63;&#111;&#109;</a> and explain the situation.</p>
+<a href="&#109;&#97;&#x69;&#x6c;&#116;&#111;&#58;&#115;&#117;&#x70;&#112;&#111;&#114;&#116;&#64;&#110;&#x70;&#109;&#x6a;&#x73;&#x2e;&#x63;&#x6f;&#x6d;">&#115;&#117;&#x70;&#112;&#111;&#114;&#116;&#64;&#110;&#x70;&#109;&#x6a;&#x73;&#x2e;&#x63;&#x6f;&#x6d;</a> and explain the situation.</p>
<p>Any data published to The npm Registry (including user account
information) may be removed or modified at the sole discretion of the
npm server administrators.</p>
@@ -161,7 +161,7 @@ ban your account in extreme cases. So don&#39;t do that.</p>
<li>web:
<a href="https://github.com/npm/npm/issues">https://github.com/npm/npm/issues</a></li>
<li>email:
-<a href="&#109;&#97;&#105;&#x6c;&#116;&#x6f;&#58;&#x6e;&#x70;&#109;&#45;&#64;&#103;&#x6f;&#111;&#x67;&#x6c;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#x2e;&#99;&#111;&#109;">&#x6e;&#x70;&#109;&#45;&#64;&#103;&#x6f;&#111;&#x67;&#x6c;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#x2e;&#99;&#111;&#109;</a></li>
+<a href="&#x6d;&#x61;&#105;&#108;&#116;&#x6f;&#x3a;&#x6e;&#x70;&#x6d;&#x2d;&#x40;&#103;&#111;&#111;&#x67;&#x6c;&#101;&#x67;&#x72;&#x6f;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#109;">&#x6e;&#x70;&#x6d;&#x2d;&#x40;&#103;&#111;&#111;&#x67;&#x6c;&#101;&#x67;&#x72;&#x6f;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#109;</a></li>
</ul>
<p>Be sure to include <em>all</em> of the output from the npm command that didn&#39;t work
as expected. The <code>npm-debug.log</code> file is also helpful to provide.</p>
@@ -186,5 +186,5 @@ will no doubt tell you to put the output in a gist or email.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.4.10</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-bin.html b/deps/npm/html/doc/api/npm-bin.html
index 56bde010d9..4694b4d15f 100644
--- a/deps/npm/html/doc/api/npm-bin.html
+++ b/deps/npm/html/doc/api/npm-bin.html
@@ -28,5 +28,5 @@ to the <code>npm.bin</code> member.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-bin &mdash; npm@1.4.10</p>
+<p id="footer">npm-bin &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-bugs.html b/deps/npm/html/doc/api/npm-bugs.html
index 4e5074f545..1678f2fdb6 100644
--- a/deps/npm/html/doc/api/npm-bugs.html
+++ b/deps/npm/html/doc/api/npm-bugs.html
@@ -33,5 +33,5 @@ friendly for programmatic use.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-bugs &mdash; npm@1.4.10</p>
+<p id="footer">npm-bugs &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-cache.html b/deps/npm/html/doc/api/npm-cache.html
new file mode 100644
index 0000000000..d74e31e238
--- /dev/null
+++ b/deps/npm/html/doc/api/npm-cache.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<html>
+ <title>npm-cache</title>
+ <meta http-equiv="content-type" value="text/html;utf-8">
+ <link rel="stylesheet" type="text/css" href="../../static/style.css">
+ <link rel="canonical" href="https://www.npmjs.org/doc/api/npm-cache.html">
+ <script async=true src="../../static/toc.js"></script>
+
+ <body>
+ <div id="wrapper">
+
+<h1><a href="../api/npm-cache.html">npm-cache</a></h1> <p>manage the npm cache programmatically</p>
+<h2 id="synopsis">SYNOPSIS</h2>
+<pre><code>npm.commands.cache([args], callback)
+
+// helpers
+npm.commands.cache.clean([args], callback)
+npm.commands.cache.add([args], callback)
+npm.commands.cache.read(name, version, forceBypass, callback)
+</code></pre><h2 id="description">DESCRIPTION</h2>
+<p>This acts much the same ways as the <a href="../cli/npm-cache.html">npm-cache(1)</a> command line
+functionality.</p>
+<p>The callback is called with the package.json data of the thing that is
+eventually added to or read from the cache.</p>
+<p>The top level <code>npm.commands.cache(...)</code> functionality is a public
+interface, and like all commands on the <code>npm.commands</code> object, it will
+match the command line behavior exactly.</p>
+<p>However, the cache folder structure and the cache helper functions are
+considered <strong>internal</strong> API surface, and as such, may change in future
+releases of npm, potentially without warning or significant version
+incrementation.</p>
+<p>Use at your own risk.</p>
+
+</div>
+
+<table border=0 cellspacing=0 cellpadding=0 id=npmlogo>
+<tr><td style="width:180px;height:10px;background:rgb(237,127,127)" colspan=18>&nbsp;</td></tr>
+<tr><td rowspan=4 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td><td style="width:40px;height:10px;background:#fff" colspan=4>&nbsp;</td><td style="width:10px;height:10px;background:rgb(237,127,127)" rowspan=4>&nbsp;</td><td style="width:40px;height:10px;background:#fff" colspan=4>&nbsp;</td><td rowspan=4 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td><td colspan=6 style="width:60px;height:10px;background:#fff">&nbsp;</td><td style="width:10px;height:10px;background:rgb(237,127,127)" rowspan=4>&nbsp;</td></tr>
+<tr><td colspan=2 style="width:20px;height:30px;background:#fff" rowspan=3>&nbsp;</td><td style="width:10px;height:10px;background:rgb(237,127,127)" rowspan=3>&nbsp;</td><td style="width:10px;height:10px;background:#fff" rowspan=3>&nbsp;</td><td style="width:20px;height:10px;background:#fff" rowspan=4 colspan=2>&nbsp;</td><td style="width:10px;height:20px;background:rgb(237,127,127)" rowspan=2>&nbsp;</td><td style="width:10px;height:10px;background:#fff" rowspan=3>&nbsp;</td><td style="width:20px;height:10px;background:#fff" rowspan=3 colspan=2>&nbsp;</td><td style="width:10px;height:10px;background:rgb(237,127,127)" rowspan=3>&nbsp;</td><td style="width:10px;height:10px;background:#fff" rowspan=3>&nbsp;</td><td style="width:10px;height:10px;background:rgb(237,127,127)" rowspan=3>&nbsp;</td></tr>
+<tr><td style="width:10px;height:10px;background:#fff" rowspan=2>&nbsp;</td></tr>
+<tr><td style="width:10px;height:10px;background:#fff">&nbsp;</td></tr>
+<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
+<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
+</table>
+<p id="footer">npm-cache &mdash; npm@1.4.14</p>
+
diff --git a/deps/npm/html/doc/api/npm-commands.html b/deps/npm/html/doc/api/npm-commands.html
index 3c68e4ba52..275911f3d1 100644
--- a/deps/npm/html/doc/api/npm-commands.html
+++ b/deps/npm/html/doc/api/npm-commands.html
@@ -36,5 +36,5 @@ usage, or <code>man 3 npm-&lt;command&gt;</code> for programmatic usage.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-commands &mdash; npm@1.4.10</p>
+<p id="footer">npm-commands &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-config.html b/deps/npm/html/doc/api/npm-config.html
index eee2e52bb5..adc681699e 100644
--- a/deps/npm/html/doc/api/npm-config.html
+++ b/deps/npm/html/doc/api/npm-config.html
@@ -57,5 +57,5 @@ functions instead.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-config &mdash; npm@1.4.10</p>
+<p id="footer">npm-config &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-deprecate.html b/deps/npm/html/doc/api/npm-deprecate.html
index 9513b96482..220b2e6376 100644
--- a/deps/npm/html/doc/api/npm-deprecate.html
+++ b/deps/npm/html/doc/api/npm-deprecate.html
@@ -47,5 +47,5 @@ a deprecation warning to all who attempt to install it.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-deprecate &mdash; npm@1.4.10</p>
+<p id="footer">npm-deprecate &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-docs.html b/deps/npm/html/doc/api/npm-docs.html
index 62e246e060..617e8886ee 100644
--- a/deps/npm/html/doc/api/npm-docs.html
+++ b/deps/npm/html/doc/api/npm-docs.html
@@ -33,5 +33,5 @@ friendly for programmatic use.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-docs &mdash; npm@1.4.10</p>
+<p id="footer">npm-docs &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-edit.html b/deps/npm/html/doc/api/npm-edit.html
index 78e685f04c..700e45cedf 100644
--- a/deps/npm/html/doc/api/npm-edit.html
+++ b/deps/npm/html/doc/api/npm-edit.html
@@ -36,5 +36,5 @@ and how this is used.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-edit &mdash; npm@1.4.10</p>
+<p id="footer">npm-edit &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-explore.html b/deps/npm/html/doc/api/npm-explore.html
index d177e9089d..ea0aacecf1 100644
--- a/deps/npm/html/doc/api/npm-explore.html
+++ b/deps/npm/html/doc/api/npm-explore.html
@@ -31,5 +31,5 @@ sure to use <code>npm rebuild &lt;pkg&gt;</code> if you make any changes.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-explore &mdash; npm@1.4.10</p>
+<p id="footer">npm-explore &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-help-search.html b/deps/npm/html/doc/api/npm-help-search.html
index ec4c6ea06e..f263eaf799 100644
--- a/deps/npm/html/doc/api/npm-help-search.html
+++ b/deps/npm/html/doc/api/npm-help-search.html
@@ -44,5 +44,5 @@ Name of the file that matched</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-help-search &mdash; npm@1.4.10</p>
+<p id="footer">npm-help-search &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-init.html b/deps/npm/html/doc/api/npm-init.html
index 81d790bb75..062b2e8721 100644
--- a/deps/npm/html/doc/api/npm-init.html
+++ b/deps/npm/html/doc/api/npm-init.html
@@ -39,5 +39,5 @@ then go ahead and use this programmatically.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-init &mdash; npm@1.4.10</p>
+<p id="footer">npm-init &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-install.html b/deps/npm/html/doc/api/npm-install.html
index 5fa76079aa..11a5f377dc 100644
--- a/deps/npm/html/doc/api/npm-install.html
+++ b/deps/npm/html/doc/api/npm-install.html
@@ -32,5 +32,5 @@ installed or when an error has been encountered.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-install &mdash; npm@1.4.10</p>
+<p id="footer">npm-install &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-link.html b/deps/npm/html/doc/api/npm-link.html
index 1f162e3b40..def9bd2bfd 100644
--- a/deps/npm/html/doc/api/npm-link.html
+++ b/deps/npm/html/doc/api/npm-link.html
@@ -42,5 +42,5 @@ the package in the current working directory</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-link &mdash; npm@1.4.10</p>
+<p id="footer">npm-link &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-load.html b/deps/npm/html/doc/api/npm-load.html
index b996d7aa9a..79ff0980f3 100644
--- a/deps/npm/html/doc/api/npm-load.html
+++ b/deps/npm/html/doc/api/npm-load.html
@@ -37,5 +37,5 @@ config object.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-load &mdash; npm@1.4.10</p>
+<p id="footer">npm-load &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-ls.html b/deps/npm/html/doc/api/npm-ls.html
index cd5f19880b..a30aef58fb 100644
--- a/deps/npm/html/doc/api/npm-ls.html
+++ b/deps/npm/html/doc/api/npm-ls.html
@@ -63,5 +63,5 @@ dependency will only be output once.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-ls &mdash; npm@1.4.10</p>
+<p id="footer">npm-ls &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-outdated.html b/deps/npm/html/doc/api/npm-outdated.html
index 854942b7d6..0be0195389 100644
--- a/deps/npm/html/doc/api/npm-outdated.html
+++ b/deps/npm/html/doc/api/npm-outdated.html
@@ -28,5 +28,5 @@ currently outdated.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-outdated &mdash; npm@1.4.10</p>
+<p id="footer">npm-outdated &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-owner.html b/deps/npm/html/doc/api/npm-owner.html
index 8a71f25e40..a0d6540554 100644
--- a/deps/npm/html/doc/api/npm-owner.html
+++ b/deps/npm/html/doc/api/npm-owner.html
@@ -47,5 +47,5 @@ that is not implemented at this time.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-owner &mdash; npm@1.4.10</p>
+<p id="footer">npm-owner &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-pack.html b/deps/npm/html/doc/api/npm-pack.html
index d08cbfae64..41304792ee 100644
--- a/deps/npm/html/doc/api/npm-pack.html
+++ b/deps/npm/html/doc/api/npm-pack.html
@@ -33,5 +33,5 @@ overwritten the second time.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-pack &mdash; npm@1.4.10</p>
+<p id="footer">npm-pack &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-prefix.html b/deps/npm/html/doc/api/npm-prefix.html
index 44a17f79cb..09e6a5cee9 100644
--- a/deps/npm/html/doc/api/npm-prefix.html
+++ b/deps/npm/html/doc/api/npm-prefix.html
@@ -29,5 +29,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-prefix &mdash; npm@1.4.10</p>
+<p id="footer">npm-prefix &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-prune.html b/deps/npm/html/doc/api/npm-prune.html
index 0358f77a6b..82cd6118e1 100644
--- a/deps/npm/html/doc/api/npm-prune.html
+++ b/deps/npm/html/doc/api/npm-prune.html
@@ -30,5 +30,5 @@ package&#39;s dependencies list.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-prune &mdash; npm@1.4.10</p>
+<p id="footer">npm-prune &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-publish.html b/deps/npm/html/doc/api/npm-publish.html
index e3e03960b1..49eaabd59b 100644
--- a/deps/npm/html/doc/api/npm-publish.html
+++ b/deps/npm/html/doc/api/npm-publish.html
@@ -46,5 +46,5 @@ the registry. Overwrites when the &quot;force&quot; environment variable is set
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-publish &mdash; npm@1.4.10</p>
+<p id="footer">npm-publish &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-rebuild.html b/deps/npm/html/doc/api/npm-rebuild.html
index f37301f564..e8a3023894 100644
--- a/deps/npm/html/doc/api/npm-rebuild.html
+++ b/deps/npm/html/doc/api/npm-rebuild.html
@@ -30,5 +30,5 @@ the new binary. If no &#39;packages&#39; parameter is specify, every package wil
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-rebuild &mdash; npm@1.4.10</p>
+<p id="footer">npm-rebuild &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-repo.html b/deps/npm/html/doc/api/npm-repo.html
index 8af28e55c2..5fdc0d61d5 100644
--- a/deps/npm/html/doc/api/npm-repo.html
+++ b/deps/npm/html/doc/api/npm-repo.html
@@ -33,5 +33,5 @@ friendly for programmatic use.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-repo &mdash; npm@1.4.10</p>
+<p id="footer">npm-repo &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-restart.html b/deps/npm/html/doc/api/npm-restart.html
index bd33c4458f..b71335e5cf 100644
--- a/deps/npm/html/doc/api/npm-restart.html
+++ b/deps/npm/html/doc/api/npm-restart.html
@@ -36,5 +36,5 @@ in the <code>packages</code> parameter.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-restart &mdash; npm@1.4.10</p>
+<p id="footer">npm-restart &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-root.html b/deps/npm/html/doc/api/npm-root.html
index ef54abb66d..82a1220691 100644
--- a/deps/npm/html/doc/api/npm-root.html
+++ b/deps/npm/html/doc/api/npm-root.html
@@ -29,5 +29,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-root &mdash; npm@1.4.10</p>
+<p id="footer">npm-root &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-run-script.html b/deps/npm/html/doc/api/npm-run-script.html
index b1575d6992..8b47cd5e16 100644
--- a/deps/npm/html/doc/api/npm-run-script.html
+++ b/deps/npm/html/doc/api/npm-run-script.html
@@ -41,5 +41,5 @@ assumed to be the command to run. All other elements are ignored.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-run-script &mdash; npm@1.4.10</p>
+<p id="footer">npm-run-script &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-search.html b/deps/npm/html/doc/api/npm-search.html
index d13d836c97..02f8e6f42a 100644
--- a/deps/npm/html/doc/api/npm-search.html
+++ b/deps/npm/html/doc/api/npm-search.html
@@ -53,5 +53,5 @@ like).</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-search &mdash; npm@1.4.10</p>
+<p id="footer">npm-search &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-shrinkwrap.html b/deps/npm/html/doc/api/npm-shrinkwrap.html
index 659d1b392a..f8a3eca529 100644
--- a/deps/npm/html/doc/api/npm-shrinkwrap.html
+++ b/deps/npm/html/doc/api/npm-shrinkwrap.html
@@ -33,5 +33,5 @@ been saved.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-shrinkwrap &mdash; npm@1.4.10</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-start.html b/deps/npm/html/doc/api/npm-start.html
index 2b2f41fd81..1c9ec3a25e 100644
--- a/deps/npm/html/doc/api/npm-start.html
+++ b/deps/npm/html/doc/api/npm-start.html
@@ -28,5 +28,5 @@ in the <code>packages</code> parameter.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-start &mdash; npm@1.4.10</p>
+<p id="footer">npm-start &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-stop.html b/deps/npm/html/doc/api/npm-stop.html
index a7dfcedd4d..d1ab824a38 100644
--- a/deps/npm/html/doc/api/npm-stop.html
+++ b/deps/npm/html/doc/api/npm-stop.html
@@ -28,5 +28,5 @@ in the <code>packages</code> parameter.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-stop &mdash; npm@1.4.10</p>
+<p id="footer">npm-stop &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-submodule.html b/deps/npm/html/doc/api/npm-submodule.html
index ab98ab5bc7..79f0054619 100644
--- a/deps/npm/html/doc/api/npm-submodule.html
+++ b/deps/npm/html/doc/api/npm-submodule.html
@@ -42,5 +42,5 @@ dependencies into the submodule folder.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-submodule &mdash; npm@1.4.10</p>
+<p id="footer">npm-submodule &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-tag.html b/deps/npm/html/doc/api/npm-tag.html
index af49ab4556..6648205dda 100644
--- a/deps/npm/html/doc/api/npm-tag.html
+++ b/deps/npm/html/doc/api/npm-tag.html
@@ -36,5 +36,5 @@ used. For more information about how to set this config, check
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-tag &mdash; npm@1.4.10</p>
+<p id="footer">npm-tag &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-test.html b/deps/npm/html/doc/api/npm-test.html
index 548d979374..ae2148f76c 100644
--- a/deps/npm/html/doc/api/npm-test.html
+++ b/deps/npm/html/doc/api/npm-test.html
@@ -30,5 +30,5 @@ in the <code>packages</code> parameter.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-test &mdash; npm@1.4.10</p>
+<p id="footer">npm-test &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-uninstall.html b/deps/npm/html/doc/api/npm-uninstall.html
index 77f6233a00..0599d68ea7 100644
--- a/deps/npm/html/doc/api/npm-uninstall.html
+++ b/deps/npm/html/doc/api/npm-uninstall.html
@@ -30,5 +30,5 @@ uninstalled or when an error has been encountered.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-uninstall &mdash; npm@1.4.10</p>
+<p id="footer">npm-uninstall &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-unpublish.html b/deps/npm/html/doc/api/npm-unpublish.html
index 7b3c99df22..186ae801dd 100644
--- a/deps/npm/html/doc/api/npm-unpublish.html
+++ b/deps/npm/html/doc/api/npm-unpublish.html
@@ -33,5 +33,5 @@ the root package entry is removed from the registry entirely.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-unpublish &mdash; npm@1.4.10</p>
+<p id="footer">npm-unpublish &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-update.html b/deps/npm/html/doc/api/npm-update.html
index f706f1e861..4d725404d6 100644
--- a/deps/npm/html/doc/api/npm-update.html
+++ b/deps/npm/html/doc/api/npm-update.html
@@ -27,5 +27,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-update &mdash; npm@1.4.10</p>
+<p id="footer">npm-update &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-version.html b/deps/npm/html/doc/api/npm-version.html
index ede9d6b37f..f052db67cf 100644
--- a/deps/npm/html/doc/api/npm-version.html
+++ b/deps/npm/html/doc/api/npm-version.html
@@ -32,5 +32,5 @@ not have exactly one element. The only element should be a version number.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-version &mdash; npm@1.4.10</p>
+<p id="footer">npm-version &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-view.html b/deps/npm/html/doc/api/npm-view.html
index b4c54cf1fc..c91edf916c 100644
--- a/deps/npm/html/doc/api/npm-view.html
+++ b/deps/npm/html/doc/api/npm-view.html
@@ -81,5 +81,5 @@ the field name.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-view &mdash; npm@1.4.10</p>
+<p id="footer">npm-view &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm-whoami.html b/deps/npm/html/doc/api/npm-whoami.html
index b6e17a6b51..b75a055b39 100644
--- a/deps/npm/html/doc/api/npm-whoami.html
+++ b/deps/npm/html/doc/api/npm-whoami.html
@@ -29,5 +29,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-whoami &mdash; npm@1.4.10</p>
+<p id="footer">npm-whoami &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/api/npm.html b/deps/npm/html/doc/api/npm.html
index 2cc3b64482..09dfa00189 100644
--- a/deps/npm/html/doc/api/npm.html
+++ b/deps/npm/html/doc/api/npm.html
@@ -23,7 +23,7 @@ npm.load([configObject, ]function (er, npm) {
npm.commands.install([&quot;package&quot;], cb)
})
</code></pre><h2 id="version">VERSION</h2>
-<p>1.4.10</p>
+<p>1.4.14</p>
<h2 id="description">DESCRIPTION</h2>
<p>This is the API documentation for npm.
To find documentation of the command line
@@ -110,5 +110,5 @@ method names. Use the <code>npm.deref</code> method to find the real name.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm &mdash; npm@1.4.10</p>
+<p id="footer">npm &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-adduser.html b/deps/npm/html/doc/cli/npm-adduser.html
index 94f3f5d9ea..a0432fcfcb 100644
--- a/deps/npm/html/doc/cli/npm-adduser.html
+++ b/deps/npm/html/doc/cli/npm-adduser.html
@@ -46,5 +46,5 @@ authorize on a new machine.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-adduser &mdash; npm@1.4.10</p>
+<p id="footer">npm-adduser &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-bin.html b/deps/npm/html/doc/cli/npm-bin.html
index 7bb77547ab..4d5d742397 100644
--- a/deps/npm/html/doc/cli/npm-bin.html
+++ b/deps/npm/html/doc/cli/npm-bin.html
@@ -35,5 +35,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-bin &mdash; npm@1.4.10</p>
+<p id="footer">npm-bin &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-bugs.html b/deps/npm/html/doc/cli/npm-bugs.html
index e308b56873..1a571fd129 100644
--- a/deps/npm/html/doc/cli/npm-bugs.html
+++ b/deps/npm/html/doc/cli/npm-bugs.html
@@ -54,5 +54,5 @@ a <code>package.json</code> in the current folder and use the <code>name</code>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-bugs &mdash; npm@1.4.10</p>
+<p id="footer">npm-bugs &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-build.html b/deps/npm/html/doc/cli/npm-build.html
index ccf049e04b..ceec574293 100644
--- a/deps/npm/html/doc/cli/npm-build.html
+++ b/deps/npm/html/doc/cli/npm-build.html
@@ -38,5 +38,5 @@ A folder containing a <code>package.json</code> file in its root.</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-build &mdash; npm@1.4.10</p>
+<p id="footer">npm-build &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-bundle.html b/deps/npm/html/doc/cli/npm-bundle.html
index 7493151d1d..b6ca08ac39 100644
--- a/deps/npm/html/doc/cli/npm-bundle.html
+++ b/deps/npm/html/doc/cli/npm-bundle.html
@@ -31,5 +31,5 @@ install packages into the local space.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-bundle &mdash; npm@1.4.10</p>
+<p id="footer">npm-bundle &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-cache.html b/deps/npm/html/doc/cli/npm-cache.html
index 1d0d0805c6..c36d9bd9ee 100644
--- a/deps/npm/html/doc/cli/npm-cache.html
+++ b/deps/npm/html/doc/cli/npm-cache.html
@@ -43,16 +43,14 @@ the entire cache is cleared.</p>
For each package that is added to the cache, three pieces of information are
stored in <code>{cache}/{name}/{version}</code>:</p>
<ul>
-<li>.../package/:
-A folder containing the package contents as they appear in the tarball.</li>
-<li>.../package.json:
-The package.json file, as npm sees it, with overlays applied and a _id attribute.</li>
+<li>.../package/package.json:
+The package.json file, as npm sees it.</li>
<li>.../package.tgz:
The tarball for that version.</li>
</ul>
<p>Additionally, whenever a registry request is made, a <code>.cache.json</code> file
is placed at the corresponding URI, to store the ETag and the requested
-data.</p>
+data. This is stored in <code>{cache}/{hostname}/{path}/.cache.json</code>.</p>
<p>Commands that make non-essential registry requests (such as <code>search</code> and
<code>view</code>, or the completion scripts) generally specify a minimum timeout.
If the <code>.cache.json</code> file is younger than the specified timeout, then
@@ -83,5 +81,5 @@ they do not make an HTTP request to the registry.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-cache &mdash; npm@1.4.10</p>
+<p id="footer">npm-cache &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-completion.html b/deps/npm/html/doc/cli/npm-completion.html
index 5208ee05d9..77bd603896 100644
--- a/deps/npm/html/doc/cli/npm-completion.html
+++ b/deps/npm/html/doc/cli/npm-completion.html
@@ -42,5 +42,5 @@ completions based on the arguments.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-completion &mdash; npm@1.4.10</p>
+<p id="footer">npm-completion &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-config.html b/deps/npm/html/doc/cli/npm-config.html
index a44e771d51..20baf24eb1 100644
--- a/deps/npm/html/doc/cli/npm-config.html
+++ b/deps/npm/html/doc/cli/npm-config.html
@@ -66,5 +66,5 @@ global config.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-config &mdash; npm@1.4.10</p>
+<p id="footer">npm-config &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-dedupe.html b/deps/npm/html/doc/cli/npm-dedupe.html
index 17bbbe7033..acdfea64ad 100644
--- a/deps/npm/html/doc/cli/npm-dedupe.html
+++ b/deps/npm/html/doc/cli/npm-dedupe.html
@@ -63,5 +63,5 @@ versions.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-dedupe &mdash; npm@1.4.10</p>
+<p id="footer">npm-dedupe &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-deprecate.html b/deps/npm/html/doc/cli/npm-deprecate.html
index 4852aa3393..a74b329695 100644
--- a/deps/npm/html/doc/cli/npm-deprecate.html
+++ b/deps/npm/html/doc/cli/npm-deprecate.html
@@ -38,5 +38,5 @@ something like this:</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-deprecate &mdash; npm@1.4.10</p>
+<p id="footer">npm-deprecate &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-docs.html b/deps/npm/html/doc/cli/npm-docs.html
index bef7fad933..bea53fb54e 100644
--- a/deps/npm/html/doc/cli/npm-docs.html
+++ b/deps/npm/html/doc/cli/npm-docs.html
@@ -56,5 +56,5 @@ the current folder and use the <code>name</code> property.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-docs &mdash; npm@1.4.10</p>
+<p id="footer">npm-docs &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-edit.html b/deps/npm/html/doc/cli/npm-edit.html
index ad2b9b2c53..7ac413dbb5 100644
--- a/deps/npm/html/doc/cli/npm-edit.html
+++ b/deps/npm/html/doc/cli/npm-edit.html
@@ -49,5 +49,5 @@ or <code>&quot;notepad&quot;</code> on Windows.</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-edit &mdash; npm@1.4.10</p>
+<p id="footer">npm-edit &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-explore.html b/deps/npm/html/doc/cli/npm-explore.html
index 13a906d26d..2b2c6d86f0 100644
--- a/deps/npm/html/doc/cli/npm-explore.html
+++ b/deps/npm/html/doc/cli/npm-explore.html
@@ -50,5 +50,5 @@ Windows</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-explore &mdash; npm@1.4.10</p>
+<p id="footer">npm-explore &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-help-search.html b/deps/npm/html/doc/cli/npm-help-search.html
index 74c0efae50..230ba2448e 100644
--- a/deps/npm/html/doc/cli/npm-help-search.html
+++ b/deps/npm/html/doc/cli/npm-help-search.html
@@ -46,5 +46,5 @@ where the terms were found in the documentation.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-help-search &mdash; npm@1.4.10</p>
+<p id="footer">npm-help-search &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-help.html b/deps/npm/html/doc/cli/npm-help.html
index da1bbd929f..94390b8f88 100644
--- a/deps/npm/html/doc/cli/npm-help.html
+++ b/deps/npm/html/doc/cli/npm-help.html
@@ -52,5 +52,5 @@ matches are equivalent to specifying a topic name.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-help &mdash; npm@1.4.10</p>
+<p id="footer">npm-help &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-init.html b/deps/npm/html/doc/cli/npm-init.html
index 4435030608..79727e3de6 100644
--- a/deps/npm/html/doc/cli/npm-init.html
+++ b/deps/npm/html/doc/cli/npm-init.html
@@ -38,5 +38,5 @@ without a really good reason to do so.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-init &mdash; npm@1.4.10</p>
+<p id="footer">npm-init &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-install.html b/deps/npm/html/doc/cli/npm-install.html
index af7251cd74..0990a9cfe7 100644
--- a/deps/npm/html/doc/cli/npm-install.html
+++ b/deps/npm/html/doc/cli/npm-install.html
@@ -220,5 +220,5 @@ affects a real use-case, it will be investigated.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-install &mdash; npm@1.4.10</p>
+<p id="footer">npm-install &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-link.html b/deps/npm/html/doc/cli/npm-link.html
index ab9d36e59e..8db8294323 100644
--- a/deps/npm/html/doc/cli/npm-link.html
+++ b/deps/npm/html/doc/cli/npm-link.html
@@ -66,5 +66,5 @@ installation target into your project&#39;s <code>node_modules</code> folder.</p
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-link &mdash; npm@1.4.10</p>
+<p id="footer">npm-link &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-ls.html b/deps/npm/html/doc/cli/npm-ls.html
index 1d7ecfa1b9..45090d719e 100644
--- a/deps/npm/html/doc/cli/npm-ls.html
+++ b/deps/npm/html/doc/cli/npm-ls.html
@@ -22,7 +22,7 @@ installed, as well as their dependencies, in a tree-structure.</p>
limit the results to only the paths to the packages named. Note that
nested packages will <em>also</em> show the paths to the specified packages.
For example, running <code>npm ls promzard</code> in npm&#39;s source tree will show:</p>
-<pre><code>npm@1.4.10 /path/to/npm
+<pre><code>npm@1.4.14 /path/to/npm
└─┬ init-package-json@0.0.4
└── promzard@0.1.5
</code></pre><p>It will print out extraneous, missing, and invalid packages.</p>
@@ -85,5 +85,5 @@ project.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-ls &mdash; npm@1.4.10</p>
+<p id="footer">npm-ls &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-outdated.html b/deps/npm/html/doc/cli/npm-outdated.html
index 94224cc905..e784c19b30 100644
--- a/deps/npm/html/doc/cli/npm-outdated.html
+++ b/deps/npm/html/doc/cli/npm-outdated.html
@@ -67,5 +67,5 @@ project.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-outdated &mdash; npm@1.4.10</p>
+<p id="footer">npm-outdated &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-owner.html b/deps/npm/html/doc/cli/npm-owner.html
index e73d1d3525..a7976af48e 100644
--- a/deps/npm/html/doc/cli/npm-owner.html
+++ b/deps/npm/html/doc/cli/npm-owner.html
@@ -49,5 +49,5 @@ that is not implemented at this time.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-owner &mdash; npm@1.4.10</p>
+<p id="footer">npm-owner &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-pack.html b/deps/npm/html/doc/cli/npm-pack.html
index 9d6b56b109..6ad4c9973a 100644
--- a/deps/npm/html/doc/cli/npm-pack.html
+++ b/deps/npm/html/doc/cli/npm-pack.html
@@ -41,5 +41,5 @@ overwritten the second time.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-pack &mdash; npm@1.4.10</p>
+<p id="footer">npm-pack &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-prefix.html b/deps/npm/html/doc/cli/npm-prefix.html
index 3ddc96fab4..9444984d51 100644
--- a/deps/npm/html/doc/cli/npm-prefix.html
+++ b/deps/npm/html/doc/cli/npm-prefix.html
@@ -35,5 +35,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-prefix &mdash; npm@1.4.10</p>
+<p id="footer">npm-prefix &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-prune.html b/deps/npm/html/doc/cli/npm-prune.html
index f555382b21..d936b70349 100644
--- a/deps/npm/html/doc/cli/npm-prune.html
+++ b/deps/npm/html/doc/cli/npm-prune.html
@@ -39,5 +39,5 @@ packages specified in your <code>devDependencies</code>.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-prune &mdash; npm@1.4.10</p>
+<p id="footer">npm-prune &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-publish.html b/deps/npm/html/doc/cli/npm-publish.html
index 876c2caf46..d4c8077c05 100644
--- a/deps/npm/html/doc/cli/npm-publish.html
+++ b/deps/npm/html/doc/cli/npm-publish.html
@@ -54,5 +54,5 @@ it is removed with <a href="../cli/npm-unpublish.html">npm-unpublish(1)</a>.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-publish &mdash; npm@1.4.10</p>
+<p id="footer">npm-publish &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-rebuild.html b/deps/npm/html/doc/cli/npm-rebuild.html
index cf5b553d1a..46b73f7f4b 100644
--- a/deps/npm/html/doc/cli/npm-rebuild.html
+++ b/deps/npm/html/doc/cli/npm-rebuild.html
@@ -38,5 +38,5 @@ the new binary.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-rebuild &mdash; npm@1.4.10</p>
+<p id="footer">npm-rebuild &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-repo.html b/deps/npm/html/doc/cli/npm-repo.html
index 325d607a89..0900e0df87 100644
--- a/deps/npm/html/doc/cli/npm-repo.html
+++ b/deps/npm/html/doc/cli/npm-repo.html
@@ -42,5 +42,5 @@ a <code>package.json</code> in the current folder and use the <code>name</code>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-repo &mdash; npm@1.4.10</p>
+<p id="footer">npm-repo &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-restart.html b/deps/npm/html/doc/cli/npm-restart.html
index cef310499f..3fb826b6f6 100644
--- a/deps/npm/html/doc/cli/npm-restart.html
+++ b/deps/npm/html/doc/cli/npm-restart.html
@@ -37,5 +37,5 @@ the &quot;start&quot; script.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-restart &mdash; npm@1.4.10</p>
+<p id="footer">npm-restart &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-rm.html b/deps/npm/html/doc/cli/npm-rm.html
index d8f6491ba4..12ed0e68d8 100644
--- a/deps/npm/html/doc/cli/npm-rm.html
+++ b/deps/npm/html/doc/cli/npm-rm.html
@@ -39,5 +39,5 @@ on its behalf.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-rm &mdash; npm@1.4.10</p>
+<p id="footer">npm-rm &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-root.html b/deps/npm/html/doc/cli/npm-root.html
index e4f097ee1b..260340e5ca 100644
--- a/deps/npm/html/doc/cli/npm-root.html
+++ b/deps/npm/html/doc/cli/npm-root.html
@@ -35,5 +35,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-root &mdash; npm@1.4.10</p>
+<p id="footer">npm-root &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-run-script.html b/deps/npm/html/doc/cli/npm-run-script.html
index 64afc282b9..8d9676aa63 100644
--- a/deps/npm/html/doc/cli/npm-run-script.html
+++ b/deps/npm/html/doc/cli/npm-run-script.html
@@ -12,6 +12,7 @@
<h1><a href="../cli/npm-run-script.html">npm-run-script</a></h1> <p>Run arbitrary package scripts</p>
<h2 id="synopsis">SYNOPSIS</h2>
<pre><code>npm run-script [&lt;pkg&gt;] [command]
+npm run [&lt;pkg&gt;] [command]
</code></pre><h2 id="description">DESCRIPTION</h2>
<p>This runs an arbitrary command from a package&#39;s <code>&quot;scripts&quot;</code> object.
If no package name is provided, it will search for a <code>package.json</code>
@@ -39,5 +40,5 @@ called directly, as well.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-run-script &mdash; npm@1.4.10</p>
+<p id="footer">npm-run-script &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-search.html b/deps/npm/html/doc/cli/npm-search.html
index e71c6bb2a4..4ada3f32eb 100644
--- a/deps/npm/html/doc/cli/npm-search.html
+++ b/deps/npm/html/doc/cli/npm-search.html
@@ -49,5 +49,5 @@ fall on multiple lines.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-search &mdash; npm@1.4.10</p>
+<p id="footer">npm-search &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-shrinkwrap.html b/deps/npm/html/doc/cli/npm-shrinkwrap.html
index 03c63e443e..3ccbdb7045 100644
--- a/deps/npm/html/doc/cli/npm-shrinkwrap.html
+++ b/deps/npm/html/doc/cli/npm-shrinkwrap.html
@@ -172,5 +172,5 @@ contents rather than versions.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-shrinkwrap &mdash; npm@1.4.10</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-star.html b/deps/npm/html/doc/cli/npm-star.html
index 053fd9b8ec..5dbe8ed10f 100644
--- a/deps/npm/html/doc/cli/npm-star.html
+++ b/deps/npm/html/doc/cli/npm-star.html
@@ -36,5 +36,5 @@ a vaguely positive way to show that you care.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-star &mdash; npm@1.4.10</p>
+<p id="footer">npm-star &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-stars.html b/deps/npm/html/doc/cli/npm-stars.html
index 4ce9697ca6..859defc07c 100644
--- a/deps/npm/html/doc/cli/npm-stars.html
+++ b/deps/npm/html/doc/cli/npm-stars.html
@@ -37,5 +37,5 @@ you will most certainly enjoy this command.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-stars &mdash; npm@1.4.10</p>
+<p id="footer">npm-stars &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-start.html b/deps/npm/html/doc/cli/npm-start.html
index 412a9916ce..cda2070c59 100644
--- a/deps/npm/html/doc/cli/npm-start.html
+++ b/deps/npm/html/doc/cli/npm-start.html
@@ -34,5 +34,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-start &mdash; npm@1.4.10</p>
+<p id="footer">npm-start &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-stop.html b/deps/npm/html/doc/cli/npm-stop.html
index 76a83fd566..29b168d476 100644
--- a/deps/npm/html/doc/cli/npm-stop.html
+++ b/deps/npm/html/doc/cli/npm-stop.html
@@ -34,5 +34,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-stop &mdash; npm@1.4.10</p>
+<p id="footer">npm-stop &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-submodule.html b/deps/npm/html/doc/cli/npm-submodule.html
index e8cba1b488..e1b1ee7147 100644
--- a/deps/npm/html/doc/cli/npm-submodule.html
+++ b/deps/npm/html/doc/cli/npm-submodule.html
@@ -42,5 +42,5 @@ dependencies into the submodule folder.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-submodule &mdash; npm@1.4.10</p>
+<p id="footer">npm-submodule &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-tag.html b/deps/npm/html/doc/cli/npm-tag.html
index 9e7a83f7d3..c534dbfbf0 100644
--- a/deps/npm/html/doc/cli/npm-tag.html
+++ b/deps/npm/html/doc/cli/npm-tag.html
@@ -44,5 +44,5 @@ of using a specific version number:</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-tag &mdash; npm@1.4.10</p>
+<p id="footer">npm-tag &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-test.html b/deps/npm/html/doc/cli/npm-test.html
index 155b930056..a1ce4e133b 100644
--- a/deps/npm/html/doc/cli/npm-test.html
+++ b/deps/npm/html/doc/cli/npm-test.html
@@ -37,5 +37,5 @@ true.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-test &mdash; npm@1.4.10</p>
+<p id="footer">npm-test &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-uninstall.html b/deps/npm/html/doc/cli/npm-uninstall.html
index 343bc01d81..e543ebc976 100644
--- a/deps/npm/html/doc/cli/npm-uninstall.html
+++ b/deps/npm/html/doc/cli/npm-uninstall.html
@@ -55,5 +55,5 @@ npm uninstall dtrace-provider --save-optional
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-uninstall &mdash; npm@1.4.10</p>
+<p id="footer">npm-uninstall &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-unpublish.html b/deps/npm/html/doc/cli/npm-unpublish.html
index de53589b53..7406cbf930 100644
--- a/deps/npm/html/doc/cli/npm-unpublish.html
+++ b/deps/npm/html/doc/cli/npm-unpublish.html
@@ -46,5 +46,5 @@ package again, a new version number must be used.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-unpublish &mdash; npm@1.4.10</p>
+<p id="footer">npm-unpublish &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-update.html b/deps/npm/html/doc/cli/npm-update.html
index 7d624199f6..d62586ce19 100644
--- a/deps/npm/html/doc/cli/npm-update.html
+++ b/deps/npm/html/doc/cli/npm-update.html
@@ -38,5 +38,5 @@ If no package name is specified, all packages in the specified location (global
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-update &mdash; npm@1.4.10</p>
+<p id="footer">npm-update &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-version.html b/deps/npm/html/doc/cli/npm-version.html
index 027c8ebfec..ef6325b85b 100644
--- a/deps/npm/html/doc/cli/npm-version.html
+++ b/deps/npm/html/doc/cli/npm-version.html
@@ -55,5 +55,5 @@ Enter passphrase:
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-version &mdash; npm@1.4.10</p>
+<p id="footer">npm-version &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-view.html b/deps/npm/html/doc/cli/npm-view.html
index adce11547d..c3d5e9d12f 100644
--- a/deps/npm/html/doc/cli/npm-view.html
+++ b/deps/npm/html/doc/cli/npm-view.html
@@ -82,5 +82,5 @@ the field name.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-view &mdash; npm@1.4.10</p>
+<p id="footer">npm-view &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm-whoami.html b/deps/npm/html/doc/cli/npm-whoami.html
index e91ab740da..4e8885e6b6 100644
--- a/deps/npm/html/doc/cli/npm-whoami.html
+++ b/deps/npm/html/doc/cli/npm-whoami.html
@@ -33,5 +33,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-whoami &mdash; npm@1.4.10</p>
+<p id="footer">npm-whoami &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/cli/npm.html b/deps/npm/html/doc/cli/npm.html
index 6381af2905..3641019fcf 100644
--- a/deps/npm/html/doc/cli/npm.html
+++ b/deps/npm/html/doc/cli/npm.html
@@ -13,7 +13,7 @@
<h2 id="synopsis">SYNOPSIS</h2>
<pre><code>npm &lt;command&gt; [args]
</code></pre><h2 id="version">VERSION</h2>
-<p>1.4.10</p>
+<p>1.4.14</p>
<h2 id="description">DESCRIPTION</h2>
<p>npm is the package manager for the Node JavaScript platform. It puts
modules in place so that node can find them, and manages dependency
@@ -28,6 +28,19 @@ programs.</p>
<code><a href="../cli/npm-install.html">npm-install(1)</a></code> for more info. It can do a lot of stuff.</p>
<p>Use the <code>npm search</code> command to show everything that&#39;s available.
Use <code>npm ls</code> to show everything you&#39;ve installed.</p>
+<h2 id="dependencies">DEPENDENCIES</h2>
+<p>If a package references to another package with a git URL, npm depends
+on a preinstalled git.</p>
+<p>If one of the packages npm tries to install is a native node module and
+requires compiling of C++ Code, npm will use
+<a href="https://github.com/TooTallNate/node-gyp">node-gyp</a> for that task.
+For a Unix system, <a href="https://github.com/TooTallNate/node-gyp">node-gyp</a>
+needs Python, make and a buildchain like GCC. On Windows,
+Python and Microsoft Visual Studio C++ is needed. Python 3 is
+not supported by <a href="https://github.com/TooTallNate/node-gyp">node-gyp</a>.
+For more information visit
+<a href="https://github.com/TooTallNate/node-gyp">the node-gyp repository</a> and
+the <a href="https://github.com/TooTallNate/node-gyp/wiki">node-gyp Wiki</a>.</p>
<h2 id="directories">DIRECTORIES</h2>
<p>See <code><a href="../files/npm-folders.html">npm-folders(5)</a></code> to learn about where npm puts stuff.</p>
<p>In particular, npm has two modes of operation:</p>
@@ -97,7 +110,7 @@ easily by doing <code>npm view npm contributors</code>.</p>
the issues list or ask on the mailing list.</p>
<ul>
<li><a href="http://github.com/npm/npm/issues">http://github.com/npm/npm/issues</a></li>
-<li><a href="&#109;&#x61;&#105;&#108;&#x74;&#111;&#58;&#110;&#112;&#109;&#x2d;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#103;&#x72;&#x6f;&#117;&#112;&#x73;&#46;&#x63;&#x6f;&#x6d;">&#110;&#112;&#109;&#x2d;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#103;&#x72;&#x6f;&#117;&#112;&#x73;&#46;&#x63;&#x6f;&#x6d;</a></li>
+<li><a href="&#x6d;&#x61;&#105;&#108;&#x74;&#x6f;&#x3a;&#110;&#112;&#x6d;&#45;&#x40;&#103;&#111;&#111;&#103;&#x6c;&#101;&#103;&#114;&#x6f;&#117;&#112;&#115;&#x2e;&#99;&#111;&#109;">&#110;&#112;&#x6d;&#45;&#x40;&#103;&#111;&#111;&#103;&#x6c;&#101;&#103;&#114;&#x6f;&#117;&#112;&#115;&#x2e;&#99;&#111;&#109;</a></li>
</ul>
<h2 id="bugs">BUGS</h2>
<p>When you find issues, please report them:</p>
@@ -105,7 +118,7 @@ the issues list or ask on the mailing list.</p>
<li>web:
<a href="http://github.com/npm/npm/issues">http://github.com/npm/npm/issues</a></li>
<li>email:
-<a href="&#109;&#x61;&#x69;&#108;&#116;&#x6f;&#x3a;&#x6e;&#112;&#109;&#x2d;&#x40;&#103;&#111;&#x6f;&#103;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#x70;&#115;&#x2e;&#x63;&#111;&#x6d;">&#x6e;&#112;&#109;&#x2d;&#x40;&#103;&#111;&#x6f;&#103;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#x70;&#115;&#x2e;&#x63;&#111;&#x6d;</a></li>
+<a href="&#x6d;&#97;&#105;&#108;&#116;&#x6f;&#58;&#110;&#112;&#x6d;&#45;&#x40;&#103;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#110;&#112;&#x6d;&#45;&#x40;&#103;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#x6f;&#x6d;</a></li>
</ul>
<p>Be sure to include <em>all</em> of the output from the npm command that didn&#39;t work
as expected. The <code>npm-debug.log</code> file is also helpful to provide.</p>
@@ -115,7 +128,7 @@ will no doubt tell you to put the output in a gist or email.</p>
<p><a href="http://blog.izs.me/">Isaac Z. Schlueter</a> ::
<a href="https://github.com/isaacs/">isaacs</a> ::
<a href="http://twitter.com/izs">@izs</a> ::
-<a href="&#109;&#x61;&#x69;&#108;&#116;&#x6f;&#x3a;&#x69;&#64;&#105;&#x7a;&#115;&#46;&#x6d;&#x65;">&#x69;&#64;&#105;&#x7a;&#115;&#46;&#x6d;&#x65;</a></p>
+<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#x40;&#105;&#x7a;&#115;&#46;&#x6d;&#101;">&#105;&#x40;&#105;&#x7a;&#115;&#46;&#x6d;&#101;</a></p>
<h2 id="see-also">SEE ALSO</h2>
<ul>
<li><a href="../cli/npm-help.html">npm-help(1)</a></li>
@@ -141,5 +154,5 @@ will no doubt tell you to put the output in a gist or email.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm &mdash; npm@1.4.10</p>
+<p id="footer">npm &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/files/npm-folders.html b/deps/npm/html/doc/files/npm-folders.html
index 5846fe9622..fa35509f46 100644
--- a/deps/npm/html/doc/files/npm-folders.html
+++ b/deps/npm/html/doc/files/npm-folders.html
@@ -179,5 +179,5 @@ cannot be found elsewhere. See <code><a href="../files/package.json.html">packa
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-folders &mdash; npm@1.4.10</p>
+<p id="footer">npm-folders &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/files/npm-global.html b/deps/npm/html/doc/files/npm-global.html
index 5846fe9622..fa35509f46 100644
--- a/deps/npm/html/doc/files/npm-global.html
+++ b/deps/npm/html/doc/files/npm-global.html
@@ -179,5 +179,5 @@ cannot be found elsewhere. See <code><a href="../files/package.json.html">packa
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-folders &mdash; npm@1.4.10</p>
+<p id="footer">npm-folders &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/files/npm-json.html b/deps/npm/html/doc/files/npm-json.html
index 43a9f07429..e7f51d11fd 100644
--- a/deps/npm/html/doc/files/npm-json.html
+++ b/deps/npm/html/doc/files/npm-json.html
@@ -459,5 +459,5 @@ ignored.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">package.json &mdash; npm@1.4.10</p>
+<p id="footer">package.json &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/files/npmrc.html b/deps/npm/html/doc/files/npmrc.html
index b6df4dc575..90588e61e2 100644
--- a/deps/npm/html/doc/files/npmrc.html
+++ b/deps/npm/html/doc/files/npmrc.html
@@ -17,8 +17,9 @@ variables, and <code>npmrc</code> files.</p>
of the user and global npmrc files.</p>
<p>For a list of available configuration options, see <a href="../misc/npm-config.html">npm-config(7)</a>.</p>
<h2 id="files">FILES</h2>
-<p>The three relevant files are:</p>
+<p>The four relevant files are:</p>
<ul>
+<li>per-project config file (/path/to/my/project/.npmrc)</li>
<li>per-user config file (~/.npmrc)</li>
<li>global config file ($PREFIX/npmrc)</li>
<li>npm builtin config file (/path/to/npm/npmrc)</li>
@@ -30,6 +31,14 @@ parameters. Environment variables can be replaced using
</code></pre><p>Each of these files is loaded, and config options are resolved in
priority order. For example, a setting in the userconfig file would
override the setting in the globalconfig file.</p>
+<h3 id="per-project-config-file">Per-project config file</h3>
+<p>When working locally in a project, a <code>.npmrc</code> file in the root of the
+project (ie, a sibling of <code>node_modules</code> and <code>package.json</code>) will set
+config values specific to this project.</p>
+<p>Note that this only applies to the root of the project that you&#39;re
+running npm in. It has no effect when your module is published. For
+example, you can&#39;t publish a module that forces itself to install
+globally, or in a different location.</p>
<h3 id="per-user-config-file">Per-user config file</h3>
<p><code>$HOME/.npmrc</code> (or the <code>userconfig</code> param, if set in the environment
or on the command line)</p>
@@ -64,5 +73,5 @@ manner.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npmrc &mdash; npm@1.4.10</p>
+<p id="footer">npmrc &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/files/package.json.html b/deps/npm/html/doc/files/package.json.html
index 43a9f07429..e7f51d11fd 100644
--- a/deps/npm/html/doc/files/package.json.html
+++ b/deps/npm/html/doc/files/package.json.html
@@ -459,5 +459,5 @@ ignored.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">package.json &mdash; npm@1.4.10</p>
+<p id="footer">package.json &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html
index 91c6876e94..56b3baff7b 100644
--- a/deps/npm/html/doc/index.html
+++ b/deps/npm/html/doc/index.html
@@ -114,6 +114,8 @@
<p>Display npm bin folder</p>
<h2 id="npm-bugs-3-"><a href="api/npm-bugs.html">npm-bugs(3)</a></h2>
<p>Bugs for a package in a web browser maybe</p>
+<h2 id="npm-cache-3-"><a href="api/npm-cache.html">npm-cache(3)</a></h2>
+<p>manage the npm cache programmatically</p>
<h2 id="npm-commands-3-"><a href="api/npm-commands.html">npm-commands(3)</a></h2>
<p>npm commands</p>
<h2 id="npm-config-3-"><a href="api/npm-config.html">npm-config(3)</a></h2>
@@ -226,5 +228,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-index &mdash; npm@1.4.10</p>
+<p id="footer">npm-index &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-coding-style.html b/deps/npm/html/doc/misc/npm-coding-style.html
index f26eb29314..e9c0121258 100644
--- a/deps/npm/html/doc/misc/npm-coding-style.html
+++ b/deps/npm/html/doc/misc/npm-coding-style.html
@@ -147,5 +147,5 @@ set to anything.&quot;</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-coding-style &mdash; npm@1.4.10</p>
+<p id="footer">npm-coding-style &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-config.html b/deps/npm/html/doc/misc/npm-config.html
index e279450aa1..eefe76f1b3 100644
--- a/deps/npm/html/doc/misc/npm-config.html
+++ b/deps/npm/html/doc/misc/npm-config.html
@@ -26,8 +26,9 @@ are not given a value will be given the value of <code>true</code>. Config
values are case-insensitive, so <code>NPM_CONFIG_FOO=bar</code> will work the
same.</p>
<h3 id="npmrc-files">npmrc Files</h3>
-<p>The three relevant files are:</p>
+<p>The four relevant files are:</p>
<ul>
+<li>per-project config file (/path/to/my/project/.npmrc)</li>
<li>per-user config file (~/.npmrc)</li>
<li>global config file ($PREFIX/npmrc)</li>
<li>npm builtin config file (/path/to/npm/npmrc)</li>
@@ -608,6 +609,15 @@ installing.</p>
using <code>-s</code> to add a signature.</p>
<p>Note that git requires you to have set up GPG keys in your git configs
for this to work properly.</p>
+<h3 id="spin">spin</h3>
+<ul>
+<li>Default: true</li>
+<li>Type: Boolean or <code>&quot;always&quot;</code></li>
+</ul>
+<p>When set to <code>true</code>, npm will display an ascii spinner while it is doing
+things, if <code>process.stderr</code> is a TTY.</p>
+<p>Set to <code>false</code> to suppress the spinner, or set to <code>always</code> to output
+the spinner even for non-TTY outputs.</p>
<h3 id="strict-ssl">strict-ssl</h3>
<ul>
<li>Default: true</li>
@@ -731,5 +741,5 @@ hash, and exit successfully.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-config &mdash; npm@1.4.10</p>
+<p id="footer">npm-config &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-developers.html b/deps/npm/html/doc/misc/npm-developers.html
index 6076b8ef1e..7c4720b5a4 100644
--- a/deps/npm/html/doc/misc/npm-developers.html
+++ b/deps/npm/html/doc/misc/npm-developers.html
@@ -181,5 +181,5 @@ from a fresh checkout.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-developers &mdash; npm@1.4.10</p>
+<p id="footer">npm-developers &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-disputes.html b/deps/npm/html/doc/misc/npm-disputes.html
index e7db18cab4..360565f729 100644
--- a/deps/npm/html/doc/misc/npm-disputes.html
+++ b/deps/npm/html/doc/misc/npm-disputes.html
@@ -13,7 +13,7 @@
<h2 id="synopsis">SYNOPSIS</h2>
<ol>
<li>Get the author email with <code>npm owner ls &lt;pkgname&gt;</code></li>
-<li>Email the author, CC <a href="&#x6d;&#97;&#x69;&#x6c;&#116;&#x6f;&#58;&#x73;&#117;&#112;&#112;&#x6f;&#x72;&#x74;&#64;&#x6e;&#112;&#109;&#x6a;&#x73;&#x2e;&#x63;&#x6f;&#x6d;">&#x73;&#117;&#112;&#112;&#x6f;&#x72;&#x74;&#64;&#x6e;&#112;&#109;&#x6a;&#x73;&#x2e;&#x63;&#x6f;&#x6d;</a></li>
+<li>Email the author, CC <a href="&#109;&#x61;&#105;&#108;&#x74;&#111;&#58;&#x73;&#117;&#x70;&#x70;&#111;&#114;&#116;&#64;&#110;&#x70;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;">&#x73;&#117;&#x70;&#x70;&#111;&#114;&#116;&#64;&#110;&#x70;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;</a></li>
<li>After a few weeks, if there&#39;s no resolution, we&#39;ll sort it out.</li>
</ol>
<p>Don&#39;t squat on package names. Publish code or move out of the way.</p>
@@ -51,12 +51,12 @@ Joe&#39;s appropriate course of action in each case is the same.</p>
owner (Bob).</li>
<li>Joe emails Bob, explaining the situation <strong>as respectfully as
possible</strong>, and what he would like to do with the module name. He
-adds the npm support staff <a href="&#109;&#97;&#105;&#108;&#x74;&#x6f;&#58;&#115;&#117;&#x70;&#x70;&#111;&#114;&#116;&#x40;&#x6e;&#112;&#x6d;&#106;&#115;&#46;&#99;&#111;&#109;">&#115;&#117;&#x70;&#x70;&#111;&#114;&#116;&#x40;&#x6e;&#112;&#x6d;&#106;&#115;&#46;&#99;&#111;&#109;</a> to the CC list of
+adds the npm support staff <a href="&#x6d;&#x61;&#x69;&#108;&#116;&#x6f;&#58;&#x73;&#x75;&#112;&#112;&#x6f;&#x72;&#116;&#x40;&#x6e;&#112;&#109;&#106;&#115;&#46;&#x63;&#111;&#109;">&#x73;&#x75;&#112;&#112;&#x6f;&#x72;&#116;&#x40;&#x6e;&#112;&#109;&#106;&#115;&#46;&#x63;&#111;&#109;</a> to the CC list of
the email. Mention in the email that Bob can run <code>npm owner add
joe foo</code> to add Joe as an owner of the <code>foo</code> package.</li>
<li>After a reasonable amount of time, if Bob has not responded, or if
Bob and Joe can&#39;t come to any sort of resolution, email support
-<a href="&#109;&#x61;&#x69;&#108;&#116;&#x6f;&#x3a;&#115;&#x75;&#112;&#x70;&#111;&#x72;&#116;&#x40;&#x6e;&#112;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#115;&#x75;&#112;&#x70;&#111;&#x72;&#116;&#x40;&#x6e;&#112;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;</a> and we&#39;ll sort it out. (&quot;Reasonable&quot; is
+<a href="&#109;&#x61;&#x69;&#108;&#116;&#x6f;&#58;&#115;&#117;&#x70;&#x70;&#x6f;&#x72;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#46;&#99;&#111;&#109;">&#115;&#117;&#x70;&#x70;&#x6f;&#x72;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#46;&#99;&#111;&#109;</a> and we&#39;ll sort it out. (&quot;Reasonable&quot; is
usually at least 4 weeks, but extra time is allowed around common
holidays.)</li>
</ol>
@@ -112,5 +112,5 @@ things into it.</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-disputes &mdash; npm@1.4.10</p>
+<p id="footer">npm-disputes &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-faq.html b/deps/npm/html/doc/misc/npm-faq.html
index 02ba3f9019..7e2c7aca0a 100644
--- a/deps/npm/html/doc/misc/npm-faq.html
+++ b/deps/npm/html/doc/misc/npm-faq.html
@@ -199,7 +199,7 @@ change it again? npm doesn&#39;t currently track any state about past
configuration settings, so this would be rather difficult to do
properly. It would have to track every previous value for this
config, and always accept any of them, or else yesterday&#39;s install may
-be broken tomorrow. Complexity hurdle #5.</p>
+be broken tomorrow. Complexity hurdle #4.</p>
<p>Never going to happen. The folder is named <code>node_modules</code>. It is
written indelibly in the Node Way, handed down from the ancient times
of Node 0.3.</p>
@@ -237,7 +237,7 @@ that has a package.json in its root, or a git url.
<p>To check if the registry is down, open up
<a href="https://registry.npmjs.org/">https://registry.npmjs.org/</a> in a web browser. This will also tell
you if you are just unable to access the internet for some reason.</p>
-<p>If the registry IS down, let us know by emailing <a href="&#x6d;&#x61;&#x69;&#108;&#116;&#x6f;&#58;&#x73;&#x75;&#x70;&#x70;&#111;&#x72;&#116;&#x40;&#110;&#112;&#x6d;&#x6a;&#115;&#x2e;&#x63;&#x6f;&#109;">&#x73;&#x75;&#x70;&#x70;&#111;&#x72;&#116;&#x40;&#110;&#112;&#x6d;&#x6a;&#115;&#x2e;&#x63;&#x6f;&#109;</a>
+<p>If the registry IS down, let us know by emailing <a href="&#109;&#x61;&#x69;&#x6c;&#116;&#x6f;&#x3a;&#115;&#x75;&#112;&#x70;&#x6f;&#114;&#x74;&#x40;&#110;&#x70;&#x6d;&#x6a;&#x73;&#x2e;&#99;&#x6f;&#109;">&#115;&#x75;&#112;&#x70;&#x6f;&#114;&#x74;&#x40;&#110;&#x70;&#x6d;&#x6a;&#x73;&#x2e;&#99;&#x6f;&#109;</a>
or posting an issue at <a href="https://github.com/npm/npm/issues">https://github.com/npm/npm/issues</a>. If it&#39;s
down for the world (and not just on your local network) then we&#39;re
probably already being pinged about it.</p>
@@ -254,7 +254,7 @@ There is not sufficient need to impose namespace rules on everyone.</p>
contributed to it, some of them quite substantially.</p>
<p>The npm open source project, The npm Registry, and <a href="https://www.npmjs.org">the community
website</a> are maintained and operated by the
-good folks at <a href="https://www.npmjs.com">npm, Inc.</a></p>
+good folks at <a href="http://www.npmjs.com">npm, Inc.</a></p>
<h2 id="i-have-a-question-or-request-not-addressed-here-where-should-i-put-it-">I have a question or request not addressed here. Where should I put it?</h2>
<p>Post an issue on the github project:</p>
<ul>
@@ -285,5 +285,5 @@ good folks at <a href="https://www.npmjs.com">npm, Inc.</a></p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-faq &mdash; npm@1.4.10</p>
+<p id="footer">npm-faq &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-index.html b/deps/npm/html/doc/misc/npm-index.html
index 47dcc35c71..3db53a7490 100644
--- a/deps/npm/html/doc/misc/npm-index.html
+++ b/deps/npm/html/doc/misc/npm-index.html
@@ -114,6 +114,8 @@
<p>Display npm bin folder</p>
<h2 id="npm-bugs-3-"><a href="../api/npm-bugs.html">npm-bugs(3)</a></h2>
<p>Bugs for a package in a web browser maybe</p>
+<h2 id="npm-cache-3-"><a href="../api/npm-cache.html">npm-cache(3)</a></h2>
+<p>manage the npm cache programmatically</p>
<h2 id="npm-commands-3-"><a href="../api/npm-commands.html">npm-commands(3)</a></h2>
<p>npm commands</p>
<h2 id="npm-config-3-"><a href="../api/npm-config.html">npm-config(3)</a></h2>
@@ -226,5 +228,5 @@
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-index &mdash; npm@1.4.10</p>
+<p id="footer">npm-index &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-registry.html b/deps/npm/html/doc/misc/npm-registry.html
index 50f0b59679..44faba0a9b 100644
--- a/deps/npm/html/doc/misc/npm-registry.html
+++ b/deps/npm/html/doc/misc/npm-registry.html
@@ -71,5 +71,5 @@ effectively implement the entire CouchDB API anyway.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-registry &mdash; npm@1.4.10</p>
+<p id="footer">npm-registry &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/npm-scripts.html b/deps/npm/html/doc/misc/npm-scripts.html
index 2fcb009494..31c6e2fc19 100644
--- a/deps/npm/html/doc/misc/npm-scripts.html
+++ b/deps/npm/html/doc/misc/npm-scripts.html
@@ -42,7 +42,7 @@ Run by the <code>npm restart</code> command. Note: <code>npm restart</code> will
stop and start scripts if no <code>restart</code> script is provided.</li>
</ul>
<p>Additionally, arbitrary scripts can be run by doing
-<code>npm run-script &lt;stage&gt; &lt;pkg&gt;</code>.</p>
+<code>npm run-script &lt;pkg&gt; &lt;stage&gt;</code>.</p>
<h2 id="note-install-scripts-are-an-antipattern">NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN</h2>
<p><strong>tl;dr</strong> Don&#39;t use <code>install</code>. Use a <code>.gyp</code> file for compilation, and
<code>prepublish</code> for anything else.</p>
@@ -218,5 +218,5 @@ the user will sudo the npm command in question.</li>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">npm-scripts &mdash; npm@1.4.10</p>
+<p id="footer">npm-scripts &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/removing-npm.html b/deps/npm/html/doc/misc/removing-npm.html
index 7b77eecf33..d03538d595 100644
--- a/deps/npm/html/doc/misc/removing-npm.html
+++ b/deps/npm/html/doc/misc/removing-npm.html
@@ -57,5 +57,5 @@ modules. To track those down, you can do the following:</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">removing-npm &mdash; npm@1.4.10</p>
+<p id="footer">removing-npm &mdash; npm@1.4.14</p>
diff --git a/deps/npm/html/doc/misc/semver.html b/deps/npm/html/doc/misc/semver.html
index 4e28efd606..818e554c6c 100644
--- a/deps/npm/html/doc/misc/semver.html
+++ b/deps/npm/html/doc/misc/semver.html
@@ -38,15 +38,16 @@ then exits failure.
Versions are printed in ascending order, so supplying
multiple versions to the utility will just sort them.
</code></pre><h2 id="versions">Versions</h2>
-<p>A &quot;version&quot; is described by the v2.0.0 specification found at
+<p>A &quot;version&quot; is described by the <code>v2.0.0</code> specification found at
<a href="http://semver.org/">http://semver.org/</a>.</p>
<p>A leading <code>&quot;=&quot;</code> or <code>&quot;v&quot;</code> character is stripped off and ignored.</p>
<h2 id="ranges">Ranges</h2>
<p>The following range styles are supported:</p>
<ul>
-<li><code>1.2.3</code> A specific version. When nothing else will do. Note that
-build metadata is still ignored, so <code>1.2.3+build2012</code> will satisfy
-this range.</li>
+<li><code>1.2.3</code> A specific version. When nothing else will do. Must be a full
+version number, with major, minor, and patch versions specified.
+Note that build metadata is still ignored, so <code>1.2.3+build2012</code> will
+satisfy this range.</li>
<li><code>&gt;1.2.3</code> Greater than a specific version.</li>
<li><code>&lt;1.2.3</code> Less than a specific version. If there is no prerelease
tag on the version range, then no prerelease version will be allowed
@@ -57,26 +58,33 @@ not satisfy this range, but <code>2.3.0-beta</code> will.</li>
<li><code>&lt;=1.2.3</code> Less than or equal to. In this case, prerelease versions
ARE allowed, so <code>1.2.3-beta</code> would satisfy.</li>
<li><code>1.2.3 - 2.3.4</code> := <code>&gt;=1.2.3 &lt;=2.3.4</code></li>
-<li><code>~1.2.3</code> := <code>&gt;=1.2.3-0 &lt;1.3.0-0</code> &quot;Reasonably close to 1.2.3&quot;. When
+<li><code>~1.2.3</code> := <code>&gt;=1.2.3-0 &lt;1.3.0-0</code> &quot;Reasonably close to <code>1.2.3</code>&quot;. When
using tilde operators, prerelease versions are supported as well,
but a prerelease of the next significant digit will NOT be
satisfactory, so <code>1.3.0-beta</code> will not satisfy <code>~1.2.3</code>.</li>
-<li><code>^1.2.3</code> := <code>&gt;=1.2.3-0 &lt;2.0.0-0</code> &quot;Compatible with 1.2.3&quot;. When
+<li><code>^1.2.3</code> := <code>&gt;=1.2.3-0 &lt;2.0.0-0</code> &quot;Compatible with <code>1.2.3</code>&quot;. When
using caret operators, anything from the specified version (including
prerelease) will be supported up to, but not including, the next
major version (or its prereleases). <code>1.5.1</code> will satisfy <code>^1.2.3</code>,
while <code>1.2.2</code> and <code>2.0.0-beta</code> will not.</li>
-<li><code>^0.1.3</code> := <code>&gt;=0.1.3-0 &lt;0.2.0-0</code> &quot;Compatible with 0.1.3&quot;. 0.x.x versions are
+<li><code>^0.1.3</code> := <code>&gt;=0.1.3-0 &lt;0.2.0-0</code> &quot;Compatible with <code>0.1.3</code>&quot;. <code>0.x.x</code> versions are
special: the first non-zero component indicates potentially breaking changes,
meaning the caret operator matches any version with the same first non-zero
component starting at the specified version.</li>
-<li><code>^0.0.2</code> := <code>=0.0.2</code> &quot;Only the version 0.0.2 is considered compatible&quot;</li>
-<li><code>~1.2</code> := <code>&gt;=1.2.0-0 &lt;1.3.0-0</code> &quot;Any version starting with 1.2&quot;</li>
-<li><code>^1.2</code> := <code>&gt;=1.2.0-0 &lt;2.0.0-0</code> &quot;Any version compatible with 1.2&quot;</li>
-<li><code>1.2.x</code> := <code>&gt;=1.2.0-0 &lt;1.3.0-0</code> &quot;Any version starting with 1.2&quot;</li>
-<li><code>~1</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version starting with 1&quot;</li>
-<li><code>^1</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version compatible with 1&quot;</li>
-<li><code>1.x</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version starting with 1&quot;</li>
+<li><code>^0.0.2</code> := <code>=0.0.2</code> &quot;Only the version <code>0.0.2</code> is considered compatible&quot;</li>
+<li><code>~1.2</code> := <code>&gt;=1.2.0-0 &lt;1.3.0-0</code> &quot;Any version starting with <code>1.2</code>&quot;</li>
+<li><code>^1.2</code> := <code>&gt;=1.2.0-0 &lt;2.0.0-0</code> &quot;Any version compatible with <code>1.2</code>&quot;</li>
+<li><code>1.2.x</code> := <code>&gt;=1.2.0-0 &lt;1.3.0-0</code> &quot;Any version starting with <code>1.2</code>&quot;</li>
+<li><code>1.2.*</code> Same as <code>1.2.x</code>.</li>
+<li><code>1.2</code> Same as <code>1.2.x</code>.</li>
+<li><code>~1</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version starting with <code>1</code>&quot;</li>
+<li><code>^1</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version compatible with <code>1</code>&quot;</li>
+<li><code>1.x</code> := <code>&gt;=1.0.0-0 &lt;2.0.0-0</code> &quot;Any version starting with <code>1</code>&quot;</li>
+<li><code>1.*</code> Same as <code>1.x</code>.</li>
+<li><code>1</code> Same as <code>1.x</code>.</li>
+<li><code>*</code> Any version whatsoever.</li>
+<li><code>x</code> Same as <code>*</code>.</li>
+<li><code>&quot;&quot;</code> (just an empty string) Same as <code>*</code>.</li>
</ul>
<p>Ranges can be joined with either a space (which implies &quot;and&quot;) or a
<code>||</code> (which implies &quot;or&quot;).</p>
@@ -87,41 +95,51 @@ The resulting output will always be 100% strict, of course.</p>
<p>Strict-mode Comparators and Ranges will be strict about the SemVer
strings that they parse.</p>
<ul>
-<li>valid(v): Return the parsed version, or null if it&#39;s not valid.</li>
-<li>inc(v, release): Return the version incremented by the release type
-(major, minor, patch, or prerelease), or null if it&#39;s not valid.</li>
+<li><code>valid(v)</code>: Return the parsed version, or null if it&#39;s not valid.</li>
+<li><code>inc(v, release)</code>: Return the version incremented by the release
+type (<code>major</code>, <code>premajor</code>, <code>minor</code>, <code>preminor</code>, <code>patch</code>,
+<code>prepatch</code>, or <code>prerelease</code>), or null if it&#39;s not valid<ul>
+<li><code>premajor</code> in one call will bump the version up to the next major
+version and down to a prerelease of that major version.
+<code>preminor</code>, and <code>prepatch</code> work the same way.</li>
+<li>If called from a non-prerelease version, the <code>prerelease</code> will work the
+same as <code>prepatch</code>. It increments the patch version, then makes a
+prerelease. If the input version is already a prerelease it simply
+increments it.</li>
+</ul>
+</li>
</ul>
<h3 id="comparison">Comparison</h3>
<ul>
-<li>gt(v1, v2): <code>v1 &gt; v2</code></li>
-<li>gte(v1, v2): <code>v1 &gt;= v2</code></li>
-<li>lt(v1, v2): <code>v1 &lt; v2</code></li>
-<li>lte(v1, v2): <code>v1 &lt;= v2</code></li>
-<li>eq(v1, v2): <code>v1 == v2</code> This is true if they&#39;re logically equivalent,
+<li><code>gt(v1, v2)</code>: <code>v1 &gt; v2</code></li>
+<li><code>gte(v1, v2)</code>: <code>v1 &gt;= v2</code></li>
+<li><code>lt(v1, v2)</code>: <code>v1 &lt; v2</code></li>
+<li><code>lte(v1, v2)</code>: <code>v1 &lt;= v2</code></li>
+<li><code>eq(v1, v2)</code>: <code>v1 == v2</code> This is true if they&#39;re logically equivalent,
even if they&#39;re not the exact same string. You already know how to
compare strings.</li>
-<li>neq(v1, v2): <code>v1 != v2</code> The opposite of eq.</li>
-<li>cmp(v1, comparator, v2): Pass in a comparison string, and it&#39;ll call
+<li><code>neq(v1, v2)</code>: <code>v1 != v2</code> The opposite of <code>eq</code>.</li>
+<li><code>cmp(v1, comparator, v2)</code>: Pass in a comparison string, and it&#39;ll call
the corresponding function above. <code>&quot;===&quot;</code> and <code>&quot;!==&quot;</code> do simple
string comparison, but are included for completeness. Throws if an
invalid comparison string is provided.</li>
-<li>compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if
-v2 is greater. Sorts in ascending order if passed to Array.sort().</li>
-<li>rcompare(v1, v2): The reverse of compare. Sorts an array of versions
-in descending order when passed to Array.sort().</li>
+<li><code>compare(v1, v2)</code>: Return <code>0</code> if <code>v1 == v2</code>, or <code>1</code> if <code>v1</code> is greater, or <code>-1</code> if
+<code>v2</code> is greater. Sorts in ascending order if passed to <code>Array.sort()</code>.</li>
+<li><code>rcompare(v1, v2)</code>: The reverse of compare. Sorts an array of versions
+in descending order when passed to <code>Array.sort()</code>.</li>
</ul>
<h3 id="ranges">Ranges</h3>
<ul>
-<li>validRange(range): Return the valid range or null if it&#39;s not valid</li>
-<li>satisfies(version, range): Return true if the version satisfies the
+<li><code>validRange(range)</code>: Return the valid range or null if it&#39;s not valid</li>
+<li><code>satisfies(version, range)</code>: Return true if the version satisfies the
range.</li>
-<li>maxSatisfying(versions, range): Return the highest version in the list
-that satisfies the range, or null if none of them do.</li>
-<li>gtr(version, range): Return true if version is greater than all the
+<li><code>maxSatisfying(versions, range)</code>: Return the highest version in the list
+that satisfies the range, or <code>null</code> if none of them do.</li>
+<li><code>gtr(version, range)</code>: Return <code>true</code> if version is greater than all the
versions possible in the range.</li>
-<li>ltr(version, range): Return true if version is less than all the
+<li><code>ltr(version, range)</code>: Return <code>true</code> if version is less than all the
versions possible in the range.</li>
-<li>outside(version, range, hilo): Return true if the version is outside
+<li><code>outside(version, range, hilo)</code>: Return true if the version is outside
the bounds of the range in either the high or low direction. The
<code>hilo</code> argument must be either the string <code>&#39;&gt;&#39;</code> or <code>&#39;&lt;&#39;</code>. (This is
the function called by <code>gtr</code> and <code>ltr</code>.)</li>
@@ -130,8 +148,8 @@ the function called by <code>gtr</code> and <code>ltr</code>.)</li>
greater than a range, less than a range, <em>or</em> satisfy a range! For
example, the range <code>1.2 &lt;1.2.9 || &gt;2.0.0</code> would have a hole from <code>1.2.9</code>
until <code>2.0.0</code>, so the version <code>1.2.10</code> would not be greater than the
-range (because 2.0.1 satisfies, which is higher), nor less than the
-range (since 1.2.8 satisfies, which is lower), and it also does not
+range (because <code>2.0.1</code> satisfies, which is higher), nor less than the
+range (since <code>1.2.8</code> satisfies, which is lower), and it also does not
satisfy the range.</p>
<p>If you want to know if a version satisfies or does not satisfy a
range, use the <code>satisfies(version, range)</code> function.</p>
@@ -147,5 +165,5 @@ range, use the <code>satisfies(version, range)</code> function.</p>
<tr><td style="width:60px;height:10px;background:rgb(237,127,127)" colspan=6>&nbsp;</td><td colspan=10 style="width:10px;height:10px;background:rgb(237,127,127)">&nbsp;</td></tr>
<tr><td colspan=5 style="width:50px;height:10px;background:#fff">&nbsp;</td><td style="width:40px;height:10px;background:rgb(237,127,127)" colspan=4>&nbsp;</td><td style="width:90px;height:10px;background:#fff" colspan=9>&nbsp;</td></tr>
</table>
-<p id="footer">semver &mdash; npm@1.4.10</p>
+<p id="footer">semver &mdash; npm@1.4.14</p>
diff --git a/deps/npm/lib/adduser.js b/deps/npm/lib/adduser.js
index 94a119683a..f826a76e8a 100644
--- a/deps/npm/lib/adduser.js
+++ b/deps/npm/lib/adduser.js
@@ -15,6 +15,7 @@ try {
adduser.usage = "npm adduser\nThen enter stuff at the prompts"
function adduser (args, cb) {
+ npm.spinner.stop()
if (!crypto) return cb(new Error(
"You must compile node with ssl support to use the adduser feature"))
@@ -131,9 +132,10 @@ function save (c, u, cb) {
registry.username = u.u
registry.password = u.p
}
-
+ npm.spinner.start()
// save existing configs, but yank off for this PUT
registry.adduser(u.u, u.p, u.e, function (er) {
+ npm.spinner.stop()
if (er) return cb(er)
registry.username = u.u
registry.password = u.p
diff --git a/deps/npm/lib/cache.js b/deps/npm/lib/cache.js
index 32fb9f832e..99e85a0f95 100644
--- a/deps/npm/lib/cache.js
+++ b/deps/npm/lib/cache.js
@@ -7,15 +7,14 @@
//
/*
-fetching a url:
-1. Check for url in inFlightUrls. If present, add cb, and return.
-2. create inFlightURL list
-3. Acquire lock at {cache}/{sha(url)}.lock
+fetching a URL:
+1. Check for URL in inflight URLs. If present, add cb, and return.
+2. Acquire lock at {cache}/{sha(url)}.lock
retries = {cache-lock-retries, def=3}
stale = {cache-lock-stale, def=30000}
wait = {cache-lock-wait, def=100}
-4. if lock can't be acquired, then fail
-5. fetch url, clear lock, call cbs
+3. if lock can't be acquired, then fail
+4. fetch url, clear lock, call cbs
cache folders:
1. urls: http!/server.com/path/to/thing
@@ -51,40 +50,27 @@ adding a local tarball:
*/
exports = module.exports = cache
-cache.read = read
-cache.clean = clean
cache.unpack = unpack
-cache.lock = lock
-cache.unlock = unlock
+cache.clean = clean
+cache.read = read
-var mkdir = require("mkdirp")
- , spawn = require("child_process").spawn
- , exec = require("child_process").execFile
- , once = require("once")
- , fetch = require("./utils/fetch.js")
- , npm = require("./npm.js")
+var npm = require("./npm.js")
, fs = require("graceful-fs")
+ , assert = require("assert")
, rm = require("./utils/gently-rm.js")
, readJson = require("read-package-json")
- , registry = npm.registry
, log = require("npmlog")
, path = require("path")
- , sha = require("sha")
+ , url = require("url")
, asyncMap = require("slide").asyncMap
- , semver = require("semver")
, tar = require("./utils/tar.js")
, fileCompletion = require("./utils/completion/file-completion.js")
- , url = require("url")
- , chownr = require("chownr")
- , lockFile = require("lockfile")
- , crypto = require("crypto")
- , retry = require("retry")
- , zlib = require("zlib")
- , chmodr = require("chmodr")
- , which = require("which")
, isGitUrl = require("./utils/is-git-url.js")
- , pathIsInside = require("path-is-inside")
- , http = require("http")
+ , deprCheck = require("./utils/depr-check.js")
+ , addNamed = require("./cache/add-named.js")
+ , addLocal = require("./cache/add-local.js")
+ , addRemoteTarball = require("./cache/add-remote-tarball.js")
+ , addRemoteGit = require("./cache/add-remote-git.js")
cache.usage = "npm cache add <tarball file>"
+ "\nnpm cache add <folder>"
@@ -131,24 +117,31 @@ function cache (args, cb) {
// just do a readJson and return.
// if they're not, then fetch them from the registry.
function read (name, ver, forceBypass, cb) {
- if (typeof cb !== "function") cb = forceBypass, forceBypass = true
+ assert(typeof name === "string", "must include name of module to install")
+ assert(typeof cb === "function", "must include callback")
+
+ if (forceBypass === undefined || forceBypass === null) forceBypass = true
+
var jsonFile = path.join(npm.cache, name, ver, "package", "package.json")
function c (er, data) {
if (data) deprCheck(data)
+
return cb(er, data)
}
if (forceBypass && npm.config.get("force")) {
log.verbose("using force", "skipping cache")
- return addNamed(name, ver, c)
+ return addNamed(name, ver, null, c)
}
readJson(jsonFile, function (er, data) {
er = needName(er, data)
er = needVersion(er, data)
if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er)
- if (er) return addNamed(name, ver, c)
+ if (er) return addNamed(name, ver, null, c)
+
deprCheck(data)
+
c(er, data)
})
}
@@ -176,8 +169,10 @@ function ls_ (req, depth, cb) {
// npm cache clean [<path>]
function clean (args, cb) {
- if (!cb) cb = args, args = []
+ assert(typeof cb === "function", "must include callback")
+
if (!args) args = []
+
args = args.join("/").split("@").join("/")
if (args.substr(-1) === "/") args = args.substr(0, args.length - 1)
var f = path.join(npm.cache, path.normalize(args))
@@ -199,8 +194,9 @@ function clean (args, cb) {
// npm cache add <tarball>
// npm cache add <folder>
cache.add = function (pkg, ver, scrub, cb) {
- if (typeof cb !== "function") cb = scrub, scrub = false
- if (typeof cb !== "function") cb = ver, ver = null
+ assert(typeof pkg === "string", "must include name of package to install")
+ assert(typeof cb === "function", "must include callback")
+
if (scrub) {
return clean([], function (er) {
if (er) return cb(er)
@@ -256,1109 +252,26 @@ function add (args, cb) {
// in that case, we will not have a protocol now, but if we
// split and check, we will.
if (!name && !p.protocol) {
- if (spec.indexOf("/") !== -1 ||
- process.platform === "win32" && spec.indexOf("\\") !== -1) {
- return maybeFile(spec, p, cb)
- } else if (spec.indexOf("@") !== -1) {
- return maybeAt(spec, cb)
- }
- }
-
- add_(name, spec, p, cb)
-}
-
-function afterAdd (arg, cb) { return function (er, data) {
- if (er || !data || !data.name || !data.version) {
- return cb(er, data)
- }
-
- // Save the resolved, shasum, etc. into the data so that the next
- // time we load from this cached data, we have all the same info.
- var name = data.name
- var ver = data.version
- var pj = path.join(npm.cache, name, ver, "package", "package.json")
- fs.writeFile(pj, JSON.stringify(data), "utf8", function (er) {
- cb(er, data)
- })
-}}
-
-
-
-function maybeFile (spec, p, cb) {
- fs.stat(spec, function (er, stat) {
- if (!er) {
- // definitely a local thing
- addLocal(spec, cb)
- } else if (er && spec.indexOf("@") !== -1) {
- // bar@baz/loofa
- maybeAt(spec, cb)
- } else {
- // Already know it's not a url, so must be local
- addLocal(spec, cb)
- }
- })
-}
-
-function maybeAt (spec, cb) {
- var tmp = spec.split("@")
-
- // split name@2.3.4 only if name is a valid package name,
- // don't split in case of "./test@example.com/" (local path)
- var name = tmp.shift()
- spec = tmp.join("@")
- return add([name, spec], cb)
-}
-
-function add_ (name, spec, p, cb) {
- switch (p.protocol) {
- case "http:":
- case "https:":
- return addRemoteTarball(spec, null, name, cb)
-
- default:
- if (isGitUrl(p))
- return addRemoteGit(spec, p, name, false, cb)
-
- // if we have a name and a spec, then try name@spec
- // if not, then try just spec (which may try name@"" if not found)
- if (name) {
- addNamed(name, spec, cb)
- } else {
- addLocal(spec, cb)
- }
- }
-}
-
-function fetchAndShaCheck (u, tmp, shasum, cb) {
- fetch(u, tmp, function (er, response) {
- if (er) {
- log.error("fetch failed", u)
- return cb(er, response)
- }
-
- if (!shasum) {
- // Well, we weren't given a shasum, so at least sha what we have
- // in case we want to compare it to something else later
- return sha.get(tmp, function (er, shasum) {
- cb(er, response, shasum)
- })
- }
-
- // validate that the url we just downloaded matches the expected shasum.
- sha.check(tmp, shasum, function (er) {
- if (er != null && er.message) {
- // add original filename for better debuggability
- er.message = er.message + '\n' + 'From: ' + u
- }
- return cb(er, response, shasum)
- })
- })
-}
-
-// Only have a single download action at once for a given url
-// additional calls stack the callbacks.
-var inFlightURLs = {}
-function addRemoteTarball (u, shasum, name, version, cb_) {
- if (typeof cb_ !== "function") cb_ = version, version = ""
- if (typeof cb_ !== "function") cb_ = name, name = ""
- if (typeof cb_ !== "function") cb_ = shasum, shasum = null
-
- if (!inFlightURLs[u]) inFlightURLs[u] = []
- var iF = inFlightURLs[u]
- iF.push(cb_)
- if (iF.length > 1) return
-
- function cb (er, data) {
- if (data) {
- data._from = u
- data._shasum = data._shasum || shasum
- data._resolved = u
- }
- unlock(u, function () {
- var c
- while (c = iF.shift()) c(er, data)
- delete inFlightURLs[u]
- })
- }
-
- var tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz")
-
- lock(u, function (er) {
- if (er) return cb(er)
-
- log.verbose("addRemoteTarball", [u, shasum])
- mkdir(path.dirname(tmp), function (er) {
- if (er) return cb(er)
- addRemoteTarball_(u, tmp, shasum, done)
- })
- })
-
- function done (er, resp, shasum) {
- if (er) return cb(er)
- addLocalTarball(tmp, name, version, shasum, cb)
- }
-}
-
-function addRemoteTarball_(u, tmp, shasum, cb) {
- // Tuned to spread 3 attempts over about a minute.
- // See formula at <https://github.com/tim-kos/node-retry>.
- var operation = retry.operation
- ( { retries: npm.config.get("fetch-retries")
- , factor: npm.config.get("fetch-retry-factor")
- , minTimeout: npm.config.get("fetch-retry-mintimeout")
- , maxTimeout: npm.config.get("fetch-retry-maxtimeout") })
-
- operation.attempt(function (currentAttempt) {
- log.info("retry", "fetch attempt " + currentAttempt
- + " at " + (new Date()).toLocaleTimeString())
- fetchAndShaCheck(u, tmp, shasum, function (er, response, shasum) {
- // Only retry on 408, 5xx or no `response`.
- var sc = response && response.statusCode
- var statusRetry = !sc || (sc === 408 || sc >= 500)
- if (er && statusRetry && operation.retry(er)) {
- log.info("retry", "will retry, error on last attempt: " + er)
- return
- }
- cb(er, response, shasum)
- })
- })
-}
-
-// 1. cacheDir = path.join(cache,'_git-remotes',sha1(u))
-// 2. checkGitDir(cacheDir) ? 4. : 3. (rm cacheDir if necessary)
-// 3. git clone --mirror u cacheDir
-// 4. cd cacheDir && git fetch -a origin
-// 5. git archive /tmp/random.tgz
-// 6. addLocalTarball(/tmp/random.tgz) <gitref> --format=tar --prefix=package/
-// silent flag is used if this should error quietly
-function addRemoteGit (u, parsed, name, silent, cb_) {
- if (typeof cb_ !== "function") cb_ = name, name = null
-
- if (!inFlightURLs[u]) inFlightURLs[u] = []
- var iF = inFlightURLs[u]
- iF.push(cb_)
- if (iF.length > 1) return
-
- // git is so tricky!
- // if the path is like ssh://foo:22/some/path then it works, but
- // it needs the ssh://
- // If the path is like ssh://foo:some/path then it works, but
- // only if you remove the ssh://
- var origUrl = u
- u = u.replace(/^git\+/, "")
- .replace(/#.*$/, "")
-
- // ssh paths that are scp-style urls don't need the ssh://
- if (parsed.pathname.match(/^\/?:/)) {
- u = u.replace(/^ssh:\/\//, "")
- }
-
- function cb (er, data) {
- unlock(u, function () {
- var c
- while (c = iF.shift()) c(er, data)
- delete inFlightURLs[origUrl]
- })
+ return maybeFile(spec, cb)
}
+ else {
+ switch (p.protocol) {
+ case "http:":
+ case "https:":
+ return addRemoteTarball(spec, { name: name }, null, cb)
- lock(u, function (er) {
- if (er) return cb(er)
-
- // figure out what we should check out.
- var co = parsed.hash && parsed.hash.substr(1) || "master"
-
- var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8)
- v = u.replace(/[^a-zA-Z0-9]+/g, '-') + '-' + v
-
- log.verbose("addRemoteGit", [u, co])
-
- var p = path.join(npm.config.get("cache"), "_git-remotes", v)
-
- checkGitDir(p, u, co, origUrl, silent, function(er, data) {
- chmodr(p, npm.modes.file, function(erChmod) {
- if (er) return cb(er, data)
- return cb(erChmod, data)
- })
- })
- })
-}
-
-function checkGitDir (p, u, co, origUrl, silent, cb) {
- fs.stat(p, function (er, s) {
- if (er) return cloneGitRemote(p, u, co, origUrl, silent, cb)
- if (!s.isDirectory()) return rm(p, function (er){
- if (er) return cb(er)
- cloneGitRemote(p, u, co, origUrl, silent, cb)
- })
-
- var git = npm.config.get("git")
- var args = [ "config", "--get", "remote.origin.url" ]
- var env = gitEnv()
+ default:
+ if (isGitUrl(p)) return addRemoteGit(spec, p, false, cb)
- // check for git
- which(git, function (err) {
- if (err) {
- err.code = "ENOGIT"
- return cb(err)
- }
- exec(git, args, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdoutTrimmed = (stdout + "\n" + stderr).trim()
- if (er || u !== stdout.trim()) {
- log.warn( "`git config --get remote.origin.url` returned "
- + "wrong result ("+u+")", stdoutTrimmed )
- return rm(p, function (er){
- if (er) return cb(er)
- cloneGitRemote(p, u, co, origUrl, silent, cb)
- })
+ // if we have a name and a spec, then try name@spec
+ if (name) {
+ addNamed(name, spec, null, cb)
}
- log.verbose("git remote.origin.url", stdoutTrimmed)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
- })
- })
-}
-
-function cloneGitRemote (p, u, co, origUrl, silent, cb) {
- mkdir(p, function (er) {
- if (er) return cb(er)
-
- var git = npm.config.get("git")
- var args = [ "clone", "--mirror", u, p ]
- var env = gitEnv()
-
- // check for git
- which(git, function (err) {
- if (err) {
- err.code = "ENOGIT"
- return cb(err)
- }
- exec(git, args, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- if (silent) {
- log.verbose("git clone " + u, stdout)
- } else {
- log.error("git clone " + u, stdout)
- }
- return cb(er)
+ // if not, then try just spec (which may try name@"" if not found)
+ else {
+ addLocal(spec, {}, cb)
}
- log.verbose("git clone " + u, stdout)
- archiveGitRemote(p, u, co, origUrl, cb)
- })
- })
- })
-}
-
-function archiveGitRemote (p, u, co, origUrl, cb) {
- var git = npm.config.get("git")
- var archive = [ "fetch", "-a", "origin" ]
- var resolve = [ "rev-list", "-n1", co ]
- var env = gitEnv()
-
- var errState = null
- var n = 0
- var resolved = null
- var tmp
-
- exec(git, archive, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- log.error("git fetch -a origin ("+u+")", stdout)
- return cb(er)
- }
- log.verbose("git fetch -a origin ("+u+")", stdout)
- tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz")
- verifyOwnership()
- })
-
- function verifyOwnership() {
- if (process.platform === "win32") {
- log.silly("verifyOwnership", "skipping for windows")
- resolveHead()
- } else {
- getCacheStat(function(er, cs) {
- if (er) {
- log.error("Could not get cache stat")
- return cb(er)
- }
- chownr(p, cs.uid, cs.gid, function(er) {
- if (er) {
- log.error("Failed to change folder ownership under npm cache for %s", p)
- return cb(er)
- }
- resolveHead()
- })
- })
- }
- }
-
- function resolveHead () {
- exec(git, resolve, {cwd: p, env: env}, function (er, stdout, stderr) {
- stdout = (stdout + "\n" + stderr).trim()
- if (er) {
- log.error("Failed resolving git HEAD (" + u + ")", stderr)
- return cb(er)
- }
- log.verbose("git rev-list -n1 " + co, stdout)
- var parsed = url.parse(origUrl)
- parsed.hash = stdout
- resolved = url.format(parsed)
-
- // https://github.com/npm/npm/issues/3224
- // node incorrectly sticks a / at the start of the path
- // We know that the host won't change, so split and detect this
- var spo = origUrl.split(parsed.host)
- var spr = resolved.split(parsed.host)
- if (spo[1].charAt(0) === ':' && spr[1].charAt(0) === '/')
- spr[1] = spr[1].slice(1)
- resolved = spr.join(parsed.host)
-
- log.verbose('resolved git url', resolved)
- next()
- })
- }
-
- function next () {
- mkdir(path.dirname(tmp), function (er) {
- if (er) return cb(er)
- var gzip = zlib.createGzip({ level: 9 })
- var git = npm.config.get("git")
- var args = ["archive", co, "--format=tar", "--prefix=package/"]
- var out = fs.createWriteStream(tmp)
- var env = gitEnv()
- cb = once(cb)
- var cp = spawn(git, args, { env: env, cwd: p })
- cp.on("error", cb)
- cp.stderr.on("data", function(chunk) {
- log.silly(chunk.toString(), "git archive")
- })
-
- cp.stdout.pipe(gzip).pipe(out).on("close", function() {
- addLocalTarball(tmp, function(er, data) {
- if (data) data._resolved = resolved
- cb(er, data)
- })
- })
- })
- }
-}
-
-var gitEnv_
-function gitEnv () {
- // git responds to env vars in some weird ways in post-receive hooks
- // so don't carry those along.
- if (gitEnv_) return gitEnv_
- gitEnv_ = {}
- for (var k in process.env) {
- if (!~['GIT_PROXY_COMMAND','GIT_SSH','GIT_SSL_NO_VERIFY'].indexOf(k) && k.match(/^GIT/)) continue
- gitEnv_[k] = process.env[k]
- }
- return gitEnv_
-}
-
-
-// only have one request in flight for a given
-// name@blah thing.
-var inFlightNames = {}
-function addNamed (name, x, data, cb_) {
- if (typeof cb_ !== "function") cb_ = data, data = null
- log.verbose("addNamed", [name, x])
-
- var k = name + "@" + x
- if (!inFlightNames[k]) inFlightNames[k] = []
- var iF = inFlightNames[k]
- iF.push(cb_)
- if (iF.length > 1) return
-
- function cb (er, data) {
- if (data && !data._fromGithub) data._from = k
- unlock(k, function () {
- var c
- while (c = iF.shift()) c(er, data)
- delete inFlightNames[k]
- })
- }
-
- log.verbose("addNamed", [semver.valid(x), semver.validRange(x)])
- lock(k, function (er, fd) {
- if (er) return cb(er)
-
- var fn = ( semver.valid(x, true) ? addNameVersion
- : semver.validRange(x, true) ? addNameRange
- : addNameTag
- )
- fn(name, x, data, cb)
- })
-}
-
-function addNameTag (name, tag, data, cb_) {
- if (typeof cb_ !== "function") cb_ = data, data = null
- log.info("addNameTag", [name, tag])
- var explicit = true
- if (!tag) {
- explicit = false
- tag = npm.config.get("tag")
- }
-
- function cb(er, data) {
- // might be username/project
- // in that case, try it as a github url.
- if (er && tag.split("/").length === 2) {
- return maybeGithub(tag, name, er, cb_)
}
- return cb_(er, data)
- }
-
- registry.get(name, function (er, data, json, response) {
- if (!er) {
- er = errorResponse(name, response)
- }
- if (er) return cb(er)
- engineFilter(data)
- if (data["dist-tags"] && data["dist-tags"][tag]
- && data.versions[data["dist-tags"][tag]]) {
- var ver = data["dist-tags"][tag]
- return addNamed(name, ver, data.versions[ver], cb)
- }
- if (!explicit && Object.keys(data.versions).length) {
- return addNamed(name, "*", data, cb)
- }
-
- er = installTargetsError(tag, data)
- return cb(er)
- })
-}
-
-
-function engineFilter (data) {
- var npmv = npm.version
- , nodev = npm.config.get("node-version")
- , strict = npm.config.get("engine-strict")
-
- if (!nodev || npm.config.get("force")) return data
-
- Object.keys(data.versions || {}).forEach(function (v) {
- var eng = data.versions[v].engines
- if (!eng) return
- if (!strict && !data.versions[v].engineStrict) return
- if (eng.node && !semver.satisfies(nodev, eng.node, true)
- || eng.npm && !semver.satisfies(npmv, eng.npm, true)) {
- delete data.versions[v]
- }
- })
-}
-
-function errorResponse (name, response) {
- if (response.statusCode >= 400) {
- var er = new Error(http.STATUS_CODES[response.statusCode])
- er.statusCode = response.statusCode
- er.code = "E" + er.statusCode
- er.pkgid = name
- }
- return er
-}
-
-function addNameRange (name, range, data, cb) {
- if (typeof cb !== "function") cb = data, data = null
-
- range = semver.validRange(range, true)
- if (range === null) return cb(new Error(
- "Invalid version range: "+range))
-
- log.silly("addNameRange", {name:name, range:range, hasData:!!data})
-
- if (data) return next()
- registry.get(name, function (er, d, json, response) {
- if (!er) {
- er = errorResponse(name, response)
- }
- if (er) return cb(er)
- data = d
- next()
- })
-
- function next () {
- log.silly( "addNameRange", "number 2"
- , {name:name, range:range, hasData:!!data})
- engineFilter(data)
-
- log.silly("addNameRange", "versions"
- , [data.name, Object.keys(data.versions || {})])
-
- // if the tagged version satisfies, then use that.
- var tagged = data["dist-tags"][npm.config.get("tag")]
- if (tagged
- && data.versions[tagged]
- && semver.satisfies(tagged, range, true)) {
- return addNamed(name, tagged, data.versions[tagged], cb)
- }
-
- // find the max satisfying version.
- var versions = Object.keys(data.versions || {})
- var ms = semver.maxSatisfying(versions, range, true)
- if (!ms) {
- return cb(installTargetsError(range, data))
- }
-
- // if we don't have a registry connection, try to see if
- // there's a cached copy that will be ok.
- addNamed(name, ms, data.versions[ms], cb)
- }
-}
-
-function installTargetsError (requested, data) {
- var targets = Object.keys(data["dist-tags"]).filter(function (f) {
- return (data.versions || {}).hasOwnProperty(f)
- }).concat(Object.keys(data.versions || {}))
-
- requested = data.name + (requested ? "@'" + requested + "'" : "")
-
- targets = targets.length
- ? "Valid install targets:\n" + JSON.stringify(targets) + "\n"
- : "No valid targets found.\n"
- + "Perhaps not compatible with your version of node?"
-
- var er = new Error( "No compatible version found: "
- + requested + "\n" + targets)
- er.code = "ETARGET"
- return er
-}
-
-function addNameVersion (name, v, data, cb) {
- if (typeof cb !== "function") cb = data, data = null
-
- var ver = semver.valid(v, true)
- if (!ver) return cb(new Error("Invalid version: "+v))
-
- var response
-
- if (data) {
- response = null
- return next()
- }
- registry.get(name, function (er, d, json, resp) {
- if (!er) {
- er = errorResponse(name, resp)
- }
- if (er) return cb(er)
- data = d && d.versions[ver]
- if (!data) {
- er = new Error('version not found: ' + name + '@' + ver)
- er.package = name
- er.statusCode = 404
- return cb(er)
- }
- response = resp
- next()
- })
-
- function next () {
- deprCheck(data)
- var dist = data.dist
-
- if (!dist) return cb(new Error("No dist in "+data._id+" package"))
-
- if (!dist.tarball) return cb(new Error(
- "No dist.tarball in " + data._id + " package"))
-
- if ((response && response.statusCode !== 304) || npm.config.get("force")) {
- return fetchit()
- }
-
- // we got cached data, so let's see if we have a tarball.
- var pkgroot = path.join(npm.cache, name, ver)
- var pkgtgz = path.join(pkgroot, "package.tgz")
- var pkgjson = path.join(pkgroot, "package", "package.json")
- fs.stat(pkgtgz, function (er, s) {
- if (!er) {
- readJson(pkgjson, function (er, data) {
- er = needName(er, data)
- er = needVersion(er, data)
- if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR")
- return cb(er)
- if (er) return fetchit()
- // check the SHA of the package we have, to ensure it wasn't installed
- // from somewhere other than the registry (eg, a fork)
- if (data._shasum && dist.shasum && data._shasum !== dist.shasum)
- return fetchit()
- return cb(null, data)
- })
- } else return fetchit()
- })
-
- function fetchit () {
- if (!npm.config.get("registry")) {
- return cb(new Error("Cannot fetch: "+dist.tarball))
- }
-
- // use the same protocol as the registry.
- // https registry --> https tarballs, but
- // only if they're the same hostname, or else
- // detached tarballs may not work.
- var tb = url.parse(dist.tarball)
- var rp = url.parse(npm.config.get("registry"))
- if (tb.hostname === rp.hostname
- && tb.protocol !== rp.protocol) {
- tb.protocol = url.parse(npm.config.get("registry")).protocol
- delete tb.href
- }
- tb = url.format(tb)
-
- // only add non-shasum'ed packages if --forced.
- // only ancient things would lack this for good reasons nowadays.
- if (!dist.shasum && !npm.config.get("force")) {
- return cb(new Error("package lacks shasum: " + data._id))
- }
- return addRemoteTarball( tb
- , dist.shasum
- , name
- , ver
- , cb )
- }
- }
-}
-
-function addLocal (p, name, cb_) {
- if (typeof cb_ !== "function") cb_ = name, name = ""
-
- function cb (er, data) {
- unlock(p, function () {
- if (er) {
- // if it doesn't have a / in it, it might be a
- // remote thing.
- if (p.indexOf("/") === -1 && p.charAt(0) !== "."
- && (process.platform !== "win32" || p.indexOf("\\") === -1)) {
- return addNamed(p, "", cb_)
- }
- log.error("addLocal", "Could not install %s", p)
- return cb_(er)
- }
- if (data && !data._fromGithub) data._from = p
- return cb_(er, data)
- })
- }
-
- lock(p, function (er) {
- if (er) return cb(er)
- // figure out if this is a folder or file.
- fs.stat(p, function (er, s) {
- if (er) {
- // might be username/project
- // in that case, try it as a github url.
- if (p.split("/").length === 2) {
- return maybeGithub(p, name, er, cb)
- }
- return cb(er)
- }
- if (s.isDirectory()) addLocalDirectory(p, name, cb)
- else addLocalTarball(p, name, cb)
- })
- })
-}
-
-function maybeGithub (p, name, er, cb) {
- var u = "git://github.com/" + p
- , up = url.parse(u)
- log.info("maybeGithub", "Attempting %s from %s", p, u)
-
- return addRemoteGit(u, up, name, true, function (er2, data) {
- if (er2) {
- var upriv = "git+ssh://git@github.com:" + p
- , uppriv = url.parse(upriv)
-
- log.info("maybeGithub", "Attempting %s from %s", p, upriv)
-
- return addRemoteGit(upriv, uppriv, false, name, function (er3, data) {
- if (er3) return cb(er)
- success(upriv, data)
- })
- }
- success(u, data)
- })
-
- function success (u, data) {
- data._from = u
- data._fromGithub = true
- return cb(null, data)
- }
-}
-
-function addLocalTarball (p, name, version, shasum, cb_) {
- if (typeof cb_ !== "function") cb_ = shasum, shasum = null
- if (typeof cb_ !== "function") cb_ = version, version = ""
- if (typeof cb_ !== "function") cb_ = name, name = ""
-
- // If we don't have a shasum yet, then get the shasum now.
- if (!shasum) {
- return sha.get(p, function (er, shasum) {
- if (er) return cb_(er)
- addLocalTarball(p, name, version, shasum, cb_)
- })
- }
-
- // if it's a tar, and not in place,
- // then unzip to .tmp, add the tmp folder, and clean up tmp
- if (pathIsInside(p, npm.tmp))
- return addTmpTarball(p, name, version, shasum, cb_)
-
- if (pathIsInside(p, npm.cache)) {
- if (path.basename(p) !== "package.tgz") return cb_(new Error(
- "Not a valid cache tarball name: "+p))
- return addPlacedTarball(p, name, shasum, cb_)
- }
-
- function cb (er, data) {
- if (data) {
- data._resolved = p
- data._shasum = data._shasum || shasum
- }
- return cb_(er, data)
- }
-
- // just copy it over and then add the temp tarball file.
- var tmp = path.join(npm.tmp, name + Date.now()
- + "-" + Math.random(), "tmp.tgz")
- mkdir(path.dirname(tmp), function (er) {
- if (er) return cb(er)
- var from = fs.createReadStream(p)
- , to = fs.createWriteStream(tmp)
- , errState = null
- function errHandler (er) {
- if (errState) return
- return cb(errState = er)
- }
- from.on("error", errHandler)
- to.on("error", errHandler)
- to.on("close", function () {
- if (errState) return
- log.verbose("chmod", tmp, npm.modes.file.toString(8))
- fs.chmod(tmp, npm.modes.file, function (er) {
- if (er) return cb(er)
- addTmpTarball(tmp, name, null, shasum, cb)
- })
- })
- from.pipe(to)
- })
-}
-
-// to maintain the cache dir's permissions consistently.
-var cacheStat = null
-function getCacheStat (cb) {
- if (cacheStat) return cb(null, cacheStat)
- fs.stat(npm.cache, function (er, st) {
- if (er) return makeCacheDir(cb)
- if (!st.isDirectory()) {
- log.error("getCacheStat", "invalid cache dir %j", npm.cache)
- return cb(er)
- }
- return cb(null, cacheStat = st)
- })
-}
-
-function makeCacheDir (cb) {
- if (!process.getuid) return mkdir(npm.cache, cb)
-
- var uid = +process.getuid()
- , gid = +process.getgid()
-
- if (uid === 0) {
- if (process.env.SUDO_UID) uid = +process.env.SUDO_UID
- if (process.env.SUDO_GID) gid = +process.env.SUDO_GID
- }
- if (uid !== 0 || !process.env.HOME) {
- cacheStat = {uid: uid, gid: gid}
- return mkdir(npm.cache, afterMkdir)
- }
-
- fs.stat(process.env.HOME, function (er, st) {
- if (er) {
- log.error("makeCacheDir", "homeless?")
- return cb(er)
- }
- cacheStat = st
- log.silly("makeCacheDir", "cache dir uid, gid", [st.uid, st.gid])
- return mkdir(npm.cache, afterMkdir)
- })
-
- function afterMkdir (er, made) {
- if (er || !cacheStat || isNaN(cacheStat.uid) || isNaN(cacheStat.gid)) {
- return cb(er, cacheStat)
- }
-
- if (!made) return cb(er, cacheStat)
-
- // ensure that the ownership is correct.
- chownr(made, cacheStat.uid, cacheStat.gid, function (er) {
- return cb(er, cacheStat)
- })
- }
-}
-
-
-
-
-function addPlacedTarball (p, name, shasum, cb) {
- if (!cb) cb = name, name = ""
- getCacheStat(function (er, cs) {
- if (er) return cb(er)
- return addPlacedTarball_(p, name, cs.uid, cs.gid, shasum, cb)
- })
-}
-
-// Resolved sum is the shasum from the registry dist object, but
-// *not* necessarily the shasum of this tarball, because for stupid
-// historical reasons, npm re-packs each package an extra time through
-// a temp directory, so all installed packages are actually built with
-// *this* version of npm, on this machine.
-//
-// Once upon a time, this meant that we could change package formats
-// around and fix junk that might be added by incompatible tar
-// implementations. Then, for a while, it was a way to correct bs
-// added by bugs in our own tar implementation. Now, it's just
-// garbage, but cleaning it up is a pain, and likely to cause issues
-// if anything is overlooked, so it's not high priority.
-//
-// If you're bored, and looking to make npm go faster, and you've
-// already made it this far in this file, here's a better methodology:
-//
-// cache.add should really be cache.place. That is, it should take
-// a set of arguments like it does now, but then also a destination
-// folder.
-//
-// cache.add('foo@bar', '/path/node_modules/foo', cb)
-//
-// 1. Resolve 'foo@bar' to some specific:
-// - git url
-// - local folder
-// - local tarball
-// - tarball url
-// 2. If resolved through the registry, then pick up the dist.shasum
-// along the way.
-// 3. Acquire request() stream fetching bytes: FETCH
-// 4. FETCH.pipe(tar unpack stream to dest)
-// 5. FETCH.pipe(shasum generator)
-// When the tar and shasum streams both finish, make sure that the
-// shasum matches dist.shasum, and if not, clean up and bail.
-//
-// publish(cb)
-//
-// 1. read package.json
-// 2. get root package object (for rev, and versions)
-// 3. update root package doc with version info
-// 4. remove _attachments object
-// 5. remove versions object
-// 5. jsonify, remove last }
-// 6. get stream: registry.put(/package)
-// 7. write trailing-}-less JSON
-// 8. write "_attachments":
-// 9. JSON.stringify(attachments), remove trailing }
-// 10. Write start of attachments (stubs)
-// 11. JSON(filename)+':{"type":"application/octet-stream","data":"'
-// 12. acquire tar packing stream, PACK
-// 13. PACK.pipe(PUT)
-// 14. PACK.pipe(shasum generator)
-// 15. when PACK finishes, get shasum
-// 16. PUT.write('"}},') (finish _attachments
-// 17. update "versions" object with current package version
-// (including dist.shasum and dist.tarball)
-// 18. write '"versions":' + JSON(versions)
-// 19. write '}}' (versions, close main doc)
-
-function addPlacedTarball_ (p, name, uid, gid, resolvedSum, cb) {
- // now we know it's in place already as .cache/name/ver/package.tgz
- // unpack to .cache/name/ver/package/, read the package.json,
- // and fire cb with the json data.
- var target = path.dirname(p)
- , folder = path.join(target, "package")
-
- lock(folder, function (er) {
- if (er) return cb(er)
- rmUnpack()
- })
-
- function rmUnpack () {
- rm(folder, function (er) {
- unlock(folder, function () {
- if (er) {
- log.error("addPlacedTarball", "Could not remove %j", folder)
- return cb(er)
- }
- thenUnpack()
- })
- })
- }
-
- function thenUnpack () {
- tar.unpack(p, folder, null, null, uid, gid, function (er) {
- if (er) {
- log.error("addPlacedTarball", "Could not unpack %j to %j", p, target)
- return cb(er)
- }
- // calculate the sha of the file that we just unpacked.
- // this is so that the data is available when publishing.
- sha.get(p, function (er, shasum) {
- if (er) {
- log.error("addPlacedTarball", "shasum fail", p)
- return cb(er)
- }
- readJson(path.join(folder, "package.json"), function (er, data) {
- er = needName(er, data)
- er = needVersion(er, data)
- if (er) {
- log.error("addPlacedTarball", "Couldn't read json in %j"
- , folder)
- return cb(er)
- }
-
- data.dist = data.dist || {}
- data.dist.shasum = shasum
- deprCheck(data)
- asyncMap([p], function (f, cb) {
- log.verbose("chmod", f, npm.modes.file.toString(8))
- fs.chmod(f, npm.modes.file, cb)
- }, function (f, cb) {
- if (process.platform === "win32") {
- log.silly("chown", "skipping for windows", f)
- cb()
- } else if (typeof uid === "number"
- && typeof gid === "number"
- && parseInt(uid, 10) === uid
- && parseInt(gid, 10) === gid) {
- log.verbose("chown", f, [uid, gid])
- fs.chown(f, uid, gid, cb)
- } else {
- log.verbose("chown", "skip for invalid uid/gid", [f, uid, gid])
- cb()
- }
- }, function (er) {
- cb(er, data)
- })
- })
- })
- })
- }
-}
-
-// At this point, if shasum is set, it's something that we've already
-// read and checked. Just stashing it in the data at this point.
-function addLocalDirectory (p, name, shasum, cb) {
- if (typeof cb !== "function") cb = shasum, shasum = ""
- if (typeof cb !== "function") cb = name, name = ""
- // if it's a folder, then read the package.json,
- // tar it to the proper place, and add the cache tar
- if (pathIsInside(p, npm.cache)) return cb(new Error(
- "Adding a cache directory to the cache will make the world implode."))
- readJson(path.join(p, "package.json"), false, function (er, data) {
- er = needName(er, data)
- er = needVersion(er, data)
- if (er) return cb(er)
- deprCheck(data)
- var random = Date.now() + "-" + Math.random()
- , tmp = path.join(npm.tmp, random)
- , tmptgz = path.resolve(tmp, "tmp.tgz")
- , placed = path.resolve( npm.cache, data.name
- , data.version, "package.tgz" )
- , placeDirect = path.basename(p) === "package"
- , tgz = placeDirect ? placed : tmptgz
- , version = data.version
-
- name = data.name
-
- getCacheStat(function (er, cs) {
- mkdir(path.dirname(tgz), function (er, made) {
- if (er) return cb(er)
-
- var fancy = !pathIsInside(p, npm.tmp)
- && !pathIsInside(p, npm.cache)
- tar.pack(tgz, p, data, fancy, function (er) {
- if (er) {
- log.error( "addLocalDirectory", "Could not pack %j to %j"
- , p, tgz )
- return cb(er)
- }
-
- // if we don't get a cache stat, or if the gid/uid is not
- // a number, then just move on. chown would fail anyway.
- if (!cs || isNaN(cs.uid) || isNaN(cs.gid)) return cb()
-
- chownr(made || tgz, cs.uid, cs.gid, function (er) {
- if (er) return cb(er)
- addLocalTarball(tgz, name, version, shasum, cb)
- })
- })
- })
- })
- })
-}
-
-// XXX This is where it should be fixed
-// Right now it's unpacking to a "package" folder, and then
-// adding that local folder, for historical reasons.
-// Instead, unpack to the *cache* folder, and then copy the
-// tgz into place in the cache, so the shasum doesn't change.
-function addTmpTarball (tgz, name, version, shasum, cb) {
- // Just have a placeholder here so we can move it into place after.
- var tmp = false
- if (!version) {
- tmp = true
- version = 'tmp_' + crypto.randomBytes(6).toString('hex')
- }
- if (!name) {
- tmp = true
- name = 'tmp_' + crypto.randomBytes(6).toString('hex')
- }
- if (!tmp) {
- var pdir = path.resolve(npm.cache, name, version, "package")
- } else {
- var pdir = path.resolve(npm.cache, name + version + "package")
- }
-
- getCacheStat(function (er, cs) {
- if (er) return cb(er)
- tar.unpack(tgz, pdir, null, null, cs.uid, cs.gid, next)
- })
-
- function next (er) {
- if (er) return cb(er)
- // it MUST be able to get a version now!
- var pj = path.resolve(pdir, "package.json")
- readJson(pj, function (er, data) {
- if (er) return cb(er)
- if (version === data.version && name === data.name && !tmp) {
- addTmpTarball_(tgz, data, name, version, shasum, cb)
- } else {
- var old = pdir
- name = data.name
- version = data.version
- pdir = path.resolve(npm.cache, name, version, "package")
- mkdir(path.dirname(pdir), function(er) {
- if (er) return cb(er)
- rm(pdir, function(er) {
- if (er) return cb(er)
- fs.rename(old, pdir, function(er) {
- if (er) return cb(er)
- rm(old, function(er) {
- if (er) return cb(er)
- addTmpTarball_(tgz, data, name, version, shasum, cb)
- })
- })
- })
- })
- }
- })
- }
-}
-
-function addTmpTarball_ (tgz, data, name, version, shasum, cb) {
- cb = once(cb)
- var target = path.resolve(npm.cache, name, version, "package.tgz")
- var read = fs.createReadStream(tgz)
- var write = fs.createWriteStream(target)
- read.on("error", cb).pipe(write).on("error", cb).on("close", done)
-
- function done() {
- data._shasum = data._shasum || shasum
- cb(null, data)
}
}
@@ -1368,7 +281,7 @@ function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) {
if (typeof cb !== "function") cb = fMode, fMode = null
if (typeof cb !== "function") cb = dMode, dMode = null
- read(pkg, ver, false, function (er, data) {
+ read(pkg, ver, false, function (er) {
if (er) {
log.error("unpack", "Could not read data for %s", pkg + "@" + ver)
return cb(er)
@@ -1384,54 +297,44 @@ function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) {
})
}
-var deprecated = {}
- , deprWarned = {}
-function deprCheck (data) {
- if (deprecated[data._id]) data.deprecated = deprecated[data._id]
- if (data.deprecated) deprecated[data._id] = data.deprecated
- else return
- if (!deprWarned[data._id]) {
- deprWarned[data._id] = true
- log.warn("deprecated", "%s: %s", data._id, data.deprecated)
+function afterAdd (arg, cb) { return function (er, data) {
+ if (er || !data || !data.name || !data.version) {
+ return cb(er, data)
}
-}
-function lockFileName (u) {
- var c = u.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "")
- , h = crypto.createHash("sha1").update(u).digest("hex")
- h = h.substr(0, 8)
- c = c.substr(-32)
- log.silly("lockFile", h + "-" + c, u)
- return path.resolve(npm.config.get("cache"), h + "-" + c + ".lock")
-}
+ // Save the resolved, shasum, etc. into the data so that the next
+ // time we load from this cached data, we have all the same info.
+ var name = data.name
+ var ver = data.version
+ var pj = path.join(npm.cache, name, ver, "package", "package.json")
+ fs.writeFile(pj, JSON.stringify(data), "utf8", function (er) {
+ cb(er, data)
+ })
+}}
-var myLocks = {}
-function lock (u, cb) {
- // the cache dir needs to exist already for this.
- getCacheStat(function (er, cs) {
- if (er) return cb(er)
- var opts = { stale: npm.config.get("cache-lock-stale")
- , retries: npm.config.get("cache-lock-retries")
- , wait: npm.config.get("cache-lock-wait") }
- var lf = lockFileName(u)
- log.verbose("lock", u, lf)
- lockFile.lock(lf, opts, function(er) {
- if (!er) myLocks[lf] = true
- cb(er)
- })
+function maybeFile (spec, cb) {
+ // split name@2.3.4 only if name is a valid package name,
+ // don't split in case of "./test@example.com/" (local path)
+ fs.stat(spec, function (er) {
+ if (!er) {
+ // definitely a local thing
+ return addLocal(spec, {}, cb)
+ }
+
+ maybeAt(spec, cb)
})
}
-function unlock (u, cb) {
- var lf = lockFileName(u)
- , locked = myLocks[lf]
- if (locked === false) {
- return process.nextTick(cb)
- } else if (locked === true) {
- myLocks[lf] = false
- lockFile.unlock(lockFileName(u), cb)
+function maybeAt (spec, cb) {
+ if (spec.indexOf("@") !== -1) {
+ var tmp = spec.split("@")
+
+ var name = tmp.shift()
+ spec = tmp.join("@")
+ add([name, spec], cb)
} else {
- throw new Error("Attempt to unlock " + u + ", which hasn't been locked")
+ // already know it's not a url, so must be local
+ addLocal(spec, {}, cb)
}
}
diff --git a/deps/npm/lib/cache/add-local-tarball.js b/deps/npm/lib/cache/add-local-tarball.js
new file mode 100644
index 0000000000..bcb938fa97
--- /dev/null
+++ b/deps/npm/lib/cache/add-local-tarball.js
@@ -0,0 +1,223 @@
+var mkdir = require("mkdirp")
+ , assert = require("assert")
+ , fs = require("graceful-fs")
+ , readJson = require("read-package-json")
+ , log = require("npmlog")
+ , path = require("path")
+ , sha = require("sha")
+ , npm = require("../npm.js")
+ , tar = require("../utils/tar.js")
+ , pathIsInside = require("path-is-inside")
+ , locker = require("../utils/locker.js")
+ , lock = locker.lock
+ , unlock = locker.unlock
+ , getCacheStat = require("./get-stat.js")
+ , chownr = require("chownr")
+ , inflight = require("inflight")
+ , once = require("once")
+
+module.exports = addLocalTarball
+
+function addLocalTarball (p, pkgData, shasum, cb_) {
+ assert(typeof p === "string", "must have path")
+ assert(typeof cb_ === "function", "must have callback")
+
+ if (!pkgData) pkgData = {}
+ var name = pkgData.name || ""
+
+ // If we don't have a shasum yet, then get the shasum now.
+ if (!shasum) {
+ return sha.get(p, function (er, shasum) {
+ if (er) return cb_(er)
+ addLocalTarball(p, pkgData, shasum, cb_)
+ })
+ }
+
+ // if it's a tar, and not in place,
+ // then unzip to .tmp, add the tmp folder, and clean up tmp
+ if (pathIsInside(p, npm.tmp))
+ return addTmpTarball(p, pkgData, shasum, cb_)
+
+ if (pathIsInside(p, npm.cache)) {
+ if (path.basename(p) !== "package.tgz") return cb_(new Error(
+ "Not a valid cache tarball name: "+p))
+ return addPlacedTarball(p, pkgData, shasum, cb_)
+ }
+
+ function cb (er, data) {
+ if (data) {
+ data._resolved = p
+ data._shasum = data._shasum || shasum
+ }
+ return cb_(er, data)
+ }
+
+ // just copy it over and then add the temp tarball file.
+ var tmp = path.join(npm.tmp, name + Date.now()
+ + "-" + Math.random(), "tmp.tgz")
+ mkdir(path.dirname(tmp), function (er) {
+ if (er) return cb(er)
+ var from = fs.createReadStream(p)
+ , to = fs.createWriteStream(tmp)
+ , errState = null
+ function errHandler (er) {
+ if (errState) return
+ return cb(errState = er)
+ }
+ from.on("error", errHandler)
+ to.on("error", errHandler)
+ to.on("close", function () {
+ if (errState) return
+ log.verbose("chmod", tmp, npm.modes.file.toString(8))
+ fs.chmod(tmp, npm.modes.file, function (er) {
+ if (er) return cb(er)
+ addTmpTarball(tmp, pkgData, shasum, cb)
+ })
+ })
+ from.pipe(to)
+ })
+}
+
+function addPlacedTarball (p, pkgData, shasum, cb) {
+ assert(pkgData, "should have package data by now")
+ assert(typeof cb === "function", "cb function required")
+
+ getCacheStat(function (er, cs) {
+ if (er) return cb(er)
+ return addPlacedTarball_(p, pkgData, cs.uid, cs.gid, shasum, cb)
+ })
+}
+
+function addPlacedTarball_ (p, pkgData, uid, gid, resolvedSum, cb) {
+ // now we know it's in place already as .cache/name/ver/package.tgz
+ var name = pkgData.name
+ , version = pkgData.version
+ , folder = path.join(npm.cache, name, version, "package")
+
+ // First, make sure we have the shasum, if we don't already.
+ if (!resolvedSum) {
+ sha.get(p, function (er, shasum) {
+ if (er) return cb(er)
+ addPlacedTarball_(p, pkgData, uid, gid, shasum, cb)
+ })
+ return
+ }
+
+ lock(folder, function (er) {
+ if (er) return cb(er)
+
+ // async try/finally
+ var originalCb = cb
+ cb = function (er, data) {
+ unlock(folder, function (er2) {
+ return originalCb(er || er2, data)
+ })
+ }
+
+ mkdir(folder, function (er) {
+ if (er) return cb(er)
+ var pj = path.join(folder, "package.json")
+ var json = JSON.stringify(pkgData, null, 2)
+ fs.writeFile(pj, json, "utf8", function (er) {
+ cb(er, pkgData)
+ })
+ })
+ })
+}
+
+function addTmpTarball (tgz, pkgData, shasum, cb) {
+ assert(typeof cb === "function", "must have callback function")
+ assert(shasum, "should have shasum by now")
+
+ cb = inflight("addTmpTarball:" + tgz, cb)
+ if (!cb) return
+
+ // we already have the package info, so just move into place
+ if (pkgData && pkgData.name && pkgData.version) {
+ return addTmpTarball_(tgz, pkgData, shasum, cb)
+ }
+
+ // This is a tarball we probably downloaded from the internet.
+ // The shasum's already been checked, but we haven't ever had
+ // a peek inside, so we unpack it here just to make sure it is
+ // what it says it is.
+ // Note: we might not have any clue what we think it is, for
+ // example if the user just did `npm install ./foo.tgz`
+
+ var target = tgz + "-unpack"
+ getCacheStat(function (er, cs) {
+ tar.unpack(tgz, target, null, null, cs.uid, cs.gid, next)
+ })
+
+ function next (er) {
+ if (er) return cb(er)
+ var pj = path.join(target, "package.json")
+ readJson(pj, function (er, data) {
+ // XXX dry with similar stanza in add-local.js
+ er = needName(er, data)
+ er = needVersion(er, data)
+ // check that this is what we expected.
+ if (!er && pkgData.name && pkgData.name !== data.name) {
+ er = new Error( "Invalid Package: expected "
+ + pkgData.name + " but found "
+ + data.name )
+ }
+
+ if (!er && pkgData.version && pkgData.version !== data.version) {
+ er = new Error( "Invalid Package: expected "
+ + pkgData.name + "@" + pkgData.version
+ + " but found "
+ + data.name + "@" + data.version )
+ }
+
+ if (er) return cb(er)
+
+ addTmpTarball_(tgz, data, shasum, cb)
+ })
+ }
+}
+
+function addTmpTarball_ (tgz, data, shasum, cb) {
+ assert(typeof cb === "function", "must have callback function")
+ cb = once(cb)
+
+ var name = data.name
+ var version = data.version
+ assert(name, "should have package name by now")
+ assert(version, "should have package version by now")
+
+ var root = path.resolve(npm.cache, name, version)
+ var pkg = path.resolve(root, "package")
+ var target = path.resolve(root, "package.tgz")
+ getCacheStat(function (er, cs) {
+ if (er) return cb(er)
+ mkdir(pkg, function (er) {
+ if (er) return cb(er)
+ var read = fs.createReadStream(tgz)
+ var write = fs.createWriteStream(target)
+ var fin = cs.uid && cs.gid ? chown : done
+ read.on("error", cb).pipe(write).on("error", cb).on("close", fin)
+ })
+
+ function chown () {
+ chownr(root, cs.uid, cs.gid, done)
+ }
+ })
+
+ function done() {
+ data._shasum = data._shasum || shasum
+ cb(null, data)
+ }
+}
+
+function needName(er, data) {
+ return er ? er
+ : (data && !data.name) ? new Error("No name provided")
+ : null
+}
+
+function needVersion(er, data) {
+ return er ? er
+ : (data && !data.version) ? new Error("No version provided")
+ : null
+}
diff --git a/deps/npm/lib/cache/add-local.js b/deps/npm/lib/cache/add-local.js
new file mode 100644
index 0000000000..2a6d8cf884
--- /dev/null
+++ b/deps/npm/lib/cache/add-local.js
@@ -0,0 +1,146 @@
+var fs = require("graceful-fs")
+ , assert = require("assert")
+ , path = require("path")
+ , mkdir = require("mkdirp")
+ , chownr = require("chownr")
+ , pathIsInside = require("path-is-inside")
+ , readJson = require("read-package-json")
+ , log = require("npmlog")
+ , npm = require("../npm.js")
+ , tar = require("../utils/tar.js")
+ , deprCheck = require("../utils/depr-check.js")
+ , locker = require("../utils/locker.js")
+ , lock = locker.lock
+ , unlock = locker.unlock
+ , getCacheStat = require("./get-stat.js")
+ , addNamed = require("./add-named.js")
+ , addLocalTarball = require("./add-local-tarball.js")
+ , maybeGithub = require("./maybe-github.js")
+ , sha = require("sha")
+
+module.exports = addLocal
+
+function addLocal (p, pkgData, cb_) {
+ assert(typeof p === "string", "must have path")
+ assert(typeof cb === "function", "must have callback")
+
+ pkgData = pkgData || {}
+
+ function cb (er, data) {
+ unlock(p, function () {
+ if (er) {
+ // if it doesn't have a / in it, it might be a
+ // remote thing.
+ if (p.indexOf("/") === -1 && p.charAt(0) !== "."
+ && (process.platform !== "win32" || p.indexOf("\\") === -1)) {
+ return addNamed(p, "", null, cb_)
+ }
+ log.error("addLocal", "Could not install %s", p)
+ return cb_(er)
+ }
+ if (data && !data._fromGithub) data._from = p
+ return cb_(er, data)
+ })
+ }
+
+ lock(p, function (er) {
+ if (er) return cb(er)
+ // figure out if this is a folder or file.
+ fs.stat(p, function (er, s) {
+ if (er) {
+ // might be username/project
+ // in that case, try it as a github url.
+ if (p.split("/").length === 2) {
+ return maybeGithub(p, er, cb)
+ }
+ return cb(er)
+ }
+ if (s.isDirectory()) addLocalDirectory(p, pkgData, null, cb)
+ else addLocalTarball(p, pkgData, null, cb)
+ })
+ })
+}
+
+// At this point, if shasum is set, it's something that we've already
+// read and checked. Just stashing it in the data at this point.
+function addLocalDirectory (p, pkgData, shasum, cb) {
+ assert(pkgData, "must pass package data")
+ assert(typeof cb === "function", "must have callback")
+
+ // if it's a folder, then read the package.json,
+ // tar it to the proper place, and add the cache tar
+ if (pathIsInside(p, npm.cache)) return cb(new Error(
+ "Adding a cache directory to the cache will make the world implode."))
+
+ readJson(path.join(p, "package.json"), false, function (er, data) {
+ er = needName(er, data)
+ er = needVersion(er, data)
+
+ // check that this is what we expected.
+ if (!er && pkgData.name && pkgData.name !== data.name) {
+ er = new Error( "Invalid Package: expected "
+ + pkgData.name + " but found "
+ + data.name )
+ }
+
+ if (!er && pkgData.version && pkgData.version !== data.version) {
+ er = new Error( "Invalid Package: expected "
+ + pkgData.name + "@" + pkgData.version
+ + " but found "
+ + data.name + "@" + data.version )
+ }
+
+ if (er) return cb(er)
+ deprCheck(data)
+
+ // pack to {cache}/name/ver/package.tgz
+ var croot = path.resolve(npm.cache, data.name, data.version)
+ var tgz = path.resolve(croot, "package.tgz")
+ var pj = path.resolve(croot, "package/package.json")
+ getCacheStat(function (er, cs) {
+ mkdir(path.dirname(pj), function (er, made) {
+ if (er) return cb(er)
+ var fancy = !pathIsInside(p, npm.tmp)
+ tar.pack(tgz, p, data, fancy, function (er) {
+ if (er) {
+ log.error( "addLocalDirectory", "Could not pack %j to %j"
+ , p, tgz )
+ return cb(er)
+ }
+
+ if (!cs || isNaN(cs.uid) || isNaN(cs.gid)) next()
+
+ chownr(made || tgz, cs.uid, cs.gid, next)
+ })
+ })
+ })
+
+ function next (er) {
+ if (er) return cb(er)
+ // if we have the shasum already, just add it
+ if (shasum) {
+ return addLocalTarball(tgz, data, shasum, cb)
+ } else {
+ sha.get(tgz, function (er, shasum) {
+ if (er) {
+ return cb(er)
+ }
+ data._shasum = shasum
+ return addLocalTarball(tgz, data, shasum, cb)
+ })
+ }
+ }
+ })
+}
+
+function needName(er, data) {
+ return er ? er
+ : (data && !data.name) ? new Error("No name provided")
+ : null
+}
+
+function needVersion(er, data) {
+ return er ? er
+ : (data && !data.version) ? new Error("No version provided")
+ : null
+}
diff --git a/deps/npm/lib/cache/add-named.js b/deps/npm/lib/cache/add-named.js
new file mode 100644
index 0000000000..7684d01d0b
--- /dev/null
+++ b/deps/npm/lib/cache/add-named.js
@@ -0,0 +1,275 @@
+var path = require("path")
+ , assert = require("assert")
+ , fs = require("graceful-fs")
+ , http = require("http")
+ , log = require("npmlog")
+ , semver = require("semver")
+ , readJson = require("read-package-json")
+ , url = require("url")
+ , npm = require("../npm.js")
+ , registry = npm.registry
+ , deprCheck = require("../utils/depr-check.js")
+ , inflight = require("inflight")
+ , locker = require("../utils/locker.js")
+ , lock = locker.lock
+ , unlock = locker.unlock
+ , maybeGithub = require("./maybe-github.js")
+ , addRemoteTarball = require("./add-remote-tarball.js")
+
+
+module.exports = addNamed
+
+var NAME_PREFIX = "addName:"
+function addNamed (name, version, data, cb_) {
+ assert(typeof name === "string", "must have module name")
+ assert(typeof cb_ === "function", "must have callback")
+
+ log.verbose("addNamed", [name, version])
+
+ var key = name + "@" + version
+ function cb (er, data) {
+ if (data && !data._fromGithub) data._from = key
+ unlock(key, function () { cb_(er, data) })
+ }
+
+ cb_ = inflight(NAME_PREFIX + key, cb_)
+
+ if (!cb_) return
+
+ log.verbose("addNamed", [semver.valid(version), semver.validRange(version)])
+ lock(key, function (er) {
+ if (er) return cb(er)
+
+ var fn = ( semver.valid(version, true) ? addNameVersion
+ : semver.validRange(version, true) ? addNameRange
+ : addNameTag
+ )
+ fn(name, version, data, cb)
+ })
+}
+
+function addNameTag (name, tag, data, cb_) {
+ log.info("addNameTag", [name, tag])
+ var explicit = true
+ if (!tag) {
+ explicit = false
+ tag = npm.config.get("tag")
+ }
+
+ function cb(er, data) {
+ // might be username/project
+ // in that case, try it as a github url.
+ if (er && tag.split("/").length === 2) {
+ return maybeGithub(tag, er, cb_)
+ }
+ return cb_(er, data)
+ }
+
+ registry.get(name, function (er, data, json, resp) {
+ if (!er) {
+ er = errorResponse(name, resp)
+ }
+ if (er) return cb(er)
+ engineFilter(data)
+ if (data["dist-tags"] && data["dist-tags"][tag]
+ && data.versions[data["dist-tags"][tag]]) {
+ var ver = data["dist-tags"][tag]
+ return addNamed(name, ver, data.versions[ver], cb)
+ }
+ if (!explicit && Object.keys(data.versions).length) {
+ return addNamed(name, "*", data, cb)
+ }
+
+ er = installTargetsError(tag, data)
+ return cb(er)
+ })
+}
+
+function engineFilter (data) {
+ var npmv = npm.version
+ , nodev = npm.config.get("node-version")
+ , strict = npm.config.get("engine-strict")
+
+ if (!nodev || npm.config.get("force")) return data
+
+ Object.keys(data.versions || {}).forEach(function (v) {
+ var eng = data.versions[v].engines
+ if (!eng) return
+ if (!strict && !data.versions[v].engineStrict) return
+ if (eng.node && !semver.satisfies(nodev, eng.node, true)
+ || eng.npm && !semver.satisfies(npmv, eng.npm, true)) {
+ delete data.versions[v]
+ }
+ })
+}
+
+function addNameVersion (name, v, data, cb) {
+ var ver = semver.valid(v, true)
+ if (!ver) return cb(new Error("Invalid version: "+v))
+
+ var response
+
+ if (data) {
+ response = null
+ return next()
+ }
+ registry.get(name, function (er, d, json, resp) {
+ if (!er) {
+ er = errorResponse(name, resp)
+ }
+ if (er) return cb(er)
+ data = d && d.versions[ver]
+ if (!data) {
+ er = new Error('version not found: ' + name + '@' + ver)
+ er.package = name
+ er.statusCode = 404
+ return cb(er)
+ }
+ response = resp
+ next()
+ })
+
+ function next () {
+ deprCheck(data)
+ var dist = data.dist
+
+ if (!dist) return cb(new Error("No dist in "+data._id+" package"))
+
+ if (!dist.tarball) return cb(new Error(
+ "No dist.tarball in " + data._id + " package"))
+
+ if ((response && response.statusCode !== 304) || npm.config.get("force")) {
+ return fetchit()
+ }
+
+ // we got cached data, so let's see if we have a tarball.
+ var pkgroot = path.join(npm.cache, name, ver)
+ var pkgtgz = path.join(pkgroot, "package.tgz")
+ var pkgjson = path.join(pkgroot, "package", "package.json")
+ fs.stat(pkgtgz, function (er) {
+ if (!er) {
+ readJson(pkgjson, function (er, data) {
+ er = needName(er, data)
+ er = needVersion(er, data)
+ if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR")
+ return cb(er)
+ if (er) return fetchit()
+ return cb(null, data)
+ })
+ } else return fetchit()
+ })
+
+ function fetchit () {
+ if (!npm.config.get("registry")) {
+ return cb(new Error("Cannot fetch: "+dist.tarball))
+ }
+
+ // use the same protocol as the registry.
+ // https registry --> https tarballs, but
+ // only if they're the same hostname, or else
+ // detached tarballs may not work.
+ var tb = url.parse(dist.tarball)
+ var rp = url.parse(npm.config.get("registry"))
+ if (tb.hostname === rp.hostname
+ && tb.protocol !== rp.protocol) {
+ tb.protocol = url.parse(npm.config.get("registry")).protocol
+ delete tb.href
+ }
+ tb = url.format(tb)
+
+ // only add non-shasum'ed packages if --forced.
+ // only ancient things would lack this for good reasons nowadays.
+ if (!dist.shasum && !npm.config.get("force")) {
+ return cb(new Error("package lacks shasum: " + data._id))
+ }
+ return addRemoteTarball(tb, data, dist.shasum, cb)
+ }
+ }
+}
+
+function addNameRange (name, range, data, cb) {
+ range = semver.validRange(range, true)
+ if (range === null) return cb(new Error(
+ "Invalid version range: "+range))
+
+ log.silly("addNameRange", {name:name, range:range, hasData:!!data})
+
+ if (data) return next()
+ registry.get(name, function (er, d, json, resp) {
+ if (!er) {
+ er = errorResponse(name, resp)
+ }
+ if (er) return cb(er)
+ data = d
+ next()
+ })
+
+ function next () {
+ log.silly( "addNameRange", "number 2"
+ , {name:name, range:range, hasData:!!data})
+ engineFilter(data)
+
+ log.silly("addNameRange", "versions"
+ , [data.name, Object.keys(data.versions || {})])
+
+ // if the tagged version satisfies, then use that.
+ var tagged = data["dist-tags"][npm.config.get("tag")]
+ if (tagged
+ && data.versions[tagged]
+ && semver.satisfies(tagged, range, true)) {
+ return addNamed(name, tagged, data.versions[tagged], cb)
+ }
+
+ // find the max satisfying version.
+ var versions = Object.keys(data.versions || {})
+ var ms = semver.maxSatisfying(versions, range, true)
+ if (!ms) {
+ return cb(installTargetsError(range, data))
+ }
+
+ // if we don't have a registry connection, try to see if
+ // there's a cached copy that will be ok.
+ addNamed(name, ms, data.versions[ms], cb)
+ }
+}
+
+function installTargetsError (requested, data) {
+ var targets = Object.keys(data["dist-tags"]).filter(function (f) {
+ return (data.versions || {}).hasOwnProperty(f)
+ }).concat(Object.keys(data.versions || {}))
+
+ requested = data.name + (requested ? "@'" + requested + "'" : "")
+
+ targets = targets.length
+ ? "Valid install targets:\n" + JSON.stringify(targets) + "\n"
+ : "No valid targets found.\n"
+ + "Perhaps not compatible with your version of node?"
+
+ var er = new Error( "No compatible version found: "
+ + requested + "\n" + targets)
+ er.code = "ETARGET"
+ return er
+}
+
+function errorResponse (name, response) {
+ var er
+ if (response.statusCode >= 400) {
+ er = new Error(http.STATUS_CODES[response.statusCode])
+ er.statusCode = response.statusCode
+ er.code = "E" + er.statusCode
+ er.pkgid = name
+ }
+ return er
+}
+
+function needName(er, data) {
+ return er ? er
+ : (data && !data.name) ? new Error("No name provided")
+ : null
+}
+
+function needVersion(er, data) {
+ return er ? er
+ : (data && !data.version) ? new Error("No version provided")
+ : null
+}
diff --git a/deps/npm/lib/cache/add-remote-git.js b/deps/npm/lib/cache/add-remote-git.js
new file mode 100644
index 0000000000..2168d189fd
--- /dev/null
+++ b/deps/npm/lib/cache/add-remote-git.js
@@ -0,0 +1,285 @@
+var mkdir = require("mkdirp")
+ , assert = require("assert")
+ , spawn = require("child_process").spawn
+ , exec = require("child_process").execFile
+ , once = require("once")
+ , fs = require("graceful-fs")
+ , log = require("npmlog")
+ , path = require("path")
+ , url = require("url")
+ , chownr = require("chownr")
+ , zlib = require("zlib")
+ , which = require("which")
+ , crypto = require("crypto")
+ , chmodr = require("chmodr")
+ , npm = require("../npm.js")
+ , rm = require("../utils/gently-rm.js")
+ , inflight = require("inflight")
+ , locker = require("../utils/locker.js")
+ , lock = locker.lock
+ , unlock = locker.unlock
+ , getCacheStat = require("./get-stat.js")
+ , addLocalTarball = require("./add-local-tarball.js")
+
+
+// 1. cacheDir = path.join(cache,'_git-remotes',sha1(u))
+// 2. checkGitDir(cacheDir) ? 4. : 3. (rm cacheDir if necessary)
+// 3. git clone --mirror u cacheDir
+// 4. cd cacheDir && git fetch -a origin
+// 5. git archive /tmp/random.tgz
+// 6. addLocalTarball(/tmp/random.tgz) <gitref> --format=tar --prefix=package/
+// silent flag is used if this should error quietly
+module.exports = function addRemoteGit (u, parsed, silent, cb_) {
+ assert(typeof u === "string", "must have git URL")
+ assert(typeof parsed === "object", "must have parsed query")
+ assert(typeof cb_ === "function", "must have callback")
+
+ function cb (er, data) {
+ unlock(u, function () { cb_(er, data) })
+ }
+
+ cb_ = inflight(u, cb_)
+
+ if (!cb_) return
+
+ // git is so tricky!
+ // if the path is like ssh://foo:22/some/path then it works, but
+ // it needs the ssh://
+ // If the path is like ssh://foo:some/path then it works, but
+ // only if you remove the ssh://
+ var origUrl = u
+ u = u.replace(/^git\+/, "")
+ .replace(/#.*$/, "")
+
+ // ssh paths that are scp-style urls don't need the ssh://
+ if (parsed.pathname.match(/^\/?:/)) {
+ u = u.replace(/^ssh:\/\//, "")
+ }
+
+ lock(u, function (er) {
+ if (er) return cb(er)
+
+ // figure out what we should check out.
+ var co = parsed.hash && parsed.hash.substr(1) || "master"
+
+ var v = crypto.createHash("sha1").update(u).digest("hex").slice(0, 8)
+ v = u.replace(/[^a-zA-Z0-9]+/g, '-') + '-' + v
+
+ log.verbose("addRemoteGit", [u, co])
+
+ var p = path.join(npm.config.get("cache"), "_git-remotes", v)
+
+ checkGitDir(p, u, co, origUrl, silent, function(er, data) {
+ chmodr(p, npm.modes.file, function(erChmod) {
+ if (er) return cb(er, data)
+ return cb(erChmod, data)
+ })
+ })
+ })
+}
+
+function checkGitDir (p, u, co, origUrl, silent, cb) {
+ fs.stat(p, function (er, s) {
+ if (er) return cloneGitRemote(p, u, co, origUrl, silent, cb)
+ if (!s.isDirectory()) return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+
+ var git = npm.config.get("git")
+ var args = [ "config", "--get", "remote.origin.url" ]
+ var env = gitEnv()
+
+ // check for git
+ which(git, function (err) {
+ if (err) {
+ err.code = "ENOGIT"
+ return cb(err)
+ }
+ exec(git, args, {cwd: p, env: env}, function (er, stdout, stderr) {
+ var stdoutTrimmed = (stdout + "\n" + stderr).trim()
+ if (er || u !== stdout.trim()) {
+ log.warn( "`git config --get remote.origin.url` returned "
+ + "wrong result ("+u+")", stdoutTrimmed )
+ return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+ }
+ log.verbose("git remote.origin.url", stdoutTrimmed)
+ archiveGitRemote(p, u, co, origUrl, cb)
+ })
+ })
+ })
+}
+
+function checkGitDir (p, u, co, origUrl, silent, cb) {
+ fs.stat(p, function (er, s) {
+ if (er) return cloneGitRemote(p, u, co, origUrl, silent, cb)
+ if (!s.isDirectory()) return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+
+ var git = npm.config.get("git")
+ var args = [ "config", "--get", "remote.origin.url" ]
+ var env = gitEnv()
+
+ // check for git
+ which(git, function (err) {
+ if (err) {
+ err.code = "ENOGIT"
+ return cb(err)
+ }
+ exec(git, args, {cwd: p, env: env}, function (er, stdout, stderr) {
+ var stdoutTrimmed = (stdout + "\n" + stderr).trim()
+ if (er || u !== stdout.trim()) {
+ log.warn( "`git config --get remote.origin.url` returned "
+ + "wrong result ("+u+")", stdoutTrimmed )
+ return rm(p, function (er){
+ if (er) return cb(er)
+ cloneGitRemote(p, u, co, origUrl, silent, cb)
+ })
+ }
+ log.verbose("git remote.origin.url", stdoutTrimmed)
+ archiveGitRemote(p, u, co, origUrl, cb)
+ })
+ })
+ })
+}
+
+function cloneGitRemote (p, u, co, origUrl, silent, cb) {
+ mkdir(p, function (er) {
+ if (er) return cb(er)
+
+ var git = npm.config.get("git")
+ var args = [ "clone", "--mirror", u, p ]
+ var env = gitEnv()
+
+ // check for git
+ which(git, function (err) {
+ if (err) {
+ err.code = "ENOGIT"
+ return cb(err)
+ }
+ exec(git, args, {cwd: p, env: env}, function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ if (silent) {
+ log.verbose("git clone " + u, stdout)
+ } else {
+ log.error("git clone " + u, stdout)
+ }
+ return cb(er)
+ }
+ log.verbose("git clone " + u, stdout)
+ archiveGitRemote(p, u, co, origUrl, cb)
+ })
+ })
+ })
+}
+
+function archiveGitRemote (p, u, co, origUrl, cb) {
+ var git = npm.config.get("git")
+ var archive = [ "fetch", "-a", "origin" ]
+ var resolve = [ "rev-list", "-n1", co ]
+ var env = gitEnv()
+
+ var resolved = null
+ var tmp
+
+ exec(git, archive, {cwd: p, env: env}, function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("git fetch -a origin ("+u+")", stdout)
+ return cb(er)
+ }
+ log.verbose("git fetch -a origin ("+u+")", stdout)
+ tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz")
+ verifyOwnership()
+ })
+
+ function verifyOwnership() {
+ if (process.platform === "win32") {
+ log.silly("verifyOwnership", "skipping for windows")
+ resolveHead()
+ } else {
+ getCacheStat(function(er, cs) {
+ if (er) {
+ log.error("Could not get cache stat")
+ return cb(er)
+ }
+ chownr(p, cs.uid, cs.gid, function(er) {
+ if (er) {
+ log.error("Failed to change folder ownership under npm cache for %s", p)
+ return cb(er)
+ }
+ resolveHead()
+ })
+ })
+ }
+ }
+
+ function resolveHead () {
+ exec(git, resolve, {cwd: p, env: env}, function (er, stdout, stderr) {
+ stdout = (stdout + "\n" + stderr).trim()
+ if (er) {
+ log.error("Failed resolving git HEAD (" + u + ")", stderr)
+ return cb(er)
+ }
+ log.verbose("git rev-list -n1 " + co, stdout)
+ var parsed = url.parse(origUrl)
+ parsed.hash = stdout
+ resolved = url.format(parsed)
+
+ // https://github.com/npm/npm/issues/3224
+ // node incorrectly sticks a / at the start of the path
+ // We know that the host won't change, so split and detect this
+ var spo = origUrl.split(parsed.host)
+ var spr = resolved.split(parsed.host)
+ if (spo[1].charAt(0) === ':' && spr[1].charAt(0) === '/')
+ spr[1] = spr[1].slice(1)
+ resolved = spr.join(parsed.host)
+
+ log.verbose('resolved git url', resolved)
+ next()
+ })
+ }
+
+ function next () {
+ mkdir(path.dirname(tmp), function (er) {
+ if (er) return cb(er)
+ var gzip = zlib.createGzip({ level: 9 })
+ var git = npm.config.get("git")
+ var args = ["archive", co, "--format=tar", "--prefix=package/"]
+ var out = fs.createWriteStream(tmp)
+ var env = gitEnv()
+ cb = once(cb)
+ var cp = spawn(git, args, { env: env, cwd: p })
+ cp.on("error", cb)
+ cp.stderr.on("data", function(chunk) {
+ log.silly(chunk.toString(), "git archive")
+ })
+
+ cp.stdout.pipe(gzip).pipe(out).on("close", function() {
+ addLocalTarball(tmp, null, null, function(er, data) {
+ if (data) data._resolved = resolved
+ cb(er, data)
+ })
+ })
+ })
+ }
+}
+
+var gitEnv_
+function gitEnv () {
+ // git responds to env vars in some weird ways in post-receive hooks
+ // so don't carry those along.
+ if (gitEnv_) return gitEnv_
+ gitEnv_ = {}
+ for (var k in process.env) {
+ if (!~['GIT_PROXY_COMMAND','GIT_SSH','GIT_SSL_NO_VERIFY'].indexOf(k) && k.match(/^GIT/)) continue
+ gitEnv_[k] = process.env[k]
+ }
+ return gitEnv_
+}
diff --git a/deps/npm/lib/cache/add-remote-tarball.js b/deps/npm/lib/cache/add-remote-tarball.js
new file mode 100644
index 0000000000..db9a05d825
--- /dev/null
+++ b/deps/npm/lib/cache/add-remote-tarball.js
@@ -0,0 +1,106 @@
+var mkdir = require("mkdirp")
+ , assert = require("assert")
+ , log = require("npmlog")
+ , path = require("path")
+ , sha = require("sha")
+ , retry = require("retry")
+ , npm = require("../npm.js")
+ , fetch = require("../utils/fetch.js")
+ , inflight = require("inflight")
+ , locker = require("../utils/locker.js")
+ , lock = locker.lock
+ , unlock = locker.unlock
+ , addLocalTarball = require("./add-local-tarball.js")
+ , cacheFile = require("npm-cache-filename")
+
+module.exports = addRemoteTarball
+
+function addRemoteTarball (u, pkgData, shasum, cb_) {
+ assert(typeof u === "string", "must have module URL")
+ assert(typeof cb_ === "function", "must have callback")
+
+ function cb (er, data) {
+ if (data) {
+ data._from = u
+ data._shasum = data._shasum || shasum
+ data._resolved = u
+ }
+ unlock(u, function () {
+ cb_(er, data)
+ })
+ }
+
+ cb_ = inflight(u, cb_)
+
+ if (!cb_) return
+
+ // XXX Fetch direct to cache location, store tarballs under
+ // ${cache}/registry.npmjs.org/pkg/-/pkg-1.2.3.tgz
+ var tmp = cacheFile(npm.tmp, u)
+
+ function next (er, resp, shasum) {
+ if (er) return cb(er)
+ addLocalTarball(tmp, pkgData, shasum, cb)
+ }
+
+ lock(u, function (er) {
+ if (er) return cb(er)
+
+ log.verbose("addRemoteTarball", [u, shasum])
+ mkdir(path.dirname(tmp), function (er) {
+ if (er) return cb(er)
+ addRemoteTarball_(u, tmp, shasum, next)
+ })
+ })
+}
+
+function addRemoteTarball_(u, tmp, shasum, cb) {
+ // Tuned to spread 3 attempts over about a minute.
+ // See formula at <https://github.com/tim-kos/node-retry>.
+ var operation = retry.operation
+ ( { retries: npm.config.get("fetch-retries")
+ , factor: npm.config.get("fetch-retry-factor")
+ , minTimeout: npm.config.get("fetch-retry-mintimeout")
+ , maxTimeout: npm.config.get("fetch-retry-maxtimeout") })
+
+ operation.attempt(function (currentAttempt) {
+ log.info("retry", "fetch attempt " + currentAttempt
+ + " at " + (new Date()).toLocaleTimeString())
+ fetchAndShaCheck(u, tmp, shasum, function (er, response, shasum) {
+ // Only retry on 408, 5xx or no `response`.
+ var sc = response && response.statusCode
+ var statusRetry = !sc || (sc === 408 || sc >= 500)
+ if (er && statusRetry && operation.retry(er)) {
+ log.info("retry", "will retry, error on last attempt: " + er)
+ return
+ }
+ cb(er, response, shasum)
+ })
+ })
+}
+
+function fetchAndShaCheck (u, tmp, shasum, cb) {
+ fetch(u, tmp, function (er, response) {
+ if (er) {
+ log.error("fetch failed", u)
+ return cb(er, response)
+ }
+
+ if (!shasum) {
+ // Well, we weren't given a shasum, so at least sha what we have
+ // in case we want to compare it to something else later
+ return sha.get(tmp, function (er, shasum) {
+ cb(er, response, shasum)
+ })
+ }
+
+ // validate that the url we just downloaded matches the expected shasum.
+ sha.check(tmp, shasum, function (er) {
+ if (er && er.message) {
+ // add original filename for better debuggability
+ er.message = er.message + '\n' + 'From: ' + u
+ }
+ return cb(er, response, shasum)
+ })
+ })
+}
diff --git a/deps/npm/lib/cache/get-stat.js b/deps/npm/lib/cache/get-stat.js
new file mode 100644
index 0000000000..913f5af851
--- /dev/null
+++ b/deps/npm/lib/cache/get-stat.js
@@ -0,0 +1,63 @@
+var mkdir = require("mkdirp")
+ , fs = require("graceful-fs")
+ , log = require("npmlog")
+ , chownr = require("chownr")
+ , npm = require("../npm.js")
+ , inflight = require("inflight")
+
+// to maintain the cache dir's permissions consistently.
+var cacheStat = null
+module.exports = function getCacheStat (cb) {
+ if (cacheStat) return cb(null, cacheStat)
+
+ cb = inflight("getCacheStat", cb)
+ if (!cb) return
+
+ fs.stat(npm.cache, function (er, st) {
+ if (er) return makeCacheDir(cb)
+ if (!st.isDirectory()) {
+ log.error("getCacheStat", "invalid cache dir %j", npm.cache)
+ return cb(er)
+ }
+ return cb(null, cacheStat = st)
+ })
+}
+
+function makeCacheDir (cb) {
+ if (!process.getuid) return mkdir(npm.cache, cb)
+
+ var uid = +process.getuid()
+ , gid = +process.getgid()
+
+ if (uid === 0) {
+ if (process.env.SUDO_UID) uid = +process.env.SUDO_UID
+ if (process.env.SUDO_GID) gid = +process.env.SUDO_GID
+ }
+ if (uid !== 0 || !process.env.HOME) {
+ cacheStat = {uid: uid, gid: gid}
+ return mkdir(npm.cache, afterMkdir)
+ }
+
+ fs.stat(process.env.HOME, function (er, st) {
+ if (er) {
+ log.error("makeCacheDir", "homeless?")
+ return cb(er)
+ }
+ cacheStat = st
+ log.silly("makeCacheDir", "cache dir uid, gid", [st.uid, st.gid])
+ return mkdir(npm.cache, afterMkdir)
+ })
+
+ function afterMkdir (er, made) {
+ if (er || !cacheStat || isNaN(cacheStat.uid) || isNaN(cacheStat.gid)) {
+ return cb(er, cacheStat)
+ }
+
+ if (!made) return cb(er, cacheStat)
+
+ // ensure that the ownership is correct.
+ chownr(made, cacheStat.uid, cacheStat.gid, function (er) {
+ return cb(er, cacheStat)
+ })
+ }
+}
diff --git a/deps/npm/lib/cache/maybe-github.js b/deps/npm/lib/cache/maybe-github.js
new file mode 100644
index 0000000000..fee64c5dfd
--- /dev/null
+++ b/deps/npm/lib/cache/maybe-github.js
@@ -0,0 +1,35 @@
+var url = require("url")
+ , assert = require("assert")
+ , log = require("npmlog")
+ , addRemoteGit = require("./add-remote-git.js")
+
+module.exports = function maybeGithub (p, er, cb) {
+ assert(typeof p === "string", "must pass package name")
+ assert(er instanceof Error, "must include error")
+ assert(typeof cb === "function", "must pass callback")
+
+ var u = "git://github.com/" + p
+ , up = url.parse(u)
+ log.info("maybeGithub", "Attempting %s from %s", p, u)
+
+ return addRemoteGit(u, up, true, function (er2, data) {
+ if (er2) {
+ var upriv = "git+ssh://git@github.com:" + p
+ , uppriv = url.parse(upriv)
+
+ log.info("maybeGithub", "Attempting %s from %s", p, upriv)
+
+ return addRemoteGit(upriv, uppriv, false, function (er3, data) {
+ if (er3) return cb(er)
+ success(upriv, data)
+ })
+ }
+ success(u, data)
+ })
+
+ function success (u, data) {
+ data._from = u
+ data._fromGithub = true
+ return cb(null, data)
+ }
+}
diff --git a/deps/npm/lib/explore.js b/deps/npm/lib/explore.js
index 8b55115e0e..767d9a876a 100644
--- a/deps/npm/lib/explore.js
+++ b/deps/npm/lib/explore.js
@@ -26,6 +26,7 @@ function explore (args, cb) {
"\nExploring "+cwd+"\n"+
"Type 'exit' or ^D when finished\n")
+ npm.spinner.stop()
var shell = spawn(sh, args, { cwd: cwd, customFds: [0, 1, 2] })
shell.on("close", function (er) {
// only fail if non-interactive.
diff --git a/deps/npm/lib/help.js b/deps/npm/lib/help.js
index 72b4393b6a..c68f322abf 100644
--- a/deps/npm/lib/help.js
+++ b/deps/npm/lib/help.js
@@ -15,6 +15,7 @@ var fs = require("graceful-fs")
, glob = require("glob")
function help (args, cb) {
+ npm.spinner.stop()
var argv = npm.config.get("argv").cooked
var argnum = 0
diff --git a/deps/npm/lib/init.js b/deps/npm/lib/init.js
index d064ae8bcc..8ae991f5b6 100644
--- a/deps/npm/lib/init.js
+++ b/deps/npm/lib/init.js
@@ -12,6 +12,7 @@ init.usage = "npm init"
function init (args, cb) {
var dir = process.cwd()
log.pause()
+ npm.spinner.stop()
var initFile = npm.config.get('init-module')
console.log(
@@ -31,6 +32,10 @@ function init (args, cb) {
log.resume()
log.silly('package data', data)
log.info('init', 'written successfully')
+ if (er && er.message === 'canceled') {
+ log.warn('init', 'canceled')
+ return cb(null, data)
+ }
cb(er, data)
})
}
diff --git a/deps/npm/lib/install.js b/deps/npm/lib/install.js
index 3e319fa673..5cf974ea7f 100644
--- a/deps/npm/lib/install.js
+++ b/deps/npm/lib/install.js
@@ -391,6 +391,7 @@ function save (where, installed, tree, pretty, hasArguments, cb) {
if (saveBundle) {
var i = bundle.indexOf(t)
if (i === -1) bundle.push(t)
+ data.bundleDependencies = bundle.sort()
}
})
@@ -709,7 +710,7 @@ function targetResolver (where, context, deps) {
// already has a matching copy.
// If it's not a git repo, and the parent already has that pkg, then
// we can skip installing it again.
- cache.add(what, function (er, data) {
+ cache.add(what, null, false, function (er, data) {
if (er && parent && parent.optionalDependencies &&
parent.optionalDependencies.hasOwnProperty(what.split("@")[0])) {
log.warn("optional dep failed, continuing", what)
diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js
index efe503b626..12e4d2edcc 100644
--- a/deps/npm/lib/ls.js
+++ b/deps/npm/lib/ls.js
@@ -128,8 +128,7 @@ function getLite (data, noname) {
var dep = data.dependencies[d]
if (typeof dep === "string") {
lite.problems = lite.problems || []
- var p
- if (data.depth >= maxDepth) {
+ if (data.depth > maxDepth) {
p = "max depth reached: "
} else {
p = "missing: "
@@ -223,14 +222,14 @@ function makeArchy (data, long, dir) {
function makeArchy_ (data, long, dir, depth, parent, d) {
var color = npm.color
if (typeof data === "string") {
- if (depth < npm.config.get("depth")) {
+ if (depth -1 <= npm.config.get("depth")) {
// just missing
var p = parent.link || parent.path
var unmet = "UNMET DEPENDENCY"
if (color) {
unmet = "\033[31;40m" + unmet + "\033[0m"
}
- data = unmet + " " + d + " " + data
+ data = unmet + " " + d + "@" + data
} else {
data = d+"@"+ data
}
diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js
index 613bf0095a..c0c744f99b 100644
--- a/deps/npm/lib/npm.js
+++ b/deps/npm/lib/npm.js
@@ -24,12 +24,8 @@ var EventEmitter = require("events").EventEmitter
, abbrev = require("abbrev")
, which = require("which")
, semver = require("semver")
- , findPrefix = require("./utils/find-prefix.js")
- , getUid = require("uid-number")
- , mkdirp = require("mkdirp")
- , slide = require("slide")
- , chain = slide.chain
, RegClient = require("npm-registry-client")
+ , charSpin = require("char-spinner")
npm.config = {
loaded: false,
@@ -41,23 +37,6 @@ npm.config = {
}
}
-// /usr/local is often a read-only fs, which is not
-// well handled by node or mkdirp. Just double-check
-// in the case of errors when making the prefix dirs.
-function mkdir (p, cb) {
- mkdirp(p, function (er, made) {
- // it could be that we couldn't create it, because it
- // already exists, and is on a read-only fs.
- if (er) {
- return fs.stat(p, function (er2, st) {
- if (er2 || !st.isDirectory()) return cb(er)
- return cb(null, made)
- })
- }
- return cb(er, made)
- })
-}
-
npm.commands = {}
try {
@@ -182,6 +161,22 @@ var commandCache = {}
})
, abbrevs = abbrev(fullList)
+npm.spinner =
+ { int: null
+ , start: function () {
+ if (npm.spinner.int) return
+ var c = npm.config.get("spin")
+ if (!c) return
+ var stream = npm.config.get("logstream")
+ var opt = { tty: c !== "always", stream: stream }
+ npm.spinner.int = charSpin(opt)
+ }
+ , stop: function () {
+ clearInterval(npm.spinner.int)
+ npm.spinner.int = null
+ }
+ }
+
Object.keys(abbrevs).concat(plumbing).forEach(function addCommand (c) {
Object.defineProperty(npm.commands, c, { get : function () {
if (!loaded) throw new Error(
@@ -204,6 +199,9 @@ Object.keys(abbrevs).concat(plumbing).forEach(function addCommand (c) {
}
if (args.length === 1) args.unshift([])
+ npm.spinner.start()
+
+ npm.registry.version = npm.version
if (!npm.registry.refer) {
npm.registry.refer = [a].concat(args[0]).map(function (arg) {
// exclude anything that might be a URL, path, or private module
@@ -350,118 +348,24 @@ function load (npm, cli, cb) {
// at this point the configs are all set.
// go ahead and spin up the registry client.
- var token = config.get("_token")
- if (typeof token === "string") {
- try {
- token = JSON.parse(token)
- config.set("_token", token, "user")
- config.save("user")
- } catch (e) { token = null }
- }
-
npm.registry = new RegClient(npm.config)
- // save the token cookie in the config file
- if (npm.registry.couchLogin) {
- npm.registry.couchLogin.tokenSet = function (tok) {
- npm.config.set("_token", tok, "user")
- // ignore save error. best effort.
- npm.config.save("user")
- }
- }
-
var umask = npm.config.get("umask")
npm.modes = { exec: 0777 & (~umask)
, file: 0666 & (~umask)
, umask: umask }
- chain([ [ loadPrefix, npm, cli ]
- , [ setUser, config, config.root ]
- , [ loadUid, npm ]
- ], cb)
- })
- })
-}
+ var gp = Object.getOwnPropertyDescriptor(config, "globalPrefix")
+ Object.defineProperty(npm, "globalPrefix", gp)
-function loadPrefix (npm, config, cb) {
- // try to guess at a good node_modules location.
- var p
- , gp
- if (!Object.prototype.hasOwnProperty.call(config, "prefix")) {
- p = process.cwd()
- } else {
- p = npm.config.get("prefix")
- }
- gp = npm.config.get("prefix")
-
- findPrefix(p, function (er, p) {
- Object.defineProperty(npm, "localPrefix",
- { get : function () { return p }
- , set : function (r) { return p = r }
- , enumerable : true
- })
- // the prefix MUST exist, or else nothing works.
- if (!npm.config.get("global")) {
- mkdir(p, next)
- } else {
- next(er)
- }
- })
-
- gp = path.resolve(gp)
- Object.defineProperty(npm, "globalPrefix",
- { get : function () { return gp }
- , set : function (r) { return gp = r }
- , enumerable : true
- })
- // the prefix MUST exist, or else nothing works.
- mkdir(gp, next)
-
-
- var i = 2
- , errState = null
- function next (er) {
- if (errState) return
- if (er) return cb(errState = er)
- if (--i === 0) return cb()
- }
-}
+ var lp = Object.getOwnPropertyDescriptor(config, "localPrefix")
+ Object.defineProperty(npm, "localPrefix", lp)
-
-function loadUid (npm, cb) {
- // if we're not in unsafe-perm mode, then figure out who
- // to run stuff as. Do this first, to support `npm update npm -g`
- if (!npm.config.get("unsafe-perm")) {
- getUid(npm.config.get("user"), npm.config.get("group"), cb)
- } else {
- process.nextTick(cb)
- }
-}
-
-function setUser (cl, dc, cb) {
- // If global, leave it as-is.
- // If not global, then set the user to the owner of the prefix folder.
- // Just set the default, so it can be overridden.
- if (cl.get("global")) return cb()
- if (process.env.SUDO_UID) {
- dc.user = +(process.env.SUDO_UID)
- return cb()
- }
-
- var prefix = path.resolve(cl.get("prefix"))
- mkdir(prefix, function (er) {
- if (er) {
- log.error("could not create prefix dir", prefix)
- return cb(er)
- }
- fs.stat(prefix, function (er, st) {
- dc.user = st && st.uid
- return cb(er)
+ return cb()
})
})
}
-
Object.defineProperty(npm, "prefix",
{ get : function () {
return npm.config.get("global") ? npm.globalPrefix : npm.localPrefix
diff --git a/deps/npm/lib/outdated.js b/deps/npm/lib/outdated.js
index 6ca348726e..ef406fbdc5 100644
--- a/deps/npm/lib/outdated.js
+++ b/deps/npm/lib/outdated.js
@@ -155,12 +155,33 @@ function outdated_ (args, dir, parentHas, depth, cb) {
}
var deps = null
readJson(path.resolve(dir, "package.json"), function (er, d) {
+ d = d || {}
if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er)
deps = (er) ? true : (d.dependencies || {})
+
+ if (npm.config.get("save-dev")) {
+ deps = d.devDependencies || {}
+ return next()
+ }
+
+ if (npm.config.get("save")) {
+ // remove optional dependencies from dependencies during --save.
+ Object.keys(d.optionalDependencies || {}).forEach(function (k) {
+ delete deps[k]
+ })
+ return next()
+ }
+
+ if (npm.config.get("save-optional")) {
+ deps = d.optionalDependencies || {}
+ return next()
+ }
+
var doUpdate = npm.config.get("dev") ||
(!npm.config.get("production") &&
!Object.keys(parentHas).length &&
!npm.config.get("global"))
+
if (!er && d && doUpdate) {
Object.keys(d.devDependencies || {}).forEach(function (k) {
if (!(k in parentHas)) {
@@ -273,7 +294,7 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
}
// We didn't find the version in the doc. See if cache can find it.
- cache.add(dep, req, onCacheAdd)
+ cache.add(dep, req, false, onCacheAdd)
function onCacheAdd(er, d) {
// if this fails, then it means we can't update this thing.
diff --git a/deps/npm/lib/pack.js b/deps/npm/lib/pack.js
index 302aa81f25..ea94dd1542 100644
--- a/deps/npm/lib/pack.js
+++ b/deps/npm/lib/pack.js
@@ -40,7 +40,7 @@ function printFiles (files, cb) {
// add to cache, then cp to the cwd
function pack_ (pkg, cb) {
- cache.add(pkg, function (er, data) {
+ cache.add(pkg, null, false, function (er, data) {
if (er) return cb(er)
var fname = path.resolve(data._id.replace(/@/g, "-") + ".tgz")
, cached = path.resolve( npm.cache
diff --git a/deps/npm/lib/publish.js b/deps/npm/lib/publish.js
index cede9ff0a6..01d66b407f 100644
--- a/deps/npm/lib/publish.js
+++ b/deps/npm/lib/publish.js
@@ -49,7 +49,7 @@ function publish (args, isRetry, cb) {
// That means that we can run publish/postpublish in the dir, rather than
// in the cache dir.
function cacheAddPublish (dir, didPre, isRetry, cb) {
- npm.commands.cache.add(dir, function (er, data) {
+ npm.commands.cache.add(dir, null, false, function (er, data) {
if (er) return cb(er)
log.silly("publish", data)
var cachedir = path.resolve( npm.cache
diff --git a/deps/npm/lib/repo.js b/deps/npm/lib/repo.js
index b95bd7562f..a2ec99bb03 100644
--- a/deps/npm/lib/repo.js
+++ b/deps/npm/lib/repo.js
@@ -19,6 +19,7 @@ var npm = require("./npm.js")
, path = require("path")
, readJson = require("read-package-json")
, fs = require("fs")
+ , url_ = require('url')
function repo (args, cb) {
var n = args.length && args[0].split("@").shift() || '.'
@@ -40,7 +41,11 @@ function getUrlAndOpen (d, cb) {
// from https://github.com/npm/npm-www/issues/418
if (githubUserRepo(r.url))
r.url = githubUserRepo(r.url)
- var url = github(r.url)
+
+ var url = (r.url && ~r.url.indexOf('github'))
+ ? github(r.url)
+ : nonGithubUrl(r.url)
+
if (!url)
return cb(new Error('no repository: could not get url'))
opener(url, { command: npm.config.get("browser") }, cb)
@@ -52,3 +57,19 @@ function callRegistry (n, cb) {
getUrlAndOpen(d, cb)
})
}
+
+function nonGithubUrl (url) {
+ try {
+ var idx = url.indexOf('@')
+ if (idx !== -1) {
+ url = url.slice(idx+1).replace(/:([^\d]+)/, '/$1')
+ }
+ url = url_.parse(url)
+ var protocol = url.protocol === 'https:'
+ ? 'https:'
+ : 'http:'
+ return protocol + '//' + (url.host || '') +
+ url.path.replace(/\.git$/, '')
+ }
+ catch(e) {}
+}
diff --git a/deps/npm/lib/submodule.js b/deps/npm/lib/submodule.js
index 72a2248142..5ea5a4f463 100644
--- a/deps/npm/lib/submodule.js
+++ b/deps/npm/lib/submodule.js
@@ -23,7 +23,7 @@ function submodule (args, cb) {
if (args.length === 0) return cb(submodule.usage)
asyncMap(args, function (arg, cb) {
- cache.add(arg, cb)
+ cache.add(arg, null, false, cb)
}, function (er, pkgs) {
if (er) return cb(er)
chain(pkgs.map(function (pkg) { return function (cb) {
@@ -99,9 +99,9 @@ var getSubmodules = function getSubmodules (cb) {
err.code = "ENOGIT"
return cb(err)
}
- exec(git, args, function (er, stdout, stderr) {
+ exec(git, args, function (er, stdout) {
if (er) return cb(er)
- res = stdout.trim().split(/\n/).map(function (line) {
+ var res = stdout.trim().split(/\n/).map(function (line) {
return line.trim().split(/\s+/)[1]
}).filter(function (line) {
// only care about submodules in the node_modules folder.
diff --git a/deps/npm/lib/utils/depr-check.js b/deps/npm/lib/utils/depr-check.js
new file mode 100644
index 0000000000..7166348b08
--- /dev/null
+++ b/deps/npm/lib/utils/depr-check.js
@@ -0,0 +1,13 @@
+var log = require("npmlog")
+
+var deprecated = {}
+ , deprWarned = {}
+module.exports = function deprCheck (data) {
+ if (deprecated[data._id]) data.deprecated = deprecated[data._id]
+ if (data.deprecated) deprecated[data._id] = data.deprecated
+ else return
+ if (!deprWarned[data._id]) {
+ deprWarned[data._id] = true
+ log.warn("deprecated", "%s: %s", data._id, data.deprecated)
+ }
+}
diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js
index b025fdd371..feeec184cf 100644
--- a/deps/npm/lib/utils/error-handler.js
+++ b/deps/npm/lib/utils/error-handler.js
@@ -63,6 +63,7 @@ function exit (code, noLog) {
// if we're really exiting, then let it exit on its own, so that
// in-process stuff can finish or clean up first.
if (!doExit) process.emit("exit", code)
+ npm.spinner.stop()
}
}
diff --git a/deps/npm/lib/utils/lifecycle.js b/deps/npm/lib/utils/lifecycle.js
index 1af5bddca7..af009cc215 100644
--- a/deps/npm/lib/utils/lifecycle.js
+++ b/deps/npm/lib/utils/lifecycle.js
@@ -162,6 +162,9 @@ function runCmd (note, cmd, pkg, env, stage, wd, unsafe, cb) {
, group = unsafe ? null : npm.config.get("group")
if (log.level !== 'silent') {
+ if (npm.spinner.int) {
+ npm.config.get("logstream").write("\r \r")
+ }
console.log(note)
}
log.verbose("unsafe-perm in lifecycle", unsafe)
diff --git a/deps/npm/lib/utils/locker.js b/deps/npm/lib/utils/locker.js
new file mode 100644
index 0000000000..9e322d7af3
--- /dev/null
+++ b/deps/npm/lib/utils/locker.js
@@ -0,0 +1,52 @@
+var crypto = require("crypto")
+var path = require("path")
+
+var npm = require("../npm.js")
+var lockFile = require("lockfile")
+var log = require("npmlog")
+var getCacheStat = require("../cache/get-stat.js")
+
+function lockFileName (u) {
+ var c = u.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "")
+ , h = crypto.createHash("sha1").update(u).digest("hex")
+ h = h.substr(0, 8)
+ c = c.substr(-32)
+ log.silly("lockFile", h + "-" + c, u)
+ return path.resolve(npm.config.get("cache"), h + "-" + c + ".lock")
+}
+
+var myLocks = {}
+function lock (u, cb) {
+ // the cache dir needs to exist already for this.
+ getCacheStat(function (er, cs) {
+ if (er) return cb(er)
+ var opts = { stale: npm.config.get("cache-lock-stale")
+ , retries: npm.config.get("cache-lock-retries")
+ , wait: npm.config.get("cache-lock-wait") }
+ var lf = lockFileName(u)
+ log.verbose("lock", u, lf)
+ lockFile.lock(lf, opts, function(er) {
+ if (!er) myLocks[lf] = true
+ cb(er)
+ })
+ })
+}
+
+function unlock (u, cb) {
+ var lf = lockFileName(u)
+ , locked = myLocks[lf]
+ if (locked === false) {
+ return process.nextTick(cb)
+ } else if (locked === true) {
+ myLocks[lf] = false
+ lockFile.unlock(lockFileName(u), cb)
+ } else {
+ throw new Error("Attempt to unlock " + u + ", which hasn't been locked")
+ }
+}
+
+module.exports = {
+ lock: lock,
+ unlock: unlock,
+ _lockFileName: lockFileName
+}
diff --git a/deps/npm/lib/utils/tar.js b/deps/npm/lib/utils/tar.js
index b73c134e4d..3121bb0289 100644
--- a/deps/npm/lib/utils/tar.js
+++ b/deps/npm/lib/utils/tar.js
@@ -8,7 +8,6 @@ var npm = require("../npm.js")
, uidNumber = require("uid-number")
, rm = require("./gently-rm.js")
, readJson = require("read-package-json")
- , cache = require("../cache.js")
, myUid = process.getuid && process.getuid()
, myGid = process.getgid && process.getgid()
, tar = require("tar")
@@ -16,13 +15,14 @@ var npm = require("../npm.js")
, fstream = require("fstream")
, Packer = require("fstream-npm")
, lifecycle = require("./lifecycle.js")
+ , locker = require("./locker.js")
function lock(path, cb) {
- return cache.lock('tar://' + path, cb)
+ return locker.lock('tar://' + path, cb)
}
function unlock(path, cb) {
- return cache.unlock('tar://' + path, cb)
+ return locker.unlock('tar://' + path, cb)
}
if (process.env.SUDO_UID && myUid === 0) {
diff --git a/deps/npm/lib/version.js b/deps/npm/lib/version.js
index 4e155da961..ec3f93b202 100644
--- a/deps/npm/lib/version.js
+++ b/deps/npm/lib/version.js
@@ -11,7 +11,7 @@ var exec = require("child_process").execFile
, which = require("which")
, npm = require("./npm.js")
-version.usage = "npm version [<newversion> | major | minor | patch]\n"
+version.usage = "npm version [<newversion> | major | minor | patch | prerelease | preminor | premajor ]\n"
+ "\n(run in package dir)\n"
+ "'npm -v' or 'npm --version' to print npm version "
+ "("+npm.version+")\n"
@@ -105,6 +105,11 @@ function checkGit (data, cb) {
chain
( [ [ exec, git, [ "add", "package.json" ], {env: process.env} ]
, [ exec, git, [ "commit", "-m", message ], {env: process.env} ]
+ , sign && function (cb) {
+ npm.spinner.stop()
+ cb()
+ }
+
, [ exec, git, [ "tag", "v" + data.version, flag, message ]
, {env: process.env} ] ]
, cb )
diff --git a/deps/npm/lib/view.js b/deps/npm/lib/view.js
index 18484b2bd1..6b73823789 100644
--- a/deps/npm/lib/view.js
+++ b/deps/npm/lib/view.js
@@ -208,7 +208,7 @@ function printData (data, name, cb) {
d = JSON.stringify(d)
}
if (f && showFields) f += " = "
- if (d.indexOf("\n") !== -1) d = "\n" + d
+ if (d.indexOf("\n") !== -1) d = " \n" + d
msg += (showVersions ? name + "@" + v + " " : "")
+ (showFields ? f : "") + d + "\n"
})
diff --git a/deps/npm/man/man1/npm-README.1 b/deps/npm/man/man1/npm-README.1
index 0f8bef3d71..030823c8ae 100644
--- a/deps/npm/man/man1/npm-README.1
+++ b/deps/npm/man/man1/npm-README.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "1" "May 2014" "" ""
+.TH "NPM" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager![Build Status \fIhttps://img\.shields\.io/travis/npm/npm/master\.svg)](https://travis\-ci\.org/npm/npm\fR
diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1
index 594330a415..6535cb4090 100644
--- a/deps/npm/man/man1/npm-adduser.1
+++ b/deps/npm/man/man1/npm-adduser.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ADDUSER" "1" "May 2014" "" ""
+.TH "NPM\-ADDUSER" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-adduser\fR \-\- Add a registry user account
diff --git a/deps/npm/man/man1/npm-bin.1 b/deps/npm/man/man1/npm-bin.1
index af5468b59d..750f9fb303 100644
--- a/deps/npm/man/man1/npm-bin.1
+++ b/deps/npm/man/man1/npm-bin.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BIN" "1" "May 2014" "" ""
+.TH "NPM\-BIN" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-bin\fR \-\- Display npm bin folder
diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1
index b3a953bfe6..43a71a2619 100644
--- a/deps/npm/man/man1/npm-bugs.1
+++ b/deps/npm/man/man1/npm-bugs.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUGS" "1" "May 2014" "" ""
+.TH "NPM\-BUGS" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
diff --git a/deps/npm/man/man1/npm-build.1 b/deps/npm/man/man1/npm-build.1
index 152caf79cc..e6c4100192 100644
--- a/deps/npm/man/man1/npm-build.1
+++ b/deps/npm/man/man1/npm-build.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUILD" "1" "May 2014" "" ""
+.TH "NPM\-BUILD" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-build\fR \-\- Build a package
diff --git a/deps/npm/man/man1/npm-bundle.1 b/deps/npm/man/man1/npm-bundle.1
index 5f2f85a3f5..0a8f2d5c30 100644
--- a/deps/npm/man/man1/npm-bundle.1
+++ b/deps/npm/man/man1/npm-bundle.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUNDLE" "1" "May 2014" "" ""
+.TH "NPM\-BUNDLE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-bundle\fR \-\- REMOVED
diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1
index 0e5b949c2b..9976f72ab6 100644
--- a/deps/npm/man/man1/npm-cache.1
+++ b/deps/npm/man/man1/npm-cache.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CACHE" "1" "May 2014" "" ""
+.TH "NPM\-CACHE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-cache\fR \-\- Manipulates packages cache
@@ -46,12 +46,8 @@ For each package that is added to the cache, three pieces of information are
stored in \fB{cache}/{name}/{version}\fR:
.
.IP "\(bu" 4
-\|\.\.\./package/:
-A folder containing the package contents as they appear in the tarball\.
-.
-.IP "\(bu" 4
-\|\.\.\./package\.json:
-The package\.json file, as npm sees it, with overlays applied and a _id attribute\.
+\|\.\.\./package/package\.json:
+The package\.json file, as npm sees it\.
.
.IP "\(bu" 4
\|\.\.\./package\.tgz:
@@ -62,7 +58,7 @@ The tarball for that version\.
.P
Additionally, whenever a registry request is made, a \fB\|\.cache\.json\fR file
is placed at the corresponding URI, to store the ETag and the requested
-data\.
+data\. This is stored in \fB{cache}/{hostname}/{path}/\.cache\.json\fR\|\.
.
.P
Commands that make non\-essential registry requests (such as \fBsearch\fR and \fBview\fR, or the completion scripts) generally specify a minimum timeout\.
diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1
index 6d1ec8d972..2c8a411fa7 100644
--- a/deps/npm/man/man1/npm-completion.1
+++ b/deps/npm/man/man1/npm-completion.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-COMPLETION" "1" "May 2014" "" ""
+.TH "NPM\-COMPLETION" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-completion\fR \-\- Tab Completion for npm
diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1
index 38490724d7..ebe9cb20e2 100644
--- a/deps/npm/man/man1/npm-config.1
+++ b/deps/npm/man/man1/npm-config.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CONFIG" "1" "May 2014" "" ""
+.TH "NPM\-CONFIG" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-config\fR \-\- Manage the npm configuration files
diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1
index e60192178b..8ffe7d7fa3 100644
--- a/deps/npm/man/man1/npm-dedupe.1
+++ b/deps/npm/man/man1/npm-dedupe.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEDUPE" "1" "May 2014" "" ""
+.TH "NPM\-DEDUPE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-dedupe\fR \-\- Reduce duplication
diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1
index e4a19b23bc..0776d22f28 100644
--- a/deps/npm/man/man1/npm-deprecate.1
+++ b/deps/npm/man/man1/npm-deprecate.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEPRECATE" "1" "May 2014" "" ""
+.TH "NPM\-DEPRECATE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-deprecate\fR \-\- Deprecate a version of a package
diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1
index 27cbb05c8d..8b5613afd2 100644
--- a/deps/npm/man/man1/npm-docs.1
+++ b/deps/npm/man/man1/npm-docs.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DOCS" "1" "May 2014" "" ""
+.TH "NPM\-DOCS" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1
index 678c9128b2..bc2de55745 100644
--- a/deps/npm/man/man1/npm-edit.1
+++ b/deps/npm/man/man1/npm-edit.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EDIT" "1" "May 2014" "" ""
+.TH "NPM\-EDIT" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-edit\fR \-\- Edit an installed package
diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1
index 2baac8f2fe..4380044c6d 100644
--- a/deps/npm/man/man1/npm-explore.1
+++ b/deps/npm/man/man1/npm-explore.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EXPLORE" "1" "May 2014" "" ""
+.TH "NPM\-EXPLORE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-explore\fR \-\- Browse an installed package
diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1
index cf723d2f41..a407809200 100644
--- a/deps/npm/man/man1/npm-help-search.1
+++ b/deps/npm/man/man1/npm-help-search.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP\-SEARCH" "1" "May 2014" "" ""
+.TH "NPM\-HELP\-SEARCH" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-help-search\fR \-\- Search npm help documentation
diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1
index 9e6c240fd1..66998f90af 100644
--- a/deps/npm/man/man1/npm-help.1
+++ b/deps/npm/man/man1/npm-help.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP" "1" "May 2014" "" ""
+.TH "NPM\-HELP" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-help\fR \-\- Get help on npm
diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1
index 795a8db9b4..947b6bb954 100644
--- a/deps/npm/man/man1/npm-init.1
+++ b/deps/npm/man/man1/npm-init.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INIT" "1" "May 2014" "" ""
+.TH "NPM\-INIT" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-init\fR \-\- Interactively create a package\.json file
diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1
index d98b55b12d..501d019caa 100644
--- a/deps/npm/man/man1/npm-install.1
+++ b/deps/npm/man/man1/npm-install.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INSTALL" "1" "May 2014" "" ""
+.TH "NPM\-INSTALL" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-install\fR \-\- Install a package
diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1
index 389dd82d53..b6a851f787 100644
--- a/deps/npm/man/man1/npm-link.1
+++ b/deps/npm/man/man1/npm-link.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LINK" "1" "May 2014" "" ""
+.TH "NPM\-LINK" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-link\fR \-\- Symlink a package folder
diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1
index f0662f64c0..8258cc7093 100644
--- a/deps/npm/man/man1/npm-ls.1
+++ b/deps/npm/man/man1/npm-ls.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LS" "1" "May 2014" "" ""
+.TH "NPM\-LS" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-ls\fR \-\- List installed packages
@@ -29,7 +29,7 @@ For example, running \fBnpm ls promzard\fR in npm\'s source tree will show:
.IP "" 4
.
.nf
-npm@1.4.10 /path/to/npm
+npm@1.4.14 /path/to/npm
└─┬ init\-package\-json@0\.0\.4
└── promzard@0\.1\.5
.
diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1
index f0e7ce6d97..ac1056b2a1 100644
--- a/deps/npm/man/man1/npm-outdated.1
+++ b/deps/npm/man/man1/npm-outdated.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OUTDATED" "1" "May 2014" "" ""
+.TH "NPM\-OUTDATED" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-outdated\fR \-\- Check for outdated packages
diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1
index dbb41b7b8a..3d4195dc43 100644
--- a/deps/npm/man/man1/npm-owner.1
+++ b/deps/npm/man/man1/npm-owner.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OWNER" "1" "May 2014" "" ""
+.TH "NPM\-OWNER" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-owner\fR \-\- Manage package owners
diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1
index c23b617e0a..6c79d8078b 100644
--- a/deps/npm/man/man1/npm-pack.1
+++ b/deps/npm/man/man1/npm-pack.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PACK" "1" "May 2014" "" ""
+.TH "NPM\-PACK" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-pack\fR \-\- Create a tarball from a package
diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1
index 66849742bf..c50736c8f8 100644
--- a/deps/npm/man/man1/npm-prefix.1
+++ b/deps/npm/man/man1/npm-prefix.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PREFIX" "1" "May 2014" "" ""
+.TH "NPM\-PREFIX" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-prefix\fR \-\- Display prefix
diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1
index 710438d106..37fd8ff593 100644
--- a/deps/npm/man/man1/npm-prune.1
+++ b/deps/npm/man/man1/npm-prune.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PRUNE" "1" "May 2014" "" ""
+.TH "NPM\-PRUNE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-prune\fR \-\- Remove extraneous packages
diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1
index 19271c82a7..4a4d00464c 100644
--- a/deps/npm/man/man1/npm-publish.1
+++ b/deps/npm/man/man1/npm-publish.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PUBLISH" "1" "May 2014" "" ""
+.TH "NPM\-PUBLISH" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-publish\fR \-\- Publish a package
diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1
index 7dda41232e..5fc945b5a2 100644
--- a/deps/npm/man/man1/npm-rebuild.1
+++ b/deps/npm/man/man1/npm-rebuild.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REBUILD" "1" "May 2014" "" ""
+.TH "NPM\-REBUILD" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-rebuild\fR \-\- Rebuild a package
diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1
index e79f8826a2..0663213165 100644
--- a/deps/npm/man/man1/npm-repo.1
+++ b/deps/npm/man/man1/npm-repo.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REPO" "1" "May 2014" "" ""
+.TH "NPM\-REPO" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-repo\fR \-\- Open package repository page in the browser
diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1
index d7ebaf7c09..5e3bfeafbb 100644
--- a/deps/npm/man/man1/npm-restart.1
+++ b/deps/npm/man/man1/npm-restart.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RESTART" "1" "May 2014" "" ""
+.TH "NPM\-RESTART" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-restart\fR \-\- Start a package
diff --git a/deps/npm/man/man1/npm-rm.1 b/deps/npm/man/man1/npm-rm.1
index a41689777f..cdde04137b 100644
--- a/deps/npm/man/man1/npm-rm.1
+++ b/deps/npm/man/man1/npm-rm.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RM" "1" "May 2014" "" ""
+.TH "NPM\-RM" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-rm\fR \-\- Remove a package
diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1
index ec6a2391bb..12da90c850 100644
--- a/deps/npm/man/man1/npm-root.1
+++ b/deps/npm/man/man1/npm-root.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ROOT" "1" "May 2014" "" ""
+.TH "NPM\-ROOT" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-root\fR \-\- Display npm root
diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1
index c350d9f192..fce1515360 100644
--- a/deps/npm/man/man1/npm-run-script.1
+++ b/deps/npm/man/man1/npm-run-script.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RUN\-SCRIPT" "1" "May 2014" "" ""
+.TH "NPM\-RUN\-SCRIPT" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-run-script\fR \-\- Run arbitrary package scripts
@@ -10,6 +10,7 @@
.
.nf
npm run\-script [<pkg>] [command]
+npm run [<pkg>] [command]
.
.fi
.
diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1
index 1680fc327a..9fc78f2676 100644
--- a/deps/npm/man/man1/npm-search.1
+++ b/deps/npm/man/man1/npm-search.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SEARCH" "1" "May 2014" "" ""
+.TH "NPM\-SEARCH" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-search\fR \-\- Search for packages
diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1
index 1c646b4d6f..1176061697 100644
--- a/deps/npm/man/man1/npm-shrinkwrap.1
+++ b/deps/npm/man/man1/npm-shrinkwrap.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SHRINKWRAP" "1" "May 2014" "" ""
+.TH "NPM\-SHRINKWRAP" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-shrinkwrap\fR \-\- Lock down dependency versions
diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1
index caa723e74d..efcf75b078 100644
--- a/deps/npm/man/man1/npm-star.1
+++ b/deps/npm/man/man1/npm-star.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STAR" "1" "May 2014" "" ""
+.TH "NPM\-STAR" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-star\fR \-\- Mark your favorite packages
diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1
index 2daacdf6c3..6517738540 100644
--- a/deps/npm/man/man1/npm-stars.1
+++ b/deps/npm/man/man1/npm-stars.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STARS" "1" "May 2014" "" ""
+.TH "NPM\-STARS" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-stars\fR \-\- View packages marked as favorites
diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1
index d8c525d5bc..bf2c7a738e 100644
--- a/deps/npm/man/man1/npm-start.1
+++ b/deps/npm/man/man1/npm-start.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-START" "1" "May 2014" "" ""
+.TH "NPM\-START" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-start\fR \-\- Start a package
diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1
index 0f0a28d53e..f921547fce 100644
--- a/deps/npm/man/man1/npm-stop.1
+++ b/deps/npm/man/man1/npm-stop.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STOP" "1" "May 2014" "" ""
+.TH "NPM\-STOP" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-stop\fR \-\- Stop a package
diff --git a/deps/npm/man/man1/npm-submodule.1 b/deps/npm/man/man1/npm-submodule.1
index f3385e1d50..588b1f0b26 100644
--- a/deps/npm/man/man1/npm-submodule.1
+++ b/deps/npm/man/man1/npm-submodule.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SUBMODULE" "1" "May 2014" "" ""
+.TH "NPM\-SUBMODULE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-submodule\fR \-\- Add a package as a git submodule
diff --git a/deps/npm/man/man1/npm-tag.1 b/deps/npm/man/man1/npm-tag.1
index d58047064e..823e5477e8 100644
--- a/deps/npm/man/man1/npm-tag.1
+++ b/deps/npm/man/man1/npm-tag.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TAG" "1" "May 2014" "" ""
+.TH "NPM\-TAG" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-tag\fR \-\- Tag a published version
diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1
index 85d7d3681b..35b6279c6b 100644
--- a/deps/npm/man/man1/npm-test.1
+++ b/deps/npm/man/man1/npm-test.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TEST" "1" "May 2014" "" ""
+.TH "NPM\-TEST" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-test\fR \-\- Test a package
diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1
index 3fbee02420..688d425001 100644
--- a/deps/npm/man/man1/npm-uninstall.1
+++ b/deps/npm/man/man1/npm-uninstall.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RM" "1" "May 2014" "" ""
+.TH "NPM\-RM" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-rm\fR \-\- Remove a package
diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1
index 1d98b1be7e..691e1fa4a5 100644
--- a/deps/npm/man/man1/npm-unpublish.1
+++ b/deps/npm/man/man1/npm-unpublish.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNPUBLISH" "1" "May 2014" "" ""
+.TH "NPM\-UNPUBLISH" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-unpublish\fR \-\- Remove a package from the registry
diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1
index 949bae254d..f1856b80f2 100644
--- a/deps/npm/man/man1/npm-update.1
+++ b/deps/npm/man/man1/npm-update.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UPDATE" "1" "May 2014" "" ""
+.TH "NPM\-UPDATE" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-update\fR \-\- Update a package
diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1
index d2ae8a0ff0..0aeea2a92c 100644
--- a/deps/npm/man/man1/npm-version.1
+++ b/deps/npm/man/man1/npm-version.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VERSION" "1" "May 2014" "" ""
+.TH "NPM\-VERSION" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-version\fR \-\- Bump a package version
diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1
index 8083dda68c..de1b11a7be 100644
--- a/deps/npm/man/man1/npm-view.1
+++ b/deps/npm/man/man1/npm-view.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VIEW" "1" "May 2014" "" ""
+.TH "NPM\-VIEW" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-view\fR \-\- View registry info
diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1
index f3f82701ba..821e5cc783 100644
--- a/deps/npm/man/man1/npm-whoami.1
+++ b/deps/npm/man/man1/npm-whoami.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-WHOAMI" "1" "May 2014" "" ""
+.TH "NPM\-WHOAMI" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-whoami\fR \-\- Display npm username
diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1
index dd60a59ae9..7e941b8667 100644
--- a/deps/npm/man/man1/npm.1
+++ b/deps/npm/man/man1/npm.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "1" "May 2014" "" ""
+.TH "NPM" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager
@@ -14,7 +14,7 @@ npm <command> [args]
.fi
.
.SH "VERSION"
-1.4.10
+1.4.14
.
.SH "DESCRIPTION"
npm is the package manager for the Node JavaScript platform\. It puts
@@ -39,6 +39,20 @@ npm help Use \fBnpm install blerg\fR to install the latest version of "blerg"\.
Use the \fBnpm search\fR command to show everything that\'s available\.
Use \fBnpm ls\fR to show everything you\'ve installed\.
.
+.SH "DEPENDENCIES"
+If a package references to another package with a git URL, npm depends
+on a preinstalled git\.
+.
+.P
+If one of the packages npm tries to install is a native node module and
+requires compiling of C++ Code, npm will use node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR for that task\.
+For a Unix system, node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR
+needs Python, make and a buildchain like GCC\. On Windows,
+Python and Microsoft Visual Studio C++ is needed\. Python 3 is
+not supported by node\-gyp \fIhttps://github\.com/TooTallNate/node\-gyp\fR\|\.
+For more information visit the node\-gyp repository \fIhttps://github\.com/TooTallNate/node\-gyp\fR and
+the node\-gyp Wiki \fIhttps://github\.com/TooTallNate/node\-gyp/wiki\fR\|\.
+.
.SH "DIRECTORIES"
npm help See \fBnpm\-folders\fR to learn about where npm puts stuff\.
.
diff --git a/deps/npm/man/man3/npm-bin.3 b/deps/npm/man/man3/npm-bin.3
index 7a15705f2b..15a0f715dd 100644
--- a/deps/npm/man/man3/npm-bin.3
+++ b/deps/npm/man/man3/npm-bin.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BIN" "3" "May 2014" "" ""
+.TH "NPM\-BIN" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-bin\fR \-\- Display npm bin folder
diff --git a/deps/npm/man/man3/npm-bugs.3 b/deps/npm/man/man3/npm-bugs.3
index 97b1440f36..98d56039d2 100644
--- a/deps/npm/man/man3/npm-bugs.3
+++ b/deps/npm/man/man3/npm-bugs.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUGS" "3" "May 2014" "" ""
+.TH "NPM\-BUGS" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
diff --git a/deps/npm/man/man3/npm-cache.3 b/deps/npm/man/man3/npm-cache.3
new file mode 100644
index 0000000000..efee679474
--- /dev/null
+++ b/deps/npm/man/man3/npm-cache.3
@@ -0,0 +1,40 @@
+.\" Generated with Ronnjs 0.3.8
+.\" http://github.com/kapouer/ronnjs/
+.
+.TH "NPM\-CACHE" "3" "June 2014" "" ""
+.
+.SH "NAME"
+\fBnpm-cache\fR \-\- manage the npm cache programmatically
+.
+.SH "SYNOPSIS"
+.
+.nf
+npm\.commands\.cache([args], callback)
+// helpers
+npm\.commands\.cache\.clean([args], callback)
+npm\.commands\.cache\.add([args], callback)
+npm\.commands\.cache\.read(name, version, forceBypass, callback)
+.
+.fi
+.
+.SH "DESCRIPTION"
+npm help This acts much the same ways as the npm\-cache command line
+functionality\.
+.
+.P
+The callback is called with the package\.json data of the thing that is
+eventually added to or read from the cache\.
+.
+.P
+The top level \fBnpm\.commands\.cache(\.\.\.)\fR functionality is a public
+interface, and like all commands on the \fBnpm\.commands\fR object, it will
+match the command line behavior exactly\.
+.
+.P
+However, the cache folder structure and the cache helper functions are
+considered \fBinternal\fR API surface, and as such, may change in future
+releases of npm, potentially without warning or significant version
+incrementation\.
+.
+.P
+Use at your own risk\.
diff --git a/deps/npm/man/man3/npm-commands.3 b/deps/npm/man/man3/npm-commands.3
index 0f3fa8668b..494139a16d 100644
--- a/deps/npm/man/man3/npm-commands.3
+++ b/deps/npm/man/man3/npm-commands.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-COMMANDS" "3" "May 2014" "" ""
+.TH "NPM\-COMMANDS" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-commands\fR \-\- npm commands
diff --git a/deps/npm/man/man3/npm-config.3 b/deps/npm/man/man3/npm-config.3
index 818a6e4bdf..8389e543eb 100644
--- a/deps/npm/man/man3/npm-config.3
+++ b/deps/npm/man/man3/npm-config.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CONFIG" "3" "May 2014" "" ""
+.TH "NPM\-CONFIG" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-config\fR \-\- Manage the npm configuration files
diff --git a/deps/npm/man/man3/npm-deprecate.3 b/deps/npm/man/man3/npm-deprecate.3
index 72dd86c462..30e3318bc4 100644
--- a/deps/npm/man/man3/npm-deprecate.3
+++ b/deps/npm/man/man3/npm-deprecate.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEPRECATE" "3" "May 2014" "" ""
+.TH "NPM\-DEPRECATE" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-deprecate\fR \-\- Deprecate a version of a package
diff --git a/deps/npm/man/man3/npm-docs.3 b/deps/npm/man/man3/npm-docs.3
index f476f754c5..8061baf8cf 100644
--- a/deps/npm/man/man3/npm-docs.3
+++ b/deps/npm/man/man3/npm-docs.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DOCS" "3" "May 2014" "" ""
+.TH "NPM\-DOCS" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
diff --git a/deps/npm/man/man3/npm-edit.3 b/deps/npm/man/man3/npm-edit.3
index 6466761093..b7d3f657b5 100644
--- a/deps/npm/man/man3/npm-edit.3
+++ b/deps/npm/man/man3/npm-edit.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EDIT" "3" "May 2014" "" ""
+.TH "NPM\-EDIT" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-edit\fR \-\- Edit an installed package
diff --git a/deps/npm/man/man3/npm-explore.3 b/deps/npm/man/man3/npm-explore.3
index 61441abea5..60187503ec 100644
--- a/deps/npm/man/man3/npm-explore.3
+++ b/deps/npm/man/man3/npm-explore.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EXPLORE" "3" "May 2014" "" ""
+.TH "NPM\-EXPLORE" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-explore\fR \-\- Browse an installed package
diff --git a/deps/npm/man/man3/npm-help-search.3 b/deps/npm/man/man3/npm-help-search.3
index ef5893b855..febd3391b4 100644
--- a/deps/npm/man/man3/npm-help-search.3
+++ b/deps/npm/man/man3/npm-help-search.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP\-SEARCH" "3" "May 2014" "" ""
+.TH "NPM\-HELP\-SEARCH" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-help-search\fR \-\- Search the help pages
diff --git a/deps/npm/man/man3/npm-init.3 b/deps/npm/man/man3/npm-init.3
index 528002af1c..0a66df1098 100644
--- a/deps/npm/man/man3/npm-init.3
+++ b/deps/npm/man/man3/npm-init.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "INIT" "3" "May 2014" "" ""
+.TH "INIT" "3" "June 2014" "" ""
.
.SH "NAME"
\fBinit\fR \-\- Interactively create a package\.json file
diff --git a/deps/npm/man/man3/npm-install.3 b/deps/npm/man/man3/npm-install.3
index 90b7089023..16964560a7 100644
--- a/deps/npm/man/man3/npm-install.3
+++ b/deps/npm/man/man3/npm-install.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INSTALL" "3" "May 2014" "" ""
+.TH "NPM\-INSTALL" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-install\fR \-\- install a package programmatically
diff --git a/deps/npm/man/man3/npm-link.3 b/deps/npm/man/man3/npm-link.3
index 28d418cc15..521b7c9926 100644
--- a/deps/npm/man/man3/npm-link.3
+++ b/deps/npm/man/man3/npm-link.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LINK" "3" "May 2014" "" ""
+.TH "NPM\-LINK" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-link\fR \-\- Symlink a package folder
diff --git a/deps/npm/man/man3/npm-load.3 b/deps/npm/man/man3/npm-load.3
index 5de64de6ac..8e871ee937 100644
--- a/deps/npm/man/man3/npm-load.3
+++ b/deps/npm/man/man3/npm-load.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LOAD" "3" "May 2014" "" ""
+.TH "NPM\-LOAD" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-load\fR \-\- Load config settings
diff --git a/deps/npm/man/man3/npm-ls.3 b/deps/npm/man/man3/npm-ls.3
index 30d8f0a78e..2c68f6a2c1 100644
--- a/deps/npm/man/man3/npm-ls.3
+++ b/deps/npm/man/man3/npm-ls.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LS" "3" "May 2014" "" ""
+.TH "NPM\-LS" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-ls\fR \-\- List installed packages
diff --git a/deps/npm/man/man3/npm-outdated.3 b/deps/npm/man/man3/npm-outdated.3
index 59c0a2491d..f9a763585a 100644
--- a/deps/npm/man/man3/npm-outdated.3
+++ b/deps/npm/man/man3/npm-outdated.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OUTDATED" "3" "May 2014" "" ""
+.TH "NPM\-OUTDATED" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-outdated\fR \-\- Check for outdated packages
diff --git a/deps/npm/man/man3/npm-owner.3 b/deps/npm/man/man3/npm-owner.3
index fb7c622c4e..e42ebfa910 100644
--- a/deps/npm/man/man3/npm-owner.3
+++ b/deps/npm/man/man3/npm-owner.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OWNER" "3" "May 2014" "" ""
+.TH "NPM\-OWNER" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-owner\fR \-\- Manage package owners
diff --git a/deps/npm/man/man3/npm-pack.3 b/deps/npm/man/man3/npm-pack.3
index 3ab49a2bf6..1384be5fff 100644
--- a/deps/npm/man/man3/npm-pack.3
+++ b/deps/npm/man/man3/npm-pack.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PACK" "3" "May 2014" "" ""
+.TH "NPM\-PACK" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-pack\fR \-\- Create a tarball from a package
diff --git a/deps/npm/man/man3/npm-prefix.3 b/deps/npm/man/man3/npm-prefix.3
index 72676148c1..e10480e9e7 100644
--- a/deps/npm/man/man3/npm-prefix.3
+++ b/deps/npm/man/man3/npm-prefix.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PREFIX" "3" "May 2014" "" ""
+.TH "NPM\-PREFIX" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-prefix\fR \-\- Display prefix
diff --git a/deps/npm/man/man3/npm-prune.3 b/deps/npm/man/man3/npm-prune.3
index 948b4d2b30..cde69a393c 100644
--- a/deps/npm/man/man3/npm-prune.3
+++ b/deps/npm/man/man3/npm-prune.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PRUNE" "3" "May 2014" "" ""
+.TH "NPM\-PRUNE" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-prune\fR \-\- Remove extraneous packages
diff --git a/deps/npm/man/man3/npm-publish.3 b/deps/npm/man/man3/npm-publish.3
index 01c2d1b439..139414a8fd 100644
--- a/deps/npm/man/man3/npm-publish.3
+++ b/deps/npm/man/man3/npm-publish.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PUBLISH" "3" "May 2014" "" ""
+.TH "NPM\-PUBLISH" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-publish\fR \-\- Publish a package
diff --git a/deps/npm/man/man3/npm-rebuild.3 b/deps/npm/man/man3/npm-rebuild.3
index 86fcca546f..8fede0d36d 100644
--- a/deps/npm/man/man3/npm-rebuild.3
+++ b/deps/npm/man/man3/npm-rebuild.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REBUILD" "3" "May 2014" "" ""
+.TH "NPM\-REBUILD" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-rebuild\fR \-\- Rebuild a package
diff --git a/deps/npm/man/man3/npm-repo.3 b/deps/npm/man/man3/npm-repo.3
index 161b213a27..65daa6bf92 100644
--- a/deps/npm/man/man3/npm-repo.3
+++ b/deps/npm/man/man3/npm-repo.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REPO" "3" "May 2014" "" ""
+.TH "NPM\-REPO" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-repo\fR \-\- Open package repository page in the browser
diff --git a/deps/npm/man/man3/npm-restart.3 b/deps/npm/man/man3/npm-restart.3
index d51ee54ad3..699e1cec67 100644
--- a/deps/npm/man/man3/npm-restart.3
+++ b/deps/npm/man/man3/npm-restart.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RESTART" "3" "May 2014" "" ""
+.TH "NPM\-RESTART" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-restart\fR \-\- Start a package
diff --git a/deps/npm/man/man3/npm-root.3 b/deps/npm/man/man3/npm-root.3
index a7ae76d7d5..1f3f4fef0f 100644
--- a/deps/npm/man/man3/npm-root.3
+++ b/deps/npm/man/man3/npm-root.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ROOT" "3" "May 2014" "" ""
+.TH "NPM\-ROOT" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-root\fR \-\- Display npm root
diff --git a/deps/npm/man/man3/npm-run-script.3 b/deps/npm/man/man3/npm-run-script.3
index 24aec93ef3..44919b788b 100644
--- a/deps/npm/man/man3/npm-run-script.3
+++ b/deps/npm/man/man3/npm-run-script.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RUN\-SCRIPT" "3" "May 2014" "" ""
+.TH "NPM\-RUN\-SCRIPT" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-run-script\fR \-\- Run arbitrary package scripts
diff --git a/deps/npm/man/man3/npm-search.3 b/deps/npm/man/man3/npm-search.3
index 90b57e189c..54278ceb05 100644
--- a/deps/npm/man/man3/npm-search.3
+++ b/deps/npm/man/man3/npm-search.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SEARCH" "3" "May 2014" "" ""
+.TH "NPM\-SEARCH" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-search\fR \-\- Search for packages
diff --git a/deps/npm/man/man3/npm-shrinkwrap.3 b/deps/npm/man/man3/npm-shrinkwrap.3
index d82fa004cd..8d26fd0f87 100644
--- a/deps/npm/man/man3/npm-shrinkwrap.3
+++ b/deps/npm/man/man3/npm-shrinkwrap.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SHRINKWRAP" "3" "May 2014" "" ""
+.TH "NPM\-SHRINKWRAP" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-shrinkwrap\fR \-\- programmatically generate package shrinkwrap file
diff --git a/deps/npm/man/man3/npm-start.3 b/deps/npm/man/man3/npm-start.3
index cddc6836a2..748f13a80d 100644
--- a/deps/npm/man/man3/npm-start.3
+++ b/deps/npm/man/man3/npm-start.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-START" "3" "May 2014" "" ""
+.TH "NPM\-START" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-start\fR \-\- Start a package
diff --git a/deps/npm/man/man3/npm-stop.3 b/deps/npm/man/man3/npm-stop.3
index ff52fb9177..7929b7d4f2 100644
--- a/deps/npm/man/man3/npm-stop.3
+++ b/deps/npm/man/man3/npm-stop.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STOP" "3" "May 2014" "" ""
+.TH "NPM\-STOP" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-stop\fR \-\- Stop a package
diff --git a/deps/npm/man/man3/npm-submodule.3 b/deps/npm/man/man3/npm-submodule.3
index b28915bdbe..cf48a8d40d 100644
--- a/deps/npm/man/man3/npm-submodule.3
+++ b/deps/npm/man/man3/npm-submodule.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SUBMODULE" "3" "May 2014" "" ""
+.TH "NPM\-SUBMODULE" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-submodule\fR \-\- Add a package as a git submodule
diff --git a/deps/npm/man/man3/npm-tag.3 b/deps/npm/man/man3/npm-tag.3
index 0f56e71be0..c7df2e2d86 100644
--- a/deps/npm/man/man3/npm-tag.3
+++ b/deps/npm/man/man3/npm-tag.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TAG" "3" "May 2014" "" ""
+.TH "NPM\-TAG" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-tag\fR \-\- Tag a published version
diff --git a/deps/npm/man/man3/npm-test.3 b/deps/npm/man/man3/npm-test.3
index 826582ecf9..6b580a565c 100644
--- a/deps/npm/man/man3/npm-test.3
+++ b/deps/npm/man/man3/npm-test.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TEST" "3" "May 2014" "" ""
+.TH "NPM\-TEST" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-test\fR \-\- Test a package
diff --git a/deps/npm/man/man3/npm-uninstall.3 b/deps/npm/man/man3/npm-uninstall.3
index 964791ab07..9b65ca7095 100644
--- a/deps/npm/man/man3/npm-uninstall.3
+++ b/deps/npm/man/man3/npm-uninstall.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNINSTALL" "3" "May 2014" "" ""
+.TH "NPM\-UNINSTALL" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-uninstall\fR \-\- uninstall a package programmatically
diff --git a/deps/npm/man/man3/npm-unpublish.3 b/deps/npm/man/man3/npm-unpublish.3
index 00711d4920..de593b3805 100644
--- a/deps/npm/man/man3/npm-unpublish.3
+++ b/deps/npm/man/man3/npm-unpublish.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNPUBLISH" "3" "May 2014" "" ""
+.TH "NPM\-UNPUBLISH" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-unpublish\fR \-\- Remove a package from the registry
diff --git a/deps/npm/man/man3/npm-update.3 b/deps/npm/man/man3/npm-update.3
index fccf96f3a9..98a0cdd135 100644
--- a/deps/npm/man/man3/npm-update.3
+++ b/deps/npm/man/man3/npm-update.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UPDATE" "3" "May 2014" "" ""
+.TH "NPM\-UPDATE" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-update\fR \-\- Update a package
diff --git a/deps/npm/man/man3/npm-version.3 b/deps/npm/man/man3/npm-version.3
index 757a2d11d8..1e23051f35 100644
--- a/deps/npm/man/man3/npm-version.3
+++ b/deps/npm/man/man3/npm-version.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VERSION" "3" "May 2014" "" ""
+.TH "NPM\-VERSION" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-version\fR \-\- Bump a package version
diff --git a/deps/npm/man/man3/npm-view.3 b/deps/npm/man/man3/npm-view.3
index d5c9e80177..9aaffd57ae 100644
--- a/deps/npm/man/man3/npm-view.3
+++ b/deps/npm/man/man3/npm-view.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VIEW" "3" "May 2014" "" ""
+.TH "NPM\-VIEW" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-view\fR \-\- View registry info
diff --git a/deps/npm/man/man3/npm-whoami.3 b/deps/npm/man/man3/npm-whoami.3
index c24fae9f41..117a1fc864 100644
--- a/deps/npm/man/man3/npm-whoami.3
+++ b/deps/npm/man/man3/npm-whoami.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-WHOAMI" "3" "May 2014" "" ""
+.TH "NPM\-WHOAMI" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-whoami\fR \-\- Display npm username
diff --git a/deps/npm/man/man3/npm.3 b/deps/npm/man/man3/npm.3
index d7f2ad3c89..dfb77f6659 100644
--- a/deps/npm/man/man3/npm.3
+++ b/deps/npm/man/man3/npm.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "3" "May 2014" "" ""
+.TH "NPM" "3" "June 2014" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager
@@ -21,7 +21,7 @@ npm\.load([configObject, ]function (er, npm) {
.fi
.
.SH "VERSION"
-1.4.10
+1.4.14
.
.SH "DESCRIPTION"
This is the API documentation for npm\.
diff --git a/deps/npm/man/man5/npm-folders.5 b/deps/npm/man/man5/npm-folders.5
index 982b0bc63e..63aff66176 100644
--- a/deps/npm/man/man5/npm-folders.5
+++ b/deps/npm/man/man5/npm-folders.5
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-FOLDERS" "5" "May 2014" "" ""
+.TH "NPM\-FOLDERS" "5" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-folders\fR \-\- Folder Structures Used by npm
diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5
index 982b0bc63e..63aff66176 100644
--- a/deps/npm/man/man5/npm-global.5
+++ b/deps/npm/man/man5/npm-global.5
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-FOLDERS" "5" "May 2014" "" ""
+.TH "NPM\-FOLDERS" "5" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-folders\fR \-\- Folder Structures Used by npm
diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5
index 89083280de..73ec3c3faa 100644
--- a/deps/npm/man/man5/npm-json.5
+++ b/deps/npm/man/man5/npm-json.5
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "PACKAGE\.JSON" "5" "May 2014" "" ""
+.TH "PACKAGE\.JSON" "5" "June 2014" "" ""
.
.SH "NAME"
\fBpackage.json\fR \-\- Specifics of npm\'s package\.json handling
diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5
index 6ee6df6c73..aea7e7569b 100644
--- a/deps/npm/man/man5/npmrc.5
+++ b/deps/npm/man/man5/npmrc.5
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPMRC" "5" "May 2014" "" ""
+.TH "NPMRC" "5" "June 2014" "" ""
.
.SH "NAME"
\fBnpmrc\fR \-\- The npm config files
@@ -18,7 +18,10 @@ of the user and global npmrc files\.
npm help For a list of available configuration options, see npm\-config\.
.
.SH "FILES"
-The three relevant files are:
+The four relevant files are:
+.
+.IP "\(bu" 4
+per\-project config file (/path/to/my/project/\.npmrc)
.
.IP "\(bu" 4
per\-user config file (~/\.npmrc)
@@ -49,6 +52,17 @@ Each of these files is loaded, and config options are resolved in
priority order\. For example, a setting in the userconfig file would
override the setting in the globalconfig file\.
.
+.SS "Per\-project config file"
+When working locally in a project, a \fB\|\.npmrc\fR file in the root of the
+project (ie, a sibling of \fBnode_modules\fR and \fBpackage\.json\fR) will set
+config values specific to this project\.
+.
+.P
+Note that this only applies to the root of the project that you\'re
+running npm in\. It has no effect when your module is published\. For
+example, you can\'t publish a module that forces itself to install
+globally, or in a different location\.
+.
.SS "Per\-user config file"
\fB$HOME/\.npmrc\fR (or the \fBuserconfig\fR param, if set in the environment
or on the command line)
diff --git a/deps/npm/man/man5/package.json.5 b/deps/npm/man/man5/package.json.5
index 89083280de..73ec3c3faa 100644
--- a/deps/npm/man/man5/package.json.5
+++ b/deps/npm/man/man5/package.json.5
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "PACKAGE\.JSON" "5" "May 2014" "" ""
+.TH "PACKAGE\.JSON" "5" "June 2014" "" ""
.
.SH "NAME"
\fBpackage.json\fR \-\- Specifics of npm\'s package\.json handling
diff --git a/deps/npm/man/man7/npm-coding-style.7 b/deps/npm/man/man7/npm-coding-style.7
index 5014ba53cb..863ec301ca 100644
--- a/deps/npm/man/man7/npm-coding-style.7
+++ b/deps/npm/man/man7/npm-coding-style.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CODING\-STYLE" "7" "May 2014" "" ""
+.TH "NPM\-CODING\-STYLE" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-coding-style\fR \-\- npm\'s "funny" coding style
diff --git a/deps/npm/man/man7/npm-config.7 b/deps/npm/man/man7/npm-config.7
index 6c96048d84..cdf5761dd4 100644
--- a/deps/npm/man/man7/npm-config.7
+++ b/deps/npm/man/man7/npm-config.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CONFIG" "7" "May 2014" "" ""
+.TH "NPM\-CONFIG" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-config\fR \-\- More than you probably want to know about npm configuration
@@ -24,7 +24,10 @@ values are case\-insensitive, so \fBNPM_CONFIG_FOO=bar\fR will work the
same\.
.
.SS "npmrc Files"
-The three relevant files are:
+The four relevant files are:
+.
+.IP "\(bu" 4
+per\-project config file (/path/to/my/project/\.npmrc)
.
.IP "\(bu" 4
per\-user config file (~/\.npmrc)
@@ -1248,6 +1251,24 @@ using \fB\-s\fR to add a signature\.
Note that git requires you to have set up GPG keys in your git configs
for this to work properly\.
.
+.SS "spin"
+.
+.IP "\(bu" 4
+Default: true
+.
+.IP "\(bu" 4
+Type: Boolean or \fB"always"\fR
+.
+.IP "" 0
+.
+.P
+When set to \fBtrue\fR, npm will display an ascii spinner while it is doing
+things, if \fBprocess\.stderr\fR is a TTY\.
+.
+.P
+Set to \fBfalse\fR to suppress the spinner, or set to \fBalways\fR to output
+the spinner even for non\-TTY outputs\.
+.
.SS "strict\-ssl"
.
.IP "\(bu" 4
diff --git a/deps/npm/man/man7/npm-developers.7 b/deps/npm/man/man7/npm-developers.7
index 1122e23af8..70fbb46af6 100644
--- a/deps/npm/man/man7/npm-developers.7
+++ b/deps/npm/man/man7/npm-developers.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEVELOPERS" "7" "May 2014" "" ""
+.TH "NPM\-DEVELOPERS" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-developers\fR \-\- Developer Guide
diff --git a/deps/npm/man/man7/npm-disputes.7 b/deps/npm/man/man7/npm-disputes.7
index 942d530bb8..abcb426cb6 100644
--- a/deps/npm/man/man7/npm-disputes.7
+++ b/deps/npm/man/man7/npm-disputes.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DISPUTES" "7" "May 2014" "" ""
+.TH "NPM\-DISPUTES" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-disputes\fR \-\- Handling Module Name Disputes
diff --git a/deps/npm/man/man7/npm-faq.7 b/deps/npm/man/man7/npm-faq.7
index c84a06d37d..f15f24ef97 100644
--- a/deps/npm/man/man7/npm-faq.7
+++ b/deps/npm/man/man7/npm-faq.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-FAQ" "7" "May 2014" "" ""
+.TH "NPM\-FAQ" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-faq\fR \-\- Frequently Asked Questions
@@ -340,7 +340,7 @@ change it again? npm doesn\'t currently track any state about past
configuration settings, so this would be rather difficult to do
properly\. It would have to track every previous value for this
config, and always accept any of them, or else yesterday\'s install may
-be broken tomorrow\. Complexity hurdle #5\.
+be broken tomorrow\. Complexity hurdle #4\.
.
.P
Never going to happen\. The folder is named \fBnode_modules\fR\|\. It is
@@ -436,7 +436,7 @@ contributed to it, some of them quite substantially\.
.P
The npm open source project, The npm Registry, and the community
website \fIhttps://www\.npmjs\.org\fR are maintained and operated by the
-good folks at npm, Inc\. \fIhttps://www\.npmjs\.com\fR
+good folks at npm, Inc\. \fIhttp://www\.npmjs\.com\fR
.
.SH "I have a question or request not addressed here\. Where should I put it?"
Post an issue on the github project:
diff --git a/deps/npm/man/man7/npm-index.7 b/deps/npm/man/man7/npm-index.7
index 576a047d3b..87d7308498 100644
--- a/deps/npm/man/man7/npm-index.7
+++ b/deps/npm/man/man7/npm-index.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INDEX" "7" "May 2014" "" ""
+.TH "NPM\-INDEX" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-index\fR \-\- Index of all npm documentation
@@ -159,6 +159,9 @@ Display npm bin folder
npm apihelp .SH "npm\-bugs"
Bugs for a package in a web browser maybe
.
+npm apihelp .SH "npm\-cache"
+manage the npm cache programmatically
+.
npm apihelp .SH "npm\-commands"
npm commands
.
diff --git a/deps/npm/man/man7/npm-registry.7 b/deps/npm/man/man7/npm-registry.7
index a6f4e7367f..09163fbc42 100644
--- a/deps/npm/man/man7/npm-registry.7
+++ b/deps/npm/man/man7/npm-registry.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REGISTRY" "7" "May 2014" "" ""
+.TH "NPM\-REGISTRY" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-registry\fR \-\- The JavaScript Package Registry
diff --git a/deps/npm/man/man7/npm-scripts.7 b/deps/npm/man/man7/npm-scripts.7
index 10f83192fc..03c5a52298 100644
--- a/deps/npm/man/man7/npm-scripts.7
+++ b/deps/npm/man/man7/npm-scripts.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SCRIPTS" "7" "May 2014" "" ""
+.TH "NPM\-SCRIPTS" "7" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-scripts\fR \-\- How npm handles the "scripts" field
@@ -63,7 +63,7 @@ stop and start scripts if no \fBrestart\fR script is provided\.
.IP "" 0
.
.P
-Additionally, arbitrary scripts can be run by doing \fBnpm run\-script <stage> <pkg>\fR\|\.
+Additionally, arbitrary scripts can be run by doing \fBnpm run\-script <pkg> <stage>\fR\|\.
.
.SH "NOTE: INSTALL SCRIPTS ARE AN ANTIPATTERN"
\fBtl;dr\fR Don\'t use \fBinstall\fR\|\. Use a \fB\|\.gyp\fR file for compilation, and \fBprepublish\fR for anything else\.
diff --git a/deps/npm/man/man7/removing-npm.7 b/deps/npm/man/man7/removing-npm.7
index 1ae454573e..b73ed56af5 100644
--- a/deps/npm/man/man7/removing-npm.7
+++ b/deps/npm/man/man7/removing-npm.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REMOVAL" "1" "May 2014" "" ""
+.TH "NPM\-REMOVAL" "1" "June 2014" "" ""
.
.SH "NAME"
\fBnpm-removal\fR \-\- Cleaning the Slate
diff --git a/deps/npm/man/man7/semver.7 b/deps/npm/man/man7/semver.7
index 6f7ebf1dde..662b9c8f2e 100644
--- a/deps/npm/man/man7/semver.7
+++ b/deps/npm/man/man7/semver.7
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "SEMVER" "7" "May 2014" "" ""
+.TH "SEMVER" "7" "June 2014" "" ""
.
.SH "NAME"
\fBsemver\fR \-\- The semantic versioner for npm
@@ -43,7 +43,7 @@ multiple versions to the utility will just sort them\.
.IP "" 0
.
.SH "Versions"
-A "version" is described by the v2\.0\.0 specification found at \fIhttp://semver\.org/\fR\|\.
+A "version" is described by the \fBv2\.0\.0\fR specification found at \fIhttp://semver\.org/\fR\|\.
.
.P
A leading \fB"="\fR or \fB"v"\fR character is stripped off and ignored\.
@@ -52,9 +52,10 @@ A leading \fB"="\fR or \fB"v"\fR character is stripped off and ignored\.
The following range styles are supported:
.
.IP "\(bu" 4
-\fB1\.2\.3\fR A specific version\. When nothing else will do\. Note that
-build metadata is still ignored, so \fB1\.2\.3+build2012\fR will satisfy
-this range\.
+\fB1\.2\.3\fR A specific version\. When nothing else will do\. Must be a full
+version number, with major, minor, and patch versions specified\.
+Note that build metadata is still ignored, so \fB1\.2\.3+build2012\fR will
+satisfy this range\.
.
.IP "\(bu" 4
\fB>1\.2\.3\fR Greater than a specific version\.
@@ -77,44 +78,65 @@ ARE allowed, so \fB1\.2\.3\-beta\fR would satisfy\.
\fB1\.2\.3 \- 2\.3\.4\fR := \fB>=1\.2\.3 <=2\.3\.4\fR
.
.IP "\(bu" 4
-\fB~1\.2\.3\fR := \fB>=1\.2\.3\-0 <1\.3\.0\-0\fR "Reasonably close to 1\.2\.3"\. When
+\fB~1\.2\.3\fR := \fB>=1\.2\.3\-0 <1\.3\.0\-0\fR "Reasonably close to \fB1\.2\.3\fR"\. When
using tilde operators, prerelease versions are supported as well,
but a prerelease of the next significant digit will NOT be
satisfactory, so \fB1\.3\.0\-beta\fR will not satisfy \fB~1\.2\.3\fR\|\.
.
.IP "\(bu" 4
-\fB^1\.2\.3\fR := \fB>=1\.2\.3\-0 <2\.0\.0\-0\fR "Compatible with 1\.2\.3"\. When
+\fB^1\.2\.3\fR := \fB>=1\.2\.3\-0 <2\.0\.0\-0\fR "Compatible with \fB1\.2\.3\fR"\. When
using caret operators, anything from the specified version (including
prerelease) will be supported up to, but not including, the next
major version (or its prereleases)\. \fB1\.5\.1\fR will satisfy \fB^1\.2\.3\fR,
while \fB1\.2\.2\fR and \fB2\.0\.0\-beta\fR will not\.
.
.IP "\(bu" 4
-\fB^0\.1\.3\fR := \fB>=0\.1\.3\-0 <0\.2\.0\-0\fR "Compatible with 0\.1\.3"\. 0\.x\.x versions are
+\fB^0\.1\.3\fR := \fB>=0\.1\.3\-0 <0\.2\.0\-0\fR "Compatible with \fB0\.1\.3\fR"\. \fB0\.x\.x\fR versions are
special: the first non\-zero component indicates potentially breaking changes,
meaning the caret operator matches any version with the same first non\-zero
component starting at the specified version\.
.
.IP "\(bu" 4
-\fB^0\.0\.2\fR := \fB=0\.0\.2\fR "Only the version 0\.0\.2 is considered compatible"
+\fB^0\.0\.2\fR := \fB=0\.0\.2\fR "Only the version \fB0\.0\.2\fR is considered compatible"
.
.IP "\(bu" 4
-\fB~1\.2\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with 1\.2"
+\fB~1\.2\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with \fB1\.2\fR"
.
.IP "\(bu" 4
-\fB^1\.2\fR := \fB>=1\.2\.0\-0 <2\.0\.0\-0\fR "Any version compatible with 1\.2"
+\fB^1\.2\fR := \fB>=1\.2\.0\-0 <2\.0\.0\-0\fR "Any version compatible with \fB1\.2\fR"
.
.IP "\(bu" 4
-\fB1\.2\.x\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with 1\.2"
+\fB1\.2\.x\fR := \fB>=1\.2\.0\-0 <1\.3\.0\-0\fR "Any version starting with \fB1\.2\fR"
.
.IP "\(bu" 4
-\fB~1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with 1"
+\fB1\.2\.*\fR Same as \fB1\.2\.x\fR\|\.
.
.IP "\(bu" 4
-\fB^1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version compatible with 1"
+\fB1\.2\fR Same as \fB1\.2\.x\fR\|\.
.
.IP "\(bu" 4
-\fB1\.x\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with 1"
+\fB~1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with \fB1\fR"
+.
+.IP "\(bu" 4
+\fB^1\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version compatible with \fB1\fR"
+.
+.IP "\(bu" 4
+\fB1\.x\fR := \fB>=1\.0\.0\-0 <2\.0\.0\-0\fR "Any version starting with \fB1\fR"
+.
+.IP "\(bu" 4
+\fB1\.*\fR Same as \fB1\.x\fR\|\.
+.
+.IP "\(bu" 4
+\fB1\fR Same as \fB1\.x\fR\|\.
+.
+.IP "\(bu" 4
+\fB*\fR Any version whatsoever\.
+.
+.IP "\(bu" 4
+\fBx\fR Same as \fB*\fR\|\.
+.
+.IP "\(bu" 4
+\fB""\fR (just an empty string) Same as \fB*\fR\|\.
.
.IP "" 0
.
@@ -131,75 +153,86 @@ Strict\-mode Comparators and Ranges will be strict about the SemVer
strings that they parse\.
.
.IP "\(bu" 4
-valid(v): Return the parsed version, or null if it\'s not valid\.
+\fBvalid(v)\fR: Return the parsed version, or null if it\'s not valid\.
+.
+.IP "\(bu" 4
+\fBinc(v, release)\fR\fBmajor\fR\fBpremajor\fR\fBminor\fR\fBpreminor\fR\fBpatch\fR\fBprepatch\fR\fBprerelease\fR
+.
+.IP "\(bu" 4
+\fBpremajor\fR in one call will bump the version up to the next major
+version and down to a prerelease of that major version\. \fBpreminor\fR, and \fBprepatch\fR work the same way\.
.
.IP "\(bu" 4
-inc(v, release): Return the version incremented by the release type
-(major, minor, patch, or prerelease), or null if it\'s not valid\.
+If called from a non\-prerelease version, the \fBprerelease\fR will work the
+same as \fBprepatch\fR\|\. It increments the patch version, then makes a
+prerelease\. If the input version is already a prerelease it simply
+increments it\.
+.
+.IP "" 0
+
.
.IP "" 0
.
.SS "Comparison"
.
.IP "\(bu" 4
-gt(v1, v2): \fBv1 > v2\fR
+\fBgt(v1, v2)\fR: \fBv1 > v2\fR
.
.IP "\(bu" 4
-gte(v1, v2): \fBv1 >= v2\fR
+\fBgte(v1, v2)\fR: \fBv1 >= v2\fR
.
.IP "\(bu" 4
-lt(v1, v2): \fBv1 < v2\fR
+\fBlt(v1, v2)\fR: \fBv1 < v2\fR
.
.IP "\(bu" 4
-lte(v1, v2): \fBv1 <= v2\fR
+\fBlte(v1, v2)\fR: \fBv1 <= v2\fR
.
.IP "\(bu" 4
-eq(v1, v2): \fBv1 == v2\fR This is true if they\'re logically equivalent,
+\fBeq(v1, v2)\fR: \fBv1 == v2\fR This is true if they\'re logically equivalent,
even if they\'re not the exact same string\. You already know how to
compare strings\.
.
.IP "\(bu" 4
-neq(v1, v2): \fBv1 != v2\fR The opposite of eq\.
+\fBneq(v1, v2)\fR: \fBv1 != v2\fR The opposite of \fBeq\fR\|\.
.
.IP "\(bu" 4
-cmp(v1, comparator, v2): Pass in a comparison string, and it\'ll call
+\fBcmp(v1, comparator, v2)\fR: Pass in a comparison string, and it\'ll call
the corresponding function above\. \fB"==="\fR and \fB"!=="\fR do simple
string comparison, but are included for completeness\. Throws if an
invalid comparison string is provided\.
.
.IP "\(bu" 4
-compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or \-1 if
-v2 is greater\. Sorts in ascending order if passed to Array\.sort()\.
+\fBcompare(v1, v2)\fR: Return \fB0\fR if \fBv1 == v2\fR, or \fB1\fR if \fBv1\fR is greater, or \fB\-1\fR if \fBv2\fR is greater\. Sorts in ascending order if passed to \fBArray\.sort()\fR\|\.
.
.IP "\(bu" 4
-rcompare(v1, v2): The reverse of compare\. Sorts an array of versions
-in descending order when passed to Array\.sort()\.
+\fBrcompare(v1, v2)\fR: The reverse of compare\. Sorts an array of versions
+in descending order when passed to \fBArray\.sort()\fR\|\.
.
.IP "" 0
.
.SS "Ranges"
.
.IP "\(bu" 4
-validRange(range): Return the valid range or null if it\'s not valid
+\fBvalidRange(range)\fR: Return the valid range or null if it\'s not valid
.
.IP "\(bu" 4
-satisfies(version, range): Return true if the version satisfies the
+\fBsatisfies(version, range)\fR: Return true if the version satisfies the
range\.
.
.IP "\(bu" 4
-maxSatisfying(versions, range): Return the highest version in the list
-that satisfies the range, or null if none of them do\.
+\fBmaxSatisfying(versions, range)\fR: Return the highest version in the list
+that satisfies the range, or \fBnull\fR if none of them do\.
.
.IP "\(bu" 4
-gtr(version, range): Return true if version is greater than all the
+\fBgtr(version, range)\fR: Return \fBtrue\fR if version is greater than all the
versions possible in the range\.
.
.IP "\(bu" 4
-ltr(version, range): Return true if version is less than all the
+\fBltr(version, range)\fR: Return \fBtrue\fR if version is less than all the
versions possible in the range\.
.
.IP "\(bu" 4
-outside(version, range, hilo): Return true if the version is outside
+\fBoutside(version, range, hilo)\fR: Return true if the version is outside
the bounds of the range in either the high or low direction\. The \fBhilo\fR argument must be either the string \fB\'>\'\fR or \fB\'<\'\fR\|\. (This is
the function called by \fBgtr\fR and \fBltr\fR\|\.)
.
@@ -210,8 +243,8 @@ Note that, since ranges may be non\-contiguous, a version might not be
greater than a range, less than a range, \fIor\fR satisfy a range! For
example, the range \fB1\.2 <1\.2\.9 || >2\.0\.0\fR would have a hole from \fB1\.2\.9\fR
until \fB2\.0\.0\fR, so the version \fB1\.2\.10\fR would not be greater than the
-range (because 2\.0\.1 satisfies, which is higher), nor less than the
-range (since 1\.2\.8 satisfies, which is lower), and it also does not
+range (because \fB2\.0\.1\fR satisfies, which is higher), nor less than the
+range (since \fB1\.2\.8\fR satisfies, which is lower), and it also does not
satisfy the range\.
.
.P
diff --git a/deps/npm/node_modules/abbrev/CONTRIBUTING.md b/deps/npm/node_modules/abbrev/CONTRIBUTING.md
new file mode 100644
index 0000000000..2f302612f8
--- /dev/null
+++ b/deps/npm/node_modules/abbrev/CONTRIBUTING.md
@@ -0,0 +1,3 @@
+ To get started, <a
+ href="http://www.clahub.com/agreements/isaacs/abbrev-js">sign the
+ Contributor License Agreement</a>.
diff --git a/deps/npm/node_modules/abbrev/lib/abbrev.js b/deps/npm/node_modules/abbrev/abbrev.js
index bee4132c92..69cfeac521 100644
--- a/deps/npm/node_modules/abbrev/lib/abbrev.js
+++ b/deps/npm/node_modules/abbrev/abbrev.js
@@ -60,52 +60,3 @@ function abbrev (list) {
function lexSort (a, b) {
return a === b ? 0 : a > b ? 1 : -1
}
-
-
-// tests
-if (module === require.main) {
-
-var assert = require("assert")
-var util = require("util")
-
-console.log("running tests")
-function test (list, expect) {
- var actual = abbrev(list)
- assert.deepEqual(actual, expect,
- "abbrev("+util.inspect(list)+") === " + util.inspect(expect) + "\n"+
- "actual: "+util.inspect(actual))
- actual = abbrev.apply(exports, list)
- assert.deepEqual(abbrev.apply(exports, list), expect,
- "abbrev("+list.map(JSON.stringify).join(",")+") === " + util.inspect(expect) + "\n"+
- "actual: "+util.inspect(actual))
-}
-
-test([ "ruby", "ruby", "rules", "rules", "rules" ],
-{ rub: 'ruby'
-, ruby: 'ruby'
-, rul: 'rules'
-, rule: 'rules'
-, rules: 'rules'
-})
-test(["fool", "foom", "pool", "pope"],
-{ fool: 'fool'
-, foom: 'foom'
-, poo: 'pool'
-, pool: 'pool'
-, pop: 'pope'
-, pope: 'pope'
-})
-test(["a", "ab", "abc", "abcd", "abcde", "acde"],
-{ a: 'a'
-, ab: 'ab'
-, abc: 'abc'
-, abcd: 'abcd'
-, abcde: 'abcde'
-, ac: 'acde'
-, acd: 'acde'
-, acde: 'acde'
-})
-
-console.log("pass")
-
-}
diff --git a/deps/npm/node_modules/abbrev/package.json b/deps/npm/node_modules/abbrev/package.json
index bea853e6ec..bac363a188 100644
--- a/deps/npm/node_modules/abbrev/package.json
+++ b/deps/npm/node_modules/abbrev/package.json
@@ -1,14 +1,14 @@
{
"name": "abbrev",
- "version": "1.0.4",
+ "version": "1.0.5",
"description": "Like ruby's abbrev module, but in js",
"author": {
"name": "Isaac Z. Schlueter",
"email": "i@izs.me"
},
- "main": "./lib/abbrev.js",
+ "main": "abbrev.js",
"scripts": {
- "test": "node lib/abbrev.js"
+ "test": "node test.js"
},
"repository": {
"type": "git",
@@ -18,8 +18,28 @@
"type": "MIT",
"url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE"
},
- "readme": "# abbrev-js\n\nJust like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).\n\nUsage:\n\n var abbrev = require(\"abbrev\");\n abbrev(\"foo\", \"fool\", \"folding\", \"flop\");\n \n // returns:\n { fl: 'flop'\n , flo: 'flop'\n , flop: 'flop'\n , fol: 'folding'\n , fold: 'folding'\n , foldi: 'folding'\n , foldin: 'folding'\n , folding: 'folding'\n , foo: 'foo'\n , fool: 'fool'\n }\n\nThis is handy for command-line scripts, or other cases where you want to be able to accept shorthands.\n",
- "readmeFilename": "README.md",
- "_id": "abbrev@1.0.4",
- "_from": "abbrev@latest"
+ "bugs": {
+ "url": "https://github.com/isaacs/abbrev-js/issues"
+ },
+ "homepage": "https://github.com/isaacs/abbrev-js",
+ "_id": "abbrev@1.0.5",
+ "_shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03",
+ "_from": "abbrev@latest",
+ "_npmVersion": "1.4.7",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03",
+ "tarball": "http://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz"
}
diff --git a/deps/npm/node_modules/abbrev/test.js b/deps/npm/node_modules/abbrev/test.js
new file mode 100644
index 0000000000..d5a7303ed6
--- /dev/null
+++ b/deps/npm/node_modules/abbrev/test.js
@@ -0,0 +1,47 @@
+var abbrev = require('./abbrev.js')
+var assert = require("assert")
+var util = require("util")
+
+console.log("TAP Version 13")
+var count = 0
+
+function test (list, expect) {
+ count++
+ var actual = abbrev(list)
+ assert.deepEqual(actual, expect,
+ "abbrev("+util.inspect(list)+") === " + util.inspect(expect) + "\n"+
+ "actual: "+util.inspect(actual))
+ actual = abbrev.apply(exports, list)
+ assert.deepEqual(abbrev.apply(exports, list), expect,
+ "abbrev("+list.map(JSON.stringify).join(",")+") === " + util.inspect(expect) + "\n"+
+ "actual: "+util.inspect(actual))
+ console.log('ok - ' + list.join(' '))
+}
+
+test([ "ruby", "ruby", "rules", "rules", "rules" ],
+{ rub: 'ruby'
+, ruby: 'ruby'
+, rul: 'rules'
+, rule: 'rules'
+, rules: 'rules'
+})
+test(["fool", "foom", "pool", "pope"],
+{ fool: 'fool'
+, foom: 'foom'
+, poo: 'pool'
+, pool: 'pool'
+, pop: 'pope'
+, pope: 'pope'
+})
+test(["a", "ab", "abc", "abcd", "abcde", "acde"],
+{ a: 'a'
+, ab: 'ab'
+, abc: 'abc'
+, abcd: 'abcd'
+, abcde: 'abcde'
+, ac: 'acde'
+, acd: 'acde'
+, acde: 'acde'
+})
+
+console.log("0..%d", count)
diff --git a/deps/npm/node_modules/char-spinner/LICENSE b/deps/npm/node_modules/char-spinner/LICENSE
new file mode 100644
index 0000000000..05eeeb88c2
--- /dev/null
+++ b/deps/npm/node_modules/char-spinner/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/deps/npm/node_modules/char-spinner/README.md b/deps/npm/node_modules/char-spinner/README.md
new file mode 100644
index 0000000000..b1290f5925
--- /dev/null
+++ b/deps/npm/node_modules/char-spinner/README.md
@@ -0,0 +1,31 @@
+# char-spinner
+
+Put a little spinner on process.stderr, as unobtrusively as possible.
+
+## USAGE
+
+```javascript
+var spinner = require("char-spinner")
+
+// All options are optional
+// even the options argument itself is optional
+spinner(options)
+```
+
+## OPTIONS
+
+Usually the defaults are what you want. Mostly they're just
+configurable for testing purposes.
+
+* `stream` Output stream. Default=`process.stderr`
+* `tty` Only show spinner if output stream has a truish `.isTTY`. Default=`true`
+* `string` String of chars to spin. Default=`'/-\\|'`
+* `interval` Number of ms between frames, bigger = slower. Default=`50`
+* `cleanup` Print `'\r \r'` to stream on process exit. Default=`true`
+* `unref` Unreference the spinner interval so that the process can
+ exit normally. Default=`true`
+* `delay` Number of frames to "skip over" before printing the spinner.
+ Useful if you want to avoid showing the spinner for very fast
+ actions. Default=`2`
+
+Returns the generated interval, if one was created.
diff --git a/deps/npm/node_modules/char-spinner/package.json b/deps/npm/node_modules/char-spinner/package.json
new file mode 100644
index 0000000000..91092d84bb
--- /dev/null
+++ b/deps/npm/node_modules/char-spinner/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "char-spinner",
+ "version": "1.0.1",
+ "description": "Put a little spinner on process.stderr, as unobtrusively as possible.",
+ "main": "spin.js",
+ "directories": {
+ "test": "test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "tap": "^0.4.10"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/char-spinner"
+ },
+ "keywords": [
+ "char",
+ "spinner"
+ ],
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/isaacs/char-spinner/issues"
+ },
+ "homepage": "https://github.com/isaacs/char-spinner",
+ "gitHead": "091b2ff5960aa083f68a5619fa93999d072aa152",
+ "_id": "char-spinner@1.0.1",
+ "_shasum": "e6ea67bd247e107112983b7ab0479ed362800081",
+ "_from": "char-spinner@latest",
+ "_npmVersion": "1.4.13",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "e6ea67bd247e107112983b7ab0479ed362800081",
+ "tarball": "http://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz"
+ },
+ "_resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz"
+}
diff --git a/deps/npm/node_modules/char-spinner/spin.js b/deps/npm/node_modules/char-spinner/spin.js
new file mode 100644
index 0000000000..cae8540c6f
--- /dev/null
+++ b/deps/npm/node_modules/char-spinner/spin.js
@@ -0,0 +1,51 @@
+module.exports = spinner
+
+function spinner(opt) {
+ opt = opt || {}
+ var str = opt.stream || process.stderr
+ var tty = typeof opt.tty === 'boolean' ? opt.tty : true
+ var string = opt.string || '/-\\|'
+ var ms = typeof opt.interval === 'number' ? opt.interval : 50
+ if (ms < 0) ms = 0
+ if (tty && !str.isTTY) return false
+ var CR = str.isTTY ? '\u001b[0G' : '\u000d';
+ var CLEAR = str.isTTY ? '\u001b[2K' : '\u000d \u000d';
+
+ var s = 0
+ var sprite = string.split('')
+ var wrote = false
+
+ var delay = typeof opt.delay === 'number' ? opt.delay : 2
+
+ var interval = setInterval(function() {
+ if (--delay >= 0) return
+ s = ++s % sprite.length
+ var c = sprite[s]
+ str.write(c + CR)
+ wrote = true
+ }, ms)
+
+ var unref = typeof opt.unref === 'boolean' ? opt.unref : true
+ if (unref && typeof interval.unref === 'function') {
+ interval.unref()
+ }
+
+ var cleanup = typeof opt.cleanup === 'boolean' ? opt.cleanup : true
+ if (cleanup) {
+ process.on('exit', function() {
+ if (wrote) {
+ str.write(CLEAR);
+ }
+ })
+ }
+
+ module.exports.clear = function () {
+ str.write(CLEAR);
+ };
+
+ return interval
+}
+
+module.exports.clear = function () {};
+
+
diff --git a/deps/npm/node_modules/char-spinner/test/basic.js b/deps/npm/node_modules/char-spinner/test/basic.js
new file mode 100644
index 0000000000..ed91b984f7
--- /dev/null
+++ b/deps/npm/node_modules/char-spinner/test/basic.js
@@ -0,0 +1,35 @@
+var test = require('tap').test
+var spinner = require('../spin.js')
+
+test('does nothing when not a tty', function(t) {
+ var int = spinner({
+ stream: { write: function(c) {
+ throw new Error('wrote something: ' + JSON.stringify(c))
+ }, isTTY: false },
+ })
+ t.notOk(int)
+ t.end()
+})
+
+test('write spinny stuff', function(t) {
+ var output = ''
+ var written = 0
+ var expect = "b\u001b[0Gc\u001b[0Gd\u001b[0Ge\u001b[0Gf\u001b[0Gg\u001b[0Gh\u001b[0Gi\u001b[0Gj\u001b[0Gk\u001b[0Gl\u001b[0Gm\u001b[0Gn\u001b[0Go\u001b[0Gp\u001b[0Ga\u001b[0Gb\u001b[0Gc\u001b[0Gd\u001b[0Ge\u001b[0Gf\u001b[0Gg\u001b[0Gh\u001b[0Gi\u001b[0Gj\u001b[0Gk\u001b[0Gl\u001b[0Gm\u001b[0Gn\u001b[0Go\u001b[0Gp\u001b[0Ga\u001b[0Gb\u001b[0Gc\u001b[0Gd\u001b[0Ge\u001b[0Gf\u001b[0Gg\u001b[0Gh\u001b[0Gi\u001b[0Gj\u001b[0Gk\u001b[0Gl\u001b[0Gm\u001b[0Gn\u001b[0Go\u001b[0Gp\u001b[0Ga\u001b[0Gb\u001b[0Gc\u001b[0G"
+
+ var int = spinner({
+ interval: 0,
+ string: 'abcdefghijklmnop',
+ stream: {
+ write: function(c) {
+ output += c
+ if (++written == 50) {
+ t.equal(output, expect)
+ clearInterval(int)
+ t.end()
+ }
+ },
+ isTTY: true
+ },
+ cleanup: false
+ })
+})
diff --git a/deps/npm/node_modules/columnify/package.json b/deps/npm/node_modules/columnify/package.json
index f4fa2cb2a4..5ad3d4a720 100644
--- a/deps/npm/node_modules/columnify/package.json
+++ b/deps/npm/node_modules/columnify/package.json
@@ -31,12 +31,24 @@
"url": "https://github.com/timoxley/columnify/issues"
},
"homepage": "https://github.com/timoxley/columnify",
- "readme": "# columnify\n\n[![Build Status](https://travis-ci.org/timoxley/columnify.png?branch=master)](https://travis-ci.org/timoxley/columnify)\n\nCreate text-based columns suitable for console output. \nSupports minimum and maximum column widths via truncation and text wrapping.\n\nDesigned to [handle sensible wrapping in npm search results](https://github.com/isaacs/npm/pull/2328).\n\n`npm search` before & after integrating columnify:\n\n![npm-tidy-search](https://f.cloud.github.com/assets/43438/1848959/ae02ad04-76a1-11e3-8255-4781debffc26.gif)\n\n## Installation & Update\n\n```\n$ npm install --save columnify@latest\n```\n\n## Usage\n\n```js\nvar columnify = require('columnify')\nvar columns = columnify(data, options)\nconsole.log(columns)\n```\n\n## Examples\n\n### Simple Columns\n\nText is aligned under column headings. Columns are automatically resized\nto fit the content of the largest cell. Each cell will be padded with\nspaces to fill the available space and ensure column contents are\nleft-aligned.\n\n```js\nvar columnify = require('columnify')\n\nvar columns = columnify([{\n name: 'mod1',\n version: '0.0.1'\n}, {\n name: 'module2',\n version: '0.2.0'\n}])\n\nconsole.log(columns)\n```\n```\nNAME VERSION\nmod1 0.0.1 \nmodule2 0.2.0 \n```\n\n### Wrapping Column Cells\n\nYou can define the maximum width before wrapping for individual cells in\ncolumns. Minimum width is also supported. Wrapping will happen at word\nboundaries. Empty cells or those which do not fill the max/min width\nwill be padded with spaces.\n\n```js\nvar columnify = require('columnify')\n\nvar columns = columnify([{\n name: 'mod1',\n description: 'some description which happens to be far larger than the max',\n version: '0.0.1',\n}, {\n name: 'module-two',\n description: 'another description larger than the max',\n version: '0.2.0',\n})\n\nconsole.log(columns)\n```\n```\nNAME DESCRIPTION VERSION\nmod1 some description which happens 0.0.1\n to be far larger than the max\nmodule-two another description larger 0.2.0\n than the max\n```\n\n### Truncated Columns\n\nYou can disable wrapping and instead truncate content at the maximum\ncolumn width. Truncation respects word boundaries. A truncation marker,\n`…` will appear next to the last word in any truncated line.\n\n```js\nvar columns = columnify(data, {\n truncate: true,\n config: {\n description: {\n maxWidth: 20\n }\n }\n})\n\nconsole.log(columns)\n```\n\n```\nNAME DESCRIPTION VERSION\nmod1 some description… 0.0.1 \nmodule-two another description… 0.2.0 \n```\n\n\n### Custom Truncation Marker\n\nYou can change the truncation marker to something other than the default\n`…`.\n\n```js\nvar columns = columnify(data, {\n truncate: true,\n truncateMarker: '>',\n widths: {\n description: {\n maxWidth: 20\n }\n }\n})\n\nconsole.log(columns)\n```\n\n```\nNAME DESCRIPTION VERSION\nmod1 some description> 0.0.1 \nmodule-two another description> 0.2.0 \n```\n\n### Custom Column Splitter\n\nIf your columns need some bling, you can split columns with custom\ncharacters.\n\n```js\n\nvar columns = columnify(data, {\n columnSplitter: ' | '\n})\n\nconsole.log(columns)\n```\n```\nNAME | DESCRIPTION | VERSION\nmod1 | some description which happens to be far larger than the max | 0.0.1\nmodule-two | another description larger than the max | 0.2.0\n```\n\n### Filtering & Ordering Columns\n\nBy default, all properties are converted into columns, whether or not\nthey exist on every object or not.\n\nTo explicitly specify which columns to include, and in which order,\nsupply an \"include\" array:\n\n```js\nvar data = [{\n name: 'module1',\n description: 'some description',\n version: '0.0.1',\n}, {\n name: 'module2',\n description: 'another description',\n version: '0.2.0',\n}]\n\nvar columns = columnify(data, {\n include: ['name', 'version'] // note description not included\n})\n\nconsole.log(columns)\n```\n\n```\nNAME VERSION\nmodule1 0.0.1\nmodule2 0.2.0\n```\n## License\n\nMIT\n",
- "readmeFilename": "Readme.md",
"_id": "columnify@0.1.2",
"dist": {
- "shasum": "ab1a1f1e37b26ba4b87c6920fb717fe51c827042"
+ "shasum": "ab1a1f1e37b26ba4b87c6920fb717fe51c827042",
+ "tarball": "http://registry.npmjs.org/columnify/-/columnify-0.1.2.tgz"
},
"_from": "columnify@0.1.2",
+ "_npmVersion": "1.3.23",
+ "_npmUser": {
+ "name": "timoxley",
+ "email": "secoif@gmail.com"
+ },
+ "maintainers": [
+ {
+ "name": "timoxley",
+ "email": "secoif@gmail.com"
+ }
+ ],
+ "directories": {},
+ "_shasum": "ab1a1f1e37b26ba4b87c6920fb717fe51c827042",
"_resolved": "https://registry.npmjs.org/columnify/-/columnify-0.1.2.tgz"
}
diff --git a/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json b/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
index fcf03f281e..a4794004c3 100644
--- a/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
+++ b/deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json
@@ -6,7 +6,7 @@
},
"name": "fstream-ignore",
"description": "A thing for ignoring files based on globs",
- "version": "0.0.7",
+ "version": "0.0.8",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream-ignore.git"
@@ -16,9 +16,9 @@
"test": "tap test/*.js"
},
"dependencies": {
- "minimatch": "~0.2.0",
"fstream": "~0.1.17",
- "inherits": "2"
+ "inherits": "2",
+ "minimatch": "^0.3.0"
},
"devDependencies": {
"tap": "",
@@ -26,15 +26,30 @@
"mkdirp": ""
},
"license": "BSD",
- "readme": "# fstream-ignore\n\nA fstream DirReader that filters out files that match globs in `.ignore`\nfiles throughout the tree, like how git ignores files based on a\n`.gitignore` file.\n\nHere's an example:\n\n```javascript\nvar Ignore = require(\"fstream-ignore\")\nIgnore({ path: __dirname\n , ignoreFiles: [\".ignore\", \".gitignore\"]\n })\n .on(\"child\", function (c) {\n console.error(c.path.substr(c.root.path.length + 1))\n })\n .pipe(tar.Pack())\n .pipe(fs.createWriteStream(\"foo.tar\"))\n```\n\nThis will tar up the files in __dirname into `foo.tar`, ignoring\nanything matched by the globs in any .iginore or .gitignore file.\n",
- "readmeFilename": "README.md",
+ "gitHead": "8dfc936e8b2d25c0d82042b73a22c659e6e69a1e",
"bugs": {
"url": "https://github.com/isaacs/fstream-ignore/issues"
},
- "_id": "fstream-ignore@0.0.7",
+ "homepage": "https://github.com/isaacs/fstream-ignore",
+ "_id": "fstream-ignore@0.0.8",
+ "_shasum": "cc4830fb9963178be5d9eb37569a4a0785cf9e53",
+ "_from": "fstream-ignore@~0.0",
+ "_npmVersion": "1.4.10",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
"dist": {
- "shasum": "eea3033f0c3728139de7b57ab1b0d6d89c353c63"
+ "shasum": "cc4830fb9963178be5d9eb37569a4a0785cf9e53",
+ "tarball": "http://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.8.tgz"
},
- "_from": "fstream-ignore@~0.0.5",
- "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz"
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.8.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/fstream-npm/package.json b/deps/npm/node_modules/fstream-npm/package.json
index 7769921d88..299148af50 100644
--- a/deps/npm/node_modules/fstream-npm/package.json
+++ b/deps/npm/node_modules/fstream-npm/package.json
@@ -6,22 +6,26 @@
},
"name": "fstream-npm",
"description": "fstream class for creating npm packages",
- "version": "0.1.6",
+ "version": "0.1.7",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream-npm.git"
},
"main": "./fstream-npm.js",
"dependencies": {
- "fstream-ignore": "~0.0.5",
+ "fstream-ignore": "~0.0",
"inherits": "2"
},
"license": "BSD",
"readme": "# fstream-npm\n\nThis is an fstream DirReader class that will read a directory and filter\nthings according to the semantics of what goes in an npm package.\n\nFor example:\n\n```javascript\n// This will print out all the files that would be included\n// by 'npm publish' or 'npm install' of this directory.\n\nvar FN = require(\"fstream-npm\")\nFN({ path: \"./\" })\n .on(\"child\", function (e) {\n console.error(e.path.substr(e.root.path.length + 1))\n })\n```\n\n",
"readmeFilename": "README.md",
+ "gitHead": "13839c9be784f2addc9352d525b35835fba01151",
"bugs": {
"url": "https://github.com/isaacs/fstream-npm/issues"
},
- "_id": "fstream-npm@0.1.6",
+ "homepage": "https://github.com/isaacs/fstream-npm",
+ "_id": "fstream-npm@0.1.7",
+ "scripts": {},
+ "_shasum": "423dc5d1d1fcb7d878501f43c7e11a33292bd55f",
"_from": "fstream-npm@latest"
}
diff --git a/deps/npm/node_modules/github-url-from-username-repo/package.json b/deps/npm/node_modules/github-url-from-username-repo/package.json
index 239ba77393..7eadf899d3 100644
--- a/deps/npm/node_modules/github-url-from-username-repo/package.json
+++ b/deps/npm/node_modules/github-url-from-username-repo/package.json
@@ -26,13 +26,26 @@
"github",
"repo"
],
- "readme": "[![Build Status](https://travis-ci.org/robertkowalski/github-url-from-username-repo.png?branch=master)](https://travis-ci.org/robertkowalski/github-url-from-username-repo)\n[![Dependency Status](https://gemnasium.com/robertkowalski/github-url-from-username-repo.png)](https://gemnasium.com/robertkowalski/github-url-from-username-repo)\n\n\n# github-url-from-username-repo\n\n## Usage\n\n```javascript\n\nvar getUrl = require(\"github-url-from-username-repo\")\ngetUrl(\"visionmedia/express\") // git://github.com/visionmedia/express\n\n```",
- "readmeFilename": "README.md",
"homepage": "https://github.com/robertkowalski/github-url-from-username-repo",
"_id": "github-url-from-username-repo@0.1.0",
"dist": {
- "shasum": "fe398af670692e91af7bcfc5ae1d99ff97b1df89"
+ "shasum": "fe398af670692e91af7bcfc5ae1d99ff97b1df89",
+ "tarball": "http://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-0.1.0.tgz"
},
- "_from": "github-url-from-username-repo@0.1.0",
- "_resolved": "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-0.1.0.tgz"
+ "_from": "github-url-from-username-repo@~0.1.0",
+ "_npmVersion": "1.4.6",
+ "_npmUser": {
+ "name": "robertkowalski",
+ "email": "rok@kowalski.gd"
+ },
+ "maintainers": [
+ {
+ "name": "robertkowalski",
+ "email": "rok@kowalski.gd"
+ }
+ ],
+ "directories": {},
+ "_shasum": "fe398af670692e91af7bcfc5ae1d99ff97b1df89",
+ "_resolved": "https://registry.npmjs.org/github-url-from-username-repo/-/github-url-from-username-repo-0.1.0.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/glob/package.json b/deps/npm/node_modules/glob/package.json
index 71f32cd490..795af8cbe3 100644
--- a/deps/npm/node_modules/glob/package.json
+++ b/deps/npm/node_modules/glob/package.json
@@ -6,7 +6,7 @@
},
"name": "glob",
"description": "a little globber",
- "version": "3.2.9",
+ "version": "3.2.10",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/node-glob.git"
@@ -16,8 +16,8 @@
"node": "*"
},
"dependencies": {
- "minimatch": "~0.2.11",
- "inherits": "2"
+ "inherits": "2",
+ "minimatch": "^0.3.0"
},
"devDependencies": {
"tap": "~0.4.0",
@@ -31,10 +31,12 @@
"license": "BSD",
"readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array<String>} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array<String>} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array<String>} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n",
"readmeFilename": "README.md",
+ "gitHead": "4e00805b5529af626bf0512d6810c27a96ca2a12",
"bugs": {
"url": "https://github.com/isaacs/node-glob/issues"
},
"homepage": "https://github.com/isaacs/node-glob",
- "_id": "glob@3.2.9",
+ "_id": "glob@3.2.10",
+ "_shasum": "e229a4d843fdabca3dd8cdc96c456e29c6e79f13",
"_from": "glob@latest"
}
diff --git a/deps/npm/node_modules/inflight/LICENSE b/deps/npm/node_modules/inflight/LICENSE
new file mode 100644
index 0000000000..05eeeb88c2
--- /dev/null
+++ b/deps/npm/node_modules/inflight/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/deps/npm/node_modules/inflight/README.md b/deps/npm/node_modules/inflight/README.md
new file mode 100644
index 0000000000..6dc8929171
--- /dev/null
+++ b/deps/npm/node_modules/inflight/README.md
@@ -0,0 +1,37 @@
+# inflight
+
+Add callbacks to requests in flight to avoid async duplication
+
+## USAGE
+
+```javascript
+var inflight = require('inflight')
+
+// some request that does some stuff
+function req(key, callback) {
+ // key is any random string. like a url or filename or whatever.
+ //
+ // will return either a falsey value, indicating that the
+ // request for this key is already in flight, or a new callback
+ // which when called will call all callbacks passed to inflightk
+ // with the same key
+ callback = inflight(key, callback)
+
+ // If we got a falsey value back, then there's already a req going
+ if (!callback) return
+
+ // this is where you'd fetch the url or whatever
+ // callback is also once()-ified, so it can safely be assigned
+ // to multiple events etc. First call wins.
+ setTimeout(function() {
+ callback(null, key)
+ }, 100)
+}
+
+// only assigns a single setTimeout
+// when it dings, all cbs get called
+req('foo', cb1)
+req('foo', cb2)
+req('foo', cb3)
+req('foo', cb4)
+```
diff --git a/deps/npm/node_modules/inflight/inflight.js b/deps/npm/node_modules/inflight/inflight.js
new file mode 100644
index 0000000000..1fe279f9ad
--- /dev/null
+++ b/deps/npm/node_modules/inflight/inflight.js
@@ -0,0 +1,25 @@
+module.exports = inflight
+
+var reqs = Object.create(null)
+var once = require('once')
+
+function inflight (key, cb) {
+ if (reqs[key]) {
+ reqs[key].push(cb)
+ return null
+ } else {
+ reqs[key] = [cb]
+ return makeres(key)
+ }
+}
+
+function makeres(key) {
+ return once(res)
+ function res(error, data) {
+ var cbs = reqs[key]
+ delete reqs[key]
+ cbs.forEach(function(cb) {
+ cb(error, data)
+ })
+ }
+}
diff --git a/deps/npm/node_modules/inflight/package.json b/deps/npm/node_modules/inflight/package.json
new file mode 100644
index 0000000000..f4e294aadf
--- /dev/null
+++ b/deps/npm/node_modules/inflight/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "inflight",
+ "version": "1.0.1",
+ "description": "Add callbacks to requests in flight to avoid async duplication",
+ "main": "inflight.js",
+ "dependencies": {
+ "once": "^1.3.0"
+ },
+ "devDependencies": {
+ "tap": "^0.4.10"
+ },
+ "scripts": {
+ "test": "tap test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/inflight"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/inflight/issues"
+ },
+ "homepage": "https://github.com/isaacs/inflight",
+ "license": "ISC",
+ "_id": "inflight@1.0.1",
+ "_shasum": "01f6911821535243c790ac0f998f54e9023ffb6f",
+ "_from": "inflight@~1.0.1",
+ "_npmVersion": "1.4.9",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "01f6911821535243c790ac0f998f54e9023ffb6f",
+ "tarball": "http://registry.npmjs.org/inflight/-/inflight-1.0.1.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.1.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/deps/npm/node_modules/inflight/test.js b/deps/npm/node_modules/inflight/test.js
new file mode 100644
index 0000000000..28fc145034
--- /dev/null
+++ b/deps/npm/node_modules/inflight/test.js
@@ -0,0 +1,33 @@
+var test = require('tap').test
+var inf = require('./inflight.js')
+
+
+function req (key, cb) {
+ cb = inf(key, cb)
+ if (cb) setTimeout(function () {
+ cb(key)
+ cb(key)
+ })
+ return cb
+}
+
+test('basic', function (t) {
+ var calleda = false
+ var a = req('key', function (k) {
+ t.notOk(calleda)
+ calleda = true
+ t.equal(k, 'key')
+ if (calledb) t.end()
+ })
+ t.ok(a, 'first returned cb function')
+
+ var calledb = false
+ var b = req('key', function (k) {
+ t.notOk(calledb)
+ calledb = true
+ t.equal(k, 'key')
+ if (calleda) t.end()
+ })
+
+ t.notOk(b, 'second should get falsey inflight response')
+})
diff --git a/deps/npm/node_modules/ini/.npmignore b/deps/npm/node_modules/ini/.npmignore
new file mode 100644
index 0000000000..3c3629e647
--- /dev/null
+++ b/deps/npm/node_modules/ini/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/deps/npm/node_modules/ini/ini.js b/deps/npm/node_modules/ini/ini.js
index eaf3209331..1d1e6e9341 100644
--- a/deps/npm/node_modules/ini/ini.js
+++ b/deps/npm/node_modules/ini/ini.js
@@ -42,12 +42,12 @@ function encode (obj, section) {
}
function dotSplit (str) {
- return str.replace(/\1/g, '\2LITERAL\\1LITERAL\2')
- .replace(/\\\./g, '\1')
+ return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
+ .replace(/\\\./g, '\u0001')
.split(/\./).map(function (part) {
return part.replace(/\1/g, '\\.')
- .replace(/\2LITERAL\\1LITERAL\2/g, '\1')
- })
+ .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
+ })
}
function decode (str) {
@@ -61,7 +61,7 @@ function decode (str) {
, section = null
lines.forEach(function (line, _, __) {
- if (!line || line.match(/^\s*;/)) return
+ if (!line || line.match(/^\s*[;#]/)) return
var match = line.match(re)
if (!match) return
if (match[1] !== undefined) {
@@ -122,21 +122,29 @@ function decode (str) {
return out
}
+function isQuoted (val) {
+ return (val.charAt(0) === "\"" && val.slice(-1) === "\"")
+ || (val.charAt(0) === "'" && val.slice(-1) === "'")
+}
+
function safe (val) {
return ( typeof val !== "string"
|| val.match(/[\r\n]/)
|| val.match(/^\[/)
|| (val.length > 1
- && val.charAt(0) === "\""
- && val.slice(-1) === "\"")
+ && isQuoted(val))
|| val !== val.trim() )
? JSON.stringify(val)
- : val.replace(/;/g, '\\;')
+ : val.replace(/;/g, '\\;').replace(/#/g, "\\#")
}
function unsafe (val, doUnesc) {
val = (val || "").trim()
- if (val.charAt(0) === "\"" && val.slice(-1) === "\"") {
+ if (isQuoted(val)) {
+ // remove the single quotes before calling JSON.parse
+ if (val.charAt(0) === "'") {
+ val = val.substr(1, val.length - 2);
+ }
try { val = JSON.parse(val) } catch (_) {}
} else {
// walk the val to find the first not-escaped ; character
@@ -145,12 +153,12 @@ function unsafe (val, doUnesc) {
for (var i = 0, l = val.length; i < l; i++) {
var c = val.charAt(i)
if (esc) {
- if (c === "\\" || c === ";")
+ if ("\\;#".indexOf(c) !== -1)
unesc += c
else
unesc += "\\" + c
esc = false
- } else if (c === ";") {
+ } else if (";#".indexOf(c) !== -1) {
break
} else if (c === "\\") {
esc = true
diff --git a/deps/npm/node_modules/ini/package.json b/deps/npm/node_modules/ini/package.json
index 41c63607ad..6c3c8d18e6 100644
--- a/deps/npm/node_modules/ini/package.json
+++ b/deps/npm/node_modules/ini/package.json
@@ -6,7 +6,7 @@
},
"name": "ini",
"description": "An ini encoder/decoder for node",
- "version": "1.1.0",
+ "version": "1.2.0",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/ini.git"
@@ -20,10 +20,30 @@
},
"dependencies": {},
"devDependencies": {
- "tap": "~0.0.9"
+ "tap": "~0.4.0"
},
- "readme": "An ini format parser and serializer for node.\n\nSections are treated as nested objects. Items before the first heading\nare saved on the object directly.\n\n## Usage\n\nConsider an ini-file `config.ini` that looks like this:\n\n ; this comment is being ignored\n scope = global\n\n [database]\n user = dbuser\n password = dbpassword\n database = use_this_database\n\n [paths.default]\n datadir = /var/lib/data\n array[] = first value\n array[] = second value\n array[] = third value\n\nYou can read, manipulate and write the ini-file like so:\n\n var fs = require('fs')\n , ini = require('ini')\n\n var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))\n\n config.scope = 'local'\n config.database.database = 'use_another_database'\n config.paths.default.tmpdir = '/tmp'\n delete config.paths.default.datadir\n config.paths.default.array.push('fourth value')\n\n fs.writeFileSync('./config_modified.ini', ini.stringify(config, 'section'))\n\nThis will result in a file called `config_modified.ini` being written to the filesystem with the following content:\n\n [section]\n scope = local\n [section.database]\n user = dbuser\n password = dbpassword\n database = use_another_database\n [section.paths.default]\n tmpdir = /tmp\n array[] = first value\n array[] = second value\n array[] = third value\n array[] = fourth value\n\n\n## API\n\n### decode(inistring)\nDecode the ini-style formatted `inistring` into a nested object.\n\n### parse(inistring)\nAlias for `decode(inistring)`\n\n### encode(object, [section])\nEncode the object `object` into an ini-style formatted string. If the optional parameter `section` is given, then all top-level properties of the object are put into this section and the `section`-string is prepended to all sub-sections, see the usage example above.\n\n### stringify(object, [section])\nAlias for `encode(object, [section])`\n\n### safe(val)\nEscapes the string `val` such that it is safe to be used as a key or value in an ini-file. Basically escapes quotes. For example\n\n ini.safe('\"unsafe string\"')\n\nwould result in\n\n \"\\\"unsafe string\\\"\"\n\n### unsafe(val)\nUnescapes the string `val`\n",
- "readmeFilename": "README.md",
- "_id": "ini@1.1.0",
- "_from": "ini@latest"
+ "bugs": {
+ "url": "https://github.com/isaacs/ini/issues"
+ },
+ "homepage": "https://github.com/isaacs/ini",
+ "_id": "ini@1.2.0",
+ "_shasum": "2cc36789605809930722e793ae13ac835e623ac6",
+ "_from": "ini@latest",
+ "_npmVersion": "1.4.10",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "2cc36789605809930722e793ae13ac835e623ac6",
+ "tarball": "http://registry.npmjs.org/ini/-/ini-1.2.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/ini/-/ini-1.2.0.tgz"
}
diff --git a/deps/npm/node_modules/ini/test/fixtures/foo.ini b/deps/npm/node_modules/ini/test/fixtures/foo.ini
index 1d81378fd6..27555e9d82 100644
--- a/deps/npm/node_modules/ini/test/fixtures/foo.ini
+++ b/deps/npm/node_modules/ini/test/fixtures/foo.ini
@@ -8,6 +8,16 @@ o = p
; wrap in quotes to get a key with a bracket, not a section.
"[disturbing]" = hey you never know
+; Test single quotes
+s = 'something'
+
+; Test mixing quotes
+
+s1 = "something'
+
+; Test double quotes
+s2 = "something else"
+
; Test arrays
zr[] = deedee
ar[] = one
@@ -45,3 +55,9 @@ a.b.c = abc
; this next one is not a comment! it's escaped!
nocomment = this\; this is not a comment
+
+# Support the use of the number sign (#) as an alternative to the semicolon for indicating comments.
+# http://en.wikipedia.org/wiki/INI_file#Comments
+
+# this next one is not a comment! it's escaped!
+noHashComment = this\# this is not a comment
diff --git a/deps/npm/node_modules/ini/test/foo.js b/deps/npm/node_modules/ini/test/foo.js
index 3a05eaf32e..e1499cbe39 100644
--- a/deps/npm/node_modules/ini/test/foo.js
+++ b/deps/npm/node_modules/ini/test/foo.js
@@ -10,6 +10,9 @@ var i = require("../")
+ 'a with spaces = b c\n'
+ '" xa n p " = "\\"\\r\\nyoyoyo\\r\\r\\n"\n'
+ '"[disturbing]" = hey you never know\n'
+ + 's = something\n'
+ + 's1 = \"something\'\n'
+ + 's2 = something else\n'
+ 'zr[] = deedee\n'
+ 'ar[] = one\n'
+ 'ar[] = three\n'
@@ -28,11 +31,15 @@ var i = require("../")
+ 'j = 2\n\n[x\\.y\\.z]\nx.y.z = xyz\n\n'
+ '[x\\.y\\.z.a\\.b\\.c]\na.b.c = abc\n'
+ 'nocomment = this\\; this is not a comment\n'
+ + 'noHashComment = this\\# this is not a comment\n'
, expectD =
{ o: 'p',
'a with spaces': 'b c',
" xa n p ":'"\r\nyoyoyo\r\r\n',
'[disturbing]': 'hey you never know',
+ 's': 'something',
+ 's1' : '\"something\'',
+ 's2': 'something else',
'zr': ['deedee'],
'ar': ['one', 'three', 'this is included'],
'br': 'warm',
@@ -47,7 +54,8 @@ var i = require("../")
'x.y.z': 'xyz',
'a.b.c': {
'a.b.c': 'abc',
- 'nocomment': 'this\; this is not a comment'
+ 'nocomment': 'this\; this is not a comment',
+ noHashComment: 'this\# this is not a comment'
}
}
}
diff --git a/deps/npm/node_modules/init-package-json/default-input.js b/deps/npm/node_modules/init-package-json/default-input.js
index 4390e708b9..0cbd85b810 100644
--- a/deps/npm/node_modules/init-package-json/default-input.js
+++ b/deps/npm/node_modules/init-package-json/default-input.js
@@ -150,7 +150,7 @@ if (!package.repository) {
else u = u.replace(/^\s*url = /, '')
}
if (u && u.match(/^git@github.com:/))
- u = u.replace(/^git@github.com:/, 'git://github.com/')
+ u = u.replace(/^git@github.com:/, 'https://github.com/')
return cb(null, prompt('git repository', u))
})
diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json b/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json
index 1d713bc691..1f1bfc6d42 100644
--- a/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json
+++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/package.json
@@ -6,7 +6,7 @@
},
"name": "promzard",
"description": "prompting wizardly",
- "version": "0.2.1",
+ "version": "0.2.2",
"repository": {
"url": "git://github.com/isaacs/promzard"
},
@@ -21,14 +21,28 @@
"test": "tap test/*.js"
},
"license": "ISC",
- "readme": "# promzard\n\nA prompting wizard for building files from specialized PromZard modules.\nUsed by `npm init`.\n\nA reimplementation of @SubStack's\n[prompter](https://github.com/substack/node-prompter), which does not\nuse AST traversal.\n\nFrom another point of view, it's a reimplementation of\n[@Marak](https://github.com/marak)'s\n[wizard](https://github.com/Marak/wizard) which doesn't use schemas.\n\nThe goal is a nice drop-in enhancement for `npm init`.\n\n## Usage\n\n```javascript\nvar promzard = require('promzard')\npromzard(inputFile, optionalContextAdditions, function (er, data) {\n // .. you know what you doing ..\n})\n```\n\nIn the `inputFile` you can have something like this:\n\n```javascript\nvar fs = require('fs')\nmodule.exports = {\n \"greeting\": prompt(\"Who shall you greet?\", \"world\", function (who) {\n return \"Hello, \" + who\n }),\n \"filename\": __filename,\n \"directory\": function (cb) {\n fs.readdir(__dirname, cb)\n }\n}\n```\n\nWhen run, promzard will display the prompts and resolve the async\nfunctions in order, and then either give you an error, or the resolved\ndata, ready to be dropped into a JSON file or some other place.\n\n\n### promzard(inputFile, ctx, callback)\n\nThe inputFile is just a node module. You can require() things, set\nmodule.exports, etc. Whatever that module exports is the result, and it\nis walked over to call any functions as described below.\n\nThe only caveat is that you must give PromZard the full absolute path\nto the module (you can get this via Node's `require.resolve`.) Also,\nthe `prompt` function is injected into the context object, so watch out.\n\nWhatever you put in that `ctx` will of course also be available in the\nmodule. You can get quite fancy with this, passing in existing configs\nand so on.\n\n### Class: promzard.PromZard(file, ctx)\n\nJust like the `promzard` function, but the EventEmitter that makes it\nall happen. Emits either a `data` event with the data, or a `error`\nevent if it blows up.\n\nIf `error` is emitted, then `data` never will be.\n\n### prompt(...)\n\nIn the promzard input module, you can call the `prompt` function.\nThis prompts the user to input some data. The arguments are interpreted\nbased on type:\n\n1. `string` The first string encountered is the prompt. The second is\n the default value.\n2. `function` A transformer function which receives the data and returns\n something else. More than meets the eye.\n3. `object` The `prompt` member is the prompt, the `default` member is\n the default value, and the `transform` is the transformer.\n\nWhatever the final value is, that's what will be put on the resulting\nobject.\n\n### Functions\n\nIf there are any functions on the promzard input module's exports, then\npromzard will call each of them with a callback. This way, your module\ncan do asynchronous actions if necessary to validate or ascertain\nwhatever needs verification.\n\nThe functions are called in the context of the ctx object, and are given\na single argument, which is a callback that should be called with either\nan error, or the result to assign to that spot.\n\nIn the async function, you can also call prompt() and return the result\nof the prompt in the callback.\n\nFor example, this works fine in a promzard module:\n\n```\nexports.asyncPrompt = function (cb) {\n fs.stat(someFile, function (er, st) {\n // if there's an error, no prompt, just error\n // otherwise prompt and use the actual file size as the default\n cb(er, prompt('file size', st.size))\n })\n}\n```\n\nYou can also return other async functions in the async function\ncallback. Though that's a bit silly, it could be a handy way to reuse\nfunctionality in some cases.\n\n### Sync vs Async\n\nThe `prompt()` function is not synchronous, though it appears that way.\nIt just returns a token that is swapped out when the data object is\nwalked over asynchronously later, and returns a token.\n\nFor that reason, prompt() calls whose results don't end up on the data\nobject are never shown to the user. For example, this will only prompt\nonce:\n\n```\nexports.promptThreeTimes = prompt('prompt me once', 'shame on you')\nexports.promptThreeTimes = prompt('prompt me twice', 'um....')\nexports.promptThreeTimes = prompt('you cant prompt me again')\n```\n\n### Isn't this exactly the sort of 'looks sync' that you said was bad about other libraries?\n\nYeah, sorta. I wouldn't use promzard for anything more complicated than\na wizard that spits out prompts to set up a config file or something.\nMaybe there are other use cases I haven't considered.\n",
- "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/isaacs/promzard/issues"
},
"homepage": "https://github.com/isaacs/promzard",
- "_id": "promzard@0.2.1",
- "_shasum": "c4c7cbe5182465c13b43540be9daf47098b4e75b",
+ "_id": "promzard@0.2.2",
+ "_shasum": "918b9f2b29458cb001781a8856502e4a79b016e0",
"_from": "promzard@~0.2.0",
- "_resolved": "https://registry.npmjs.org/promzard/-/promzard-0.2.1.tgz"
+ "_npmVersion": "1.4.10",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "918b9f2b29458cb001781a8856502e4a79b016e0",
+ "tarball": "http://registry.npmjs.org/promzard/-/promzard-0.2.2.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/promzard/-/promzard-0.2.2.tgz"
}
diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/promzard.js b/deps/npm/node_modules/init-package-json/node_modules/promzard/promzard.js
index ef41ff7ec2..3afb567f77 100644
--- a/deps/npm/node_modules/init-package-json/node_modules/promzard/promzard.js
+++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/promzard.js
@@ -121,7 +121,7 @@ PromZard.prototype.makePrompt = function () {
else if (a && typeof a === 'object') {
p = a.prompt || p
d = a.default || d
- t = a.tranform || t
+ t = a.transform || t
}
}
diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/basic.js b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/basic.js
index af99df41ca..ad1c92df9c 100644
--- a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/basic.js
+++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/basic.js
@@ -70,10 +70,18 @@ tap.test('run the example', function (t) {
}
if (output.match(/keywords: $/)) {
c.stdin.write('fugazi function waiting room\n')
+ // "read" module is weird on node >= 0.10 when not a TTY
+ // requires explicit ending for reasons.
+ // could dig in, but really just wanna make tests pass, whatever.
+ c.stdin.end()
return
}
}
+ c.on('exit', function () {
+ console.error('exit event')
+ })
+
c.on('close', function () {
console.error('actual', actual)
actual = JSON.parse(actual)
diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/exports.js b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/exports.js
index a5f72d8bd1..c17993a4e9 100644
--- a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/exports.js
+++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/exports.js
@@ -20,7 +20,7 @@ test('exports', function (t) {
child.stdin.write('\n');
}, 100)
setTimeout(function () {
- child.stdin.write('55\n');
+ child.stdin.end('55\n');
}, 200)
child.on('close', function () {
diff --git a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/fn.js b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/fn.js
index 4ce803e73b..899ebedbdd 100644
--- a/deps/npm/node_modules/init-package-json/node_modules/promzard/test/fn.js
+++ b/deps/npm/node_modules/init-package-json/node_modules/promzard/test/fn.js
@@ -43,7 +43,7 @@ test('prompt callback param', function (t) {
child.stdin.write('55\n')
}, 150)
setTimeout(function () {
- child.stdin.write('async prompt\n')
+ child.stdin.end('async prompt\n')
}, 200)
})
diff --git a/deps/npm/node_modules/init-package-json/package.json b/deps/npm/node_modules/init-package-json/package.json
index 9ca7721cd5..84d3814f8b 100644
--- a/deps/npm/node_modules/init-package-json/package.json
+++ b/deps/npm/node_modules/init-package-json/package.json
@@ -1,6 +1,6 @@
{
"name": "init-package-json",
- "version": "0.0.16",
+ "version": "0.0.17",
"main": "init-package-json.js",
"scripts": {
"test": "tap test/*.js"
@@ -37,13 +37,29 @@
"prompt",
"start"
],
- "readme": "# init-package-json\n\nA node module to get your node module started.\n\n## Usage\n\n```javascript\nvar init = require('init-package-json')\nvar path = require('path')\n\n// a path to a promzard module. In the event that this file is\n// not found, one will be provided for you.\nvar initFile = path.resolve(process.env.HOME, '.npm-init')\n\n// the dir where we're doin stuff.\nvar dir = process.cwd()\n\n// extra stuff that gets put into the PromZard module's context.\n// In npm, this is the resolved config object. Exposed as 'config'\n// Optional.\nvar configData = { some: 'extra stuff' }\n\n// Any existing stuff from the package.json file is also exposed in the\n// PromZard module as the `package` object. There will also be free\n// vars for:\n// * `filename` path to the package.json file\n// * `basename` the tip of the package dir\n// * `dirname` the parent of the package dir\n\ninit(dir, initFile, configData, function (er, data) {\n // the data's already been written to {dir}/package.json\n // now you can do stuff with it\n})\n```\n\nOr from the command line:\n\n```\n$ npm-init\n```\n\nSee [PromZard](https://github.com/isaacs/promzard) for details about\nwhat can go in the config file.\n",
- "readmeFilename": "README.md",
+ "gitHead": "cbc53fbedd4246d62ec99ea3a61a113a07d21629",
"bugs": {
"url": "https://github.com/isaacs/init-package-json/issues"
},
"homepage": "https://github.com/isaacs/init-package-json",
- "_id": "init-package-json@0.0.16",
- "_shasum": "f7bb96fcb0a2c8061d15a2c3180323b17a65aa16",
- "_from": "init-package-json@latest"
+ "_id": "init-package-json@0.0.17",
+ "_shasum": "395f2cb8d1c5af93ba6ec19dafa64717047f90c3",
+ "_from": "init-package-json@latest",
+ "_npmVersion": "1.4.10",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "395f2cb8d1c5af93ba6ec19dafa64717047f90c3",
+ "tarball": "http://registry.npmjs.org/init-package-json/-/init-package-json-0.0.17.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-0.0.17.tgz"
}
diff --git a/deps/npm/node_modules/minimatch/README.md b/deps/npm/node_modules/minimatch/README.md
index 978268e275..5b3967ea99 100644
--- a/deps/npm/node_modules/minimatch/README.md
+++ b/deps/npm/node_modules/minimatch/README.md
@@ -157,8 +157,8 @@ Perform a case-insensitive match.
### nonull
When a match is not found by `minimatch.match`, return a list containing
-the pattern itself. When set, an empty list is returned if there are
-no matches.
+the pattern itself if this option is set. When not set, an empty list
+is returned if there are no matches.
### matchBase
diff --git a/deps/npm/node_modules/minimatch/minimatch.js b/deps/npm/node_modules/minimatch/minimatch.js
index c633f89fab..4539678949 100644
--- a/deps/npm/node_modules/minimatch/minimatch.js
+++ b/deps/npm/node_modules/minimatch/minimatch.js
@@ -813,11 +813,12 @@ function makeRe () {
}
minimatch.match = function (list, pattern, options) {
+ options = options || {}
var mm = new Minimatch(pattern, options)
list = list.filter(function (f) {
return mm.match(f)
})
- if (options.nonull && !list.length) {
+ if (mm.options.nonull && !list.length) {
list.push(pattern)
}
return list
@@ -853,12 +854,17 @@ function match (f, partial) {
var set = this.set
this.debug(this.pattern, "set", set)
- var splitFile = path.basename(f.join("/")).split("/")
+ // Find the basename of the path by looking for the last non-empty segment
+ var filename;
+ for (var i = f.length - 1; i >= 0; i--) {
+ filename = f[i]
+ if (filename) break
+ }
for (var i = 0, l = set.length; i < l; i ++) {
var pattern = set[i], file = f
if (options.matchBase && pattern.length === 1) {
- file = splitFile
+ file = [filename]
}
var hit = this.matchOne(file, pattern, partial)
if (hit) {
@@ -975,7 +981,7 @@ Minimatch.prototype.matchOne = function (file, pattern, partial) {
}
// no match was found.
// However, in partial mode, we can't say this is necessarily over.
- // If there's more *pattern* left, then
+ // If there's more *pattern* left, then
if (partial) {
// ran out of file
this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
diff --git a/deps/npm/node_modules/minimatch/node_modules/sigmund/package.json b/deps/npm/node_modules/minimatch/node_modules/sigmund/package.json
index cb7e2bd4b7..6d0305d0d3 100644
--- a/deps/npm/node_modules/minimatch/node_modules/sigmund/package.json
+++ b/deps/npm/node_modules/minimatch/node_modules/sigmund/package.json
@@ -32,11 +32,23 @@
},
"license": "BSD",
"readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n",
- "readmeFilename": "README.md",
- "bugs": {
- "url": "https://github.com/isaacs/sigmund/issues"
- },
- "homepage": "https://github.com/isaacs/sigmund",
"_id": "sigmund@1.0.0",
- "_from": "sigmund@~1.0.0"
+ "dist": {
+ "shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296",
+ "tarball": "http://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
+ },
+ "_npmVersion": "1.1.48",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "_shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296",
+ "_from": "sigmund@~1.0.0",
+ "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
}
diff --git a/deps/npm/node_modules/minimatch/package.json b/deps/npm/node_modules/minimatch/package.json
index 9dedca5121..36d7df35d4 100644
--- a/deps/npm/node_modules/minimatch/package.json
+++ b/deps/npm/node_modules/minimatch/package.json
@@ -6,7 +6,7 @@
},
"name": "minimatch",
"description": "a glob matcher in javascript",
- "version": "0.2.14",
+ "version": "0.3.0",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/minimatch.git"
@@ -29,12 +29,28 @@
"type": "MIT",
"url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
},
- "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself. When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n",
- "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/isaacs/minimatch/issues"
},
"homepage": "https://github.com/isaacs/minimatch",
- "_id": "minimatch@0.2.14",
- "_from": "minimatch@latest"
+ "_id": "minimatch@0.3.0",
+ "_shasum": "275d8edaac4f1bb3326472089e7949c8394699dd",
+ "_from": "minimatch@latest",
+ "_npmVersion": "1.4.10",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "dist": {
+ "shasum": "275d8edaac4f1bb3326472089e7949c8394699dd",
+ "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz"
}
diff --git a/deps/npm/node_modules/minimatch/test/defaults.js b/deps/npm/node_modules/minimatch/test/defaults.js
index 25f1f601cd..75e05712d4 100644
--- a/deps/npm/node_modules/minimatch/test/defaults.js
+++ b/deps/npm/node_modules/minimatch/test/defaults.js
@@ -237,7 +237,7 @@ tap.test("basic tests", function (t) {
var pattern = c[0]
, expect = c[1].sort(alpha)
- , options = c[2] || {}
+ , options = c[2]
, f = c[3] || files
, tapOpts = c[4] || {}
diff --git a/deps/npm/node_modules/node-gyp/README.md b/deps/npm/node_modules/node-gyp/README.md
index ffe429c327..cba646e71d 100644
--- a/deps/npm/node_modules/node-gyp/README.md
+++ b/deps/npm/node_modules/node-gyp/README.md
@@ -45,6 +45,21 @@ You will also need to install:
* Windows 7/8:
* Microsoft Visual Studio C++ 2012 for Windows Desktop ([Express][msvc2012] version works well)
+If you have multiple Python versions installed, you can identify which Python
+version `node-gyp` uses by setting the '--python' variable:
+
+``` bash
+$ node-gyp --python /path/to/python2.7
+```
+
+If `node-gyp` is called by way of `npm` *and* you have multiple versions of
+Python installed, then you can set `npm`'s 'python' config key to the appropriate
+value:
+
+``` bash
+$ npm config set python /path/to/executable/python2.7
+```
+
Note that OS X is just a flavour of Unix and so needs `python`, `make`, and C/C++.
An easy way to obtain these is to install XCode from Apple,
and then use it to install the command line tools (under Preferences -> Downloads).
diff --git a/deps/npm/node_modules/node-gyp/lib/configure.js b/deps/npm/node_modules/node-gyp/lib/configure.js
index 268c336259..68f26d6e19 100644
--- a/deps/npm/node_modules/node-gyp/lib/configure.js
+++ b/deps/npm/node_modules/node-gyp/lib/configure.js
@@ -327,6 +327,9 @@ function configure (gyp, argv, callback) {
// execute `gyp` from the current target nodedir
argv.unshift(gyp_script)
+ // make sure python uses files that came with this particular node package
+ process.env.PYTHONPATH = path.resolve(__dirname, '..', 'gyp', 'pylib')
+
var cp = gyp.spawn(python, argv)
cp.on('exit', onCpExit)
}
diff --git a/deps/npm/node_modules/node-gyp/lib/node-gyp.js b/deps/npm/node_modules/node-gyp/lib/node-gyp.js
index 2ae08904b3..df7ce85553 100644
--- a/deps/npm/node_modules/node-gyp/lib/node-gyp.js
+++ b/deps/npm/node_modules/node-gyp/lib/node-gyp.js
@@ -203,9 +203,6 @@ proto.usage = function usage () {
return ' - ' + c + ' - ' + require('./' + c).usage
}).join('\n')
, ''
- , ' for specific command usage and options try:'
- , ' $ node-gyp <command> --help'
- , ''
, 'node-gyp@' + this.version + ' ' + path.resolve(__dirname, '..')
, 'node@' + process.versions.node
].join('\n')
diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json
index c9dbae5a81..223e87b4b7 100644
--- a/deps/npm/node_modules/node-gyp/package.json
+++ b/deps/npm/node_modules/node-gyp/package.json
@@ -10,7 +10,7 @@
"bindings",
"gyp"
],
- "version": "0.13.0",
+ "version": "0.13.1",
"installVersion": 9,
"author": {
"name": "Nathan Rajlich",
@@ -37,23 +37,40 @@
"osenv": "0",
"request": "2",
"rimraf": "2",
- "semver": "~2.2.1",
+ "semver": "2",
"tar": "0",
"which": "1"
},
"engines": {
"node": ">= 0.8.0"
},
- "readme": "node-gyp\n=========\n### Node.js native addon build tool\n\n`node-gyp` is a cross-platform command-line tool written in Node.js for compiling\nnative addon modules for Node.js, which takes away the pain of dealing with the\nvarious differences in build platforms. It is the replacement to the `node-waf`\nprogram which is removed for node `v0.8`. If you have a native addon for node that\nstill has a `wscript` file, then you should definitely add a `binding.gyp` file\nto support the latest versions of node.\n\nMultiple target versions of node are supported (i.e. `0.8`, `0.9`, `0.10`, ..., `1.0`,\netc.), regardless of what version of node is actually installed on your system\n(`node-gyp` downloads the necessary development files for the target version).\n\n#### Features:\n\n * Easy to use, consistent interface\n * Same commands to build your module on every platform\n * Supports multiple target versions of Node\n\n\nInstallation\n------------\n\nYou can install with `npm`:\n\n``` bash\n$ npm install -g node-gyp\n```\n\nYou will also need to install:\n\n * On Unix:\n * `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported)\n * `make`\n * A proper C/C++ compiler toolchain, like GCC\n * On Windows:\n * [Python][windows-python] ([`v2.7.3`][windows-python-v2.7.3] recommended, `v3.x.x` is __*not*__ supported)\n * Windows XP/Vista/7:\n * Microsoft Visual Studio C++ 2010 ([Express][msvc2010] version works well)\n * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]\n * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first.\n * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]\n * Windows 7/8:\n * Microsoft Visual Studio C++ 2012 for Windows Desktop ([Express][msvc2012] version works well)\n\nNote that OS X is just a flavour of Unix and so needs `python`, `make`, and C/C++.\nAn easy way to obtain these is to install XCode from Apple,\nand then use it to install the command line tools (under Preferences -> Downloads).\n\nHow to Use\n----------\n\nTo compile your native addon, first go to its root directory:\n\n``` bash\n$ cd my_node_addon\n```\n\nThe next step is to generate the appropriate project build files for the current\nplatform. Use `configure` for that:\n\n``` bash\n$ node-gyp configure\n```\n\n__Note__: The `configure` step looks for the `binding.gyp` file in the current\ndirectory to processs. See below for instructions on creating the `binding.gyp` file.\n\nNow you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file\n(on Windows) in the `build/` directory. Next invoke the `build` command:\n\n``` bash\n$ node-gyp build\n```\n\nNow you have your compiled `.node` bindings file! The compiled bindings end up\nin `build/Debug/` or `build/Release/`, depending on the build mode. At this point\nyou can require the `.node` file with Node and run your tests!\n\n__Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or\n`-d`) switch when running the either `configure` or `build` command.\n\n\nThe \"binding.gyp\" file\n----------------------\n\nPreviously when node had `node-waf` you had to write a `wscript` file. The\nreplacement for that is the `binding.gyp` file, which describes the configuration\nto build your module in a JSON-like format. This file gets placed in the root of\nyour package, alongside the `package.json` file.\n\nA barebones `gyp` file appropriate for building a node addon looks like:\n\n``` python\n{\n \"targets\": [\n {\n \"target_name\": \"binding\",\n \"sources\": [ \"src/binding.cc\" ]\n }\n ]\n}\n```\n\nSome additional resources for writing `gyp` files:\n\n * [\"Hello World\" node addon example](https://github.com/joyent/node/tree/master/test/addons/hello-world)\n * [gyp user documentation](http://code.google.com/p/gyp/wiki/GypUserDocumentation)\n * [gyp input format reference](http://code.google.com/p/gyp/wiki/InputFormatReference)\n * [*\"binding.gyp\" files out in the wild* wiki page](https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)\n\n\nCommands\n--------\n\n`node-gyp` responds to the following commands:\n\n| **Command** | **Description**\n|:--------------|:---------------------------------------------------------------\n| `build` | Invokes `make`/`msbuild.exe` and builds the native addon\n| `clean` | Removes any the `build` dir if it exists\n| `configure` | Generates project build files for the current platform\n| `rebuild` | Runs \"clean\", \"configure\" and \"build\" all in a row\n| `install` | Installs node development header files for the given version\n| `list` | Lists the currently installed node development file versions\n| `remove` | Removes the node development header files for the given version\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n[windows-python]: http://www.python.org/getit/windows\n[windows-python-v2.7.3]: http://www.python.org/download/releases/2.7.3#download\n[msvc2010]: http://go.microsoft.com/?linkid=9709949\n[msvc2012]: http://go.microsoft.com/?linkid=9816758\n[win7sdk]: http://www.microsoft.com/en-us/download/details.aspx?id=8279\n[compiler update for the Windows SDK 7.1]: http://www.microsoft.com/en-us/download/details.aspx?id=4422\n",
- "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/TooTallNate/node-gyp/issues"
},
"homepage": "https://github.com/TooTallNate/node-gyp",
- "_id": "node-gyp@0.13.0",
+ "_id": "node-gyp@0.13.1",
+ "_shasum": "5a484dd2dc13d5b894a8fe781a250c07eae7bffa",
+ "_from": "node-gyp@~0.13.0",
+ "_npmVersion": "1.4.9",
+ "_npmUser": {
+ "name": "tootallnate",
+ "email": "nathan@tootallnate.net"
+ },
+ "maintainers": [
+ {
+ "name": "TooTallNate",
+ "email": "nathan@tootallnate.net"
+ },
+ {
+ "name": "tootallnate",
+ "email": "nathan@tootallnate.net"
+ }
+ ],
"dist": {
- "shasum": "97765303203579f1445358d4d25d03645811d87d"
+ "shasum": "5a484dd2dc13d5b894a8fe781a250c07eae7bffa",
+ "tarball": "http://registry.npmjs.org/node-gyp/-/node-gyp-0.13.1.tgz"
},
- "_from": "node-gyp@latest",
- "_resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-0.13.0.tgz"
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-0.13.1.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/node_modules/npm-cache-filename/LICENSE b/deps/npm/node_modules/npm-cache-filename/LICENSE
new file mode 100644
index 0000000000..20a4762540
--- /dev/null
+++ b/deps/npm/node_modules/npm-cache-filename/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) npm, Inc. and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/deps/npm/node_modules/npm-cache-filename/README.md b/deps/npm/node_modules/npm-cache-filename/README.md
new file mode 100644
index 0000000000..47bd08a494
--- /dev/null
+++ b/deps/npm/node_modules/npm-cache-filename/README.md
@@ -0,0 +1,21 @@
+# npm-cache-filename
+
+Given a cache folder and url, return the appropriate cache folder.
+
+## USAGE
+
+```javascript
+var cf = require('npm-cache-filename');
+console.log(cf('/tmp/cache', 'https://registry.npmjs.org:1234/foo/bar'));
+// outputs: /tmp/cache/registry.npmjs.org_1234/foo/bar
+```
+
+As a bonus, you can also bind it to a specific root path:
+
+```javascript
+var cf = require('npm-cache-filename');
+var getFile = cf('/tmp/cache');
+
+console.log(getFile('https://registry.npmjs.org:1234/foo/bar'));
+// outputs: /tmp/cache/registry.npmjs.org_1234/foo/bar
+```
diff --git a/deps/npm/node_modules/npm-cache-filename/index.js b/deps/npm/node_modules/npm-cache-filename/index.js
new file mode 100644
index 0000000000..9fd2488d40
--- /dev/null
+++ b/deps/npm/node_modules/npm-cache-filename/index.js
@@ -0,0 +1,20 @@
+var url = require('url');;
+var path = require('path');;
+
+module.exports = cf;;
+
+function cf(root, u) {
+ if (!u)
+ return cf.bind(null, root);;
+
+ u = url.parse(u);;
+ var h = u.host.replace(/:/g, '_');;
+ // Strip off any /-rev/... or ?rev=... bits
+ var revre = /(\?rev=|\?.*?&rev=|\/-rev\/).*$/
+ var parts = u.path.replace(revre, '').split('/').slice(1)
+ var p = [root, h].concat(parts.map(function(part) {
+ return encodeURIComponent(part).replace(/%/g, '_');;
+ }));;
+
+ return path.join.apply(path, p);;
+}
diff --git a/deps/npm/node_modules/npm-cache-filename/package.json b/deps/npm/node_modules/npm-cache-filename/package.json
new file mode 100644
index 0000000000..979450bc69
--- /dev/null
+++ b/deps/npm/node_modules/npm-cache-filename/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "npm-cache-filename",
+ "version": "1.0.1",
+ "description": "Given a cache folder and url, return the appropriate cache folder.",
+ "main": "index.js",
+ "dependencies": {},
+ "devDependencies": {
+ "tap": "^0.4.10"
+ },
+ "scripts": {
+ "test": "tap test.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/npm/npm-cache-filename"
+ },
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/npm/npm-cache-filename/issues"
+ },
+ "homepage": "https://github.com/npm/npm-cache-filename",
+ "readme": "# npm-cache-filename\n\nGiven a cache folder and url, return the appropriate cache folder.\n\n## USAGE\n\n```javascript\nvar cf = require('npm-cache-filename');\nconsole.log(cf('/tmp/cache', 'https://registry.npmjs.org:1234/foo/bar'));\n// outputs: /tmp/cache/registry.npmjs.org_1234/foo/bar\n```\n\nAs a bonus, you can also bind it to a specific root path:\n\n```javascript\nvar cf = require('npm-cache-filename');\nvar getFile = cf('/tmp/cache');\n\nconsole.log(getFile('https://registry.npmjs.org:1234/foo/bar'));\n// outputs: /tmp/cache/registry.npmjs.org_1234/foo/bar\n```\n",
+ "readmeFilename": "README.md",
+ "_id": "npm-cache-filename@1.0.1",
+ "_shasum": "9b640f0c1a5ba1145659685372a9ff71f70c4323",
+ "_from": "npm-cache-filename@latest",
+ "_resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.1.tgz"
+}
diff --git a/deps/npm/node_modules/npm-cache-filename/test.js b/deps/npm/node_modules/npm-cache-filename/test.js
new file mode 100644
index 0000000000..5faecceb40
--- /dev/null
+++ b/deps/npm/node_modules/npm-cache-filename/test.js
@@ -0,0 +1,21 @@
+var test = require('tap').test;;
+test('it does the thing it says it does', function(t) {
+ var cf = require('./');;
+
+ t.equal(cf('/tmp/cache', 'https://foo:134/xyz?adf=foo:bar/baz'),
+ '/tmp/cache/foo_134/xyz_3Fadf_3Dfoo_3Abar/baz');;
+
+ var getFile = cf('/tmp/cache');;
+ t.equal(getFile('https://foo:134/xyz?adf=foo:bar/baz'),
+ '/tmp/cache/foo_134/xyz_3Fadf_3Dfoo_3Abar/baz');;
+
+ t.equal(cf("/tmp", "https://foo:134/xyz/-rev/baz"),
+ '/tmp/foo_134/xyz')
+ t.equal(cf("/tmp", "https://foo:134/xyz/?rev=baz"),
+ '/tmp/foo_134/xyz')
+ t.equal(cf("/tmp", "https://foo:134/xyz/?foo&rev=baz"),
+ '/tmp/foo_134/xyz')
+ t.equal(cf("/tmp", "https://foo:134/xyz-rev/baz"),
+ '/tmp/foo_134/xyz-rev/baz')
+ t.end();
+});;
diff --git a/deps/npm/node_modules/npm-install-checks/LICENSE b/deps/npm/node_modules/npm-install-checks/LICENSE
index 1a8fdb735b..3bed8320c1 100644
--- a/deps/npm/node_modules/npm-install-checks/LICENSE
+++ b/deps/npm/node_modules/npm-install-checks/LICENSE
@@ -1,7 +1,6 @@
-Copyright (c) Robert Kowalski ("Author")
+Copyright (c) Robert Kowalski and Isaac Z. Schlueter ("Authors")
All rights reserved.
-
The BSD License
Redistribution and use in source and binary forms, with or without
@@ -15,10 +14,10 @@ are met:
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
@@ -26,209 +25,3 @@ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-This uses parts of npm, (c) Isaac Z. Schlueter, under the following license:
-
-
-The Artistic License 2.0
-
-Copyright (c) 2000-2006, The Perl Foundation.
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-Preamble
-
-This license establishes the terms under which a given free software
-Package may be copied, modified, distributed, and/or redistributed.
-The intent is that the Copyright Holder maintains some artistic
-control over the development of that Package while still keeping the
-Package available as open source and free software.
-
-You are always permitted to make arrangements wholly outside of this
-license directly with the Copyright Holder of a given Package. If the
-terms of this license do not permit the full use that you propose to
-make of the Package, you should contact the Copyright Holder and seek
-a different licensing arrangement.
-
-Definitions
-
- "Copyright Holder" means the individual(s) or organization(s)
- named in the copyright notice for the entire Package.
-
- "Contributor" means any party that has contributed code or other
- material to the Package, in accordance with the Copyright Holder's
- procedures.
-
- "You" and "your" means any person who would like to copy,
- distribute, or modify the Package.
-
- "Package" means the collection of files distributed by the
- Copyright Holder, and derivatives of that collection and/or of
- those files. A given Package may consist of either the Standard
- Version, or a Modified Version.
-
- "Distribute" means providing a copy of the Package or making it
- accessible to anyone else, or in the case of a company or
- organization, to others outside of your company or organization.
-
- "Distributor Fee" means any fee that you charge for Distributing
- this Package or providing support for this Package to another
- party. It does not mean licensing fees.
-
- "Standard Version" refers to the Package if it has not been
- modified, or has been modified only in ways explicitly requested
- by the Copyright Holder.
-
- "Modified Version" means the Package, if it has been changed, and
- such changes were not explicitly requested by the Copyright
- Holder.
-
- "Original License" means this Artistic License as Distributed with
- the Standard Version of the Package, in its current version or as
- it may be modified by The Perl Foundation in the future.
-
- "Source" form means the source code, documentation source, and
- configuration files for the Package.
-
- "Compiled" form means the compiled bytecode, object code, binary,
- or any other form resulting from mechanical transformation or
- translation of the Source form.
-
-
-Permission for Use and Modification Without Distribution
-
-(1) You are permitted to use the Standard Version and create and use
-Modified Versions for any purpose without restriction, provided that
-you do not Distribute the Modified Version.
-
-
-Permissions for Redistribution of the Standard Version
-
-(2) You may Distribute verbatim copies of the Source form of the
-Standard Version of this Package in any medium without restriction,
-either gratis or for a Distributor Fee, provided that you duplicate
-all of the original copyright notices and associated disclaimers. At
-your discretion, such verbatim copies may or may not include a
-Compiled form of the Package.
-
-(3) You may apply any bug fixes, portability changes, and other
-modifications made available from the Copyright Holder. The resulting
-Package will still be considered the Standard Version, and as such
-will be subject to the Original License.
-
-
-Distribution of Modified Versions of the Package as Source
-
-(4) You may Distribute your Modified Version as Source (either gratis
-or for a Distributor Fee, and with or without a Compiled form of the
-Modified Version) provided that you clearly document how it differs
-from the Standard Version, including, but not limited to, documenting
-any non-standard features, executables, or modules, and provided that
-you do at least ONE of the following:
-
- (a) make the Modified Version available to the Copyright Holder
- of the Standard Version, under the Original License, so that the
- Copyright Holder may include your modifications in the Standard
- Version.
-
- (b) ensure that installation of your Modified Version does not
- prevent the user installing or running the Standard Version. In
- addition, the Modified Version must bear a name that is different
- from the name of the Standard Version.
-
- (c) allow anyone who receives a copy of the Modified Version to
- make the Source form of the Modified Version available to others
- under
-
- (i) the Original License or
-
- (ii) a license that permits the licensee to freely copy,
- modify and redistribute the Modified Version using the same
- licensing terms that apply to the copy that the licensee
- received, and requires that the Source form of the Modified
- Version, and of any works derived from it, be made freely
- available in that license fees are prohibited but Distributor
- Fees are allowed.
-
-
-Distribution of Compiled Forms of the Standard Version
-or Modified Versions without the Source
-
-(5) You may Distribute Compiled forms of the Standard Version without
-the Source, provided that you include complete instructions on how to
-get the Source of the Standard Version. Such instructions must be
-valid at the time of your distribution. If these instructions, at any
-time while you are carrying out such distribution, become invalid, you
-must provide new instructions on demand or cease further distribution.
-If you provide valid instructions or cease distribution within thirty
-days after you become aware that the instructions are invalid, then
-you do not forfeit any of your rights under this license.
-
-(6) You may Distribute a Modified Version in Compiled form without
-the Source, provided that you comply with Section 4 with respect to
-the Source of the Modified Version.
-
-
-Aggregating or Linking the Package
-
-(7) You may aggregate the Package (either the Standard Version or
-Modified Version) with other packages and Distribute the resulting
-aggregation provided that you do not charge a licensing fee for the
-Package. Distributor Fees are permitted, and licensing fees for other
-components in the aggregation are permitted. The terms of this license
-apply to the use and Distribution of the Standard or Modified Versions
-as included in the aggregation.
-
-(8) You are permitted to link Modified and Standard Versions with
-other works, to embed the Package in a larger work of your own, or to
-build stand-alone binary or bytecode versions of applications that
-include the Package, and Distribute the result without restriction,
-provided the result does not expose a direct interface to the Package.
-
-
-Items That are Not Considered Part of a Modified Version
-
-(9) Works (including, but not limited to, modules and scripts) that
-merely extend or make use of the Package, do not, by themselves, cause
-the Package to be a Modified Version. In addition, such works are not
-considered parts of the Package itself, and are not subject to the
-terms of this license.
-
-
-General Provisions
-
-(10) Any use, modification, and distribution of the Standard or
-Modified Versions is governed by this Artistic License. By using,
-modifying or distributing the Package, you accept this license. Do not
-use, modify, or distribute the Package, if you do not accept this
-license.
-
-(11) If your Modified Version has been derived from a Modified
-Version made by someone other than you, you are nevertheless required
-to ensure that your Modified Version complies with the requirements of
-this license.
-
-(12) This license does not grant you the right to use any trademark,
-service mark, tradename, or logo of the Copyright Holder.
-
-(13) This license includes the non-exclusive, worldwide,
-free-of-charge patent license to make, have made, use, offer to sell,
-sell, import and otherwise transfer the Package with respect to any
-patent claims licensable by the Copyright Holder that are necessarily
-infringed by the Package. If you institute patent litigation
-(including a cross-claim or counterclaim) against any party alleging
-that the Package constitutes direct or contributory patent
-infringement, then this Artistic License to you shall terminate on the
-date that such litigation is filed.
-
-(14) Disclaimer of Warranty:
-THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
-IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
-LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/deps/npm/node_modules/npm-install-checks/package.json b/deps/npm/node_modules/npm-install-checks/package.json
index 39b7adf994..a4e8695ca1 100644
--- a/deps/npm/node_modules/npm-install-checks/package.json
+++ b/deps/npm/node_modules/npm-install-checks/package.json
@@ -1,11 +1,11 @@
{
"name": "npm-install-checks",
- "version": "1.0.0",
+ "version": "1.0.1",
"description": "checks that npm runs during the installation of a module",
"main": "index.js",
"dependencies": {
"npmlog": "0.0.6",
- "semver": "~2.2.1"
+ "semver": "^2.3.0"
},
"devDependencies": {
"tap": "~0.4.8",
@@ -17,9 +17,9 @@
},
"repository": {
"type": "git",
- "url": "git://github.com/robertkowalski/npm-install-checks.git"
+ "url": "git://github.com/npm/npm-install-checks.git"
},
- "homepage": "https://github.com/robertkowalski/npm-install-checks",
+ "homepage": "https://github.com/npm/npm-install-checks",
"keywords": [
"npm,",
"install"
@@ -30,14 +30,11 @@
},
"license": "BSD-2-Clause",
"bugs": {
- "url": "https://github.com/robertkowalski/npm-install-checks/issues"
+ "url": "https://github.com/npm/npm-install-checks/issues"
},
"readme": "# npm-install-checks\n\nA package that contains checks that npm runs during the installation.\n\n## API\n\n### .checkEngine(target, npmVer, nodeVer, force, strict, cb)\nCheck if node/npm version is supported by the package.\n\nError type: `ENOTSUP`\n\n### .checkPlatform(target, force, cb)\nCheck if OS/Arch is supported by the package.\n\nError type: `EBADPLATFORM`\n\n### .checkCycle(target, ancestors, cb)\nCheck for cyclic dependencies.\n\nError type: `ECYCLE`\n\n### .checkGit(folder, cb)\nCheck if a folder is a .git folder.\n\nError type: `EISGIT`\n",
"readmeFilename": "README.md",
- "_id": "npm-install-checks@1.0.0",
- "dist": {
- "shasum": "7e1469b5e0c693b2ae2a8830b5fc4e7bf76c88fd"
- },
- "_from": "npm-install-checks@1.0.0",
- "_resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.0.tgz"
+ "_id": "npm-install-checks@1.0.1",
+ "_shasum": "547a73dec58acfd52365012e60de9418b6405101",
+ "_from": "npm-install-checks@~1.0.0"
}
diff --git a/deps/npm/node_modules/npm-registry-client/README.md b/deps/npm/node_modules/npm-registry-client/README.md
index 6cef754dfd..4b3d4c3c65 100644
--- a/deps/npm/node_modules/npm-registry-client/README.md
+++ b/deps/npm/node_modules/npm-registry-client/README.md
@@ -113,11 +113,10 @@ Get the url for bugs of a package
Fetches data from the registry via a GET request, saving it in
the cache folder with the ETag.
-# client.publish(data, tarball, [readme], cb)
+# client.publish(data, tarball, cb)
* `data` {Object} Package data
* `tarball` {String | Stream} Filename or stream of the package tarball
-* `readme` {String} Contents of the README markdown file
* `cb` {Function}
Publish a package to the registry.
diff --git a/deps/npm/node_modules/npm-registry-client/index.js b/deps/npm/node_modules/npm-registry-client/index.js
index 24c33ae44e..eac60d605f 100644
--- a/deps/npm/node_modules/npm-registry-client/index.js
+++ b/deps/npm/node_modules/npm-registry-client/index.js
@@ -6,6 +6,7 @@ var fs = require('fs')
, url = require('url')
, path = require('path')
, npmlog
+, cacheFile = require('npm-cache-filename')
try {
npmlog = require("npmlog")
@@ -45,7 +46,10 @@ function RegClient (conf) {
registry = null
}
+ this.registry = registry
+
if (!conf.get('cache')) throw new Error("Cache dir is required")
+ this.cacheFile = cacheFile(this.conf.get('cache'))
this.log = conf.log || conf.get('log') || npmlog
}
diff --git a/deps/npm/node_modules/npm-registry-client/lib/adduser.js b/deps/npm/node_modules/npm-registry-client/lib/adduser.js
index a4581a6c81..5a76b028c0 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/adduser.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/adduser.js
@@ -1,11 +1,5 @@
module.exports = adduser
-var crypto = require('crypto')
-
-function sha (s) {
- return crypto.createHash("sha1").update(s).digest("hex")
-}
-
function adduser (username, password, email, cb) {
password = ("" + (password || "")).trim()
@@ -17,12 +11,7 @@ function adduser (username, password, email, cb) {
return cb(new Error("Please use a real email address."))
}
- if (password.indexOf(":") !== -1) return cb(new Error(
- "Sorry, ':' chars are not allowed in passwords.\n"+
- "See <https://issues.apache.org/jira/browse/COUCHDB-969> for why."))
-
- var salt = crypto.randomBytes(30).toString('hex')
- , userobj =
+ var userobj =
{ name : username
, password : password
, email : email
diff --git a/deps/npm/node_modules/npm-registry-client/lib/deprecate.js b/deps/npm/node_modules/npm-registry-client/lib/deprecate.js
index 4a2f9af241..9cbc6d88e3 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/deprecate.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/deprecate.js
@@ -12,8 +12,6 @@ function deprecate (name, ver, message, cb) {
return cb(new Error("invalid version range: "+ver))
}
- var users = {}
-
this.get(name + '?write=true', function (er, data) {
if (er) return cb(er)
// filter all the versions that match
diff --git a/deps/npm/node_modules/npm-registry-client/lib/get.js b/deps/npm/node_modules/npm-registry-client/lib/get.js
index bb6d525b8e..9aab7d7b0f 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/get.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/get.js
@@ -10,7 +10,6 @@ function get (uri, timeout, nofollow, staleOk, cb) {
if (typeof cb !== "function") cb = staleOk, staleOk = false
if (typeof cb !== "function") cb = nofollow, nofollow = false
if (typeof cb !== "function") cb = timeout, timeout = -1
- if (typeof cb !== "function") cb = version, version = null
timeout = Math.min(timeout, this.conf.get('cache-max') || 0)
timeout = Math.max(timeout, this.conf.get('cache-min') || -Infinity)
@@ -22,18 +21,15 @@ function get (uri, timeout, nofollow, staleOk, cb) {
&& process.env.COMP_POINT !== undefined
) timeout = Math.max(timeout, 60000)
+ var cache = this.cacheFile(this.registry + uri) + "/.cache.json"
+
// /-/all is special.
// It uses timestamp-based caching and partial updates,
// because it is a monster.
if (uri === "/-/all") {
- return requestAll.call(this, cb)
+ return requestAll.call(this, cache, cb)
}
- var cacheUri = uri
- // on windows ":" is not an allowed character in a foldername
- cacheUri = cacheUri.replace(/:/g, '_').replace(/\?write=true$/, '')
- var cache = path.join(this.conf.get('cache'), cacheUri, ".cache.json")
-
// If the GET is part of a write operation (PUT or DELETE), then
// skip past the cache entirely, but still save the results.
if (uri.match(/\?write=true$/))
@@ -50,27 +46,25 @@ function get (uri, timeout, nofollow, staleOk, cb) {
}.bind(this))
}
-function requestAll (cb) {
- var cache = path.join(this.conf.get('cache'), "/-/all", ".cache.json")
-
- mkdir(path.join(this.conf.get('cache'), "-", "all"), function (er) {
+function requestAll (cache, cb) {
+ mkdir(path.dirname(cache), function (er) {
fs.readFile(cache, function (er, data) {
- if (er) return requestAll_.call(this, 0, {}, cb)
+ if (er) return requestAll_.call(this, 0, {}, cache, cb)
try {
data = JSON.parse(data)
} catch (ex) {
fs.writeFile(cache, "{}", function (er) {
if (er) return cb(new Error("Broken cache."))
- return requestAll_.call(this, 0, {}, cb)
+ return requestAll_.call(this, 0, {}, cache, cb)
}.bind(this))
}
var t = +data._updated || 0
- requestAll_.call(this, t, data, cb)
+ requestAll_.call(this, t, data, cache, cb)
}.bind(this))
}.bind(this))
}
-function requestAll_ (c, data, cb) {
+function requestAll_ (c, data, cache, cb) {
// use the cache and update in the background if it's not too old
if (Date.now() - c < 60000) {
cb(null, data)
@@ -84,7 +78,6 @@ function requestAll_ (c, data, cb) {
uri = "/-/all"
}
- var cache = path.join(this.conf.get('cache'), "-/all", ".cache.json")
this.request('GET', uri, function (er, updates, _, res) {
if (er) return cb(er, data)
var headers = res.headers
diff --git a/deps/npm/node_modules/npm-registry-client/lib/publish.js b/deps/npm/node_modules/npm-registry-client/lib/publish.js
index d6525eb783..2a503802ab 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/publish.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/publish.js
@@ -1,8 +1,7 @@
module.exports = publish
-var path = require("path")
- , url = require("url")
+var url = require("url")
, semver = require("semver")
, crypto = require("crypto")
, fs = require("fs")
@@ -29,14 +28,14 @@ function publish (data, tarball, cb) {
var self = this
fs.stat(tarball, function(er, s) {
if (er) return cb(er)
- fs.readFile(tarball, 'base64', function(er, tardata) {
+ fs.readFile(tarball, function(er, tarbuffer) {
if (er) return cb(er)
- putFirst.call(self, data, tardata, s, username, email, cb)
+ putFirst.call(self, data, tarbuffer, s, username, email, cb)
})
})
}
-function putFirst (data, tardata, stat, username, email, cb) {
+function putFirst (data, tarbuffer, stat, username, email, cb) {
// optimistically try to PUT all in one single atomic thing.
// If 409, then GET and merge, try again.
// If other error, then fail.
@@ -66,14 +65,14 @@ function putFirst (data, tardata, stat, username, email, cb) {
data._id = data.name+"@"+data.version
data.dist = data.dist || {}
- data.dist.shasum = crypto.createHash("sha1").update(tardata, 'base64').digest("hex")
+ data.dist.shasum = crypto.createHash("sha1").update(tarbuffer).digest("hex")
data.dist.tarball = url.resolve(registry, tbURI)
.replace(/^https:\/\//, "http://")
root._attachments = {}
root._attachments[ tbName ] = {
content_type: 'application/octet-stream',
- data: tardata,
+ data: tarbuffer.toString('base64'),
length: stat.size
};
diff --git a/deps/npm/node_modules/npm-registry-client/lib/request.js b/deps/npm/node_modules/npm-registry-client/lib/request.js
index 72401e60e7..4af0b8ff3c 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/request.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/request.js
@@ -2,13 +2,13 @@ module.exports = regRequest
var url = require("url")
, zlib = require("zlib")
- , fs = require("graceful-fs")
, rm = require("rimraf")
, asyncMap = require("slide").asyncMap
, Stream = require("stream").Stream
, request = require("request")
, retry = require("retry")
, crypto = require("crypto")
+ , pkg = require("../package.json")
function regRequest (method, where, what, etag, nofollow, cb_) {
if (typeof cb_ !== "function") cb_ = nofollow, nofollow = false
@@ -79,7 +79,7 @@ function regRequest (method, where, what, etag, nofollow, cb_) {
if (authRequired && !auth) {
return cb(new Error(
- "Cannot insert data into the registry without auth"))
+ "This request requires auth credentials. Run `npm login` and repeat the request."))
}
if (auth && authRequired) {
@@ -101,7 +101,7 @@ function regRequest (method, where, what, etag, nofollow, cb_) {
+ " at " + (new Date()).toLocaleTimeString())
makeRequest.call(self, method, remote, where, what, etag, nofollow
, function (er, parsed, raw, response) {
- if (!er || er.message.match(/^SSL Error/)) {
+ if (!er || (er.message && er.message.match(/^SSL Error/))) {
if (er)
er.code = 'ESSL'
return cb(er, parsed, raw, response)
@@ -149,6 +149,7 @@ function makeRequest (method, remote, where, what, etag, nofollow, cb_) {
}
headers['npm-session'] = this.sessionToken
+ headers.version = this.version || pkg.version
if (this.refer) {
headers.referer = this.refer
@@ -255,7 +256,7 @@ function requestDone (method, where, cb) {
, null, data, response )
}
- var er = null
+ er = null
if (parsed && response.headers.etag) {
parsed._etag = response.headers.etag
}
@@ -280,26 +281,7 @@ function requestDone (method, where, cb) {
// from thinking that it didn't work when it did.
// Note that failure is an acceptable option here, since the
// only result will be a stale cache for some helper commands.
- var path = require("path")
- , p = url.parse(where).pathname.split("/")
- , _ = "/"
- , caches = p.map(function (part) {
- part = part.replace(/:/g, "_")
- return _ = path.join(_, part)
- }).map(function (cache) {
- return path.join(this.conf.get('cache'), cache, ".cache.json")
- }, this)
-
- // if the method is DELETE, then also remove the thing itself.
- // Note that the search index is probably invalid. Whatever.
- // That's what you get for deleting stuff. Don't do that.
- if (method === "DELETE") {
- p = p.slice(0, p.indexOf("-rev"))
- p = p.join("/").replace(/:/g, "_")
- caches.push(path.join(this.conf.get('cache'), p))
- }
-
- asyncMap(caches, rm, function () {})
+ rm(this.cacheFile(where), function() {})
}
return cb(er, parsed, data, response)
}.bind(this)
diff --git a/deps/npm/node_modules/npm-registry-client/lib/star.js b/deps/npm/node_modules/npm-registry-client/lib/star.js
index 5c2375d04f..23fbd91692 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/star.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/star.js
@@ -5,8 +5,6 @@ function star (package, starred, cb) {
if (!this.conf.get('username')) return cb(new Error(
"Must be logged in to star/unstar packages"))
- var users = {}
-
this.request("GET", package + '?write=true', function (er, fullData) {
if (er) return cb(er)
diff --git a/deps/npm/node_modules/npm-registry-client/lib/stars.js b/deps/npm/node_modules/npm-registry-client/lib/stars.js
index 93f0d708f2..4ef57e2716 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/stars.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/stars.js
@@ -1,5 +1,3 @@
-var qs = require('querystring')
-
module.exports = stars
function stars (name, cb) {
diff --git a/deps/npm/node_modules/npm-registry-client/lib/tag.js b/deps/npm/node_modules/npm-registry-client/lib/tag.js
index 96136b717d..d7ebf08a66 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/tag.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/tag.js
@@ -1,6 +1,6 @@
module.exports = tag
-function tag (project, version, tag, cb) {
- this.request("PUT", project+"/"+tag, JSON.stringify(version), cb)
+function tag (project, version, tagName, cb) {
+ this.request("PUT", project+"/"+tagName, JSON.stringify(version), cb)
}
diff --git a/deps/npm/node_modules/npm-registry-client/lib/unpublish.js b/deps/npm/node_modules/npm-registry-client/lib/unpublish.js
index 4bbbb347e3..1887a99e64 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/unpublish.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/unpublish.js
@@ -29,10 +29,11 @@ function unpublish (name, ver, cb) {
var versions = data.versions || {}
, versionPublic = versions.hasOwnProperty(ver)
+ var dist
if (!versionPublic) {
this.log.info("unpublish", name+"@"+ver+" not published")
} else {
- var dist = versions[ver].dist
+ dist = versions[ver].dist
this.log.verbose("unpublish", "removing attachments", dist)
}
diff --git a/deps/npm/node_modules/npm-registry-client/package.json b/deps/npm/node_modules/npm-registry-client/package.json
index f7e876eaaf..c5b1cec6db 100644
--- a/deps/npm/node_modules/npm-registry-client/package.json
+++ b/deps/npm/node_modules/npm-registry-client/package.json
@@ -6,7 +6,7 @@
},
"name": "npm-registry-client",
"description": "Client for the npm registry",
- "version": "0.4.8",
+ "version": "1.0.0",
"repository": {
"url": "git://github.com/isaacs/npm-registry-client"
},
@@ -15,14 +15,15 @@
"test": "tap test/*.js"
},
"dependencies": {
- "request": "2 >=2.25.0",
- "graceful-fs": "~2.0.0",
- "semver": "^2.2.1",
- "slide": "~1.1.3",
"chownr": "0",
+ "graceful-fs": "~2.0.0",
"mkdirp": "~0.3.3",
- "rimraf": "~2",
+ "npm-cache-filename": "^1.0.0",
+ "request": "2 >=2.25.0",
"retry": "0.6.0",
+ "rimraf": "~2",
+ "semver": "2 >=2.2.1",
+ "slide": "~1.1.3",
"npmlog": ""
},
"devDependencies": {
@@ -32,13 +33,13 @@
"npmlog": ""
},
"license": "BSD",
- "readme": "# npm-registry-client\n\nThe code that npm uses to talk to the registry.\n\nIt handles all the caching and HTTP calls.\n\n## Usage\n\n```javascript\nvar RegClient = require('npm-registry-client')\nvar client = new RegClient(config)\n\nclient.get(\"npm\", \"latest\", 1000, function (er, data, raw, res) {\n // error is an error if there was a problem.\n // data is the parsed data object\n // raw is the json string\n // res is the response from couch\n})\n```\n\n# Configuration\n\nThis program is designed to work with\n[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\na plain-jane object with the appropriate configs, and it'll shim it\nfor you. Any configuration thingie that has get/set/del methods will\nalso be accepted.\n\n* `registry` **Required** {String} URL to the registry\n* `cache` **Required** {String} Path to the cache folder\n* `always-auth` {Boolean} Auth even for GET requests.\n* `auth` {String} A base64-encoded `username:password`\n* `email` {String} User's email address\n* `tag` {String} The default tag to use when publishing new packages.\n Default = `\"latest\"`\n* `ca` {String} Cerficate signing authority certificates to trust.\n* `cert` {String} Client certificate (PEM encoded). Enable access\n to servers that require client certificates\n* `key` {String} Private key (PEM encoded) for client certificate 'cert'\n* `strict-ssl` {Boolean} Whether or not to be strict with SSL\n certificates. Default = `true`\n* `user-agent` {String} User agent header to send. Default =\n `\"node/{process.version} {process.platform} {process.arch}\"`\n* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\n that works, otherwise logs are disabled.\n* `fetch-retries` {Number} Number of times to retry on GET failures.\n Default=2\n* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\n* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\n Default=10000 (10 seconds)\n* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\n Default=60000 (60 seconds)\n* `proxy` {URL} The url to proxy requests through.\n* `https-proxy` {URL} The url to proxy https requests through.\n Defaults to be the same as `proxy` if unset.\n* `_auth` {String} The base64-encoded authorization header.\n* `username` `_password` {String} Username/password to use to generate\n `_auth` if not supplied.\n* `_token` {Object} A token for use with\n [couch-login](https://npmjs.org/package/couch-login)\n\n# client.request(method, where, [what], [etag], [nofollow], cb)\n\n* `method` {String} HTTP method\n* `where` {String} Path to request on the server\n* `what` {Stream | Buffer | String | Object} The request body. Objects\n that are not Buffers or Streams are encoded as JSON.\n* `etag` {String} The cached ETag\n* `nofollow` {Boolean} Prevent following 302/301 responses\n* `cb` {Function}\n * `error` {Error | null}\n * `data` {Object} the parsed data object\n * `raw` {String} the json\n * `res` {Response Object} response from couch\n\nMake a request to the registry. All the other methods are wrappers\naround this. one.\n\n# client.adduser(username, password, email, cb)\n\n* `username` {String}\n* `password` {String}\n* `email` {String}\n* `cb` {Function}\n\nAdd a user account to the registry, or verify the credentials.\n\n# client.deprecate(name, version, message, cb)\n\n* `name` {String} The package name\n* `version` {String} Semver version range\n* `message` {String} The message to use as a deprecation warning\n* `cb` {Function}\n\nDeprecate a version of a package in the registry.\n\n# client.bugs(name, cb)\n\n* `name` {String} the name of the package\n* `cb` {Function}\n\nGet the url for bugs of a package\n\n# client.get(url, [timeout], [nofollow], [staleOk], cb)\n\n* `url` {String} The url path to fetch\n* `timeout` {Number} Number of seconds old that a cached copy must be\n before a new request will be made.\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `staleOk` {Boolean} If there's cached data available, then return that\n to the callback quickly, and update the cache the background.\n\nFetches data from the registry via a GET request, saving it in\nthe cache folder with the ETag.\n\n# client.publish(data, tarball, [readme], cb)\n\n* `data` {Object} Package data\n* `tarball` {String | Stream} Filename or stream of the package tarball\n* `readme` {String} Contents of the README markdown file\n* `cb` {Function}\n\nPublish a package to the registry.\n\nNote that this does not create the tarball from a folder. However, it\ncan accept a gzipped tar stream or a filename to a tarball.\n\n# client.star(package, starred, cb)\n\n* `package` {String} Name of the package to star\n* `starred` {Boolean} True to star the package, false to unstar it.\n* `cb` {Function}\n\nStar or unstar a package.\n\nNote that the user does not have to be the package owner to star or\nunstar a package, though other writes do require that the user be the\npackage owner.\n\n# client.stars(username, cb)\n\n* `username` {String} Name of user to fetch starred packages for.\n* `cb` {Function}\n\nView your own or another user's starred packages.\n\n# client.tag(project, version, tag, cb)\n\n* `project` {String} Project name\n* `version` {String} Version to tag\n* `tag` {String} Tag name to apply\n* `cb` {Function}\n\nMark a version in the `dist-tags` hash, so that `pkg@tag`\nwill fetch the specified version.\n\n# client.unpublish(name, [ver], cb)\n\n* `name` {String} package name\n* `ver` {String} version to unpublish. Leave blank to unpublish all\n versions.\n* `cb` {Function}\n\nRemove a version of a package (or all versions) from the registry. When\nthe last version us unpublished, the entire document is removed from the\ndatabase.\n\n# client.upload(where, file, [etag], [nofollow], cb)\n\n* `where` {String} URL path to upload to\n* `file` {String | Stream} Either the filename or a readable stream\n* `etag` {String} Cache ETag\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `cb` {Function}\n\nUpload an attachment. Mostly used by `client.publish()`.\n",
+ "readme": "# npm-registry-client\n\nThe code that npm uses to talk to the registry.\n\nIt handles all the caching and HTTP calls.\n\n## Usage\n\n```javascript\nvar RegClient = require('npm-registry-client')\nvar client = new RegClient(config)\n\nclient.get(\"npm\", \"latest\", 1000, function (er, data, raw, res) {\n // error is an error if there was a problem.\n // data is the parsed data object\n // raw is the json string\n // res is the response from couch\n})\n```\n\n# Configuration\n\nThis program is designed to work with\n[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\na plain-jane object with the appropriate configs, and it'll shim it\nfor you. Any configuration thingie that has get/set/del methods will\nalso be accepted.\n\n* `registry` **Required** {String} URL to the registry\n* `cache` **Required** {String} Path to the cache folder\n* `always-auth` {Boolean} Auth even for GET requests.\n* `auth` {String} A base64-encoded `username:password`\n* `email` {String} User's email address\n* `tag` {String} The default tag to use when publishing new packages.\n Default = `\"latest\"`\n* `ca` {String} Cerficate signing authority certificates to trust.\n* `cert` {String} Client certificate (PEM encoded). Enable access\n to servers that require client certificates\n* `key` {String} Private key (PEM encoded) for client certificate 'cert'\n* `strict-ssl` {Boolean} Whether or not to be strict with SSL\n certificates. Default = `true`\n* `user-agent` {String} User agent header to send. Default =\n `\"node/{process.version} {process.platform} {process.arch}\"`\n* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\n that works, otherwise logs are disabled.\n* `fetch-retries` {Number} Number of times to retry on GET failures.\n Default=2\n* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\n* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\n Default=10000 (10 seconds)\n* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\n Default=60000 (60 seconds)\n* `proxy` {URL} The url to proxy requests through.\n* `https-proxy` {URL} The url to proxy https requests through.\n Defaults to be the same as `proxy` if unset.\n* `_auth` {String} The base64-encoded authorization header.\n* `username` `_password` {String} Username/password to use to generate\n `_auth` if not supplied.\n* `_token` {Object} A token for use with\n [couch-login](https://npmjs.org/package/couch-login)\n\n# client.request(method, where, [what], [etag], [nofollow], cb)\n\n* `method` {String} HTTP method\n* `where` {String} Path to request on the server\n* `what` {Stream | Buffer | String | Object} The request body. Objects\n that are not Buffers or Streams are encoded as JSON.\n* `etag` {String} The cached ETag\n* `nofollow` {Boolean} Prevent following 302/301 responses\n* `cb` {Function}\n * `error` {Error | null}\n * `data` {Object} the parsed data object\n * `raw` {String} the json\n * `res` {Response Object} response from couch\n\nMake a request to the registry. All the other methods are wrappers\naround this. one.\n\n# client.adduser(username, password, email, cb)\n\n* `username` {String}\n* `password` {String}\n* `email` {String}\n* `cb` {Function}\n\nAdd a user account to the registry, or verify the credentials.\n\n# client.deprecate(name, version, message, cb)\n\n* `name` {String} The package name\n* `version` {String} Semver version range\n* `message` {String} The message to use as a deprecation warning\n* `cb` {Function}\n\nDeprecate a version of a package in the registry.\n\n# client.bugs(name, cb)\n\n* `name` {String} the name of the package\n* `cb` {Function}\n\nGet the url for bugs of a package\n\n# client.get(url, [timeout], [nofollow], [staleOk], cb)\n\n* `url` {String} The url path to fetch\n* `timeout` {Number} Number of seconds old that a cached copy must be\n before a new request will be made.\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `staleOk` {Boolean} If there's cached data available, then return that\n to the callback quickly, and update the cache the background.\n\nFetches data from the registry via a GET request, saving it in\nthe cache folder with the ETag.\n\n# client.publish(data, tarball, cb)\n\n* `data` {Object} Package data\n* `tarball` {String | Stream} Filename or stream of the package tarball\n* `cb` {Function}\n\nPublish a package to the registry.\n\nNote that this does not create the tarball from a folder. However, it\ncan accept a gzipped tar stream or a filename to a tarball.\n\n# client.star(package, starred, cb)\n\n* `package` {String} Name of the package to star\n* `starred` {Boolean} True to star the package, false to unstar it.\n* `cb` {Function}\n\nStar or unstar a package.\n\nNote that the user does not have to be the package owner to star or\nunstar a package, though other writes do require that the user be the\npackage owner.\n\n# client.stars(username, cb)\n\n* `username` {String} Name of user to fetch starred packages for.\n* `cb` {Function}\n\nView your own or another user's starred packages.\n\n# client.tag(project, version, tag, cb)\n\n* `project` {String} Project name\n* `version` {String} Version to tag\n* `tag` {String} Tag name to apply\n* `cb` {Function}\n\nMark a version in the `dist-tags` hash, so that `pkg@tag`\nwill fetch the specified version.\n\n# client.unpublish(name, [ver], cb)\n\n* `name` {String} package name\n* `ver` {String} version to unpublish. Leave blank to unpublish all\n versions.\n* `cb` {Function}\n\nRemove a version of a package (or all versions) from the registry. When\nthe last version us unpublished, the entire document is removed from the\ndatabase.\n\n# client.upload(where, file, [etag], [nofollow], cb)\n\n* `where` {String} URL path to upload to\n* `file` {String | Stream} Either the filename or a readable stream\n* `etag` {String} Cache ETag\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `cb` {Function}\n\nUpload an attachment. Mostly used by `client.publish()`.\n",
"readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/isaacs/npm-registry-client/issues"
},
"homepage": "https://github.com/isaacs/npm-registry-client",
- "_id": "npm-registry-client@0.4.8",
- "_shasum": "a6685a161033101be6064b7af887ab440e8695d0",
- "_from": "npm-registry-client@~0.4.7"
+ "_id": "npm-registry-client@1.0.0",
+ "_shasum": "2a6f9dfdce5f8ebf4b9af4dbfd738384d25014e5",
+ "_from": "npm-registry-client@1"
}
diff --git a/deps/npm/node_modules/npm-user-validate/README.md b/deps/npm/node_modules/npm-user-validate/README.md
index 5e34f0aa07..53bdae5af0 100644
--- a/deps/npm/node_modules/npm-user-validate/README.md
+++ b/deps/npm/node_modules/npm-user-validate/README.md
@@ -1,6 +1,6 @@
-[![Build Status](https://travis-ci.org/robertkowalski/npm-user-validate.png?branch=master)](https://travis-ci.org/robertkowalski/npm-user-validate)
-[![devDependency Status](https://david-dm.org/robertkowalski/npm-user-validate/dev-status.png)](https://david-dm.org/robertkowalski/npm-user-validate#info=devDependencies)
+[![Build Status](https://travis-ci.org/npm/npm-user-validate.png?branch=master)](https://travis-ci.org/npm/npm-user-validate)
+[![devDependency Status](https://david-dm.org/npm/npm-user-validate/dev-status.png)](https://david-dm.org/npm/npm-user-validate#info=devDependencies)
# npm-user-validate
-Validation for the npm client and npm-www (and probably other npm projects) \ No newline at end of file
+Validation for the npm client and npm-www (and probably other npm projects)
diff --git a/deps/npm/node_modules/npm-user-validate/npm-user-validate.js b/deps/npm/node_modules/npm-user-validate/npm-user-validate.js
index 853456f527..f18e13ccf7 100644
--- a/deps/npm/node_modules/npm-user-validate/npm-user-validate.js
+++ b/deps/npm/node_modules/npm-user-validate/npm-user-validate.js
@@ -8,9 +8,7 @@ var requirements = exports.requirements = {
urlSafe: 'Username may not contain non-url-safe chars',
dot: 'Username may not start with "."'
},
- password: {
- badchars: 'Password passwords cannot contain these characters: \'!:@"'
- },
+ password: {},
email: {
valid: 'Email must be an email address'
}
@@ -41,9 +39,5 @@ function email (em) {
}
function pw (pw) {
- if (pw.match(/['!:@"]/)) {
- return new Error(requirements.password.badchars)
- }
-
return null
}
diff --git a/deps/npm/node_modules/npm-user-validate/package.json b/deps/npm/node_modules/npm-user-validate/package.json
index a05b95ef1d..b9377c7716 100644
--- a/deps/npm/node_modules/npm-user-validate/package.json
+++ b/deps/npm/node_modules/npm-user-validate/package.json
@@ -1,6 +1,6 @@
{
"name": "npm-user-validate",
- "version": "0.0.3",
+ "version": "0.1.0",
"description": "User validations for npm",
"main": "npm-user-validate.js",
"devDependencies": {
@@ -11,7 +11,7 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/robertkowalski/npm-user-validate"
+ "url": "git://github.com/npm/npm-registry-mock.git"
},
"keywords": [
"npm",
@@ -23,15 +23,13 @@
"email": "rok@kowalski.gd"
},
"license": "BSD",
- "readme": "[![Build Status](https://travis-ci.org/robertkowalski/npm-user-validate.png?branch=master)](https://travis-ci.org/robertkowalski/npm-user-validate)\n[![devDependency Status](https://david-dm.org/robertkowalski/npm-user-validate/dev-status.png)](https://david-dm.org/robertkowalski/npm-user-validate#info=devDependencies)\n\n# npm-user-validate\n\nValidation for the npm client and npm-www (and probably other npm projects)",
+ "readme": "[![Build Status](https://travis-ci.org/npm/npm-user-validate.png?branch=master)](https://travis-ci.org/npm/npm-user-validate)\n[![devDependency Status](https://david-dm.org/npm/npm-user-validate/dev-status.png)](https://david-dm.org/npm/npm-user-validate#info=devDependencies)\n\n# npm-user-validate\n\nValidation for the npm client and npm-www (and probably other npm projects)\n",
"readmeFilename": "README.md",
"bugs": {
- "url": "https://github.com/robertkowalski/npm-user-validate/issues"
+ "url": "https://github.com/npm/npm-registry-mock/issues"
},
- "_id": "npm-user-validate@0.0.3",
- "dist": {
- "shasum": "7b147d11038083fb0ba2d60ff851dc20322aa9f6"
- },
- "_from": "npm-user-validate@0.0.3",
- "_resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-0.0.3.tgz"
+ "homepage": "https://github.com/npm/npm-registry-mock",
+ "_id": "npm-user-validate@0.1.0",
+ "_shasum": "358a5b5148ed3f79771d980388c6e34c4a61f638",
+ "_from": "npm-user-validate@latest"
}
diff --git a/deps/npm/node_modules/npm-user-validate/test/pw.test.js b/deps/npm/node_modules/npm-user-validate/test/pw.test.js
index e99c991cbf..d57401da0b 100644
--- a/deps/npm/node_modules/npm-user-validate/test/pw.test.js
+++ b/deps/npm/node_modules/npm-user-validate/test/pw.test.js
@@ -3,25 +3,25 @@ var v = require('../npm-user-validate.js').pw
test('pw contains a \'', function (t) {
err = v('\'')
- t.type(err, 'object')
+ t.type(err, 'null')
t.end()
})
test('pw contains a :', function (t) {
err = v(':')
- t.type(err, 'object')
+ t.type(err, 'null')
t.end()
})
test('pw contains a @', function (t) {
err = v('@')
- t.type(err, 'object')
+ t.notOk(err, 'null')
t.end()
})
test('pw contains a "', function (t) {
err = v('"')
- t.type(err, 'object')
+ t.type(err, 'null')
t.end()
})
@@ -29,4 +29,4 @@ test('pw is ok', function (t) {
err = v('duck')
t.type(err, 'null')
t.end()
-}) \ No newline at end of file
+})
diff --git a/deps/npm/node_modules/npmconf/config-defs.js b/deps/npm/node_modules/npmconf/config-defs.js
index f879a941d6..7d76f81291 100644
--- a/deps/npm/node_modules/npmconf/config-defs.js
+++ b/deps/npm/node_modules/npmconf/config-defs.js
@@ -162,7 +162,7 @@ Object.defineProperty(exports, "defaults", {get: function () {
, key: null
, link: false
, "local-address" : undefined
- , loglevel : "http"
+ , loglevel : "warn"
, logstream : process.stderr
, long : false
, message : "%s"
@@ -196,6 +196,7 @@ Object.defineProperty(exports, "defaults", {get: function () {
, shell : osenv.shell()
, shrinkwrap: true
, "sign-git-tag": false
+ , spin: true
, "strict-ssl": true
, tag : "latest"
, tmp : temp
@@ -303,6 +304,7 @@ exports.types =
, shell : String
, shrinkwrap: Boolean
, "sign-git-tag": Boolean
+ , spin: ["always", Boolean]
, "strict-ssl": Boolean
, tag : String
, tmp : path
diff --git a/deps/npm/lib/utils/find-prefix.js b/deps/npm/node_modules/npmconf/lib/find-prefix.js
index a61d9e136d..bb00cd6b10 100644
--- a/deps/npm/lib/utils/find-prefix.js
+++ b/deps/npm/node_modules/npmconf/lib/find-prefix.js
@@ -2,9 +2,8 @@
module.exports = findPrefix
-var fs = require("graceful-fs")
- , path = require("path")
- , npm = require("../npm.js")
+var fs = require("fs")
+var path = require("path")
function findPrefix (p, cb_) {
function cb (er, p) {
diff --git a/deps/npm/node_modules/npmconf/lib/load-prefix.js b/deps/npm/node_modules/npmconf/lib/load-prefix.js
new file mode 100644
index 0000000000..c161b06495
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/lib/load-prefix.js
@@ -0,0 +1,51 @@
+module.exports = loadPrefix
+
+var findPrefix = require("./find-prefix.js")
+var mkdirp = require("mkdirp")
+var path = require('path')
+
+function loadPrefix (cb) {
+ var cli = this.list[0]
+
+ // try to guess at a good node_modules location.
+ var p
+ , gp
+
+ if (!Object.prototype.hasOwnProperty.call(cli, "prefix")) {
+ p = process.cwd()
+ } else {
+ p = this.get("prefix")
+ }
+ gp = this.get("prefix")
+
+ findPrefix(p, function (er, p) {
+ Object.defineProperty(this, "localPrefix",
+ { get : function () { return p }
+ , set : function (r) { return p = r }
+ , enumerable : true
+ })
+ // the prefix MUST exist, or else nothing works.
+ if (!this.get("global")) {
+ mkdirp(p, next.bind(this))
+ } else {
+ next.bind(this)(er)
+ }
+ }.bind(this))
+
+ gp = path.resolve(gp)
+ Object.defineProperty(this, "globalPrefix",
+ { get : function () { return gp }
+ , set : function (r) { return gp = r }
+ , enumerable : true
+ })
+ // the prefix MUST exist, or else nothing works.
+ mkdirp(gp, next.bind(this))
+
+ var i = 2
+ var errState = null
+ function next (er) {
+ if (errState) return
+ if (er) return cb(errState = er)
+ if (--i === 0) return cb()
+ }
+}
diff --git a/deps/npm/node_modules/npmconf/lib/load-uid.js b/deps/npm/node_modules/npmconf/lib/load-uid.js
new file mode 100644
index 0000000000..3ca7987735
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/lib/load-uid.js
@@ -0,0 +1,15 @@
+module.exports = loadUid
+
+var getUid = require("uid-number")
+
+// Call in the context of a npmconf object
+
+function loadUid (cb) {
+ // if we're not in unsafe-perm mode, then figure out who
+ // to run stuff as. Do this first, to support `npm update npm -g`
+ if (!this.get("unsafe-perm")) {
+ getUid(this.get("user"), this.get("group"), cb)
+ } else {
+ process.nextTick(cb)
+ }
+}
diff --git a/deps/npm/node_modules/npmconf/lib/set-user.js b/deps/npm/node_modules/npmconf/lib/set-user.js
new file mode 100644
index 0000000000..2e7774aec3
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/lib/set-user.js
@@ -0,0 +1,23 @@
+module.exports = setUser
+
+var path = require('path')
+var fs = require('fs')
+
+function setUser (cb) {
+ var defaultConf = Object.getPrototypeOf(this.root)
+
+ // If global, leave it as-is.
+ // If not global, then set the user to the owner of the prefix folder.
+ // Just set the default, so it can be overridden.
+ if (this.get("global")) return cb()
+ if (process.env.SUDO_UID) {
+ defaultConf.user = +(process.env.SUDO_UID)
+ return cb()
+ }
+
+ var prefix = path.resolve(this.get("prefix"))
+ fs.stat(prefix, function (er, st) {
+ defaultConf.user = st && st.uid
+ return cb(er)
+ })
+}
diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json b/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json
index a7349f06b7..f96627c728 100644
--- a/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json
+++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/node_modules/proto-list/package.json
@@ -23,12 +23,22 @@
"tap": "0"
},
"readme": "A list of objects, bound by their prototype chain.\n\nUsed in npm's config stuff.\n",
- "readmeFilename": "README.md",
- "bugs": {
- "url": "https://github.com/isaacs/proto-list/issues"
- },
- "homepage": "https://github.com/isaacs/proto-list",
"_id": "proto-list@1.2.2",
+ "dist": {
+ "shasum": "48b88798261ec2c4a785720cdfec6200d57d3326",
+ "tarball": "http://registry.npmjs.org/proto-list/-/proto-list-1.2.2.tgz"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "directories": {},
"_shasum": "48b88798261ec2c4a785720cdfec6200d57d3326",
"_from": "proto-list@~1.2.1",
"_resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.2.tgz"
diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
index 2f8695410e..c59f5ceeb6 100644
--- a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
+++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
@@ -28,7 +28,27 @@
"url": "https://github.com/dominictarr/config-chain/issues"
},
"_id": "config-chain@1.1.8",
- "_shasum": "0943d0b7227213a20d4eaff4434f4a1c0a052cad",
+ "dist": {
+ "shasum": "0943d0b7227213a20d4eaff4434f4a1c0a052cad",
+ "tarball": "http://registry.npmjs.org/config-chain/-/config-chain-1.1.8.tgz"
+ },
"_from": "config-chain@~1.1.8",
+ "_npmVersion": "1.3.6",
+ "_npmUser": {
+ "name": "dominictarr",
+ "email": "dominic.tarr@gmail.com"
+ },
+ "maintainers": [
+ {
+ "name": "dominictarr",
+ "email": "dominic.tarr@gmail.com"
+ },
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {},
+ "_shasum": "0943d0b7227213a20d4eaff4434f4a1c0a052cad",
"_resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.8.tgz"
}
diff --git a/deps/npm/node_modules/npmconf/npmconf.js b/deps/npm/node_modules/npmconf/npmconf.js
index 46ff2b813b..aa2c7b2e6e 100644
--- a/deps/npm/node_modules/npmconf/npmconf.js
+++ b/deps/npm/node_modules/npmconf/npmconf.js
@@ -10,6 +10,7 @@ var nopt = require('nopt')
var ini = require('ini')
var Octal = configDefs.Octal
var mkdirp = require('mkdirp')
+var path = require('path')
exports.load = load
exports.Conf = Conf
@@ -17,9 +18,11 @@ exports.loaded = false
exports.rootConf = null
exports.usingBuiltin = false
exports.defs = configDefs
+
Object.defineProperty(exports, 'defaults', { get: function () {
return configDefs.defaults
}, enumerable: true })
+
Object.defineProperty(exports, 'types', { get: function () {
return configDefs.types
}, enumerable: true })
@@ -67,6 +70,7 @@ function load (cli_, builtin_, cb_) {
loadCbs.push(cb)
if (loading)
return
+
loading = true
cb = once(function (er, conf) {
@@ -81,46 +85,68 @@ function load (cli_, builtin_, cb_) {
// check for a builtin if provided.
exports.usingBuiltin = !!builtin
var rc = exports.rootConf = new Conf()
- var defaults = configDefs.defaults
if (builtin)
rc.addFile(builtin, 'builtin')
else
rc.add({}, 'builtin')
rc.on('load', function () {
- var conf = new Conf(rc)
- conf.usingBuiltin = !!builtin
- conf.add(cli, 'cli')
- conf.addEnv()
+ load_(builtin, rc, cli, cb)
+ })
+}
+
+function load_(builtin, rc, cli, cb) {
+ var defaults = configDefs.defaults
+ var conf = new Conf(rc)
+
+ conf.usingBuiltin = !!builtin
+ conf.add(cli, 'cli')
+ conf.addEnv()
+
+ conf.loadExtras(function(er) {
+ if (er)
+ return cb(er)
+
+ if (!conf.get('global')) {
+ var projectConf = path.resolve(conf.localPrefix, '.npmrc')
+ conf.addFile(projectConf, 'project')
+ conf.once('load', afterPrefix)
+ }
+ else return afterPrefix()
+ })
+
+ function afterPrefix() {
conf.addFile(conf.get('userconfig'), 'user')
conf.once('error', cb)
+ conf.once('load', afterUser)
+ }
+
+ function afterUser () {
+ // globalconfig and globalignorefile defaults
+ // need to respond to the 'prefix' setting up to this point.
+ // Eg, `npm config get globalconfig --prefix ~/local` should
+ // return `~/local/etc/npmrc`
+ // annoying humans and their expectations!
+ if (conf.get('prefix')) {
+ var etc = path.resolve(conf.get('prefix'), 'etc')
+ defaults.globalconfig = path.resolve(etc, 'npmrc')
+ defaults.globalignorefile = path.resolve(etc, 'npmignore')
+ }
+
+ conf.addFile(conf.get('globalconfig'), 'global')
+
+ // move the builtin into the conf stack now.
+ conf.root = defaults
+ conf.add(rc.shift(), 'builtin')
conf.once('load', function () {
- // globalconfig and globalignorefile defaults
- // need to respond to the "prefix" setting up to this point.
- // Eg, `npm config get globalconfig --prefix ~/local` should
- // return `~/local/etc/npmrc`
- // annoying humans and their expectations!
- if (conf.get('prefix')) {
- var etc = path.resolve(conf.get("prefix"), "etc")
- defaults.globalconfig = path.resolve(etc, "npmrc")
- defaults.globalignorefile = path.resolve(etc, "npmignore")
- }
- conf.addFile(conf.get('globalconfig'), 'global')
-
- // move the builtin into the conf stack now.
- conf.root = defaults
- conf.add(rc.shift(), 'builtin')
- conf.once('load', function () {
- // warn about invalid bits.
- validate(conf)
- exports.loaded = conf
- cb(null, conf)
- })
+ // warn about invalid bits.
+ validate(conf)
+ exports.loaded = conf
+ cb(null, conf)
})
- })
+ }
}
-
// Basically the same as CC, but:
// 1. Always ini
// 2. Parses environment variable names in field values
@@ -142,6 +168,23 @@ function Conf (base) {
this.root = configDefs.defaults
}
+Conf.prototype.loadPrefix = require('./lib/load-prefix.js')
+Conf.prototype.loadUid = require('./lib/load-uid.js')
+Conf.prototype.setUser = require('./lib/set-user.js')
+Conf.prototype.findPrefix = require('./lib/find-prefix.js')
+
+Conf.prototype.loadExtras = function(cb) {
+ this.loadPrefix(function(er) {
+ if (er)
+ return cb(er)
+ this.setUser(function(er) {
+ if (er)
+ return cb(er)
+ this.loadUid(cb)
+ }.bind(this))
+ }.bind(this))
+}
+
Conf.prototype.save = function (where, cb) {
var target = this.sources[where]
if (!target || !(target.path || target.source) || !target.data) {
@@ -316,7 +359,7 @@ function parseField (f, k, emptyIsFalse) {
}
function envReplace (f) {
- if (typeof f !== "string" || !f) return f
+ if (typeof f !== 'string' || !f) return f
// replace any ${ENV} values with the appropriate environ.
var envExpr = /(\\*)\$\{([^}]+)\}/g
@@ -325,7 +368,7 @@ function envReplace (f) {
if (esc)
return orig
if (undefined === process.env[name])
- throw new Error("Failed to replace env in config: "+orig)
+ throw new Error('Failed to replace env in config: '+orig)
return process.env[name]
})
}
diff --git a/deps/npm/node_modules/npmconf/package.json b/deps/npm/node_modules/npmconf/package.json
index 3e3c76e6b7..f6727d98ff 100644
--- a/deps/npm/node_modules/npmconf/package.json
+++ b/deps/npm/node_modules/npmconf/package.json
@@ -1,6 +1,6 @@
{
"name": "npmconf",
- "version": "0.1.15",
+ "version": "1.0.1",
"description": "The config thing npm uses",
"main": "npmconf.js",
"directories": {
@@ -9,12 +9,13 @@
"dependencies": {
"config-chain": "~1.1.8",
"inherits": "~2.0.0",
- "once": "~1.3.0",
+ "ini": "^1.2.0",
"mkdirp": "~0.3.3",
- "osenv": "0.0.3",
"nopt": "2",
+ "once": "~1.3.0",
+ "osenv": "0.0.3",
"semver": "2",
- "ini": "~1.1.0"
+ "uid-number": "0.0.5"
},
"devDependencies": {
"tap": "~0.4.0"
@@ -41,11 +42,12 @@
"license": "BSD",
"readme": "# npmconf\n\nThe config thing npm uses\n\nIf you are interested in interacting with the config settings that npm\nuses, then use this module.\n\nHowever, if you are writing a new Node.js program, and want\nconfiguration functionality similar to what npm has, but for your\nown thing, then I'd recommend using [rc](https://github.com/dominictarr/rc),\nwhich is probably what you want.\n\nIf I were to do it all over again, that's what I'd do for npm. But,\nalas, there are many systems depending on many of the particulars of\nnpm's configuration setup, so it's not worth the cost of changing.\n\n## USAGE\n\n```javascript\nvar npmconf = require('npmconf')\n\n// pass in the cli options that you read from the cli\n// or whatever top-level configs you want npm to use for now.\nnpmconf.load({some:'configs'}, function (er, conf) {\n // do stuff with conf\n conf.get('some', 'cli') // 'configs'\n conf.get('username') // 'joebobwhatevers'\n conf.set('foo', 'bar', 'user')\n conf.save('user', function (er) {\n // foo = bar is now saved to ~/.npmrc or wherever\n })\n})\n```\n",
"readmeFilename": "README.md",
+ "gitHead": "7da0322e33d6116378f6a2206d8b8fa113c06e4b",
"bugs": {
"url": "https://github.com/isaacs/npmconf/issues"
},
"homepage": "https://github.com/isaacs/npmconf",
- "_id": "npmconf@0.1.15",
- "_shasum": "9df0f0545d04d121330c32a5be9d351b4a8df029",
+ "_id": "npmconf@1.0.1",
+ "_shasum": "3503d12c6585395b0d8378d76e2d4a2453a23328",
"_from": "npmconf@latest"
}
diff --git a/deps/npm/node_modules/npmconf/test/basic.js b/deps/npm/node_modules/npmconf/test/basic.js
index 83832c2ef2..f17f0fb8e0 100644
--- a/deps/npm/node_modules/npmconf/test/basic.js
+++ b/deps/npm/node_modules/npmconf/test/basic.js
@@ -1,6 +1,9 @@
var test = require('tap').test
var npmconf = require('../npmconf.js')
var common = require('./00-setup.js')
+var path = require('path')
+
+var projectData = {}
var ucData =
{ globalconfig: common.globalconfig,
@@ -29,6 +32,7 @@ var ucData =
httponly: true } }
var envData = { userconfig: common.userconfig, 'other-env-thing': '1000' }
+var envDataFix = { userconfig: common.userconfig, 'other-env-thing': 1000 }
var gcData = { 'package-config:foo': 'boo' }
@@ -38,7 +42,8 @@ var cli = { foo: 'bar', umask: 022 }
var expectList =
[ cli,
- envData,
+ envDataFix,
+ projectData,
ucData,
gcData,
biData ]
@@ -46,9 +51,13 @@ var expectList =
var expectSources =
{ cli: { data: cli },
env:
- { data: envData,
+ { data: envDataFix,
source: envData,
prefix: '' },
+ project:
+ { path: path.resolve(__dirname, '..', '.npmrc'),
+ type: 'ini',
+ data: projectData },
user:
{ path: common.userconfig,
type: 'ini',
diff --git a/deps/npm/node_modules/npmconf/test/builtin.js b/deps/npm/node_modules/npmconf/test/builtin.js
index c5216ed902..0a305d2a65 100644
--- a/deps/npm/node_modules/npmconf/test/builtin.js
+++ b/deps/npm/node_modules/npmconf/test/builtin.js
@@ -1,6 +1,7 @@
var test = require('tap').test
var npmconf = require('../npmconf.js')
var common = require('./00-setup.js')
+var path = require('path')
var ucData =
{ globalconfig: common.globalconfig,
@@ -29,6 +30,7 @@ var ucData =
httponly: true } }
var envData = { userconfig: common.userconfig, 'other-env-thing': '1000' }
+var envDataFix = { userconfig: common.userconfig, 'other-env-thing': 1000 }
var gcData = { 'package-config:foo': 'boo' }
@@ -36,9 +38,12 @@ var biData = { 'builtin-config': true }
var cli = { foo: 'bar', heading: 'foo', 'git-tag-version': false }
+var projectData = {}
+
var expectList =
[ cli,
- envData,
+ envDataFix,
+ projectData,
ucData,
gcData,
biData ]
@@ -46,9 +51,13 @@ var expectList =
var expectSources =
{ cli: { data: cli },
env:
- { data: envData,
+ { data: envDataFix,
source: envData,
prefix: '' },
+ project:
+ { path: path.resolve(__dirname, '..', '.npmrc'),
+ type: 'ini',
+ data: projectData },
user:
{ path: common.userconfig,
type: 'ini',
diff --git a/deps/npm/node_modules/npmconf/test/fixtures/.npmrc b/deps/npm/node_modules/npmconf/test/fixtures/.npmrc
new file mode 100644
index 0000000000..7d59bd8be1
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/test/fixtures/.npmrc
@@ -0,0 +1 @@
+just = testing
diff --git a/deps/npm/node_modules/npmconf/test/fixtures/package.json b/deps/npm/node_modules/npmconf/test/fixtures/package.json
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/test/fixtures/package.json
diff --git a/deps/npm/node_modules/npmconf/test/project.js b/deps/npm/node_modules/npmconf/test/project.js
new file mode 100644
index 0000000000..04e063855b
--- /dev/null
+++ b/deps/npm/node_modules/npmconf/test/project.js
@@ -0,0 +1,85 @@
+var test = require('tap').test
+var npmconf = require('../npmconf.js')
+var common = require('./00-setup.js')
+var path = require('path')
+var fix = path.resolve(__dirname, 'fixtures')
+var projectRc = path.resolve(fix, '.npmrc')
+
+var projectData = { just: 'testing' }
+
+var ucData =
+ { globalconfig: common.globalconfig,
+ email: 'i@izs.me',
+ 'env-thing': 'asdf',
+ 'init.author.name': 'Isaac Z. Schlueter',
+ 'init.author.email': 'i@izs.me',
+ 'init.author.url': 'http://blog.izs.me/',
+ 'proprietary-attribs': false,
+ 'npm:publishtest': true,
+ '_npmjs.org:couch': 'https://admin:password@localhost:5984/registry',
+ _auth: 'dXNlcm5hbWU6cGFzc3dvcmQ=',
+ 'npm-www:nocache': '1',
+ nodedir: '/Users/isaacs/dev/js/node-v0.8',
+ 'sign-git-tag': true,
+ message: 'v%s',
+ 'strict-ssl': false,
+ 'tmp': process.env.HOME + '/.tmp',
+ username : "username",
+ _password : "password",
+ _token:
+ { AuthSession: 'yabba-dabba-doodle',
+ version: '1',
+ expires: '1345001053415',
+ path: '/',
+ httponly: true } }
+
+var envData = { userconfig: common.userconfig, 'other-env-thing': '1000' }
+var envDataFix = { userconfig: common.userconfig, 'other-env-thing': 1000 }
+
+var gcData = { 'package-config:foo': 'boo' }
+
+var biData = {}
+
+var cli = { foo: 'bar', umask: 022, prefix: fix }
+
+var expectList =
+[ cli,
+ envDataFix,
+ projectData,
+ ucData,
+ gcData,
+ biData ]
+
+var expectSources =
+{ cli: { data: cli },
+ env:
+ { data: envDataFix,
+ source: envData,
+ prefix: '' },
+ project:
+ { path: projectRc,
+ type: 'ini',
+ data: projectData },
+ user:
+ { path: common.userconfig,
+ type: 'ini',
+ data: ucData },
+ global:
+ { path: common.globalconfig,
+ type: 'ini',
+ data: gcData },
+ builtin: { data: biData } }
+
+test('no builtin', function (t) {
+ npmconf.load(cli, function (er, conf) {
+ if (er) throw er
+ t.same(conf.list, expectList)
+ t.same(conf.sources, expectSources)
+ t.same(npmconf.rootConf.list, [])
+ t.equal(npmconf.rootConf.root, npmconf.defs.defaults)
+ t.equal(conf.root, npmconf.defs.defaults)
+ t.equal(conf.get('umask'), 022)
+ t.equal(conf.get('heading'), 'npm')
+ t.end()
+ })
+})
diff --git a/deps/npm/node_modules/npmlog/package.json b/deps/npm/node_modules/npmlog/package.json
index 28b444cca8..5bb3925537 100644
--- a/deps/npm/node_modules/npmlog/package.json
+++ b/deps/npm/node_modules/npmlog/package.json
@@ -28,5 +28,23 @@
"url": "https://github.com/isaacs/npmlog/issues"
},
"_id": "npmlog@0.0.6",
- "_from": "npmlog@latest"
+ "dist": {
+ "shasum": "685043fe71aa1665d6e3b2acef180640caf40873",
+ "tarball": "http://registry.npmjs.org/npmlog/-/npmlog-0.0.6.tgz"
+ },
+ "_from": "npmlog@latest",
+ "_npmVersion": "1.3.11",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {},
+ "_shasum": "685043fe71aa1665d6e3b2acef180640caf40873",
+ "_resolved": "https://registry.npmjs.org/npmlog/-/npmlog-0.0.6.tgz"
}
diff --git a/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json b/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json
index f45c5c94fc..a1f2911ad9 100644
--- a/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json
+++ b/deps/npm/node_modules/read-installed/node_modules/util-extend/package.json
@@ -17,7 +17,25 @@
"bugs": {
"url": "https://github.com/isaacs/util-extend/issues"
},
- "homepage": "https://github.com/isaacs/util-extend",
"_id": "util-extend@1.0.1",
- "_from": "util-extend@^1.0.1"
+ "dist": {
+ "shasum": "bb703b79480293ddcdcfb3c6a9fea20f483415bc",
+ "tarball": "http://registry.npmjs.org/util-extend/-/util-extend-1.0.1.tgz"
+ },
+ "_from": "util-extend@^1.0.1",
+ "_npmVersion": "1.3.4",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {},
+ "_shasum": "bb703b79480293ddcdcfb3c6a9fea20f483415bc",
+ "_resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.1.tgz",
+ "homepage": "https://github.com/isaacs/util-extend"
}
diff --git a/deps/npm/node_modules/read-installed/package.json b/deps/npm/node_modules/read-installed/package.json
index 41a980f76e..46b0036fc5 100644
--- a/deps/npm/node_modules/read-installed/package.json
+++ b/deps/npm/node_modules/read-installed/package.json
@@ -1,7 +1,7 @@
{
"name": "read-installed",
"description": "Read all the installed packages in a folder, and return a tree structure with all the data.",
- "version": "2.0.2",
+ "version": "2.0.4",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/read-installed"
@@ -31,10 +31,12 @@
},
"readme": "# read-installed\n\nRead all the installed packages in a folder, and return a tree\nstructure with all the data.\n\nnpm uses this.\n\n## 2.0.0\n\nBreaking changes in `2.0.0`:\n\nThe second argument is now an `Object` that contains the following keys:\n\n * `depth` optional, defaults to Infinity\n * `log` optional log Function\n * `dev` optional, default false, set to true to include devDependencies\n\n## Usage\n\n```javascript\nvar readInstalled = require(\"read-installed\")\n// optional options\nvar options = { dev: false, log: fn, depth: 2 }\nreadInstalled(folder, options, function (er, data) {\n ...\n})\n```\n",
"readmeFilename": "README.md",
+ "gitHead": "86c1d4444724b82855a6879d443b6fa184f2f9dd",
"bugs": {
"url": "https://github.com/isaacs/read-installed/issues"
},
"homepage": "https://github.com/isaacs/read-installed",
- "_id": "read-installed@2.0.2",
+ "_id": "read-installed@2.0.4",
+ "_shasum": "3a1e12b977a93132b93c5a6a8663fbd62c812671",
"_from": "read-installed@latest"
}
diff --git a/deps/npm/node_modules/read-installed/read-installed.js b/deps/npm/node_modules/read-installed/read-installed.js
index a33758b172..9b5a479622 100644
--- a/deps/npm/node_modules/read-installed/read-installed.js
+++ b/deps/npm/node_modules/read-installed/read-installed.js
@@ -217,23 +217,9 @@ function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) {
if (!rv && obj.devDependencies && opts.dev)
rv = obj.devDependencies[pkg]
- if (depth >= opts.depth) {
- // just try to get the version number
- var pkgfolder = path.resolve(folder, "node_modules", pkg)
- , jsonFile = path.resolve(pkgfolder, "package.json")
- return readJson(jsonFile, function (er, depData) {
- // already out of our depth, ignore errors
- if (er || !depData || !depData.version) return cb(null, obj)
- if (depth === opts.depth) {
- // edge case, ignore dependencies
- depData.dependencies = {}
- depData.peerDependencies = {}
- obj.dependencies[pkg] = depData
- } else {
- obj.dependencies[pkg] = depData.version
- }
- cb(null, obj)
- })
+ if (depth > opts.depth) {
+ obj.dependencies = {}
+ return cb(null, obj)
}
readInstalled_( path.resolve(folder, "node_modules/"+pkg)
@@ -331,7 +317,11 @@ function findUnmet (obj, opts) {
obj.dependencies[d] = peerDeps[d]
}
} else {
- dependency = obj.parent.dependencies && obj.parent.dependencies[d]
+ var r = obj.parent
+ while (r && !dependency) {
+ dependency = r.dependencies && r.dependencies[d]
+ r = r.link ? null : r.parent
+ }
}
if (!dependency) {
diff --git a/deps/npm/node_modules/read-installed/test/depth-0.js b/deps/npm/node_modules/read-installed/test/depth-0.js
index 16dc6c5254..459df8a729 100644
--- a/deps/npm/node_modules/read-installed/test/depth-0.js
+++ b/deps/npm/node_modules/read-installed/test/depth-0.js
@@ -16,6 +16,8 @@ test("make sure that it works with depth=0", function (t) {
// Exclude self from dependencies when depth = 0
delete map.dependencies[json.name]
var subdeps = Object.keys(map.dependencies).reduce(function(acc, dep) {
+ // Exclude self from dependencies when depth = current depth
+ delete map.dependencies[dep].dependencies[dep]
acc += Object.keys(map.dependencies[dep].dependencies).length;
return acc;
}, 0);
diff --git a/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer/package.json b/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer/package.json
new file mode 100644
index 0000000000..51c12935f0
--- /dev/null
+++ b/deps/npm/node_modules/read-installed/test/fixtures/grandparent-peer/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "example",
+ "version": "0.0.0",
+ "dependencies": {
+ "plugin-wrapper": "0.0.0",
+ "framework": "0.0.0"
+ }
+}
diff --git a/deps/npm/node_modules/read-installed/test/grandparent-peer.js b/deps/npm/node_modules/read-installed/test/grandparent-peer.js
new file mode 100644
index 0000000000..8b51a0985a
--- /dev/null
+++ b/deps/npm/node_modules/read-installed/test/grandparent-peer.js
@@ -0,0 +1,24 @@
+var readInstalled = require('../read-installed.js')
+var test = require('tap').test
+var path = require('path');
+
+function allValid(t, map) {
+ var deps = Object.keys(map.dependencies || {})
+ deps.forEach(function (dep) {
+ t.notOk(map.dependencies[dep].invalid, 'dependency ' + dep + ' of ' + map.name + ' is not invalid')
+ t.notOk(typeof map.dependencies[dep] === 'string', 'dependency ' + dep + ' of ' + map.name + ' is not missing')
+ })
+ deps.forEach(function (dep) {
+ allValid(t, map.dependencies[dep])
+ })
+}
+
+test('grandparent can satisfy peer dependencies', function(t) {
+ readInstalled(
+ path.join(__dirname, 'fixtures/grandparent-peer'),
+ { log: console.error },
+ function(err, map) {
+ allValid(t, map)
+ t.end()
+ })
+})
diff --git a/deps/npm/node_modules/semver/README.md b/deps/npm/node_modules/semver/README.md
index ef04659812..4e95b84656 100644
--- a/deps/npm/node_modules/semver/README.md
+++ b/deps/npm/node_modules/semver/README.md
@@ -34,7 +34,7 @@ As a command-line utility:
## Versions
-A "version" is described by the v2.0.0 specification found at
+A "version" is described by the `v2.0.0` specification found at
<http://semver.org/>.
A leading `"="` or `"v"` character is stripped off and ignored.
@@ -43,9 +43,10 @@ A leading `"="` or `"v"` character is stripped off and ignored.
The following range styles are supported:
-* `1.2.3` A specific version. When nothing else will do. Note that
- build metadata is still ignored, so `1.2.3+build2012` will satisfy
- this range.
+* `1.2.3` A specific version. When nothing else will do. Must be a full
+ version number, with major, minor, and patch versions specified.
+ Note that build metadata is still ignored, so `1.2.3+build2012` will
+ satisfy this range.
* `>1.2.3` Greater than a specific version.
* `<1.2.3` Less than a specific version. If there is no prerelease
tag on the version range, then no prerelease version will be allowed
@@ -56,26 +57,33 @@ The following range styles are supported:
* `<=1.2.3` Less than or equal to. In this case, prerelease versions
ARE allowed, so `1.2.3-beta` would satisfy.
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to 1.2.3". When
+* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When
using tilde operators, prerelease versions are supported as well,
but a prerelease of the next significant digit will NOT be
satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.
-* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with 1.2.3". When
+* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When
using caret operators, anything from the specified version (including
prerelease) will be supported up to, but not including, the next
major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,
while `1.2.2` and `2.0.0-beta` will not.
-* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with 0.1.3". 0.x.x versions are
+* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` "Compatible with `0.1.3`". `0.x.x` versions are
special: the first non-zero component indicates potentially breaking changes,
meaning the caret operator matches any version with the same first non-zero
component starting at the specified version.
-* `^0.0.2` := `=0.0.2` "Only the version 0.0.2 is considered compatible"
-* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
-* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with 1.2"
-* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with 1.2"
-* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
-* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with 1"
-* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with 1"
+* `^0.0.2` := `=0.0.2` "Only the version `0.0.2` is considered compatible"
+* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
+* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`"
+* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`"
+* `1.2.*` Same as `1.2.x`.
+* `1.2` Same as `1.2.x`.
+* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
+* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`"
+* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`"
+* `1.*` Same as `1.x`.
+* `1` Same as `1.x`.
+* `*` Any version whatsoever.
+* `x` Same as `*`.
+* `""` (just an empty string) Same as `*`.
Ranges can be joined with either a space (which implies "and") or a
@@ -90,42 +98,50 @@ The resulting output will always be 100% strict, of course.
Strict-mode Comparators and Ranges will be strict about the SemVer
strings that they parse.
-* valid(v): Return the parsed version, or null if it's not valid.
-* inc(v, release): Return the version incremented by the release type
- (major, minor, patch, or prerelease), or null if it's not valid.
+* `valid(v)`: Return the parsed version, or null if it's not valid.
+* `inc(v, release)`: Return the version incremented by the release
+ type (`major`, `premajor`, `minor`, `preminor`, `patch`,
+ `prepatch`, or `prerelease`), or null if it's not valid
+ * `premajor` in one call will bump the version up to the next major
+ version and down to a prerelease of that major version.
+ `preminor`, and `prepatch` work the same way.
+ * If called from a non-prerelease version, the `prerelease` will work the
+ same as `prepatch`. It increments the patch version, then makes a
+ prerelease. If the input version is already a prerelease it simply
+ increments it.
### Comparison
-* gt(v1, v2): `v1 > v2`
-* gte(v1, v2): `v1 >= v2`
-* lt(v1, v2): `v1 < v2`
-* lte(v1, v2): `v1 <= v2`
-* eq(v1, v2): `v1 == v2` This is true if they're logically equivalent,
+* `gt(v1, v2)`: `v1 > v2`
+* `gte(v1, v2)`: `v1 >= v2`
+* `lt(v1, v2)`: `v1 < v2`
+* `lte(v1, v2)`: `v1 <= v2`
+* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
even if they're not the exact same string. You already know how to
compare strings.
-* neq(v1, v2): `v1 != v2` The opposite of eq.
-* cmp(v1, comparator, v2): Pass in a comparison string, and it'll call
+* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
+* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
the corresponding function above. `"==="` and `"!=="` do simple
string comparison, but are included for completeness. Throws if an
invalid comparison string is provided.
-* compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if
- v2 is greater. Sorts in ascending order if passed to Array.sort().
-* rcompare(v1, v2): The reverse of compare. Sorts an array of versions
- in descending order when passed to Array.sort().
+* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
+ `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
+* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
+ in descending order when passed to `Array.sort()`.
### Ranges
-* validRange(range): Return the valid range or null if it's not valid
-* satisfies(version, range): Return true if the version satisfies the
+* `validRange(range)`: Return the valid range or null if it's not valid
+* `satisfies(version, range)`: Return true if the version satisfies the
range.
-* maxSatisfying(versions, range): Return the highest version in the list
- that satisfies the range, or null if none of them do.
-* gtr(version, range): Return true if version is greater than all the
+* `maxSatisfying(versions, range)`: Return the highest version in the list
+ that satisfies the range, or `null` if none of them do.
+* `gtr(version, range)`: Return `true` if version is greater than all the
versions possible in the range.
-* ltr(version, range): Return true if version is less than all the
+* `ltr(version, range)`: Return `true` if version is less than all the
versions possible in the range.
-* outside(version, range, hilo): Return true if the version is outside
+* `outside(version, range, hilo)`: Return true if the version is outside
the bounds of the range in either the high or low direction. The
`hilo` argument must be either the string `'>'` or `'<'`. (This is
the function called by `gtr` and `ltr`.)
@@ -134,8 +150,8 @@ Note that, since ranges may be non-contiguous, a version might not be
greater than a range, less than a range, *or* satisfy a range! For
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
until `2.0.0`, so the version `1.2.10` would not be greater than the
-range (because 2.0.1 satisfies, which is higher), nor less than the
-range (since 1.2.8 satisfies, which is lower), and it also does not
+range (because `2.0.1` satisfies, which is higher), nor less than the
+range (since `1.2.8` satisfies, which is lower), and it also does not
satisfy the range.
If you want to know if a version satisfies or does not satisfy a
diff --git a/deps/npm/node_modules/semver/bin/semver b/deps/npm/node_modules/semver/bin/semver
index 88b4c7d311..848420630b 100755
--- a/deps/npm/node_modules/semver/bin/semver
+++ b/deps/npm/node_modules/semver/bin/semver
@@ -39,6 +39,7 @@ function main () {
case "-i": case "--inc": case "--increment":
switch (argv[0]) {
case "major": case "minor": case "patch": case "prerelease":
+ case "premajor": case "preminor": case "prepatch":
inc = argv.shift()
break
default:
diff --git a/deps/npm/node_modules/semver/package.json b/deps/npm/node_modules/semver/package.json
index 023f01bc85..b65d866c30 100644
--- a/deps/npm/node_modules/semver/package.json
+++ b/deps/npm/node_modules/semver/package.json
@@ -1,6 +1,6 @@
{
"name": "semver",
- "version": "2.2.1",
+ "version": "2.3.0",
"description": "The semantic version parser used by npm.",
"main": "semver.js",
"browser": "semver.browser.js",
@@ -21,12 +21,13 @@
"bin": {
"semver": "./bin/semver"
},
- "readme": "semver(1) -- The semantic versioner for npm\n===========================================\n\n## Usage\n\n $ npm install semver\n\n semver.valid('1.2.3') // '1.2.3'\n semver.valid('a.b.c') // null\n semver.clean(' =v1.2.3 ') // '1.2.3'\n semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\n semver.gt('1.2.3', '9.8.7') // false\n semver.lt('1.2.3', '9.8.7') // true\n\nAs a command-line utility:\n\n $ semver -h\n\n Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | -d <dec>]\n Test if version(s) satisfy the supplied range(s), and sort them.\n\n Multiple versions or ranges may be supplied, unless increment\n or decrement options are specified. In that case, only a single\n version may be used, and it is incremented by the specified level\n\n Program exits successfully if any valid version satisfies\n all supplied ranges, and prints all satisfying versions.\n\n If no versions are valid, or ranges are not satisfied,\n then exits failure.\n\n Versions are printed in ascending order, so supplying\n multiple versions to the utility will just sort them.\n\n## Versions\n\nA \"version\" is described by the v2.0.0 specification found at\n<http://semver.org/>.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nThe following range styles are supported:\n\n* `1.2.3` A specific version. When nothing else will do. Note that\n build metadata is still ignored, so `1.2.3+build2012` will satisfy\n this range.\n* `>1.2.3` Greater than a specific version.\n* `<1.2.3` Less than a specific version. If there is no prerelease\n tag on the version range, then no prerelease version will be allowed\n either, even though these are technically \"less than\".\n* `>=1.2.3` Greater than or equal to. Note that prerelease versions\n are NOT equal to their \"normal\" equivalents, so `1.2.3-beta` will\n not satisfy this range, but `2.3.0-beta` will.\n* `<=1.2.3` Less than or equal to. In this case, prerelease versions\n ARE allowed, so `1.2.3-beta` would satisfy.\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` \"Reasonably close to 1.2.3\". When\n using tilde operators, prerelease versions are supported as well,\n but a prerelease of the next significant digit will NOT be\n satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.\n* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` \"Compatible with 1.2.3\". When\n using caret operators, anything from the specified version (including\n prerelease) will be supported up to, but not including, the next\n major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,\n while `1.2.2` and `2.0.0-beta` will not.\n* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` \"Compatible with 0.1.3\". 0.x.x versions are\n special: the first non-zero component indicates potentially breaking changes,\n meaning the caret operator matches any version with the same first non-zero\n component starting at the specified version.\n* `^0.0.2` := `=0.0.2` \"Only the version 0.0.2 is considered compatible\"\n* `~1.2` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with 1.2\"\n* `^1.2` := `>=1.2.0-0 <2.0.0-0` \"Any version compatible with 1.2\"\n* `1.2.x` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with 1.2\"\n* `~1` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with 1\"\n* `^1` := `>=1.0.0-0 <2.0.0-0` \"Any version compatible with 1\"\n* `1.x` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with 1\"\n\n\nRanges can be joined with either a space (which implies \"and\") or a\n`||` (which implies \"or\").\n\n## Functions\n\nAll methods and classes take a final `loose` boolean argument that, if\ntrue, will be more forgiving about not-quite-valid semver strings.\nThe resulting output will always be 100% strict, of course.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* valid(v): Return the parsed version, or null if it's not valid.\n* inc(v, release): Return the version incremented by the release type\n (major, minor, patch, or prerelease), or null if it's not valid.\n\n### Comparison\n\n* gt(v1, v2): `v1 > v2`\n* gte(v1, v2): `v1 >= v2`\n* lt(v1, v2): `v1 < v2`\n* lte(v1, v2): `v1 <= v2`\n* eq(v1, v2): `v1 == v2` This is true if they're logically equivalent,\n even if they're not the exact same string. You already know how to\n compare strings.\n* neq(v1, v2): `v1 != v2` The opposite of eq.\n* cmp(v1, comparator, v2): Pass in a comparison string, and it'll call\n the corresponding function above. `\"===\"` and `\"!==\"` do simple\n string comparison, but are included for completeness. Throws if an\n invalid comparison string is provided.\n* compare(v1, v2): Return 0 if v1 == v2, or 1 if v1 is greater, or -1 if\n v2 is greater. Sorts in ascending order if passed to Array.sort().\n* rcompare(v1, v2): The reverse of compare. Sorts an array of versions\n in descending order when passed to Array.sort().\n\n\n### Ranges\n\n* validRange(range): Return the valid range or null if it's not valid\n* satisfies(version, range): Return true if the version satisfies the\n range.\n* maxSatisfying(versions, range): Return the highest version in the list\n that satisfies the range, or null if none of them do.\n* gtr(version, range): Return true if version is greater than all the\n versions possible in the range.\n* ltr(version, range): Return true if version is less than all the\n versions possible in the range.\n* outside(version, range, hilo): Return true if the version is outside\n the bounds of the range in either the high or low direction. The\n `hilo` argument must be either the string `'>'` or `'<'`. (This is\n the function called by `gtr` and `ltr`.)\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range! For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so the version `1.2.10` would not be greater than the\nrange (because 2.0.1 satisfies, which is higher), nor less than the\nrange (since 1.2.8 satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n",
+ "readme": "semver(1) -- The semantic versioner for npm\n===========================================\n\n## Usage\n\n $ npm install semver\n\n semver.valid('1.2.3') // '1.2.3'\n semver.valid('a.b.c') // null\n semver.clean(' =v1.2.3 ') // '1.2.3'\n semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\n semver.gt('1.2.3', '9.8.7') // false\n semver.lt('1.2.3', '9.8.7') // true\n\nAs a command-line utility:\n\n $ semver -h\n\n Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | -d <dec>]\n Test if version(s) satisfy the supplied range(s), and sort them.\n\n Multiple versions or ranges may be supplied, unless increment\n or decrement options are specified. In that case, only a single\n version may be used, and it is incremented by the specified level\n\n Program exits successfully if any valid version satisfies\n all supplied ranges, and prints all satisfying versions.\n\n If no versions are valid, or ranges are not satisfied,\n then exits failure.\n\n Versions are printed in ascending order, so supplying\n multiple versions to the utility will just sort them.\n\n## Versions\n\nA \"version\" is described by the `v2.0.0` specification found at\n<http://semver.org/>.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nThe following range styles are supported:\n\n* `1.2.3` A specific version. When nothing else will do. Must be a full\n version number, with major, minor, and patch versions specified.\n Note that build metadata is still ignored, so `1.2.3+build2012` will\n satisfy this range.\n* `>1.2.3` Greater than a specific version.\n* `<1.2.3` Less than a specific version. If there is no prerelease\n tag on the version range, then no prerelease version will be allowed\n either, even though these are technically \"less than\".\n* `>=1.2.3` Greater than or equal to. Note that prerelease versions\n are NOT equal to their \"normal\" equivalents, so `1.2.3-beta` will\n not satisfy this range, but `2.3.0-beta` will.\n* `<=1.2.3` Less than or equal to. In this case, prerelease versions\n ARE allowed, so `1.2.3-beta` would satisfy.\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` \"Reasonably close to `1.2.3`\". When\n using tilde operators, prerelease versions are supported as well,\n but a prerelease of the next significant digit will NOT be\n satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`.\n* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` \"Compatible with `1.2.3`\". When\n using caret operators, anything from the specified version (including\n prerelease) will be supported up to, but not including, the next\n major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`,\n while `1.2.2` and `2.0.0-beta` will not.\n* `^0.1.3` := `>=0.1.3-0 <0.2.0-0` \"Compatible with `0.1.3`\". `0.x.x` versions are\n special: the first non-zero component indicates potentially breaking changes,\n meaning the caret operator matches any version with the same first non-zero\n component starting at the specified version.\n* `^0.0.2` := `=0.0.2` \"Only the version `0.0.2` is considered compatible\"\n* `~1.2` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with `1.2`\"\n* `^1.2` := `>=1.2.0-0 <2.0.0-0` \"Any version compatible with `1.2`\"\n* `1.2.x` := `>=1.2.0-0 <1.3.0-0` \"Any version starting with `1.2`\"\n* `1.2.*` Same as `1.2.x`.\n* `1.2` Same as `1.2.x`.\n* `~1` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with `1`\"\n* `^1` := `>=1.0.0-0 <2.0.0-0` \"Any version compatible with `1`\"\n* `1.x` := `>=1.0.0-0 <2.0.0-0` \"Any version starting with `1`\"\n* `1.*` Same as `1.x`.\n* `1` Same as `1.x`.\n* `*` Any version whatsoever.\n* `x` Same as `*`.\n* `\"\"` (just an empty string) Same as `*`.\n\n\nRanges can be joined with either a space (which implies \"and\") or a\n`||` (which implies \"or\").\n\n## Functions\n\nAll methods and classes take a final `loose` boolean argument that, if\ntrue, will be more forgiving about not-quite-valid semver strings.\nThe resulting output will always be 100% strict, of course.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* `valid(v)`: Return the parsed version, or null if it's not valid.\n* `inc(v, release)`: Return the version incremented by the release\n type (`major`, `premajor`, `minor`, `preminor`, `patch`,\n `prepatch`, or `prerelease`), or null if it's not valid\n * `premajor` in one call will bump the version up to the next major\n version and down to a prerelease of that major version.\n `preminor`, and `prepatch` work the same way.\n * If called from a non-prerelease version, the `prerelease` will work the\n same as `prepatch`. It increments the patch version, then makes a\n prerelease. If the input version is already a prerelease it simply\n increments it.\n\n### Comparison\n\n* `gt(v1, v2)`: `v1 > v2`\n* `gte(v1, v2)`: `v1 >= v2`\n* `lt(v1, v2)`: `v1 < v2`\n* `lte(v1, v2)`: `v1 <= v2`\n* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,\n even if they're not the exact same string. You already know how to\n compare strings.\n* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.\n* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call\n the corresponding function above. `\"===\"` and `\"!==\"` do simple\n string comparison, but are included for completeness. Throws if an\n invalid comparison string is provided.\n* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if\n `v2` is greater. Sorts in ascending order if passed to `Array.sort()`.\n* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions\n in descending order when passed to `Array.sort()`.\n\n\n### Ranges\n\n* `validRange(range)`: Return the valid range or null if it's not valid\n* `satisfies(version, range)`: Return true if the version satisfies the\n range.\n* `maxSatisfying(versions, range)`: Return the highest version in the list\n that satisfies the range, or `null` if none of them do.\n* `gtr(version, range)`: Return `true` if version is greater than all the\n versions possible in the range.\n* `ltr(version, range)`: Return `true` if version is less than all the\n versions possible in the range.\n* `outside(version, range, hilo)`: Return true if the version is outside\n the bounds of the range in either the high or low direction. The\n `hilo` argument must be either the string `'>'` or `'<'`. (This is\n the function called by `gtr` and `ltr`.)\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range! For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so the version `1.2.10` would not be greater than the\nrange (because `2.0.1` satisfies, which is higher), nor less than the\nrange (since `1.2.8` satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n",
"readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/isaacs/node-semver/issues"
},
"homepage": "https://github.com/isaacs/node-semver",
- "_id": "semver@2.2.1",
+ "_id": "semver@2.3.0",
+ "_shasum": "d31b2903ebe2a1806c05b8e763916a7183108a15",
"_from": "semver@latest"
}
diff --git a/deps/npm/node_modules/semver/semver.browser.js b/deps/npm/node_modules/semver/semver.browser.js
index e05ecc19ca..0f414c3d8d 100644
--- a/deps/npm/node_modules/semver/semver.browser.js
+++ b/deps/npm/node_modules/semver/semver.browser.js
@@ -248,6 +248,8 @@ function SemVer(version, loose) {
return version;
else
version = version.version;
+ } else if (typeof version !== 'string') {
+ throw new TypeError('Invalid Version: ' + version);
}
if (!(this instanceof SemVer))
@@ -320,7 +322,7 @@ SemVer.prototype.comparePre = function(other) {
return -1;
else if (!this.prerelease.length && other.prerelease.length)
return 1;
- else if (!this.prerelease.lenth && !other.prerelease.length)
+ else if (!this.prerelease.length && !other.prerelease.length)
return 0;
var i = 0;
@@ -341,19 +343,49 @@ SemVer.prototype.comparePre = function(other) {
} while (++i);
};
+// preminor will bump the version up to the next minor release, and immediately
+// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function(release) {
switch (release) {
+ case 'premajor':
+ this.inc('major');
+ this.inc('pre');
+ break;
+ case 'preminor':
+ this.inc('minor');
+ this.inc('pre');
+ break;
+ case 'prepatch':
+ this.inc('patch');
+ this.inc('pre');
+ break;
+ // If the input is a non-prerelease version, this acts the same as
+ // prepatch.
+ case 'prerelease':
+ if (this.prerelease.length === 0)
+ this.inc('patch');
+ this.inc('pre');
+ break;
case 'major':
this.major++;
this.minor = -1;
case 'minor':
this.minor++;
- this.patch = -1;
+ this.patch = 0;
+ this.prerelease = [];
+ break;
case 'patch':
- this.patch++;
+ // If this is not a pre-release version, it will increment the patch.
+ // If it is a pre-release it will bump up to the same patch version.
+ // 1.2.0-5 patches to 1.2.0
+ // 1.2.0 patches to 1.2.1
+ if (this.prerelease.length === 0)
+ this.patch++;
this.prerelease = [];
break;
- case 'prerelease':
+ // This probably shouldn't be used publically.
+ // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
+ case 'pre':
if (this.prerelease.length === 0)
this.prerelease = [0];
else {
diff --git a/deps/npm/node_modules/semver/semver.browser.js.gz b/deps/npm/node_modules/semver/semver.browser.js.gz
index b9549f809a..2b07bae519 100644
--- a/deps/npm/node_modules/semver/semver.browser.js.gz
+++ b/deps/npm/node_modules/semver/semver.browser.js.gz
Binary files differ
diff --git a/deps/npm/node_modules/semver/semver.js b/deps/npm/node_modules/semver/semver.js
index 9e9470d86f..a7385b41c5 100644
--- a/deps/npm/node_modules/semver/semver.js
+++ b/deps/npm/node_modules/semver/semver.js
@@ -258,6 +258,8 @@ function SemVer(version, loose) {
return version;
else
version = version.version;
+ } else if (typeof version !== 'string') {
+ throw new TypeError('Invalid Version: ' + version);
}
if (!(this instanceof SemVer))
@@ -330,7 +332,7 @@ SemVer.prototype.comparePre = function(other) {
return -1;
else if (!this.prerelease.length && other.prerelease.length)
return 1;
- else if (!this.prerelease.lenth && !other.prerelease.length)
+ else if (!this.prerelease.length && !other.prerelease.length)
return 0;
var i = 0;
@@ -351,19 +353,49 @@ SemVer.prototype.comparePre = function(other) {
} while (++i);
};
+// preminor will bump the version up to the next minor release, and immediately
+// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function(release) {
switch (release) {
+ case 'premajor':
+ this.inc('major');
+ this.inc('pre');
+ break;
+ case 'preminor':
+ this.inc('minor');
+ this.inc('pre');
+ break;
+ case 'prepatch':
+ this.inc('patch');
+ this.inc('pre');
+ break;
+ // If the input is a non-prerelease version, this acts the same as
+ // prepatch.
+ case 'prerelease':
+ if (this.prerelease.length === 0)
+ this.inc('patch');
+ this.inc('pre');
+ break;
case 'major':
this.major++;
this.minor = -1;
case 'minor':
this.minor++;
- this.patch = -1;
+ this.patch = 0;
+ this.prerelease = [];
+ break;
case 'patch':
- this.patch++;
+ // If this is not a pre-release version, it will increment the patch.
+ // If it is a pre-release it will bump up to the same patch version.
+ // 1.2.0-5 patches to 1.2.0
+ // 1.2.0 patches to 1.2.1
+ if (this.prerelease.length === 0)
+ this.patch++;
this.prerelease = [];
break;
- case 'prerelease':
+ // This probably shouldn't be used publically.
+ // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
+ case 'pre':
if (this.prerelease.length === 0)
this.prerelease = [0];
else {
diff --git a/deps/npm/node_modules/semver/semver.min.js b/deps/npm/node_modules/semver/semver.min.js
index c2164c33ef..66e13b8633 100644
--- a/deps/npm/node_modules/semver/semver.min.js
+++ b/deps/npm/node_modules/semver/semver.min.js
@@ -1 +1 @@
-(function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var o=n++;t[o]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var a=n++;t[a]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[o]+")";var l=n++;t[l]="(?:"+t[s]+"|"+t[o]+")";var c=n++;t[c]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var p=n++;t[p]="(?:-?("+t[l]+"(?:\\."+t[l]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[a]+t[c]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[p]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var $=n++;t[$]=t[s]+"|x|X|\\*";var j=n++;t[j]=t[i]+"|x|X|\\*";var b=n++;t[b]="[v=\\s]*("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:("+t[c]+")"+")?)?)?";var E=n++;t[E]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[p]+")"+")?)?)?";var k=n++;t[k]="^"+t[y]+"\\s*"+t[b]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[E]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[b]+"$";var A=n++;t[A]="^"+t[R]+t[E]+"$";var C=n++;t[C]="(?:\\^)";var T=n++;t[T]="(\\s*)"+t[C]+"\\s+";r[T]=new RegExp(t[T],"g");var M="$1^";var z=n++;t[z]="^"+t[C]+t[b]+"$";var P=n++;t[P]="^"+t[C]+t[E]+"$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[y]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[b]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[b]+")"+"\\s+-\\s+"+"("+t[b]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[E]+")"+"\\s+-\\s+"+"("+t[E]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B<n;B++){if(!r[B])r[B]=new RegExp(t[B])}e.parse=D;function D(e,t){var n=t?r[d]:r[m];return n.test(e)?new H(e,t):null}e.valid=F;function F(e,r){var t=D(e,r);return t?t.version:null}e.clean=G;function G(e,r){var t=D(e,r);return t?t.version:null}e.SemVer=H;function H(e,t){if(e instanceof H){if(e.loose===t)return e;else e=e.version}if(!(this instanceof H))return new H(e,t);this.loose=t;var n=e.trim().match(t?r[d]:r[m]);if(!n)throw new TypeError("Invalid Version: "+e);this.raw=e;this.major=+n[1];this.minor=+n[2];this.patch=+n[3];if(!n[4])this.prerelease=[];else this.prerelease=n[4].split(".").map(function(e){return/^[0-9]+$/.test(e)?+e:e});this.build=n[5]?n[5].split("."):[];this.format()}H.prototype.format=function(){this.version=this.major+"."+this.minor+"."+this.patch;if(this.prerelease.length)this.version+="-"+this.prerelease.join(".");return this.version};H.prototype.inspect=function(){return'<SemVer "'+this+'">'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.lenth&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=-1;case"patch":this.patch++;this.prerelease=[];break;case"prerelease":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:e<r?-1:e>r?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=or;function or(e,r,t){return W(e,r,t)!==0}e.gte=ar;function ar(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=or(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=ar(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=lr;function lr(e,r){if(e instanceof lr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof lr))return new lr(e,r);this.loose=r;this.parse(e);if(this.semver===cr)this.value="";else this.value=this.operator+this.semver.version}var cr={};lr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(!n[2])this.semver=cr;else{this.semver=new H(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};lr.prototype.inspect=function(){return'<SemVer Comparator "'+this+'">'};lr.prototype.toString=function(){return this.value};lr.prototype.test=function(e){return this.semver===cr?true:ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return'<SemVer Range "'+this.range+'">'};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,Er);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[T],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new lr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=dr(e,r);e=gr(e,r);e=$r(e,r);e=br(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[A]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function dr(e,r){return e.trim().split(/\s+/).map(function(e){return yr(e,r)}).join(" ")}function yr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else s=">="+r+"."+t+".0-0 <"+(+r+1)+".0.0-0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n+i;else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0-0"}else{if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n;else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+(+r+1)+".0.0-0"}return s})}function $r(e,r){return e.split(/\s+/).map(function(e){return jr(e,r)}).join(" ")}function jr(e,t){e=e.trim();var n=t?r[x]:r[k];return e.replace(n,function(e,r,t,n,i,s){var o=mr(t);var a=o||mr(n);var f=a||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(o)t=0;if(a)n=0;if(f)i=0;if(r===">"){r=">=";if(o){}else if(a){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(o){e="*"}else if(a){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(f){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function br(e,t){return e.trim().replace(r[O],"")}function Er(e,r,t,n,i,s,o,a,f,u,l,c,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0-0";else if(mr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(mr(f))a="";else if(mr(u))a="<"+(+f+1)+".0.0-0";else if(mr(l))a="<"+f+"."+(+u+1)+".0-0";else if(c)a="<="+f+"."+u+"."+l+"-"+c;else a="<="+a;return(r+" "+a).trim()}pr.prototype.test=function(e){if(!e)return false;for(var r=0;r<this.set.length;r++){if(kr(this.set[r],e))return true}return false};function kr(e,r){for(var t=0;t<e.length;t++){if(!e[t].test(r))return false}return true}e.satisfies=xr;function xr(e,r,t){try{r=new pr(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=Rr;function Rr(e,r,t){return e.filter(function(e){return xr(e,r,t)}).sort(function(e,r){return er(e,r,t)})[0]||null}e.validRange=Sr;function Sr(e,r){try{return new pr(e,r).range||"*"}catch(t){return null}}e.ltr=Vr;function Vr(e,r,t){return Ar(e,r,"<",t)}e.gtr=Ir;function Ir(e,r,t){return Ar(e,r,">",t)}e.outside=Ar;function Ar(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,o,a,f;switch(t){case">":i=nr;s=fr;o=ir;a=">";f=">=";break;case"<":i=ir;s=ar;o=nr;a="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var u=0;u<r.set.length;++u){var l=r.set[u];var c=null;var p=null;l.forEach(function(e){c=c||e;p=p||e;if(i(e.semver,c.semver,n)){c=e}else if(o(e.semver,p.semver,n)){p=e}});if(c.operator===a||c.operator===f){return false}if((!p.operator||p.operator===a)&&s(e,p.semver)){return false}else if(p.operator===f&&o(e,p.semver)){return false}}return true}if(typeof define==="function"&&define.amd)define(e)})(typeof exports==="object"?exports:typeof define==="function"&&define.amd?{}:semver={}); \ No newline at end of file
+(function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var a=n++;t[a]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var o=n++;t[o]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[a]+")";var c=n++;t[c]="(?:"+t[s]+"|"+t[a]+")";var l=n++;t[l]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var p=n++;t[p]="(?:-?("+t[c]+"(?:\\."+t[c]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[o]+t[l]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[p]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var b=n++;t[b]=t[s]+"|x|X|\\*";var $=n++;t[$]=t[i]+"|x|X|\\*";var j=n++;t[j]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[l]+")"+")?)?)?";var k=n++;t[k]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:("+t[p]+")"+")?)?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[j]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[j]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[j]+"$";var P=n++;t[P]="^"+t[A]+t[k]+"$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[y]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[j]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[j]+")"+"\\s+-\\s+"+"("+t[j]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B<n;B++){if(!r[B])r[B]=new RegExp(t[B])}e.parse=D;function D(e,t){var n=t?r[d]:r[m];return n.test(e)?new H(e,t):null}e.valid=F;function F(e,r){var t=D(e,r);return t?t.version:null}e.clean=G;function G(e,r){var t=D(e,r);return t?t.version:null}e.SemVer=H;function H(e,t){if(e instanceof H){if(e.loose===t)return e;else e=e.version}else if(typeof e!=="string"){throw new TypeError("Invalid Version: "+e)}if(!(this instanceof H))return new H(e,t);this.loose=t;var n=e.trim().match(t?r[d]:r[m]);if(!n)throw new TypeError("Invalid Version: "+e);this.raw=e;this.major=+n[1];this.minor=+n[2];this.patch=+n[3];if(!n[4])this.prerelease=[];else this.prerelease=n[4].split(".").map(function(e){return/^[0-9]+$/.test(e)?+e:e});this.build=n[5]?n[5].split("."):[];this.format()}H.prototype.format=function(){this.version=this.major+"."+this.minor+"."+this.patch;if(this.prerelease.length)this.version+="-"+this.prerelease.join(".");return this.version};H.prototype.inspect=function(){return'<SemVer "'+this+'">'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"premajor":this.inc("major");this.inc("pre");break;case"preminor":this.inc("minor");this.inc("pre");break;case"prepatch":this.inc("patch");this.inc("pre");break;case"prerelease":if(this.prerelease.length===0)this.inc("patch");this.inc("pre");break;case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:e<r?-1:e>r?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=ar;function ar(e,r,t){return W(e,r,t)!==0}e.gte=or;function or(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=ar(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=or(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=cr;function cr(e,r){if(e instanceof cr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof cr))return new cr(e,r);this.loose=r;this.parse(e);if(this.semver===lr)this.value="";else this.value=this.operator+this.semver.version}var lr={};cr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(!n[2])this.semver=lr;else{this.semver=new H(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};cr.prototype.inspect=function(){return'<SemVer Comparator "'+this+'">'};cr.prototype.toString=function(){return this.value};cr.prototype.test=function(e){return this.semver===lr?true:ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return'<SemVer Range "'+this.range+'">'};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,kr);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new cr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=dr(e,r);e=gr(e,r);e=br(e,r);e=jr(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function dr(e,r){return e.trim().split(/\s+/).map(function(e){return yr(e,r)}).join(" ")}function yr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else s=">="+r+"."+t+".0-0 <"+(+r+1)+".0.0-0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n+i;else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0-0"}else{if(r==="0"){if(t==="0")s="="+r+"."+t+"."+n;else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+(+r+1)+".0.0-0"}return s})}function br(e,r){return e.split(/\s+/).map(function(e){return $r(e,r)}).join(" ")}function $r(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var a=mr(t);var o=a||mr(n);var f=o||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(a)t=0;if(o)n=0;if(f)i=0;if(r===">"){r=">=";if(a){}else if(o){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(a){e="*"}else if(o){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(f){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function jr(e,t){return e.trim().replace(r[O],"")}function kr(e,r,t,n,i,s,a,o,f,u,c,l,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0-0";else if(mr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(mr(f))o="";else if(mr(u))o="<"+(+f+1)+".0.0-0";else if(mr(c))o="<"+f+"."+(+u+1)+".0-0";else if(l)o="<="+f+"."+u+"."+c+"-"+l;else o="<="+o;return(r+" "+o).trim()}pr.prototype.test=function(e){if(!e)return false;for(var r=0;r<this.set.length;r++){if(Er(this.set[r],e))return true}return false};function Er(e,r){for(var t=0;t<e.length;t++){if(!e[t].test(r))return false}return true}e.satisfies=xr;function xr(e,r,t){try{r=new pr(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=Rr;function Rr(e,r,t){return e.filter(function(e){return xr(e,r,t)}).sort(function(e,r){return er(e,r,t)})[0]||null}e.validRange=Sr;function Sr(e,r){try{return new pr(e,r).range||"*"}catch(t){return null}}e.ltr=Vr;function Vr(e,r,t){return Tr(e,r,"<",t)}e.gtr=Ir;function Ir(e,r,t){return Tr(e,r,">",t)}e.outside=Tr;function Tr(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,a,o,f;switch(t){case">":i=nr;s=fr;a=ir;o=">";f=">=";break;case"<":i=ir;s=or;a=nr;o="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var u=0;u<r.set.length;++u){var c=r.set[u];var l=null;var p=null;c.forEach(function(e){l=l||e;p=p||e;if(i(e.semver,l.semver,n)){l=e}else if(a(e.semver,p.semver,n)){p=e}});if(l.operator===o||l.operator===f){return false}if((!p.operator||p.operator===o)&&s(e,p.semver)){return false}else if(p.operator===f&&a(e,p.semver)){return false}}return true}if(typeof define==="function"&&define.amd)define(e)})(typeof exports==="object"?exports:typeof define==="function"&&define.amd?{}:semver={}); \ No newline at end of file
diff --git a/deps/npm/node_modules/semver/semver.min.js.gz b/deps/npm/node_modules/semver/semver.min.js.gz
index e82da41e35..cc05248ffd 100644
--- a/deps/npm/node_modules/semver/semver.min.js.gz
+++ b/deps/npm/node_modules/semver/semver.min.js.gz
Binary files differ
diff --git a/deps/npm/node_modules/semver/test/index.js b/deps/npm/node_modules/semver/test/index.js
index e6c9cefb0a..6285b693f9 100644
--- a/deps/npm/node_modules/semver/test/index.js
+++ b/deps/npm/node_modules/semver/test/index.js
@@ -302,8 +302,15 @@ test('\nincrement versions test', function(t) {
['1.2.3tag', 'major', '2.0.0', true],
['1.2.3-tag', 'major', '2.0.0'],
['1.2.3', 'fake', null],
+ ['1.2.0-0', 'patch', '1.2.0'],
['fake', 'major', null],
- ['1.2.3', 'prerelease', '1.2.3-0'],
+ ['1.2.3-4', 'major', '2.0.0'],
+ ['1.2.3-4', 'minor', '1.3.0'],
+ ['1.2.3-4', 'patch', '1.2.3'],
+ ['1.2.3-alpha.0.beta', 'major', '2.0.0'],
+ ['1.2.3-alpha.0.beta', 'minor', '1.3.0'],
+ ['1.2.3-alpha.0.beta', 'patch', '1.2.3'],
+ ['1.2.4', 'prerelease', '1.2.5-0'],
['1.2.3-0', 'prerelease', '1.2.3-1'],
['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'],
['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'],
@@ -319,7 +326,13 @@ test('\nincrement versions test', function(t) {
['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'],
['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'],
['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'],
- ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta']
+ ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],
+ ['1.2.0', 'preminor', '1.3.0-0'],
+ ['1.2.0', 'premajor', '2.0.0-0'],
+ ['1.2.0', 'preminor', '1.3.0-0'],
+ ['1.2.0', 'premajor', '2.0.0-0']
+
+
].forEach(function(v) {
var pre = v[0];
var what = v[1];
@@ -500,6 +513,21 @@ test('\ncomparators test', function(t) {
t.end();
});
+test('\ninvalid version numbers', function(t) {
+ ['1.2.3.4',
+ 'NOT VALID',
+ 1.2,
+ null,
+ 'Infinity.NaN.Infinity'
+ ].forEach(function(v) {
+ t.throws(function() {
+ new SemVer(v);
+ }, {name:'TypeError', message:'Invalid Version: ' + v});
+ });
+
+ t.end();
+});
+
test('\nstrict vs loose version numbers', function(t) {
[['=1.2.3', '1.2.3'],
['01.02.03', '1.2.3'],
diff --git a/deps/npm/node_modules/uid-number/LICENCE b/deps/npm/node_modules/uid-number/LICENCE
deleted file mode 100644
index 74489e2e26..0000000000
--- a/deps/npm/node_modules/uid-number/LICENCE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) Isaac Z. Schlueter
-All rights reserved.
-
-The BSD License
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/deps/npm/node_modules/uid-number/package.json b/deps/npm/node_modules/uid-number/package.json
index 0b10753b15..643c36b466 100644
--- a/deps/npm/node_modules/uid-number/package.json
+++ b/deps/npm/node_modules/uid-number/package.json
@@ -19,12 +19,29 @@
"node": "*"
},
"license": "ISC",
- "readme": "Use this module to convert a username/groupname to a uid/gid number.\n\nUsage:\n\n```\nnpm install uid-number\n```\n\nThen, in your node program:\n\n```javascript\nvar uidNumber = require(\"uid-number\")\nuidNumber(\"isaacs\", function (er, uid, gid) {\n // gid is null because we didn't ask for a group name\n // uid === 24561 because that's my number.\n})\n```\n",
- "readmeFilename": "README.md",
"bugs": {
"url": "https://github.com/isaacs/uid-number/issues"
},
"homepage": "https://github.com/isaacs/uid-number",
"_id": "uid-number@0.0.5",
- "_from": "uid-number@latest"
+ "dist": {
+ "shasum": "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e",
+ "tarball": "http://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz"
+ },
+ "_from": "uid-number@latest",
+ "_npmVersion": "1.4.3",
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "maintainers": [
+ {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ }
+ ],
+ "directories": {},
+ "_shasum": "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e",
+ "_resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz",
+ "readme": "ERROR: No README data found!"
}
diff --git a/deps/npm/package.json b/deps/npm/package.json
index a2b0667ab4..e496acddcf 100644
--- a/deps/npm/package.json
+++ b/deps/npm/package.json
@@ -1,9 +1,6 @@
{
- "version": "1.4.10",
+ "version": "1.4.14",
"name": "npm",
- "publishConfig": {
- "proprietary-attribs": false
- },
"description": "A package manager for node",
"keywords": [
"package manager",
@@ -34,48 +31,51 @@
"main": "./lib/npm.js",
"bin": "./bin/npm-cli.js",
"dependencies": {
- "abbrev": "~1.0.4",
+ "abbrev": "~1.0.5",
"ansi": "~0.2.1",
"ansicolors": "~0.3.2",
"ansistyles": "~0.1.3",
"archy": "0",
"block-stream": "0.0.7",
+ "char-spinner": "~1.0.1",
"child-process-close": "~0.1.1",
"chmodr": "~0.1.0",
"chownr": "0",
"cmd-shim": "~1.1.1",
- "columnify": "0.1.2",
+ "columnify": "~0.1.2",
"editor": "0.0.5",
"fstream": "~0.1.25",
- "fstream-npm": "~0.1.6",
+ "fstream-npm": "~0.1.7",
"github-url-from-git": "1.1.1",
"github-url-from-username-repo": "~0.1.0",
- "glob": "~3.2.9",
+ "glob": "~3.2.10",
"graceful-fs": "~2.0.2",
- "ini": "~1.1.0",
- "init-package-json": "0.0.16",
+ "inflight": "~1.0.1",
+ "ini": "~1.2.0",
+ "init-package-json": "0.0.17",
"lockfile": "~0.4.0",
"lru-cache": "~2.5.0",
- "minimatch": "~0.2.14",
+ "minimatch": "~0.3.0",
"mkdirp": "~0.3.5",
"node-gyp": "~0.13.0",
"nopt": "~2.2.1",
+ "npm-cache-filename": "~1.0.1",
"npm-install-checks": "~1.0.0",
- "npm-registry-client": "~0.4.8",
- "npm-user-validate": "0.0.3",
- "npmconf": "~0.1.15",
+ "npm-registry-client": "~1.0.0",
+ "npm-user-validate": "~0.1.0",
+ "npmconf": "~1.0.1",
"npmlog": "0.0.6",
"once": "~1.3.0",
"opener": "~1.3.0",
"osenv": "0",
"path-is-inside": "~1.0.0",
"read": "~1.0.4",
- "read-installed": "~2.0.1",
+ "read-installed": "~2.0.4",
"read-package-json": "~1.1.9",
"request": "~2.30.0",
"retry": "~0.6.0",
"rimraf": "~2.2.5",
- "semver": "~2.2.1",
+ "semver": "~2.3.0",
"sha": "~1.2.1",
"slide": "~1.1.5",
"sorted-object": "~1.0.0",
@@ -91,6 +91,7 @@
"ansistyles",
"archy",
"block-stream",
+ "char-spinner",
"child-process-close",
"chmodr",
"chownr",
@@ -103,6 +104,7 @@
"github-url-from-username-repo",
"glob",
"graceful-fs",
+ "inflight",
"inherits",
"ini",
"init-package-json",
@@ -112,7 +114,7 @@
"mkdirp",
"node-gyp",
"nopt",
- "normalize-package-data",
+ "npm-cache-filename",
"npm-install-checks",
"npm-registry-client",
"npm-user-validate",
diff --git a/deps/npm/test/tap/00-verify-bundle-deps.js b/deps/npm/test/tap/00-verify-bundle-deps.js
new file mode 100644
index 0000000000..00291a6c48
--- /dev/null
+++ b/deps/npm/test/tap/00-verify-bundle-deps.js
@@ -0,0 +1,27 @@
+var fs = require("fs")
+var path = require("path")
+var test = require("tap").test
+
+var manifest = require("../../package.json")
+var deps = Object.keys(manifest.dependencies)
+var dev = Object.keys(manifest.devDependencies)
+var bundled = manifest.bundleDependencies
+
+test("all deps are bundled deps or dev deps", function (t) {
+ deps.forEach(function (name) {
+ t.assert(
+ bundled.indexOf(name) !== -1,
+ name + " is in bundledDependencies"
+ )
+ })
+
+ t.same(
+ fs.readdirSync(path.resolve(__dirname, '../../node_modules')).filter(function (name) {
+ return (dev.indexOf(name) === -1) && (name !== ".bin")
+ }).sort(),
+ bundled.sort(),
+ "bundleDependencies matches what's in node_modules"
+ )
+
+ t.end()
+})
diff --git a/deps/npm/test/tap/cache-shasum.js b/deps/npm/test/tap/cache-shasum.js
index 460f2ee3ff..2139d8fb79 100644
--- a/deps/npm/test/tap/cache-shasum.js
+++ b/deps/npm/test/tap/cache-shasum.js
@@ -43,7 +43,7 @@ test("npm cache add request", function(t) {
test("compare", function(t) {
var d = path.resolve(__dirname, "cache-shasum/request")
var p = path.resolve(d, "2.27.0/package.tgz")
- var r = require(path.resolve(d, ".cache.json"))
+ var r = require("./cache-shasum/localhost_1337/request/.cache.json")
var rshasum = r.versions['2.27.0'].dist.shasum
sha.get(p, function (er, pshasum) {
if (er)
diff --git a/deps/npm/test/tap/config-meta.js b/deps/npm/test/tap/config-meta.js
index 63cdd61c4f..75a66604cf 100644
--- a/deps/npm/test/tap/config-meta.js
+++ b/deps/npm/test/tap/config-meta.js
@@ -31,7 +31,12 @@ test("get files", function (t) {
return path.resolve(lib, f)
})
files.forEach(function (f) {
- if (fs.statSync(f).isDirectory())
+ try {
+ var s = fs.statSync(f)
+ } catch (er) {
+ return
+ }
+ if (s.isDirectory())
walk(f)
else if (f.match(/\.js$/))
FILES.push(f)
diff --git a/deps/npm/test/tap/install-save-prefix.js b/deps/npm/test/tap/install-save-prefix.js
index 753150924a..bbdeddf3fe 100644
--- a/deps/npm/test/tap/install-save-prefix.js
+++ b/deps/npm/test/tap/install-save-prefix.js
@@ -22,6 +22,7 @@ test('"npm install --save with default save-prefix should install local pkg vers
npm.load({
cache: pkg + "/cache",
loglevel: 'silent',
+ 'save-prefix': '^',
registry: common.registry }, function(err) {
t.ifError(err)
npm.config.set('save', true)
@@ -47,6 +48,7 @@ test('"npm install --save-dev with default save-prefix should install local pkg
npm.load({
cache: pkg + "/cache",
loglevel: 'silent',
+ 'save-prefix': '^',
registry: common.registry }, function(err) {
t.ifError(err)
npm.config.set('save-dev', true)
diff --git a/deps/npm/test/tap/ls-depth-unmet.js b/deps/npm/test/tap/ls-depth-unmet.js
new file mode 100644
index 0000000000..1ac85efc94
--- /dev/null
+++ b/deps/npm/test/tap/ls-depth-unmet.js
@@ -0,0 +1,97 @@
+var common = require('../common-tap')
+ , test = require('tap').test
+ , path = require('path')
+ , rimraf = require('rimraf')
+ , osenv = require('osenv')
+ , mkdirp = require('mkdirp')
+ , pkg = __dirname + '/ls-depth-unmet'
+ , cache = pkg + '/cache'
+ , tmp = pkg + '/tmp'
+ , node = process.execPath
+ , npm = path.resolve(__dirname, '../../cli.js')
+ , mr = require('npm-registry-mock')
+ , opts = {cwd: pkg}
+
+
+function cleanup () {
+ process.chdir(osenv.tmpdir())
+ rimraf.sync(pkg + '/cache')
+ rimraf.sync(pkg + '/tmp')
+ rimraf.sync(pkg + '/node_modules')
+}
+
+test('setup', function (t) {
+ cleanup()
+ mkdirp.sync(pkg + '/cache')
+ mkdirp.sync(pkg + '/tmp')
+ mr(common.port, function (s) {
+ var cmd = ['install', 'underscore@1.3.1', 'mkdirp', 'test-package-with-one-dep', '--registry=' + common.registry]
+ common.npm(cmd, opts, function (er, c) {
+ if (er) throw er
+ t.equal(c, 0)
+ s.close()
+ t.end()
+ })
+ })
+})
+
+test('npm ls --depth=0', function (t) {
+ common.npm(['ls', '--depth=0'], opts, function (er, c, out) {
+ if (er) throw er
+ t.equal(c, 1)
+ t.has(out, /UNMET DEPENDENCY optimist@0\.6\.0/
+ , "output contains optimist@0.6.0 and labeled as unmet dependency")
+ t.has(out, /mkdirp@0\.3\.5 extraneous/
+ , "output contains mkdirp@0.3.5 and labeled as extraneous")
+ t.has(out, /underscore@1\.3\.1 invalid/
+ , "output contains underscore@1.3.1 and labeled as invalid")
+ t.has(out, /test-package-with-one-dep@0\.0\.0\n/
+ , "output contains test-package-with-one-dep@0.0.0 and has no labels")
+ t.doesNotHave(out, /test-package@0\.0\.0/
+ , "output does not contain test-package@0.0.0 which is at depth=1")
+ t.end()
+ })
+})
+
+test('npm ls --depth=1', function (t) {
+ common.npm(['ls', '--depth=1'], opts, function (er, c, out) {
+ if (er) throw er
+ t.equal(c, 1)
+ t.has(out, /UNMET DEPENDENCY optimist@0\.6\.0/
+ , "output contains optimist@0.6.0 and labeled as unmet dependency")
+ t.has(out, /mkdirp@0\.3\.5 extraneous/
+ , "output contains mkdirp@0.3.5 and labeled as extraneous")
+ t.has(out, /underscore@1\.3\.1 invalid/
+ , "output contains underscore@1.3.1 and labeled as invalid")
+ t.has(out, /test-package-with-one-dep@0\.0\.0\n/
+ , "output contains test-package-with-one-dep@0.0.0 and has no labels")
+ t.has(out, /test-package@0\.0\.0/
+ , "output contains test-package@0.0.0 which is at depth=1")
+ t.end()
+ })
+})
+
+test('npm ls --depth=Infinity', function (t) {
+ // travis has a preconfigured depth=0, in general we can not depend
+ // on the default value in all environments, so explictly set it here
+ common.npm(['ls', '--depth=Infinity'], opts, function (er, c, out) {
+ if (er) throw er
+ t.equal(c, 1)
+ t.has(out, /UNMET DEPENDENCY optimist@0\.6\.0/
+ , "output contains optimist@0.6.0 and labeled as unmet dependency")
+ t.has(out, /mkdirp@0\.3\.5 extraneous/
+ , "output contains mkdirp@0.3.5 and labeled as extraneous")
+ t.has(out, /underscore@1\.3\.1 invalid/
+ , "output contains underscore@1.3.1 and labeled as invalid")
+ t.has(out, /test-package-with-one-dep@0\.0\.0\n/
+ , "output contains test-package-with-one-dep@0.0.0 and has no labels")
+ t.has(out, /test-package@0\.0\.0/
+ , "output contains test-package@0.0.0 which is at depth=1")
+ t.end()
+ })
+})
+
+test('cleanup', function (t) {
+ cleanup()
+ t.end()
+})
diff --git a/deps/npm/test/tap/ls-depth-unmet/package.json b/deps/npm/test/tap/ls-depth-unmet/package.json
new file mode 100644
index 0000000000..391fa8d5b3
--- /dev/null
+++ b/deps/npm/test/tap/ls-depth-unmet/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "ls-depth-umnet",
+ "author": "Evan You",
+ "version": "0.0.0",
+ "dependencies": {
+ "test-package-with-one-dep": "0.0.0",
+ "underscore": "1.5.1",
+ "optimist": "0.6.0"
+ }
+} \ No newline at end of file
diff --git a/deps/npm/test/tap/maybe-github.js b/deps/npm/test/tap/maybe-github.js
new file mode 100644
index 0000000000..8b7105e6ea
--- /dev/null
+++ b/deps/npm/test/tap/maybe-github.js
@@ -0,0 +1,76 @@
+require("../common-tap.js")
+var test = require("tap").test
+var npm = require("../../lib/npm.js")
+
+// this is the narrowest way to replace a function in the module cache
+var found = true
+var remoteGitPath = require.resolve('../../lib/cache/add-remote-git.js')
+require("module")._cache[remoteGitPath] = {
+ id: remoteGitPath,
+ exports: function stub(_, error, __, cb) {
+ if (found) {
+ cb(null, {})
+ }
+ else {
+ cb(error)
+ }
+ }
+}
+
+// only load maybeGithub now, so it gets the stub from cache
+var maybeGithub = require("../../lib/cache/maybe-github.js")
+
+test("should throw with no parameters", function (t) {
+ t.plan(1)
+
+ t.throws(function () {
+ maybeGithub();
+ }, "throws when called without parameters")
+})
+
+test("should throw with wrong parameter types", function (t) {
+ t.plan(3)
+
+ t.throws(function () {
+ maybeGithub({}, new Error(), function () {})
+ }, "expects only a package name")
+
+ t.throws(function () {
+ maybeGithub("npm/xxx-noexist", null, function () {})
+ }, "expects to be called after a previous check already failed")
+
+ t.throws(function () {
+ maybeGithub("npm/xxx-noexist", new Error(), "ham")
+ }, "is always async")
+})
+
+test("should find an existing package on Github", function (t) {
+ found = true
+ npm.load({}, function (error) {
+ t.notOk(error, "bootstrapping succeeds")
+ t.doesNotThrow(function () {
+ maybeGithub("npm/npm", new Error("not on filesystem"), function (error, data) {
+ t.notOk(error, "no issues in looking things up")
+ t.ok(data, "received metadata from Github")
+ t.end()
+ })
+ })
+ })
+})
+
+test("shouldn't find a nonexistent package on Github", function (t) {
+ found = false
+ npm.load({}, function () {
+ t.doesNotThrow(function () {
+ maybeGithub("npm/xxx-noexist", new Error("not on filesystem"), function (error, data) {
+ t.equal(
+ error.message,
+ "not on filesystem",
+ "passed through original error message"
+ )
+ t.notOk(data, "didn't pass any metadata")
+ t.end()
+ })
+ })
+ })
+})
diff --git a/deps/npm/test/tap/noargs-install-config-save.js b/deps/npm/test/tap/noargs-install-config-save.js
index ceff77bd4d..c821000c2f 100644
--- a/deps/npm/test/tap/noargs-install-config-save.js
+++ b/deps/npm/test/tap/noargs-install-config-save.js
@@ -1,7 +1,6 @@
var common = require("../common-tap.js")
var test = require("tap").test
var npm = require.resolve("../../bin/npm-cli.js")
-var osenv = require("osenv")
var path = require("path")
var fs = require("fs")
var rimraf = require("rimraf")
@@ -9,7 +8,6 @@ var mkdirp = require("mkdirp")
var mr = require("npm-registry-mock")
-var child
var spawn = require("child_process").spawn
var node = process.execPath
@@ -56,7 +54,7 @@ test("does not update the package.json with empty arguments", function (t) {
mr(common.port, function (s) {
var child = createChild([npm, "install"])
- child.on("close", function (m) {
+ child.on("close", function () {
var text = JSON.stringify(fs.readFileSync(pkg + "/package.json", "utf8"))
t.ok(text.indexOf('"dependencies') === -1)
s.close()
@@ -71,7 +69,7 @@ test("updates the package.json (adds dependencies) with an argument", function (
mr(common.port, function (s) {
var child = createChild([npm, "install", "underscore"])
- child.on("close", function (m) {
+ child.on("close", function () {
var text = JSON.stringify(fs.readFileSync(pkg + "/package.json", "utf8"))
t.ok(text.indexOf('"dependencies') !== -1)
s.close()
diff --git a/deps/npm/test/tap/repo.js b/deps/npm/test/tap/repo.js
index 44671e7d51..bf7b574f86 100644
--- a/deps/npm/test/tap/repo.js
+++ b/deps/npm/test/tap/repo.js
@@ -12,6 +12,10 @@ var node = process.execPath
var rimraf = require("rimraf")
var spawn = require("child_process").spawn
var fs = require("fs")
+var path = require('path')
+var outFile = path.join(__dirname, '/_output')
+
+var opts = { cwd: __dirname }
test("setup", function (t) {
var s = "#!/usr/bin/env bash\n" +
@@ -24,21 +28,105 @@ test("setup", function (t) {
test("npm repo underscore", function (t) {
mr(common.port, function (s) {
- var c = spawn(node, [
- npm, "repo", "underscore",
- "--registry=" + common.registry,
- "--loglevel=silent",
- "--browser=" + __dirname + "/_script.sh",
- ])
- c.stdout.on("data", function(d) {
- t.fail("Should not get data on stdout: " + d)
- })
- c.stderr.pipe(process.stderr)
- c.on("close", function(code) {
- t.equal(code, 0, "exit ok")
- var res = fs.readFileSync(__dirname + "/_output", "ascii")
+ common.npm([
+ 'repo', 'underscore',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 0, 'exit ok')
+ var res = fs.readFileSync(outFile, 'ascii')
s.close()
t.equal(res, "https://github.com/jashkenas/underscore\n")
+ rimraf.sync(outFile)
+ t.end()
+ })
+ })
+})
+
+
+test('npm repo optimist - github (https://)', function (t) {
+ mr(common.port, function (s) {
+ common.npm([
+ 'repo', 'optimist',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 0, 'exit ok')
+ var res = fs.readFileSync(outFile, 'ascii')
+ s.close()
+ t.equal(res, "https://github.com/substack/node-optimist\n")
+ rimraf.sync(outFile)
+ t.end()
+ })
+ })
+})
+
+test("npm repo npm-test-peer-deps - no repo", function (t) {
+ mr(common.port, function (s) {
+ common.npm([
+ 'repo', 'npm-test-peer-deps',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 1, 'exit not ok')
+ s.close()
+ t.end()
+ })
+ })
+})
+
+test("npm repo test-repo-url-http - non-github (http://)", function (t) {
+ mr(common.port, function (s) {
+ common.npm([
+ 'repo', 'test-repo-url-http',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 0, 'exit ok')
+ var res = fs.readFileSync(outFile, 'ascii')
+ s.close()
+ t.equal(res, "http://gitlab.com/evanlucas/test-repo-url-http\n")
+ rimraf.sync(outFile)
+ t.end()
+ })
+ })
+})
+
+test("npm repo test-repo-url-https - non-github (https://)", function (t) {
+ mr(common.port, function (s) {
+ common.npm([
+ 'repo', 'test-repo-url-https',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 0, 'exit ok')
+ var res = fs.readFileSync(outFile, 'ascii')
+ s.close()
+ t.equal(res, "https://gitlab.com/evanlucas/test-repo-url-https\n")
+ rimraf.sync(outFile)
+ t.end()
+ })
+ })
+})
+
+test("npm repo test-repo-url-ssh - non-github (ssh://)", function (t) {
+ mr(common.port, function (s) {
+ common.npm([
+ 'repo', 'test-repo-url-ssh',
+ '--registry=' + common.registry,
+ '--loglevel=silent',
+ '--browser=' + __dirname + '/_script.sh'
+ ], opts, function(err, code, stdout, stderr) {
+ t.equal(code, 0, 'exit ok')
+ var res = fs.readFileSync(outFile, 'ascii')
+ s.close()
+ t.equal(res, "http://gitlab.com/evanlucas/test-repo-url-ssh\n")
+ rimraf.sync(outFile)
t.end()
})
})
@@ -46,7 +134,6 @@ test("npm repo underscore", function (t) {
test("cleanup", function (t) {
fs.unlinkSync(__dirname + "/_script.sh")
- fs.unlinkSync(__dirname + "/_output")
t.pass("cleaned up")
t.end()
})
diff --git a/deps/npm/test/tap/update-save.js b/deps/npm/test/tap/update-save.js
new file mode 100644
index 0000000000..6323ef8515
--- /dev/null
+++ b/deps/npm/test/tap/update-save.js
@@ -0,0 +1,160 @@
+var common = require("../common-tap.js")
+var test = require("tap").test
+var npm = require("../../")
+var mkdirp = require("mkdirp")
+var rimraf = require("rimraf")
+var fs = require('fs')
+var path = require('path')
+var mr = require("npm-registry-mock")
+
+var PKG_DIR = path.resolve(__dirname, "update-save")
+var PKG = path.resolve(PKG_DIR, "package.json")
+var CACHE_DIR = path.resolve(PKG_DIR, "cache")
+var MODULES_DIR = path.resolve(PKG_DIR, "node_modules")
+
+var EXEC_OPTS = {
+ cwd: PKG_DIR,
+ stdio: 'ignore',
+ env: {
+ npm_config_registry: common.registry,
+ npm_config_loglevel: 'verbose'
+ }
+}
+
+var DEFAULT_PKG = {
+ "name": "update-save-example",
+ "version": "1.2.3",
+ "dependencies": {
+ "mkdirp": "~0.3.0"
+ },
+ "devDependencies": {
+ "underscore": "~1.3.1"
+ }
+}
+
+var s = undefined // mock server reference
+
+test('setup', function (t) {
+ resetPackage()
+
+ mr(common.port, function (server) {
+ npm.load({cache: CACHE_DIR, registry: common.registry}, function (err) {
+ t.ifError(err)
+ s = server
+ t.end()
+ })
+ })
+})
+
+test("update regular dependencies only", function (t) {
+ resetPackage()
+
+ common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
+ t.ifError(err)
+ t.equal(code, 0)
+
+ var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
+ t.deepEqual(pkgdata.dependencies, {mkdirp: '^0.3.5'}, 'only dependencies updated')
+ t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
+ t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be untouched')
+ t.end()
+ })
+})
+
+test("update devDependencies only", function (t) {
+ resetPackage()
+
+ common.npm(['update', '--save-dev'], EXEC_OPTS, function (err, code, stdout, stderr) {
+ t.ifError(err)
+ t.equal(code, 0)
+
+ var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
+ t.deepEqual(pkgdata.dependencies, DEFAULT_PKG.dependencies, 'dependencies should be untouched')
+ t.deepEqual(pkgdata.devDependencies, {underscore: '^1.3.3'}, 'dev dependencies should be updated')
+ t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be untouched')
+ t.end()
+ })
+})
+
+test("update optionalDependencies only", function (t) {
+ resetPackage({
+ "optionalDependencies": {
+ "underscore": "~1.3.1"
+ }
+ })
+
+ common.npm(['update', '--save-optional'], EXEC_OPTS, function (err, code) {
+ t.ifError(err)
+ t.equal(code, 0)
+
+ var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
+ t.deepEqual(pkgdata.dependencies, DEFAULT_PKG.dependencies, 'dependencies should be untouched')
+ t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
+ t.deepEqual(pkgdata.optionalDependencies, {underscore: '^1.3.3'}, 'optional dependencies should be updated')
+ t.end()
+ })
+})
+
+test("optionalDependencies are merged into dependencies during --save", function (t) {
+ var pkg = resetPackage({
+ "optionalDependencies": {
+ "underscore": "~1.3.1"
+ }
+ })
+
+ common.npm(['update', '--save'], EXEC_OPTS, function (err, code) {
+ t.ifError(err)
+ t.equal(code, 0)
+
+ var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
+ t.deepEqual(pkgdata.dependencies, {mkdirp: '^0.3.5'}, 'dependencies should not include optional dependencies')
+ t.deepEqual(pkgdata.devDependencies, pkg.devDependencies, 'dev dependencies should be untouched')
+ t.deepEqual(pkgdata.optionalDependencies, pkg.optionalDependencies, 'optional dependencies should be untouched')
+ t.end()
+ })
+})
+
+test("semver prefix is replaced with configured save-prefix", function (t) {
+ resetPackage()
+
+ common.npm(['update', '--save', '--save-prefix', '~'], EXEC_OPTS, function (err, code) {
+ t.ifError(err)
+ t.equal(code, 0)
+
+ var pkgdata = JSON.parse(fs.readFileSync(PKG, 'utf8'))
+ t.deepEqual(pkgdata.dependencies, {
+ mkdirp: '~0.3.5'
+ }, 'dependencies should be updated')
+ t.deepEqual(pkgdata.devDependencies, DEFAULT_PKG.devDependencies, 'dev dependencies should be untouched')
+ t.deepEqual(pkgdata.optionalDependencies, DEFAULT_PKG.optionalDependencies, 'optional dependencies should be updated')
+ t.end()
+ })
+})
+
+function resetPackage(extendWith) {
+ rimraf.sync(CACHE_DIR)
+ rimraf.sync(MODULES_DIR)
+ mkdirp.sync(CACHE_DIR)
+ var pkg = clone(DEFAULT_PKG)
+ extend(pkg, extendWith)
+ for (key in extend) { pkg[key] = extend[key]}
+ fs.writeFileSync(PKG, JSON.stringify(pkg, null, 2), 'ascii')
+ return pkg
+}
+
+test("cleanup", function (t) {
+ s.close()
+ resetPackage() // restore package.json
+ rimraf.sync(CACHE_DIR)
+ rimraf.sync(MODULES_DIR)
+ t.end()
+})
+
+function clone(a) {
+ return extend({}, a)
+}
+
+function extend(a, b) {
+ for (key in b) { a[key] = b[key]}
+ return a
+}
diff --git a/deps/npm/test/tap/update-save/README.md b/deps/npm/test/tap/update-save/README.md
new file mode 100644
index 0000000000..aca67ff17d
--- /dev/null
+++ b/deps/npm/test/tap/update-save/README.md
@@ -0,0 +1 @@
+# just a test
diff --git a/deps/npm/test/tap/update-save/index.js b/deps/npm/test/tap/update-save/index.js
new file mode 100644
index 0000000000..33c1891f81
--- /dev/null
+++ b/deps/npm/test/tap/update-save/index.js
@@ -0,0 +1 @@
+module.exports = true
diff --git a/deps/npm/test/tap/update-save/package.json b/deps/npm/test/tap/update-save/package.json
new file mode 100644
index 0000000000..cb41e88cfe
--- /dev/null
+++ b/deps/npm/test/tap/update-save/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "update-save-example",
+ "version": "1.2.3",
+ "dependencies": {
+ "mkdirp": "~0.3.0"
+ },
+ "devDependencies": {
+ "underscore": "~1.3.1"
+ }
+} \ No newline at end of file
diff --git a/deps/npm/test/tap/url-dependencies.js b/deps/npm/test/tap/url-dependencies.js
index c3e1fa2a32..7f8cc78644 100644
--- a/deps/npm/test/tap/url-dependencies.js
+++ b/deps/npm/test/tap/url-dependencies.js
@@ -56,6 +56,7 @@ function performInstall (cb) {
npm_config_registry: common.registry,
npm_config_cache_lock_stale: 1000,
npm_config_cache_lock_wait: 1000,
+ npm_config_loglevel: "http",
HOME: process.env.HOME,
Path: process.env.PATH,
PATH: process.env.PATH
diff --git a/lib/_http_server.js b/lib/_http_server.js
index 44ebaa61cc..72e5b62c86 100644
--- a/lib/_http_server.js
+++ b/lib/_http_server.js
@@ -475,7 +475,7 @@ function connectionListener(socket) {
// if the user never called req.read(), and didn't pipe() or
// .resume() or .on('data'), then we call req._dump() so that the
// bytes will be pulled off the wire.
- if (!req._consuming)
+ if (!req._consuming && !req._readableState.resumeScheduled)
req._dump();
res.detachSocket(socket);
diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js
index 192b0a90d1..317b40bcda 100644
--- a/lib/_stream_readable.js
+++ b/lib/_stream_readable.js
@@ -86,6 +86,9 @@ function ReadableState(options, stream) {
// if true, a maybeReadMore has been scheduled
this.readingMore = false;
+ // if true, stream is in old mode
+ this.oldMode = false;
+
this.decoder = null;
this.encoding = null;
if (options.encoding) {
@@ -701,10 +704,6 @@ Readable.prototype.resume = function() {
if (!state.flowing) {
debug('resume');
state.flowing = true;
- if (!state.reading) {
- debug('resume read 0');
- this.read(0);
- }
resume(this, state);
}
return this;
@@ -720,6 +719,11 @@ function resume(stream, state) {
}
function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
state.resumeScheduled = false;
stream.emit('resume');
flow(stream);
diff --git a/lib/fs.js b/lib/fs.js
index e8e8250350..aabe68655f 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -969,7 +969,7 @@ fs.writeFile = function(path, data, options, callback) {
assertEncoding(options.encoding);
var flag = options.flag || 'w';
- fs.open(path, options.flag || 'w', options.mode, function(openErr, fd) {
+ fs.open(path, flag, options.mode, function(openErr, fd) {
if (openErr) {
if (callback) callback(openErr);
} else {
diff --git a/lib/string_decoder.js b/lib/string_decoder.js
index 6b1e30895a..7d8de27c9e 100644
--- a/lib/string_decoder.js
+++ b/lib/string_decoder.js
@@ -25,6 +25,14 @@ function assertEncoding(encoding) {
}
}
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters. CESU-8 is handled as part of the UTF-8 encoding.
+//
+// @TODO Handling all encodings inside a single object makes it very difficult
+// to reason about this code, so it should be split up in the future.
+// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
+// points as used by CESU-8.
var StringDecoder = exports.StringDecoder = function(encoding) {
this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
assertEncoding(encoding);
@@ -49,37 +57,50 @@ var StringDecoder = exports.StringDecoder = function(encoding) {
return;
}
+ // Enough space to store all bytes of a single character. UTF-8 needs 4
+ // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
this.charBuffer = new Buffer(6);
+ // Number of bytes received for the current incomplete multi-byte character.
this.charReceived = 0;
+ // Number of bytes expected for the current incomplete multi-byte character.
this.charLength = 0;
};
+// write decodes the given buffer and returns it as JS string that is
+// guaranteed to not contain any partial multi-byte characters. Any partial
+// character found at the end of the buffer is buffered up, and will be
+// returned when calling write again with the remaining bytes.
+//
+// Note: Converting a Buffer containing an orphan surrogate to a String
+// currently works, but converting a String to a Buffer (via `new Buffer`, or
+// Buffer#write) will replace incomplete surrogates with the unicode
+// replacement character. See https://codereview.chromium.org/121173009/ .
StringDecoder.prototype.write = function(buffer) {
var charStr = '';
- var offset = 0;
-
// if our last write ended with an incomplete multibyte character
while (this.charLength) {
// determine how many remaining bytes this buffer has to offer for this char
- var i = (buffer.length >= this.charLength - this.charReceived) ?
- this.charLength - this.charReceived :
- buffer.length;
+ var available = (buffer.length >= this.charLength - this.charReceived) ?
+ this.charLength - this.charReceived :
+ buffer.length;
// add the new bytes to the char buffer
- buffer.copy(this.charBuffer, this.charReceived, offset, i);
- this.charReceived += (i - offset);
- offset = i;
+ buffer.copy(this.charBuffer, this.charReceived, 0, available);
+ this.charReceived += available;
if (this.charReceived < this.charLength) {
// still not enough chars in this buffer? wait for more ...
return '';
}
+ // remove bytes belonging to the current character from the buffer
+ buffer = buffer.slice(available, buffer.length);
+
// get the character that was split
charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
- // lead surrogate (D800-DBFF) is also the incomplete character
+ // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
var charCode = charStr.charCodeAt(charStr.length - 1);
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
this.charLength += this.surrogateSize;
@@ -89,34 +110,33 @@ StringDecoder.prototype.write = function(buffer) {
this.charReceived = this.charLength = 0;
// if there are no more bytes in this buffer, just emit our char
- if (i == buffer.length) return charStr;
-
- // otherwise cut off the characters end from the beginning of this buffer
- buffer = buffer.slice(i, buffer.length);
+ if (buffer.length === 0) {
+ return charStr;
+ }
break;
}
- var lenIncomplete = this.detectIncompleteChar(buffer);
+ // determine and set charLength / charReceived
+ this.detectIncompleteChar(buffer);
var end = buffer.length;
if (this.charLength) {
// buffer the incomplete character bytes we got
- buffer.copy(this.charBuffer, 0, buffer.length - lenIncomplete, end);
- this.charReceived = lenIncomplete;
- end -= lenIncomplete;
+ buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
+ end -= this.charReceived;
}
charStr += buffer.toString(this.encoding, 0, end);
var end = charStr.length - 1;
var charCode = charStr.charCodeAt(end);
- // lead surrogate (D800-DBFF) is also the incomplete character
+ // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
var size = this.surrogateSize;
this.charLength += size;
this.charReceived += size;
this.charBuffer.copy(this.charBuffer, size, 0, size);
- this.charBuffer.write(charStr.charAt(charStr.length - 1), this.encoding);
+ buffer.copy(this.charBuffer, 0, 0, size);
return charStr.substring(0, end);
}
@@ -124,6 +144,10 @@ StringDecoder.prototype.write = function(buffer) {
return charStr;
};
+// detectIncompleteChar determines if there is an incomplete UTF-8 character at
+// the end of the given buffer. If so, it sets this.charLength to the byte
+// length that character, and sets this.charReceived to the number of bytes
+// that are available for this character.
StringDecoder.prototype.detectIncompleteChar = function(buffer) {
// determine how many bytes we have to check at the end of this buffer
var i = (buffer.length >= 3) ? 3 : buffer.length;
@@ -153,8 +177,7 @@ StringDecoder.prototype.detectIncompleteChar = function(buffer) {
break;
}
}
-
- return i;
+ this.charReceived = i;
};
StringDecoder.prototype.end = function(buffer) {
@@ -177,13 +200,11 @@ function passThroughWrite(buffer) {
}
function utf16DetectIncompleteChar(buffer) {
- var incomplete = this.charReceived = buffer.length % 2;
- this.charLength = incomplete ? 2 : 0;
- return incomplete;
+ this.charReceived = buffer.length % 2;
+ this.charLength = this.charReceived ? 2 : 0;
}
function base64DetectIncompleteChar(buffer) {
- var incomplete = this.charReceived = buffer.length % 3;
- this.charLength = incomplete ? 3 : 0;
- return incomplete;
+ this.charReceived = buffer.length % 3;
+ this.charLength = this.charReceived ? 3 : 0;
}
diff --git a/node.gyp b/node.gyp
index ec64d22978..27dafe5867 100644
--- a/node.gyp
+++ b/node.gyp
@@ -147,6 +147,7 @@
'src/tree.h',
'src/util.h',
'src/util-inl.h',
+ 'src/util.cc',
'deps/http_parser/http_parser.h',
'<(SHARED_INTERMEDIATE_DIR)/node_natives.h',
# javascript files to make for an even more pleasant IDE experience
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc
index f762f2a403..5e8aa25921 100644
--- a/src/cares_wrap.cc
+++ b/src/cares_wrap.cc
@@ -28,6 +28,7 @@
#include "node.h"
#include "req_wrap.h"
#include "tree.h"
+#include "util.h"
#include "uv.h"
#include <assert.h>
@@ -39,6 +40,7 @@
defined(__MINGW32__) || \
defined(__OpenBSD__) || \
defined(_MSC_VER)
+
# include <nameser.h>
#else
# include <arpa/nameser.h>
@@ -849,7 +851,7 @@ static void Query(const FunctionCallbackInfo<Value>& args) {
Local<String> string = args[1].As<String>();
Wrap* wrap = new Wrap(env, req_wrap_obj);
- String::Utf8Value name(string);
+ node::Utf8Value name(string);
int err = wrap->Send(*name);
if (err)
delete wrap;
@@ -960,7 +962,7 @@ static void IsIP(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args.GetIsolate());
HandleScope scope(env->isolate());
- String::Utf8Value ip(args[0]);
+ node::Utf8Value ip(args[0]);
char address_buffer[sizeof(struct in6_addr)];
int rc = 0;
@@ -981,7 +983,7 @@ static void GetAddrInfo(const FunctionCallbackInfo<Value>& args) {
assert(args[1]->IsString());
assert(args[2]->IsInt32());
Local<Object> req_wrap_obj = args[0].As<Object>();
- String::Utf8Value hostname(args[1]);
+ node::Utf8Value hostname(args[1]);
int family;
switch (args[2]->Int32Value()) {
@@ -1082,7 +1084,7 @@ static void SetServers(const FunctionCallbackInfo<Value>& args) {
assert(elm->Get(1)->IsString());
int fam = elm->Get(0)->Int32Value();
- String::Utf8Value ip(elm->Get(1));
+ node::Utf8Value ip(elm->Get(1));
ares_addr_node* cur = &servers[i];
diff --git a/src/fs_event_wrap.cc b/src/fs_event_wrap.cc
index 7bd8b310f2..04f3b997fd 100644
--- a/src/fs_event_wrap.cc
+++ b/src/fs_event_wrap.cc
@@ -112,7 +112,7 @@ void FSEventWrap::Start(const FunctionCallbackInfo<Value>& args) {
return env->ThrowTypeError("Bad arguments");
}
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
unsigned int flags = 0;
if (args[2]->IsTrue())
diff --git a/src/node.cc b/src/node.cc
index 5d13e8bd58..ee5f18f30f 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -47,6 +47,7 @@
#include "handle_wrap.h"
#include "req_wrap.h"
#include "string_bytes.h"
+#include "util.h"
#include "uv.h"
#include "v8-debug.h"
#include "v8-profiler.h"
@@ -144,6 +145,8 @@ static uv_async_t dispatch_debug_messages_async;
static Isolate* node_isolate = NULL;
+int WRITE_UTF8_FLAGS = v8::String::HINT_MANY_WRITES_EXPECTED |
+ v8::String::NO_NULL_TERMINATION;
class ArrayBufferAllocator : public ArrayBuffer::Allocator {
public:
@@ -1252,7 +1255,7 @@ enum encoding ParseEncoding(Isolate* isolate,
if (!encoding_v->IsString())
return _default;
- String::Utf8Value encoding(encoding_v);
+ node::Utf8Value encoding(encoding_v);
if (strcasecmp(*encoding, "utf8") == 0) {
return UTF8;
@@ -1352,11 +1355,11 @@ void AppendExceptionLine(Environment* env,
static char arrow[1024];
// Print (filename):(line number): (message).
- String::Utf8Value filename(message->GetScriptResourceName());
+ node::Utf8Value filename(message->GetScriptResourceName());
const char* filename_string = *filename;
int linenum = message->GetLineNumber();
// Print line of source code.
- String::Utf8Value sourceline(message->GetSourceLine());
+ node::Utf8Value sourceline(message->GetSourceLine());
const char* sourceline_string = *sourceline;
// Because of how node modules work, all scripts are wrapped with a
@@ -1447,7 +1450,7 @@ static void ReportException(Environment* env,
else
trace_value = er->ToObject()->Get(env->stack_string());
- String::Utf8Value trace(trace_value);
+ node::Utf8Value trace(trace_value);
// range errors have a trace member set to undefined
if (trace.length() > 0 && !trace_value->IsUndefined()) {
@@ -1470,11 +1473,11 @@ static void ReportException(Environment* env,
name.IsEmpty() ||
name->IsUndefined()) {
// Not an error object. Just print as-is.
- String::Utf8Value message(er);
+ node::Utf8Value message(er);
fprintf(stderr, "%s\n", *message);
} else {
- String::Utf8Value name_string(name);
- String::Utf8Value message_string(message);
+ node::Utf8Value name_string(name);
+ node::Utf8Value message_string(message);
fprintf(stderr, "%s: %s\n", *name_string, *message_string);
}
}
@@ -1574,7 +1577,7 @@ static void Chdir(const FunctionCallbackInfo<Value>& args) {
return env->ThrowError("Bad argument.");
}
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
int err = uv_chdir(*path);
if (err) {
return env->ThrowUVException(err, "uv_chdir");
@@ -1622,10 +1625,10 @@ static void Umask(const FunctionCallbackInfo<Value>& args) {
oct = args[0]->Uint32Value();
} else {
oct = 0;
- String::Utf8Value str(args[0]);
+ node::Utf8Value str(args[0]);
// Parse the octal string.
- for (int i = 0; i < str.length(); i++) {
+ for (size_t i = 0; i < str.length(); i++) {
char c = (*str)[i];
if (c > '7' || c < '0') {
return env->ThrowTypeError("invalid octal string");
@@ -1727,7 +1730,7 @@ static uid_t uid_by_name(Handle<Value> value) {
if (value->IsUint32()) {
return static_cast<uid_t>(value->Uint32Value());
} else {
- String::Utf8Value name(value);
+ node::Utf8Value name(value);
return uid_by_name(*name);
}
}
@@ -1737,7 +1740,7 @@ static gid_t gid_by_name(Handle<Value> value) {
if (value->IsUint32()) {
return static_cast<gid_t>(value->Uint32Value());
} else {
- String::Utf8Value name(value);
+ node::Utf8Value name(value);
return gid_by_name(*name);
}
}
@@ -1878,7 +1881,7 @@ static void InitGroups(const FunctionCallbackInfo<Value>& args) {
return env->ThrowTypeError("argument 2 must be a number or a string");
}
- String::Utf8Value arg0(args[0]);
+ node::Utf8Value arg0(args[0]);
gid_t extra_group;
bool must_free;
char* user;
@@ -2054,7 +2057,7 @@ void DLOpen(const FunctionCallbackInfo<Value>& args) {
}
Local<Object> module = args[0]->ToObject(); // Cast
- String::Utf8Value filename(args[1]); // Cast
+ node::Utf8Value filename(args[1]); // Cast
Local<String> exports_string = env->exports_string();
Local<Object> exports = module->Get(exports_string)->ToObject();
@@ -2191,7 +2194,7 @@ static void Binding(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args.GetIsolate());
Local<String> module = args[0]->ToString();
- String::Utf8Value module_v(module);
+ node::Utf8Value module_v(module);
Local<Object> cache = env->binding_cache_object();
Local<Object> exports;
@@ -2251,7 +2254,7 @@ static void ProcessTitleSetter(Local<String> property,
const PropertyCallbackInfo<void>& info) {
Environment* env = Environment::GetCurrent(info.GetIsolate());
HandleScope scope(env->isolate());
- String::Utf8Value title(value);
+ node::Utf8Value title(value);
// TODO(piscisaureus): protect with a lock
uv_set_process_title(*title);
}
@@ -2262,7 +2265,7 @@ static void EnvGetter(Local<String> property,
Environment* env = Environment::GetCurrent(info.GetIsolate());
HandleScope scope(env->isolate());
#ifdef __POSIX__
- String::Utf8Value key(property);
+ node::Utf8Value key(property);
const char* val = getenv(*key);
if (val) {
return info.GetReturnValue().Set(String::NewFromUtf8(env->isolate(), val));
@@ -2295,8 +2298,8 @@ static void EnvSetter(Local<String> property,
Environment* env = Environment::GetCurrent(info.GetIsolate());
HandleScope scope(env->isolate());
#ifdef __POSIX__
- String::Utf8Value key(property);
- String::Utf8Value val(value);
+ node::Utf8Value key(property);
+ node::Utf8Value val(value);
setenv(*key, *val, 1);
#else // _WIN32
String::Value key(property);
@@ -2318,7 +2321,7 @@ static void EnvQuery(Local<String> property,
HandleScope scope(env->isolate());
int32_t rc = -1; // Not found unless proven otherwise.
#ifdef __POSIX__
- String::Utf8Value key(property);
+ node::Utf8Value key(property);
if (getenv(*key))
rc = 0;
#else // _WIN32
@@ -2346,7 +2349,7 @@ static void EnvDeleter(Local<String> property,
HandleScope scope(env->isolate());
bool rc = true;
#ifdef __POSIX__
- String::Utf8Value key(property);
+ node::Utf8Value key(property);
rc = getenv(*key) != NULL;
if (rc)
unsetenv(*key);
@@ -2811,7 +2814,7 @@ static void RawDebug(const FunctionCallbackInfo<Value>& args) {
assert(args.Length() == 1 && args[0]->IsString() &&
"must be called with a single string");
- String::Utf8Value message(args[0]);
+ node::Utf8Value message(args[0]);
fprintf(stderr, "%s\n", *message);
fflush(stderr);
}
@@ -3563,6 +3566,11 @@ Environment* CreateEnvironment(Isolate* isolate,
int Start(int argc, char** argv) {
+ const char* replaceInvalid = getenv("NODE_INVALID_UTF8");
+
+ if (replaceInvalid == NULL)
+ WRITE_UTF8_FLAGS |= String::REPLACE_INVALID_UTF8;
+
#if !defined(_WIN32)
// Try hard not to lose SIGUSR1 signals during the bootstrap process.
InstallEarlyDebugSignalHandler();
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index ee43eedc97..c62206ece9 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -353,7 +353,7 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
return;
}
- String::Utf8Value at(args[0]);
+ node::Utf8Value at(args[0]);
size_t at_length = at.length();
// optimize single ascii character case
diff --git a/src/node_crypto.cc b/src/node_crypto.cc
index 4201040491..4abc513dce 100644
--- a/src/node_crypto.cc
+++ b/src/node_crypto.cc
@@ -305,7 +305,7 @@ void SecureContext::Init(const FunctionCallbackInfo<Value>& args) {
OPENSSL_CONST SSL_METHOD *method = SSLv23_method();
if (args.Length() == 1 && args[0]->IsString()) {
- const String::Utf8Value sslmethod(args[0]);
+ const node::Utf8Value sslmethod(args[0]);
if (strcmp(*sslmethod, "SSLv2_method") == 0) {
#ifndef OPENSSL_NO_SSL2
@@ -386,7 +386,7 @@ static BIO* LoadBIO(Environment* env, Handle<Value> v) {
int r = -1;
if (v->IsString()) {
- const String::Utf8Value s(v);
+ const node::Utf8Value s(v);
r = BIO_write(bio, *s, s.length());
} else if (Buffer::HasInstance(v)) {
char* buffer_data = Buffer::Data(v);
@@ -441,7 +441,7 @@ void SecureContext::SetKey(const FunctionCallbackInfo<Value>& args) {
if (!bio)
return;
- String::Utf8Value passphrase(args[1]);
+ node::Utf8Value passphrase(args[1]);
EVP_PKEY* key = PEM_read_bio_PrivateKey(bio,
NULL,
@@ -710,7 +710,7 @@ void SecureContext::SetCiphers(const FunctionCallbackInfo<Value>& args) {
return sc->env()->ThrowTypeError("Bad parameter");
}
- const String::Utf8Value ciphers(args[0]);
+ const node::Utf8Value ciphers(args[0]);
SSL_CTX_set_cipher_list(sc->ctx_, *ciphers);
}
@@ -724,7 +724,7 @@ void SecureContext::SetECDHCurve(const FunctionCallbackInfo<Value>& args) {
if (args.Length() != 1 || !args[0]->IsString())
return env->ThrowTypeError("First argument should be a string");
- String::Utf8Value curve(args[0]);
+ node::Utf8Value curve(args[0]);
int nid = OBJ_sn2nid(*curve);
@@ -766,7 +766,7 @@ void SecureContext::SetSessionIdContext(
return sc->env()->ThrowTypeError("Bad parameter");
}
- const String::Utf8Value sessionIdContext(args[0]);
+ const node::Utf8Value sessionIdContext(args[0]);
const unsigned char* sid_ctx =
reinterpret_cast<const unsigned char*>(*sessionIdContext);
unsigned int sid_ctx_len = sessionIdContext.length();
@@ -2123,7 +2123,7 @@ void Connection::New(const FunctionCallbackInfo<Value>& args) {
if (is_server) {
SSL_CTX_set_tlsext_servername_callback(sc->ctx_, SelectSNIContextCallback_);
} else if (args[2]->IsString()) {
- const String::Utf8Value servername(args[2]);
+ const node::Utf8Value servername(args[2]);
SSL_set_tlsext_host_name(conn->ssl_, *servername);
}
#endif
@@ -2544,7 +2544,7 @@ void CipherBase::Init(const FunctionCallbackInfo<Value>& args) {
return cipher->env()->ThrowError("Must give cipher-type, key");
}
- const String::Utf8Value cipher_type(args[0]);
+ const node::Utf8Value cipher_type(args[0]);
const char* key_buf = Buffer::Data(args[1]);
ssize_t key_buf_len = Buffer::Length(args[1]);
cipher->Init(*cipher_type, key_buf, key_buf_len);
@@ -2599,7 +2599,7 @@ void CipherBase::InitIv(const FunctionCallbackInfo<Value>& args) {
ASSERT_IS_BUFFER(args[1]);
ASSERT_IS_BUFFER(args[2]);
- const String::Utf8Value cipher_type(args[0]);
+ const node::Utf8Value cipher_type(args[0]);
ssize_t key_len = Buffer::Length(args[1]);
const char* key_buf = Buffer::Data(args[1]);
ssize_t iv_len = Buffer::Length(args[2]);
@@ -2899,7 +2899,7 @@ void Hmac::HmacInit(const FunctionCallbackInfo<Value>& args) {
ASSERT_IS_BUFFER(args[1]);
- const String::Utf8Value hash_type(args[0]);
+ const node::Utf8Value hash_type(args[0]);
const char* buffer_data = Buffer::Data(args[1]);
size_t buffer_length = Buffer::Length(args[1]);
hmac->HmacInit(*hash_type, buffer_data, buffer_length);
@@ -3010,7 +3010,7 @@ void Hash::New(const FunctionCallbackInfo<Value>& args) {
return env->ThrowError("Must give hashtype string as argument");
}
- const String::Utf8Value hash_type(args[0]);
+ const node::Utf8Value hash_type(args[0]);
Hash* hash = new Hash(env, args.This());
if (!hash->HashInit(*hash_type)) {
@@ -3189,7 +3189,7 @@ void Sign::SignInit(const FunctionCallbackInfo<Value>& args) {
return sign->env()->ThrowError("Must give signtype string as argument");
}
- const String::Utf8Value sign_type(args[0]);
+ const node::Utf8Value sign_type(args[0]);
sign->CheckThrow(sign->SignInit(*sign_type));
}
@@ -3298,7 +3298,7 @@ void Sign::SignFinal(const FunctionCallbackInfo<Value>& args) {
encoding = ParseEncoding(env->isolate(), args[1]->ToString(), BUFFER);
}
- String::Utf8Value passphrase(args[2]);
+ node::Utf8Value passphrase(args[2]);
ASSERT_IS_BUFFER(args[0]);
size_t buf_len = Buffer::Length(args[0]);
@@ -3374,7 +3374,7 @@ void Verify::VerifyInit(const FunctionCallbackInfo<Value>& args) {
return verify->env()->ThrowError("Must give verifytype string as argument");
}
- const String::Utf8Value verify_type(args[0]);
+ const node::Utf8Value verify_type(args[0]);
verify->CheckThrow(verify->VerifyInit(*verify_type));
}
@@ -3644,7 +3644,7 @@ void DiffieHellman::DiffieHellmanGroup(
bool initialized = false;
- const String::Utf8Value group_name(args[0]);
+ const node::Utf8Value group_name(args[0]);
for (unsigned int i = 0; i < ARRAY_SIZE(modp_groups); ++i) {
const modp_group* it = modp_groups + i;
@@ -4158,7 +4158,7 @@ void PBKDF2(const FunctionCallbackInfo<Value>& args) {
}
if (args[4]->IsString()) {
- String::Utf8Value digest_name(args[4]);
+ node::Utf8Value digest_name(args[4]);
digest = EVP_get_digestbyname(*digest_name);
if (digest == NULL) {
type_error = "Bad digest name";
@@ -4668,7 +4668,7 @@ void SetEngine(const FunctionCallbackInfo<Value>& args) {
ClearErrorOnReturn clear_error_on_return;
(void) &clear_error_on_return; // Silence compiler warning.
- const String::Utf8Value engine_id(args[0]);
+ const node::Utf8Value engine_id(args[0]);
ENGINE* engine = ENGINE_by_id(*engine_id);
// Engine not found, try loading dynamically
diff --git a/src/node_dtrace.cc b/src/node_dtrace.cc
index 53724307c6..6e5e31083f 100644
--- a/src/node_dtrace.cc
+++ b/src/node_dtrace.cc
@@ -20,6 +20,8 @@
// USE OR OTHER DEALINGS IN THE SOFTWARE.
+#include "util.h"
+
#ifdef HAVE_DTRACE
#include "node_dtrace.h"
#include "node_provider.h"
@@ -74,7 +76,7 @@ using v8::Value;
return env->ThrowError( \
"expected object for " #obj " to contain string member " #member); \
} \
- String::Utf8Value _##member(obj->Get(OneByteString(env->isolate(), \
+ node::Utf8Value _##member(obj->Get(OneByteString(env->isolate(), \
#member))); \
if ((*(const char **)valp = *_##member) == NULL) \
*(const char **)valp = "<unknown>";
@@ -217,7 +219,7 @@ void DTRACE_HTTP_SERVER_REQUEST(const FunctionCallbackInfo<Value>& args) {
}
Local<Value> strfwdfor = headers->Get(env->x_forwarded_string());
- String::Utf8Value fwdfor(strfwdfor);
+ node::Utf8Value fwdfor(strfwdfor);
if (!strfwdfor->IsString() || (req.forwardedFor = *fwdfor) == NULL)
req.forwardedFor = const_cast<char*>("");
diff --git a/src/node_file.cc b/src/node_file.cc
index f50ed7ad40..d62fbe2ab9 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -29,6 +29,7 @@
#include "env-inl.h"
#include "req_wrap.h"
#include "string_bytes.h"
+#include "util.h"
#include <fcntl.h>
#include <sys/types.h>
@@ -429,7 +430,7 @@ static void Stat(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(stat, args[1], *path)
@@ -449,7 +450,7 @@ static void LStat(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(lstat, args[1], *path)
@@ -493,12 +494,12 @@ static void Symlink(const FunctionCallbackInfo<Value>& args) {
if (!args[1]->IsString())
return TYPE_ERROR("src path must be a string");
- String::Utf8Value dest(args[0]);
- String::Utf8Value path(args[1]);
+ node::Utf8Value dest(args[0]);
+ node::Utf8Value path(args[1]);
int flags = 0;
if (args[2]->IsString()) {
- String::Utf8Value mode(args[2]);
+ node::Utf8Value mode(args[2]);
if (strcmp(*mode, "dir") == 0) {
flags |= UV_FS_SYMLINK_DIR;
} else if (strcmp(*mode, "junction") == 0) {
@@ -529,8 +530,8 @@ static void Link(const FunctionCallbackInfo<Value>& args) {
if (!args[1]->IsString())
return TYPE_ERROR("src path must be a string");
- String::Utf8Value orig_path(args[0]);
- String::Utf8Value new_path(args[1]);
+ node::Utf8Value orig_path(args[0]);
+ node::Utf8Value new_path(args[1]);
if (args[2]->IsFunction()) {
ASYNC_DEST_CALL(link, args[2], *new_path, *orig_path, *new_path)
@@ -548,7 +549,7 @@ static void ReadLink(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(readlink, args[1], *path)
@@ -574,8 +575,8 @@ static void Rename(const FunctionCallbackInfo<Value>& args) {
if (!args[1]->IsString())
return TYPE_ERROR("new path must be a string");
- String::Utf8Value old_path(args[0]);
- String::Utf8Value new_path(args[1]);
+ node::Utf8Value old_path(args[0]);
+ node::Utf8Value new_path(args[1]);
if (args[2]->IsFunction()) {
ASYNC_DEST_CALL(rename, args[2], *new_path, *old_path, *new_path)
@@ -647,7 +648,7 @@ static void Unlink(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(unlink, args[1], *path)
@@ -665,7 +666,7 @@ static void RMDir(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(rmdir, args[1], *path)
@@ -682,7 +683,7 @@ static void MKDir(const FunctionCallbackInfo<Value>& args) {
return THROW_BAD_ARGS;
}
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
int mode = static_cast<int>(args[1]->Int32Value());
if (args[2]->IsFunction()) {
@@ -701,7 +702,7 @@ static void ReadDir(const FunctionCallbackInfo<Value>& args) {
if (!args[0]->IsString())
return TYPE_ERROR("path must be a string");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
if (args[1]->IsFunction()) {
ASYNC_CALL(readdir, args[1], *path, 0 /*flags*/)
@@ -746,7 +747,7 @@ static void Open(const FunctionCallbackInfo<Value>& args) {
if (!args[2]->IsInt32())
return TYPE_ERROR("mode must be an int");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
int flags = args[1]->Int32Value();
int mode = static_cast<int>(args[2]->Int32Value());
@@ -949,7 +950,7 @@ static void Chmod(const FunctionCallbackInfo<Value>& args) {
if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsInt32()) {
return THROW_BAD_ARGS;
}
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
int mode = static_cast<int>(args[1]->Int32Value());
if (args[2]->IsFunction()) {
@@ -1002,7 +1003,7 @@ static void Chown(const FunctionCallbackInfo<Value>& args) {
if (!args[2]->IsUint32())
return TYPE_ERROR("gid must be an unsigned int");
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
uv_uid_t uid = static_cast<uv_uid_t>(args[1]->Uint32Value());
uv_gid_t gid = static_cast<uv_gid_t>(args[2]->Uint32Value());
@@ -1065,7 +1066,7 @@ static void UTimes(const FunctionCallbackInfo<Value>& args) {
if (!args[2]->IsNumber())
return TYPE_ERROR("mtime must be a number");
- const String::Utf8Value path(args[0]);
+ const node::Utf8Value path(args[0]);
const double atime = static_cast<double>(args[1]->NumberValue());
const double mtime = static_cast<double>(args[2]->NumberValue());
diff --git a/src/node_stat_watcher.cc b/src/node_stat_watcher.cc
index 51cb276e8d..aaaa1a3cdb 100644
--- a/src/node_stat_watcher.cc
+++ b/src/node_stat_watcher.cc
@@ -113,7 +113,7 @@ void StatWatcher::Start(const FunctionCallbackInfo<Value>& args) {
HandleScope scope(env->isolate());
StatWatcher* wrap = Unwrap<StatWatcher>(args.Holder());
- String::Utf8Value path(args[0]);
+ node::Utf8Value path(args[0]);
const bool persistent = args[1]->BooleanValue();
const uint32_t interval = args[2]->Uint32Value();
diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc
index 72bb480130..03156cc8f5 100644
--- a/src/pipe_wrap.cc
+++ b/src/pipe_wrap.cc
@@ -148,7 +148,7 @@ void PipeWrap::Bind(const FunctionCallbackInfo<Value>& args) {
PipeWrap* wrap = Unwrap<PipeWrap>(args.Holder());
- String::Utf8Value name(args[0]);
+ node::Utf8Value name(args[0]);
int err = uv_pipe_bind(&wrap->handle_, *name);
args.GetReturnValue().Set(err);
}
@@ -282,7 +282,7 @@ void PipeWrap::Connect(const FunctionCallbackInfo<Value>& args) {
assert(args[1]->IsString());
Local<Object> req_wrap_obj = args[0].As<Object>();
- String::Utf8Value name(args[1]);
+ node::Utf8Value name(args[1]);
ConnectWrap* req_wrap = new ConnectWrap(env,
req_wrap_obj,
diff --git a/src/process_wrap.cc b/src/process_wrap.cc
index 133eac67c5..a270c38843 100644
--- a/src/process_wrap.cc
+++ b/src/process_wrap.cc
@@ -173,7 +173,7 @@ class ProcessWrap : public HandleWrap {
// options.file
Local<Value> file_v = js_options->Get(env->file_string());
- String::Utf8Value file(file_v->IsString() ? file_v : Local<Value>());
+ node::Utf8Value file(file_v->IsString() ? file_v : Local<Value>());
if (file.length() > 0) {
options.file = *file;
} else {
@@ -188,7 +188,7 @@ class ProcessWrap : public HandleWrap {
// Heap allocate to detect errors. +1 is for NULL.
options.args = new char*[argc + 1];
for (int i = 0; i < argc; i++) {
- String::Utf8Value arg(js_argv->Get(i));
+ node::Utf8Value arg(js_argv->Get(i));
options.args[i] = strdup(*arg);
}
options.args[argc] = NULL;
@@ -196,7 +196,7 @@ class ProcessWrap : public HandleWrap {
// options.cwd
Local<Value> cwd_v = js_options->Get(env->cwd_string());
- String::Utf8Value cwd(cwd_v->IsString() ? cwd_v : Local<Value>());
+ node::Utf8Value cwd(cwd_v->IsString() ? cwd_v : Local<Value>());
if (cwd.length() > 0) {
options.cwd = *cwd;
}
@@ -208,7 +208,7 @@ class ProcessWrap : public HandleWrap {
int envc = env->Length();
options.env = new char*[envc + 1]; // Heap allocated to detect errors.
for (int i = 0; i < envc; i++) {
- String::Utf8Value pair(env->Get(i));
+ node::Utf8Value pair(env->Get(i));
options.env[i] = strdup(*pair);
}
options.env[envc] = NULL;
diff --git a/src/string_bytes.cc b/src/string_bytes.cc
index 1a7b4e1ebe..38a082fa2b 100644
--- a/src/string_bytes.cc
+++ b/src/string_bytes.cc
@@ -326,9 +326,11 @@ size_t StringBytes::Write(Isolate* isolate,
case UTF8:
if (is_extern)
+ // TODO(tjfontaine) should this validate invalid surrogate pairs as
+ // well?
memcpy(buf, data, len);
else
- len = str->WriteUtf8(buf, buflen, chars_written, flags);
+ len = str->WriteUtf8(buf, buflen, chars_written, WRITE_UTF8_FLAGS);
break;
case UCS2:
diff --git a/src/string_bytes.h b/src/string_bytes.h
index feaf61617c..77ae5b9421 100644
--- a/src/string_bytes.h
+++ b/src/string_bytes.h
@@ -29,6 +29,8 @@
namespace node {
+extern int WRITE_UTF8_FLAGS;
+
class StringBytes {
public:
// Does the string match the encoding? Quick but non-exhaustive.
diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc
index d0e2573bd5..ecaffef803 100644
--- a/src/tcp_wrap.cc
+++ b/src/tcp_wrap.cc
@@ -257,7 +257,7 @@ void TCPWrap::Bind(const FunctionCallbackInfo<Value>& args) {
TCPWrap* wrap = Unwrap<TCPWrap>(args.Holder());
- String::Utf8Value ip_address(args[0]);
+ node::Utf8Value ip_address(args[0]);
int port = args[1]->Int32Value();
sockaddr_in addr;
@@ -278,7 +278,7 @@ void TCPWrap::Bind6(const FunctionCallbackInfo<Value>& args) {
TCPWrap* wrap = Unwrap<TCPWrap>(args.Holder());
- String::Utf8Value ip6_address(args[0]);
+ node::Utf8Value ip6_address(args[0]);
int port = args[1]->Int32Value();
sockaddr_in6 addr;
@@ -381,7 +381,7 @@ void TCPWrap::Connect(const FunctionCallbackInfo<Value>& args) {
assert(args[2]->Uint32Value());
Local<Object> req_wrap_obj = args[0].As<Object>();
- String::Utf8Value ip_address(args[1]);
+ node::Utf8Value ip_address(args[1]);
int port = args[2]->Uint32Value();
sockaddr_in addr;
@@ -415,7 +415,7 @@ void TCPWrap::Connect6(const FunctionCallbackInfo<Value>& args) {
assert(args[2]->Uint32Value());
Local<Object> req_wrap_obj = args[0].As<Object>();
- String::Utf8Value ip_address(args[1]);
+ node::Utf8Value ip_address(args[1]);
int port = args[2]->Int32Value();
sockaddr_in6 addr;
diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc
index b0200a8956..93f8355d44 100644
--- a/src/tls_wrap.cc
+++ b/src/tls_wrap.cc
@@ -756,7 +756,7 @@ void TLSCallbacks::SetServername(const FunctionCallbackInfo<Value>& args) {
return;
#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
- String::Utf8Value servername(args[0].As<String>());
+ node::Utf8Value servername(args[0].As<String>());
SSL_set_tlsext_host_name(wrap->ssl_, *servername);
#endif // SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
}
diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc
index c1bc6a7311..b392e35785 100644
--- a/src/udp_wrap.cc
+++ b/src/udp_wrap.cc
@@ -155,7 +155,7 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
// bind(ip, port, flags)
assert(args.Length() == 3);
- String::Utf8Value address(args[0]);
+ node::Utf8Value address(args[0]);
const int port = args[1]->Uint32Value();
const int flags = args[2]->Uint32Value();
char addr[sizeof(sockaddr_in6)];
@@ -219,8 +219,8 @@ void UDPWrap::SetMembership(const FunctionCallbackInfo<Value>& args,
assert(args.Length() == 2);
- String::Utf8Value address(args[0]);
- String::Utf8Value iface(args[1]);
+ node::Utf8Value address(args[0]);
+ node::Utf8Value iface(args[1]);
const char* iface_cstr = *iface;
if (args[1]->IsUndefined() || args[1]->IsNull()) {
@@ -265,7 +265,7 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
size_t offset = args[2]->Uint32Value();
size_t length = args[3]->Uint32Value();
const unsigned short port = args[4]->Uint32Value();
- String::Utf8Value address(args[5]);
+ node::Utf8Value address(args[5]);
const bool have_callback = args[6]->IsTrue();
assert(offset < Buffer::Length(buffer_obj));
diff --git a/src/util.cc b/src/util.cc
new file mode 100644
index 0000000000..7459dbb7b8
--- /dev/null
+++ b/src/util.cc
@@ -0,0 +1,50 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#include "util.h"
+
+#include "string_bytes.h"
+
+namespace node {
+
+Utf8Value::Utf8Value(v8::Handle<v8::Value> value)
+ : length_(0), str_(NULL) {
+ if (value.IsEmpty())
+ return;
+
+ v8::Local<v8::String> val_ = value->ToString();
+
+ // Allocate enough space to include the null terminator
+ size_t len = StringBytes::StorageSize(val_, UTF8) + 1;
+
+ char* str = static_cast<char*>(calloc(1, len));
+
+ int flags = WRITE_UTF8_FLAGS;
+ flags |= ~v8::String::NO_NULL_TERMINATION;
+
+ length_ = val_->WriteUtf8(str,
+ len,
+ 0,
+ flags);
+
+ str_ = reinterpret_cast<char*>(str);
+}
+} // namespace node
diff --git a/src/util.h b/src/util.h
index 3dcfa5560f..f547a08527 100644
--- a/src/util.h
+++ b/src/util.h
@@ -23,6 +23,7 @@
#define SRC_UTIL_H_
#include "v8.h"
+
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
@@ -114,6 +115,31 @@ inline void Wrap(v8::Local<v8::Object> object, void* pointer);
template <typename TypeName>
inline TypeName* Unwrap(v8::Local<v8::Object> object);
+class Utf8Value {
+ public:
+ explicit Utf8Value(v8::Handle<v8::Value> value);
+
+ ~Utf8Value() {
+ free(str_);
+ }
+
+ char* operator*() {
+ return str_;
+ };
+
+ const char* operator*() const {
+ return str_;
+ };
+
+ size_t length() const {
+ return length_;
+ };
+
+ private:
+ size_t length_;
+ char* str_;
+};
+
} // namespace node
#endif // SRC_UTIL_H_
diff --git a/test/simple/test-http-abort-stream-end.js b/test/disabled/test-http-abort-stream-end.js
index e2ffa4590a..e2ffa4590a 100644
--- a/test/simple/test-http-abort-stream-end.js
+++ b/test/disabled/test-http-abort-stream-end.js
diff --git a/test/simple/test-buffer.js b/test/simple/test-buffer.js
index bc36acb7c2..1ad5244f70 100644
--- a/test/simple/test-buffer.js
+++ b/test/simple/test-buffer.js
@@ -768,6 +768,18 @@ assert.equal(7, b.writeUInt8(0, 6));
assert.equal(8, b.writeInt8(0, 7));
assert.equal(16, b.writeDoubleLE(0, 8));
+// test unmatched surrogates not producing invalid utf8 output
+// ef bf bd = utf-8 representation of unicode replacement character
+// see https://codereview.chromium.org/121173009/
+buf = new Buffer('ab\ud800cd', 'utf8');
+assert.equal(buf[0], 0x61);
+assert.equal(buf[1], 0x62);
+assert.equal(buf[2], 0xef);
+assert.equal(buf[3], 0xbf);
+assert.equal(buf[4], 0xbd);
+assert.equal(buf[5], 0x63);
+assert.equal(buf[6], 0x64);
+
// test for buffer overrun
buf = new Buffer([0, 0, 0, 0, 0]); // length: 5
var sub = buf.slice(0, 4); // length: 4
diff --git a/test/simple/test-stdout-close-unref.js b/test/simple/test-stdout-close-unref.js
index 42f399772f..f8cbc7e4b6 100644
--- a/test/simple/test-stdout-close-unref.js
+++ b/test/simple/test-stdout-close-unref.js
@@ -19,6 +19,18 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
+var assert = require('assert');
+var common = require('../common');
+
+var errs = 0;
+
process.stdin.resume();
process.stdin._handle.close();
process.stdin._handle.unref(); // Should not segfault.
+process.stdin.on('error', function(err) {
+ errs++;
+});
+
+process.on('exit', function() {
+ assert.strictEqual(errs, 1);
+});
diff --git a/test/simple/test-stream-readable-data-sync-race.js b/test/simple/test-stream-readable-data-sync-race.js
new file mode 100644
index 0000000000..5bbfcc88ae
--- /dev/null
+++ b/test/simple/test-stream-readable-data-sync-race.js
@@ -0,0 +1,41 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+var Readable = require('stream').Readable;
+
+var r = new Readable();
+var errors = 0;
+
+// Setting `data` listener should not trigger `_read()` calls before we will
+// set the `error` listener below
+r.on('data', function() {
+});
+
+r.on('error', function() {
+ errors++;
+});
+
+process.on('exit', function() {
+ assert.equal(errors, 1);
+});
diff --git a/test/simple/test-stream2-readable-legacy-drain.js b/test/simple/test-stream2-readable-legacy-drain.js
index 675da8e90d..117e253d26 100644
--- a/test/simple/test-stream2-readable-legacy-drain.js
+++ b/test/simple/test-stream2-readable-legacy-drain.js
@@ -49,7 +49,7 @@ w.write = function(c) {
};
function drain() {
- assert(buffered <= 2);
+ assert(buffered <= 3);
buffered = 0;
w.emit('drain');
}
diff --git a/test/simple/test-string-decoder.js b/test/simple/test-string-decoder.js
index 0da66f6760..9f47d131bb 100644
--- a/test/simple/test-string-decoder.js
+++ b/test/simple/test-string-decoder.js
@@ -22,109 +22,14 @@
var common = require('../common');
var assert = require('assert');
var StringDecoder = require('string_decoder').StringDecoder;
-var decoder = new StringDecoder('utf8');
-
-
-
-var buffer = new Buffer('$');
-assert.deepEqual('$', decoder.write(buffer));
-
-buffer = new Buffer('¢');
-assert.deepEqual('', decoder.write(buffer.slice(0, 1)));
-assert.deepEqual('¢', decoder.write(buffer.slice(1, 2)));
-
-buffer = new Buffer('€');
-assert.deepEqual('', decoder.write(buffer.slice(0, 1)));
-assert.deepEqual('', decoder.write(buffer.slice(1, 2)));
-assert.deepEqual('€', decoder.write(buffer.slice(2, 3)));
-
-buffer = new Buffer([0xF0, 0xA4, 0xAD, 0xA2]);
-var s = '';
-s += decoder.write(buffer.slice(0, 1));
-s += decoder.write(buffer.slice(1, 2));
-s += decoder.write(buffer.slice(2, 3));
-s += decoder.write(buffer.slice(3, 4));
-assert.ok(s.length > 0);
-
-// CESU-8
-buffer = new Buffer('EDA0BDEDB18D', 'hex'); // THUMBS UP SIGN (in CESU-8)
-var s = '';
-s += decoder.write(buffer.slice(0, 1));
-s += decoder.write(buffer.slice(1, 2));
-s += decoder.write(buffer.slice(2, 3)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(3, 4));
-s += decoder.write(buffer.slice(4, 5));
-s += decoder.write(buffer.slice(5, 6)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 2));
-s += decoder.write(buffer.slice(2, 4)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(4, 6)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 3)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(3, 6)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 4)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(4, 5));
-s += decoder.write(buffer.slice(5, 6)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 5)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(5, 6)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 6));
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-
-// UCS-2
-decoder = new StringDecoder('ucs2');
-buffer = new Buffer('ab', 'ucs2');
-assert.equal(decoder.write(buffer), 'ab'); // 2 complete chars
-buffer = new Buffer('abc', 'ucs2');
-assert.equal(decoder.write(buffer.slice(0, 3)), 'a'); // 'a' and first of 'b'
-assert.equal(decoder.write(buffer.slice(3, 6)), 'bc'); // second of 'b' and 'c'
-
-
-// UTF-16LE
-buffer = new Buffer('3DD84DDC', 'hex'); // THUMBS UP SIGN (in CESU-8)
-var s = '';
-s += decoder.write(buffer.slice(0, 1));
-s += decoder.write(buffer.slice(1, 2)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(2, 3));
-s += decoder.write(buffer.slice(3, 4)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 2)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(2, 4)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 3)); // complete lead surrogate
-assert.equal(s, '');
-s += decoder.write(buffer.slice(3, 4)); // complete trail surrogate
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
-
-var s = '';
-s += decoder.write(buffer.slice(0, 4));
-assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
+process.stdout.write('scanning ');
+// UTF-8
+test('utf-8', new Buffer('$', 'utf-8'), '$');
+test('utf-8', new Buffer('¢', 'utf-8'), '¢');
+test('utf-8', new Buffer('€', 'utf-8'), '€');
+test('utf-8', new Buffer('𤭢', 'utf-8'), '𤭢');
// A mixed ascii and non-ascii string
// Test stolen from deps/v8/test/cctest/test-strings.cc
// U+02E4 -> CB A4
@@ -132,32 +37,86 @@ assert.equal(s, '\uD83D\uDC4D'); // THUMBS UP SIGN (in UTF-16)
// U+12E4 -> E1 8B A4
// U+0030 -> 30
// U+3045 -> E3 81 85
-var expected = '\u02e4\u0064\u12e4\u0030\u3045';
-var buffer = new Buffer([0xCB, 0xA4, 0x64, 0xE1, 0x8B, 0xA4,
- 0x30, 0xE3, 0x81, 0x85]);
-var charLengths = [0, 0, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5];
+test(
+ 'utf-8',
+ new Buffer([0xCB, 0xA4, 0x64, 0xE1, 0x8B, 0xA4, 0x30, 0xE3, 0x81, 0x85]),
+ '\u02e4\u0064\u12e4\u0030\u3045'
+);
+
+// CESU-8
+test('utf-8', new Buffer('EDA0BDEDB18D', 'hex'), '\ud83d\udc4d'); // thumbs up
+
+// UCS-2
+test('ucs2', new Buffer('ababc', 'ucs2'), 'ababc');
+
+// UTF-16LE
+test('ucs2', new Buffer('3DD84DDC', 'hex'), '\ud83d\udc4d'); // thumbs up
-// Split the buffer into 3 segments
-// |----|------|-------|
-// 0 i j buffer.length
-// Scan through every possible 3 segment combination
-// and make sure that the string is always parsed.
-common.print('scanning ');
-for (var j = 2; j < buffer.length; j++) {
- for (var i = 1; i < j; i++) {
- var decoder = new StringDecoder('utf8');
+console.log(' crayon!');
- var sum = decoder.write(buffer.slice(0, i));
+// test verifies that StringDecoder will correctly decode the given input
+// buffer with the given encoding to the expected output. It will attempt all
+// possible ways to write() the input buffer, see writeSequences(). The
+// singleSequence allows for easy debugging of a specific sequence which is
+// useful in case of test failures.
+function test(encoding, input, expected, singleSequence) {
+ var sequences;
+ if (!singleSequence) {
+ sequences = writeSequences(input.length);
+ } else {
+ sequences = [singleSequence];
+ }
+ sequences.forEach(function(sequence) {
+ var decoder = new StringDecoder(encoding);
+ var output = '';
+ sequence.forEach(function(write) {
+ output += decoder.write(input.slice(write[0], write[1]));
+ });
+ process.stdout.write('.');
+ if (output !== expected) {
+ var message =
+ 'Expected "'+unicodeEscape(expected)+'", '+
+ 'but got "'+unicodeEscape(output)+'"\n'+
+ 'Write sequence: '+JSON.stringify(sequence)+'\n'+
+ 'Decoder charBuffer: 0x'+decoder.charBuffer.toString('hex')+'\n'+
+ 'Full Decoder State: '+JSON.stringify(decoder, null, 2);
+ assert.fail(output, expected, message);
+ }
+ });
+}
- // just check that we've received the right amount
- // after the first write
- assert.equal(charLengths[i], sum.length);
+// unicodeEscape prints the str contents as unicode escape codes.
+function unicodeEscape(str) {
+ var r = '';
+ for (var i = 0; i < str.length; i++) {
+ r += '\\u'+str.charCodeAt(i).toString(16);
+ }
+ return r;
+}
- sum += decoder.write(buffer.slice(i, j));
- sum += decoder.write(buffer.slice(j, buffer.length));
- assert.equal(expected, sum);
- common.print('.');
+// writeSequences returns an array of arrays that describes all possible ways a
+// buffer of the given length could be split up and passed to sequential write
+// calls.
+//
+// e.G. writeSequences(3) will return: [
+// [ [ 0, 3 ] ],
+// [ [ 0, 2 ], [ 2, 3 ] ],
+// [ [ 0, 1 ], [ 1, 3 ] ],
+// [ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ] ]
+// ]
+function writeSequences(length, start, sequence) {
+ if (start === undefined) {
+ start = 0;
+ sequence = []
+ } else if (start === length) {
+ return [sequence];
}
+ var sequences = [];
+ for (var end = length; end > start; end--) {
+ var subSequence = sequence.concat([[start, end]]);
+ var subSequences = writeSequences(length, end, subSequence, sequences);
+ sequences = sequences.concat(subSequences);
+ }
+ return sequences;
}
-console.log(' crayon!');