deps: upgrade npm to 2.5.1
authorForrest L Norvell <forrest@npmjs.com>
Fri, 6 Feb 2015 09:14:25 +0000 (01:14 -0800)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 6 Feb 2015 17:38:36 +0000 (18:38 +0100)
PR-URL: https://github.com/iojs/io.js/pull/738
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
463 files changed:
deps/npm/.mailmap [new file with mode: 0644]
deps/npm/AUTHORS
deps/npm/CHANGELOG.md
deps/npm/Makefile
deps/npm/doc/cli/npm-shrinkwrap.md
deps/npm/doc/files/package.json.md
deps/npm/doc/misc/npm-config.md
deps/npm/html/doc/README.html
deps/npm/html/doc/api/npm-bin.html
deps/npm/html/doc/api/npm-bugs.html
deps/npm/html/doc/api/npm-cache.html
deps/npm/html/doc/api/npm-commands.html
deps/npm/html/doc/api/npm-config.html
deps/npm/html/doc/api/npm-deprecate.html
deps/npm/html/doc/api/npm-docs.html
deps/npm/html/doc/api/npm-edit.html
deps/npm/html/doc/api/npm-explore.html
deps/npm/html/doc/api/npm-help-search.html
deps/npm/html/doc/api/npm-init.html
deps/npm/html/doc/api/npm-install.html
deps/npm/html/doc/api/npm-link.html
deps/npm/html/doc/api/npm-load.html
deps/npm/html/doc/api/npm-ls.html
deps/npm/html/doc/api/npm-outdated.html
deps/npm/html/doc/api/npm-owner.html
deps/npm/html/doc/api/npm-pack.html
deps/npm/html/doc/api/npm-prefix.html
deps/npm/html/doc/api/npm-prune.html
deps/npm/html/doc/api/npm-publish.html
deps/npm/html/doc/api/npm-rebuild.html
deps/npm/html/doc/api/npm-repo.html
deps/npm/html/doc/api/npm-restart.html
deps/npm/html/doc/api/npm-root.html
deps/npm/html/doc/api/npm-run-script.html
deps/npm/html/doc/api/npm-search.html
deps/npm/html/doc/api/npm-shrinkwrap.html
deps/npm/html/doc/api/npm-start.html
deps/npm/html/doc/api/npm-stop.html
deps/npm/html/doc/api/npm-tag.html
deps/npm/html/doc/api/npm-test.html
deps/npm/html/doc/api/npm-uninstall.html
deps/npm/html/doc/api/npm-unpublish.html
deps/npm/html/doc/api/npm-update.html
deps/npm/html/doc/api/npm-version.html
deps/npm/html/doc/api/npm-view.html
deps/npm/html/doc/api/npm-whoami.html
deps/npm/html/doc/api/npm.html
deps/npm/html/doc/cli/npm-access.html
deps/npm/html/doc/cli/npm-adduser.html
deps/npm/html/doc/cli/npm-bin.html
deps/npm/html/doc/cli/npm-bugs.html
deps/npm/html/doc/cli/npm-build.html
deps/npm/html/doc/cli/npm-bundle.html
deps/npm/html/doc/cli/npm-cache.html
deps/npm/html/doc/cli/npm-completion.html
deps/npm/html/doc/cli/npm-config.html
deps/npm/html/doc/cli/npm-dedupe.html
deps/npm/html/doc/cli/npm-deprecate.html
deps/npm/html/doc/cli/npm-dist-tag.html
deps/npm/html/doc/cli/npm-docs.html
deps/npm/html/doc/cli/npm-edit.html
deps/npm/html/doc/cli/npm-explore.html
deps/npm/html/doc/cli/npm-help-search.html
deps/npm/html/doc/cli/npm-help.html
deps/npm/html/doc/cli/npm-init.html
deps/npm/html/doc/cli/npm-install.html
deps/npm/html/doc/cli/npm-link.html
deps/npm/html/doc/cli/npm-ls.html
deps/npm/html/doc/cli/npm-outdated.html
deps/npm/html/doc/cli/npm-owner.html
deps/npm/html/doc/cli/npm-pack.html
deps/npm/html/doc/cli/npm-prefix.html
deps/npm/html/doc/cli/npm-prune.html
deps/npm/html/doc/cli/npm-publish.html
deps/npm/html/doc/cli/npm-rebuild.html
deps/npm/html/doc/cli/npm-repo.html
deps/npm/html/doc/cli/npm-restart.html
deps/npm/html/doc/cli/npm-rm.html
deps/npm/html/doc/cli/npm-root.html
deps/npm/html/doc/cli/npm-run-script.html
deps/npm/html/doc/cli/npm-search.html
deps/npm/html/doc/cli/npm-shrinkwrap.html
deps/npm/html/doc/cli/npm-star.html
deps/npm/html/doc/cli/npm-stars.html
deps/npm/html/doc/cli/npm-start.html
deps/npm/html/doc/cli/npm-stop.html
deps/npm/html/doc/cli/npm-tag.html
deps/npm/html/doc/cli/npm-test.html
deps/npm/html/doc/cli/npm-uninstall.html
deps/npm/html/doc/cli/npm-unpublish.html
deps/npm/html/doc/cli/npm-update.html
deps/npm/html/doc/cli/npm-version.html
deps/npm/html/doc/cli/npm-view.html
deps/npm/html/doc/cli/npm-whoami.html
deps/npm/html/doc/cli/npm.html
deps/npm/html/doc/files/npm-folders.html
deps/npm/html/doc/files/npm-global.html
deps/npm/html/doc/files/npm-json.html
deps/npm/html/doc/files/npmrc.html
deps/npm/html/doc/files/package.json.html
deps/npm/html/doc/index.html
deps/npm/html/doc/misc/npm-coding-style.html
deps/npm/html/doc/misc/npm-config.html
deps/npm/html/doc/misc/npm-developers.html
deps/npm/html/doc/misc/npm-disputes.html
deps/npm/html/doc/misc/npm-faq.html
deps/npm/html/doc/misc/npm-index.html
deps/npm/html/doc/misc/npm-registry.html
deps/npm/html/doc/misc/npm-scope.html
deps/npm/html/doc/misc/npm-scripts.html
deps/npm/html/doc/misc/removing-npm.html
deps/npm/html/doc/misc/semver.html
deps/npm/html/partial/doc/README.html
deps/npm/html/partial/doc/api/npm.html
deps/npm/html/partial/doc/cli/npm-ls.html
deps/npm/html/partial/doc/cli/npm-shrinkwrap.html
deps/npm/html/partial/doc/cli/npm.html
deps/npm/html/partial/doc/files/npm-json.html
deps/npm/html/partial/doc/files/package.json.html
deps/npm/html/partial/doc/misc/npm-config.html
deps/npm/html/partial/doc/misc/npm-disputes.html
deps/npm/html/partial/doc/misc/npm-faq.html
deps/npm/lib/config/defaults.js
deps/npm/lib/outdated.js
deps/npm/lib/publish.js
deps/npm/man/man1/npm-README.1
deps/npm/man/man1/npm-access.1
deps/npm/man/man1/npm-adduser.1
deps/npm/man/man1/npm-bin.1
deps/npm/man/man1/npm-bugs.1
deps/npm/man/man1/npm-build.1
deps/npm/man/man1/npm-bundle.1
deps/npm/man/man1/npm-cache.1
deps/npm/man/man1/npm-completion.1
deps/npm/man/man1/npm-config.1
deps/npm/man/man1/npm-dedupe.1
deps/npm/man/man1/npm-deprecate.1
deps/npm/man/man1/npm-dist-tag.1
deps/npm/man/man1/npm-docs.1
deps/npm/man/man1/npm-edit.1
deps/npm/man/man1/npm-explore.1
deps/npm/man/man1/npm-help-search.1
deps/npm/man/man1/npm-help.1
deps/npm/man/man1/npm-init.1
deps/npm/man/man1/npm-install.1
deps/npm/man/man1/npm-link.1
deps/npm/man/man1/npm-ls.1
deps/npm/man/man1/npm-outdated.1
deps/npm/man/man1/npm-owner.1
deps/npm/man/man1/npm-pack.1
deps/npm/man/man1/npm-prefix.1
deps/npm/man/man1/npm-prune.1
deps/npm/man/man1/npm-publish.1
deps/npm/man/man1/npm-rebuild.1
deps/npm/man/man1/npm-repo.1
deps/npm/man/man1/npm-restart.1
deps/npm/man/man1/npm-rm.1
deps/npm/man/man1/npm-root.1
deps/npm/man/man1/npm-run-script.1
deps/npm/man/man1/npm-search.1
deps/npm/man/man1/npm-shrinkwrap.1
deps/npm/man/man1/npm-star.1
deps/npm/man/man1/npm-stars.1
deps/npm/man/man1/npm-start.1
deps/npm/man/man1/npm-stop.1
deps/npm/man/man1/npm-tag.1
deps/npm/man/man1/npm-test.1
deps/npm/man/man1/npm-uninstall.1
deps/npm/man/man1/npm-unpublish.1
deps/npm/man/man1/npm-update.1
deps/npm/man/man1/npm-version.1
deps/npm/man/man1/npm-view.1
deps/npm/man/man1/npm-whoami.1
deps/npm/man/man1/npm.1
deps/npm/man/man3/npm-bin.3
deps/npm/man/man3/npm-bugs.3
deps/npm/man/man3/npm-cache.3
deps/npm/man/man3/npm-commands.3
deps/npm/man/man3/npm-config.3
deps/npm/man/man3/npm-deprecate.3
deps/npm/man/man3/npm-docs.3
deps/npm/man/man3/npm-edit.3
deps/npm/man/man3/npm-explore.3
deps/npm/man/man3/npm-help-search.3
deps/npm/man/man3/npm-init.3
deps/npm/man/man3/npm-install.3
deps/npm/man/man3/npm-link.3
deps/npm/man/man3/npm-load.3
deps/npm/man/man3/npm-ls.3
deps/npm/man/man3/npm-outdated.3
deps/npm/man/man3/npm-owner.3
deps/npm/man/man3/npm-pack.3
deps/npm/man/man3/npm-prefix.3
deps/npm/man/man3/npm-prune.3
deps/npm/man/man3/npm-publish.3
deps/npm/man/man3/npm-rebuild.3
deps/npm/man/man3/npm-repo.3
deps/npm/man/man3/npm-restart.3
deps/npm/man/man3/npm-root.3
deps/npm/man/man3/npm-run-script.3
deps/npm/man/man3/npm-search.3
deps/npm/man/man3/npm-shrinkwrap.3
deps/npm/man/man3/npm-start.3
deps/npm/man/man3/npm-stop.3
deps/npm/man/man3/npm-tag.3
deps/npm/man/man3/npm-test.3
deps/npm/man/man3/npm-uninstall.3
deps/npm/man/man3/npm-unpublish.3
deps/npm/man/man3/npm-update.3
deps/npm/man/man3/npm-version.3
deps/npm/man/man3/npm-view.3
deps/npm/man/man3/npm-whoami.3
deps/npm/man/man3/npm.3
deps/npm/man/man5/npm-folders.5
deps/npm/man/man5/npm-global.5
deps/npm/man/man5/npm-json.5
deps/npm/man/man5/npmrc.5
deps/npm/man/man5/package.json.5
deps/npm/man/man7/npm-coding-style.7
deps/npm/man/man7/npm-config.7
deps/npm/man/man7/npm-developers.7
deps/npm/man/man7/npm-disputes.7
deps/npm/man/man7/npm-faq.7
deps/npm/man/man7/npm-index.7
deps/npm/man/man7/npm-registry.7
deps/npm/man/man7/npm-scope.7
deps/npm/man/man7/npm-scripts.7
deps/npm/man/man7/removing-npm.7
deps/npm/man/man7/semver.7
deps/npm/node_modules/columnify/Makefile [new file with mode: 0644]
deps/npm/node_modules/columnify/Readme.md
deps/npm/node_modules/columnify/columnify.js [new file with mode: 0644]
deps/npm/node_modules/columnify/index.js
deps/npm/node_modules/columnify/node_modules/strip-ansi/cli.js
deps/npm/node_modules/columnify/node_modules/strip-ansi/package.json
deps/npm/node_modules/columnify/node_modules/strip-ansi/readme.md
deps/npm/node_modules/columnify/node_modules/wcwidth/package.json
deps/npm/node_modules/columnify/package.json
deps/npm/node_modules/fstream/lib/writer.js
deps/npm/node_modules/fstream/package.json
deps/npm/node_modules/node-gyp/addon.gypi
deps/npm/node_modules/node-gyp/lib/build.js
deps/npm/node_modules/node-gyp/lib/install.js
deps/npm/node_modules/npm-registry-client/lib/fetch.js
deps/npm/node_modules/npm-registry-client/lib/initialize.js
deps/npm/node_modules/npm-registry-client/lib/publish.js
deps/npm/node_modules/npm-registry-client/lib/request.js
deps/npm/node_modules/npm-registry-client/node_modules/npm-package-arg/node_modules/hosted-git-info/package.json
deps/npm/node_modules/npm-registry-client/node_modules/npm-package-arg/package.json
deps/npm/node_modules/npm-registry-client/package.json
deps/npm/node_modules/npm-registry-client/test/initialize.js [new file with mode: 0644]
deps/npm/node_modules/npm-registry-client/test/publish.js
deps/npm/node_modules/request/.npmignore
deps/npm/node_modules/request/.travis.yml
deps/npm/node_modules/request/CHANGELOG.md
deps/npm/node_modules/request/README.md
deps/npm/node_modules/request/index.js
deps/npm/node_modules/request/lib/auth.js [new file with mode: 0644]
deps/npm/node_modules/request/lib/debug.js [deleted file]
deps/npm/node_modules/request/lib/getProxyFromURI.js [new file with mode: 0644]
deps/npm/node_modules/request/lib/oauth.js [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/bl/README.md
deps/npm/node_modules/request/node_modules/bl/bl.js
deps/npm/node_modules/request/node_modules/bl/package.json
deps/npm/node_modules/request/node_modules/caseless/index.js
deps/npm/node_modules/request/node_modules/caseless/package.json
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/HISTORY.md [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/LICENSE [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/README.md [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/index.js [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/LICENSE [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/README.md [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/db.json [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/index.js [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/package.json [deleted file]
deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/package.json [deleted file]
deps/npm/node_modules/request/node_modules/hawk/.npmignore
deps/npm/node_modules/request/node_modules/hawk/.travis.yml
deps/npm/node_modules/request/node_modules/hawk/LICENSE
deps/npm/node_modules/request/node_modules/hawk/Makefile
deps/npm/node_modules/request/node_modules/hawk/README.md
deps/npm/node_modules/request/node_modules/hawk/bower.json [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/hawk/component.json [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/hawk/lib/browser.js
deps/npm/node_modules/request/node_modules/hawk/lib/client.js
deps/npm/node_modules/request/node_modules/hawk/lib/crypto.js
deps/npm/node_modules/request/node_modules/hawk/lib/server.js
deps/npm/node_modules/request/node_modules/hawk/lib/utils.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/Makefile
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/README.md
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/package.json
deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/package.json [changed mode: 0755->0644]
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js [changed mode: 0644->0755]
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE
deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile
deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
deps/npm/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js
deps/npm/node_modules/request/node_modules/hawk/package.json
deps/npm/node_modules/request/node_modules/hawk/test/browser.js
deps/npm/node_modules/request/node_modules/hawk/test/client.js
deps/npm/node_modules/request/node_modules/hawk/test/crypto.js
deps/npm/node_modules/request/node_modules/hawk/test/index.js
deps/npm/node_modules/request/node_modules/hawk/test/message.js
deps/npm/node_modules/request/node_modules/hawk/test/readme.js
deps/npm/node_modules/request/node_modules/hawk/test/server.js
deps/npm/node_modules/request/node_modules/hawk/test/uri.js
deps/npm/node_modules/request/node_modules/hawk/test/utils.js
deps/npm/node_modules/request/node_modules/http-signature/README.md
deps/npm/node_modules/request/node_modules/http-signature/http_signing.md
deps/npm/node_modules/request/node_modules/http-signature/lib/index.js
deps/npm/node_modules/request/node_modules/http-signature/lib/signer.js
deps/npm/node_modules/request/node_modules/http-signature/lib/util.js
deps/npm/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
deps/npm/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
deps/npm/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/.npmignore [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js [deleted file]
deps/npm/node_modules/request/node_modules/http-signature/package.json
deps/npm/node_modules/request/node_modules/isstream/.jshintrc [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/.npmignore [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/.travis.yml [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/LICENSE [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/README.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/isstream.js [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/package.json [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/isstream/test.js [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/.npmignore [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/.travis.yml [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/Makefile [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/README.md
deps/npm/node_modules/request/node_modules/mime-types/SOURCES.md [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/component.json [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/index.js [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/lib/custom.json [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/lib/index.js [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/lib/mime.json [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/lib/node.json [deleted file]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json [new file with mode: 0644]
deps/npm/node_modules/request/node_modules/mime-types/package.json
deps/npm/node_modules/request/node_modules/oauth-sign/index.js
deps/npm/node_modules/request/node_modules/oauth-sign/package.json
deps/npm/node_modules/request/node_modules/oauth-sign/test.js
deps/npm/node_modules/request/package.json
deps/npm/node_modules/request/request.js
deps/npm/package.json
deps/npm/scripts/update-authors.sh [new file with mode: 0755]
deps/npm/test/common-tap.js
deps/npm/test/disabled/outdated-depth-integer.js
deps/npm/test/run.js
deps/npm/test/tap/404-parent.js
deps/npm/test/tap/access.js
deps/npm/test/tap/adduser-always-auth.js
deps/npm/test/tap/adduser-legacy-auth.js
deps/npm/test/tap/bugs.js
deps/npm/test/tap/cache-shasum-fork.js
deps/npm/test/tap/cache-shasum.js
deps/npm/test/tap/circular-dep.js
deps/npm/test/tap/dedupe.js
deps/npm/test/tap/dist-tag.js
deps/npm/test/tap/false_name.js
deps/npm/test/tap/get.js
deps/npm/test/tap/ignore-shrinkwrap.js
deps/npm/test/tap/install-cli-unicode.js
deps/npm/test/tap/install-save-exact.js
deps/npm/test/tap/install-save-prefix.js
deps/npm/test/tap/install-with-dev-dep-duplicate.js
deps/npm/test/tap/ls-depth-cli.js
deps/npm/test/tap/ls-depth-unmet.js
deps/npm/test/tap/ls-l-depth-0.js
deps/npm/test/tap/noargs-install-config-save.js
deps/npm/test/tap/outdated-color.js
deps/npm/test/tap/outdated-depth.js
deps/npm/test/tap/outdated-include-devdependencies.js
deps/npm/test/tap/outdated-json.js
deps/npm/test/tap/outdated-long.js [new file with mode: 0644]
deps/npm/test/tap/outdated-new-versions.js
deps/npm/test/tap/outdated-notarget.js
deps/npm/test/tap/outdated-private.js
deps/npm/test/tap/outdated.js
deps/npm/test/tap/owner.js
deps/npm/test/tap/peer-deps-invalid.js
deps/npm/test/tap/peer-deps-toplevel.js
deps/npm/test/tap/peer-deps-without-package-json.js
deps/npm/test/tap/peer-deps.js
deps/npm/test/tap/prune.js
deps/npm/test/tap/publish-access-scoped.js
deps/npm/test/tap/publish-access-unscoped-restricted-fails.js [new file with mode: 0644]
deps/npm/test/tap/publish-access-unscoped.js
deps/npm/test/tap/repo.js
deps/npm/test/tap/search.js
deps/npm/test/tap/shrinkwrap-dev-dependency.js
deps/npm/test/tap/shrinkwrap-empty-deps.js
deps/npm/test/tap/shrinkwrap-scoped-auth.js
deps/npm/test/tap/shrinkwrap-shared-dev-dependency.js
deps/npm/test/tap/sorted-package-json.js
deps/npm/test/tap/uninstall-package.js
deps/npm/test/tap/update-index.js
deps/npm/test/tap/update-save.js
deps/npm/test/tap/url-dependencies.js
deps/npm/test/tap/view.js

diff --git a/deps/npm/.mailmap b/deps/npm/.mailmap
new file mode 100644 (file)
index 0000000..c90d447
--- /dev/null
@@ -0,0 +1,31 @@
+Arlo Breault <arlolra@gmail.com>
+Alex K. Wolfe <alexkwolfe@gmail.com>
+Andrew Lunny <alunny@gmail.com>
+Benjamin Coe <bencoe@gmail.com>
+Brian White <mscdex@mscdex.net> <mscdex@gmail.com>
+Charlie Robbins <charlie.robbins@gmail.com>
+Dalmais Maxence <root@ip-10-195-202-5.ec2.internal>
+David Beitey <david@davidjb.com>
+Domenic Denicola <domenic@domenicdenicola.com>
+Einar Otto Stangvik <einaros@gmail.com>
+Evan Lucas <evan@btc.com> <evanlucas@me.com> <evan.lucas@hattiesburgclinic.com>
+Faiq Raza <faiqrazarizvi@gmail.com>
+Forbes Lindesay <forbes@lindesay.co.uk>
+Forrest L. Norvell <forrest@npmjs.com> <ogd@aoaioxxysz.net>
+Gabriel Barros <descartavel1@gmail.com>
+Geoff Flarity <geoff.flarity@gmail.com> <gflarity@raptvm-x02.(none)>
+Isaac Z. Schlueter <i@izs.me> <i@foohack.com>
+Jake Verbaten <raynos2@gmail.com>
+James Sanders <jimmyjazz14@gmail.com>
+Jason Smith <jhs@iriscouch.com>
+Kris Windham <kriswindham@gmail.com>
+Lin Clark <lin.w.clark@gmail.com>
+Maciej Małecki <me@mmalecki.com> <maciej.malecki@notimplemented.org>
+Maximilian Antoni <mail@maxantoni.de> <maximilian.antoni@juliusbaer.com>
+Maxim Bogushevich <boga1@mail.ru>
+Max Goodman <c@chromakode.com>
+Nicolas Morel <marsup@gmail.com>
+Olivier Melcher <olivier.melcher@gmail.com>
+Visnu Pitiyanuvath <visnupx@gmail.com>
+Will Elwood <w.elwood08@gmail.com>
+Zeke Sikelianos <zeke@sikelianos.com>
\ No newline at end of file
index 3c0c0b0ba89ef918883ecc327780425bdc02038b..7155393ab4116ea1b9f54ec341fc4fb83e5deb76 100644 (file)
 # Authors sorted by whether or not they're me
-Isaac Z. Schlueter <i@izs.me>
-Steve Steiner <ssteinerX@gmail.com>
-Mikeal Rogers <mikeal.rogers@gmail.com>
-Aaron Blohowiak <aaron.blohowiak@gmail.com>
-Martyn Smith <martyn@dollyfish.net.nz>
-Mathias Pettersson <mape@mape.me>
-Brian Hammond <brian@fictorial.com>
-Charlie Robbins <charlie.robbins@gmail.com>
-Francisco Treacy <francisco.treacy@gmail.com>
-Cliffano Subagio <cliffano@gmail.com>
-Christian Eager <christian.eager@nokia.com>
-Dav Glass <davglass@gmail.com>
-Alex K. Wolfe <alexkwolfe@gmail.com>
-James Sanders <jimmyjazz14@gmail.com>
-Reid Burke <me@reidburke.com>
-Arlo Breault <arlolra@gmail.com>
-Timo Derstappen <teemow@gmail.com>
-Bradley Meck <bradley.meck@gmail.com>
-Bart Teeuwisse <bart.teeuwisse@thecodemill.biz>
-Ben Noordhuis <info@bnoordhuis.nl>
-Tor Valamo <tor.valamo@gmail.com>
-Whyme.Lyu <5longluna@gmail.com>
-Olivier Melcher <olivier.melcher@gmail.com>
-Tomaž Muraus <kami@k5-storitve.net>
 Evan Meagher <evan.meagher@gmail.com>
 Orlando Vazquez <ovazquez@gmail.com>
+Kai Chen <kaichenxyz@gmail.com>
 George Miroshnykov <gmiroshnykov@lohika.com>
 Geoff Flarity <geoff.flarity@gmail.com>
+Max Goodman <c@chromakode.com>
 Pete Kruckenberg <pete@kruckenberg.com>
 Laurie Harper <laurie@holoweb.net>
+Neil Gentleman <ngentleman@gmail.com>
+Kris Kowal <kris.kowal@cixar.com>
+Alex Gorbatchev <alex.gorbatchev@gmail.com>
+Shawn Wildermuth <shawn@wildermuth.com>
+Wesley de Souza <wesleywex@gmail.com>
+Patrick Pfeiffer <patrick@buzzle.at>
+yoyoyogi <yogesh.k@gmail.com>
+Paul Miller <paul@paulmillr.com>
+Jérémy Lal <kapouer@melix.org>
+J. Tangelder <j.tangelder@gmail.com>
+seebees <seebees@gmail.com>
+Anders Janmyr <anders@janmyr.com>
+Jean Lauliac <jean@lauliac.com>
+Carl Lange <carl@flax.ie>
+Chris Meyers <chris.meyers.fsu@gmail.com>
+Andrey Kislyuk <kislyuk@gmail.com>
+Jan Lehnardt <jan@apache.org>
+Ludwig Magnusson <ludwig@mediatool.com>
+Thorsten Lorenz <thlorenz@gmx.de>
+Stuart P. Bentley <stuart@testtrack4.com>
+wmertens <Wout.Mertens@gmail.com>
+Johan Sköld <johan@skold.cc>
+Nick Santos <nick@medium.com>
+Stuart Knightley <stuart@stuartk.com>
+Terin Stock <terinjokes@gmail.com>
+Niggler <nirk.niggler@gmail.com>
+Faiq Raza <faiqrazarizvi@gmail.com>
+Paolo Fragomeni <paolo@async.ly>
+Thomas Torp <thomas@erupt.no>
+Jaakko Manninen <jaakko@rocketpack.fi>
+Sam Mikes <smikes@cubane.com>
+Luke Arduini <luke.arduini@gmail.com>
+Larz Conwell <larz@larz-laptop.(none)>
+Marcel Klehr <mklehr@gmx.net>
+Robert Kowalski <rok@kowalski.gd>
 Chris Wong <chris@chriswongstudio.com>
-Max Goodman <c@chromacode.com>
+Forbes Lindesay <forbes@lindesay.co.uk>
 Scott Bronson <brons_github@rinspin.com>
+Vaz Allen <vaz@tryptid.com>
 Federico Romero <federomero@gmail.com>
+Jake Verbaten <raynos2@gmail.com>
 Visnu Pitiyanuvath <visnupx@gmail.com>
+Schabse Laks <Dev@SLaks.net>
 Irakli Gozalishvili <rfobic@gmail.com>
+Florian Margaine <florian@margaine.com>
 Mark Cahill <mark@tiemonster.info>
 Zearin <zearin@gonk.net>
 Iain Sproat <iainsproat@gmail.com>
 Trent Mick <trentm@gmail.com>
 Felix Geisendörfer <felix@debuggable.com>
-Conny Brunnkvist <cbrunnkvist@gmail.com>
+Julian Gruber <julian@juliangruber.com>
+Benjamin Coe <bencoe@gmail.com>
+Alex Ford <Alex.Ford@CodeTunnel.com>
+Matt Hickford <matt.hickford@gmail.com>
+Sean McGivern <sean.mcgivern@rightscale.com>
+C J Silverio <ceejceej@gmail.com>
+Mat Tyndall <mat.tyndall@gmail.com>
+Robin Tweedie <robin@songkick.com>
+Tauren Mills <tauren@sportzing.com>
+Miroslav Bajtoš <miroslav@strongloop.com>
+Isaac Z. Schlueter <i@izs.me>
+Ron Martinez <ramartin.net@gmail.com>
+David Glasser <glasser@davidglasser.net>
+Steve Steiner <ssteinerX@gmail.com>
+Kazuhito Hokamura <k.hokamura@gmail.com>
+Gianluca Casati <casati_gianluca@yahoo.it>
+Mikeal Rogers <mikeal.rogers@gmail.com>
+Tristan Davies <github@tristan.io>
+Aaron Blohowiak <aaron.blohowiak@gmail.com>
+David Volm <david@volminator.com>
+Martyn Smith <martyn@dollyfish.net.nz>
+Lin Clark <lin.w.clark@gmail.com>
+Charlie Robbins <charlie.robbins@gmail.com>
+Ben Page <bpage@dewalch.com>
+Francisco Treacy <francisco.treacy@gmail.com>
+Jeff Jo <jeffjo@squareup.com>
+Johan Nordberg <its@johan-nordberg.com>
+Cliffano Subagio <cliffano@gmail.com>
+martinvd <martinvdpub@gmail.com>
+Ian Babrou <ibobrik@gmail.com>
+Christian Eager <christian.eager@nokia.com>
+Di Wu <dwu@palantir.com>
+Mathias Bynens <mathias@qiwi.be>
+Matt McClure <matt.mcclure@mapmyfitness.com>
+Jameson Little <t.jameson.little@gmail.com>
+Matt Lunn <matt@mattlunn.me.uk>
+Conny Brunnkvist <conny@fuchsia.se>
+Alexey Kreschuk <akrsch@gmail.com>
 Will Elwood <w.elwood08@gmail.com>
+elisee <elisee@sparklin.org>
+Dean Landolt <dean@deanlandolt.com>
+Robert Gieseke <robert.gieseke@gmail.com>
 Oleg Efimov <efimovov@gmail.com>
+François Frisch <francoisfrisch@gmail.com>
 Martin Cooper <mfncooper@gmail.com>
-Jameson Little <t.jameson.little@gmail.com>
+Jann Horn <jannhorn@googlemail.com>
 cspotcode <cspotcode@gmail.com>
-Maciej Małecki <maciej.malecki@notimplemented.org>
+Maciej Małecki <me@mmalecki.com>
 Stephen Sugden <glurgle@gmail.com>
+Forrest L Norvell <forrest@npmjs.com>
+Karsten Tinnefeld <k.tinnefeld@googlemail.com>
+Bryan Burgers <bryan@burgers.io>
+David Beitey <david@davidjb.com>
+Evan You <yyou@google.com>
+Zach Pomerantz <zmp@umich.edu>
+Mark J. Titorenko <nospam-github.com@titorenko.net>
+Chris Williams <cwilliams88@gmail.com>
+Oddur Sigurdsson <oddurs@gmail.com>
+sudodoki <smd.deluzion@gmail.com>
+Eric Mill <eric@konklone.com>
+Mick Thompson <dthompson@gmail.com>
+Gabriel Barros <descartavel1@gmail.com>
+Felix Rabe <felix@rabe.io>
+KevinSheedy <kevinsheedy@gmail.com>
+Aleksey Smolenchuk <aleksey@uber.com>
+Ed Morley <emorley@mozilla.com>
+Blaine Bublitz <blaine@iceddev.com>
+Andrey Fedorov <anfedorov@gmail.com>
+Trevor Burnham <tburnham@hubspot.com>
+Daijiro Wachi <daijiro.wachi@gmail.com>
+Alan Shaw <alan@freestyle-developments.co.uk>
+TJ Holowaychuk <tj@vision-media.ca>
+Luke Arduini <luke.arduini@me.com>
+Nicholas Kinsey <pyro@feisty.io>
+Michael Budde <mbudde@gmail.com>
+Paulo Cesar <pauloc062@gmail.com>
+Jason Smith <jhs@iriscouch.com>
+Elan Shanker <elan.shanker@gmail.com>
 Gautham Pai <buzypi@gmail.com>
+Jon Spencer <jon@jonspencer.ca>
 David Trejo <david.daniel.trejo@gmail.com>
+Jason Diamond <jason@diamond.name>
 Paul Vorbach <paul@vorb.de>
+Maximilian Antoni <mail@maxantoni.de>
 George Ornbo <george@shapeshed.com>
 Tim Oxley <secoif@gmail.com>
 Tyler Green <tyler.green2@gmail.com>
+Dave Pacheco <dap@joyent.com>
 atomizer <danila.gerasimov@gmail.com>
+Michael Hayes <michael@hayes.io>
+Chris Dickinson <christopher.s.dickinson@gmail.com>
+Bradley Meck <bradley.meck@gmail.com>
+GeJ <geraud@gcu.info>
+Andrew Terris <atterris@gmail.com>
+Michael Nisi <michael.nisi@gmail.com>
+Luc Thevenard <lucthevenard@gmail.com>
+fengmk2 <fengmk2@gmail.com>
+Aria Stewart <aredridel@nbtsc.org>
+Adam Meadows <adam.meadows@gmail.com>
+Charlie Rudolph <charles.w.rudolph@gmail.com>
+Chulki Lee <chulki.lee@gmail.com>
+不四 <busi.hyy@taobao.com>
+Thom Blake <tblake@brightroll.com>
+Jess Martin <jessmartin@gmail.com>
+Spain Train <michael.spainhower@opower.com>
+Alex Rodionov <p0deje@gmail.com>
+Matt Colyer <matt@colyer.name>
 Rod Vagg <rod@vagg.org>
+Evan You <yyx990803@gmail.com>
 Christian Howe <coderarity@gmail.com>
+bitspill <bitspill+github@bitspill.net>
 Andrew Lunny <alunny@gmail.com>
+Gabriel Falkenberg <gabriel.falkenberg@gmail.com>
 Henrik Hodne <dvyjones@binaryhex.com>
+Alexej Yaroshevich <alex@qfox.ru>
 Adam Blackburn <regality@gmail.com>
+Quim Calpe <quim@kalpe.com>
 Kris Windham <kriswindham@gmail.com>
 Jens Grunert <jens.grunert@gmail.com>
 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-Dalmais Maxence <github@maxired.fr>
+Dalmais Maxence <root@ip-10-195-202-5.ec2.internal>
 Marcus Ekwall <marcus.ekwall@gmail.com>
+Steve Mason <stevem@brandwatch.com>
+Wil Moore III <wil.moore@wilmoore.com>
+Sergey Belov <peimei@ya.ru>
+Tom Huang <hzlhu.dargon@gmail.com>
+CamilleM <camille.moulin@alterway.fr>
 Aaron Stacy <aaron.r.stacy@gmail.com>
+Sébastien Santoro <dereckson@espace-win.org>
 Phillip Howell <phowell@cothm.org>
+Evan Lucas <evan@btc.com>
 Domenic Denicola <domenic@domenicdenicola.com>
+Quinn Slack <qslack@qslack.com>
 James Halliday <mail@substack.net>
+Alex Kocharin <alex@kocharin.ru>
 Jeremy Cantrell <jmcantrell@gmail.com>
+Evan Lucas <evan.lucas@hattiesburgclinic.com>
+Trent Mick <trent.mick@joyent.com>
 Ribettes <patlogan29@gmail.com>
-Einar Otto Stangvik <einaros@gmail.com>
 Don Park <donpark@docuverse.com>
+Einar Otto Stangvik <einaros@gmail.com>
 Kei Son <heyacct@gmail.com>
+Dav Glass <davglass@gmail.com>
+Alex K. Wolfe <alexkwolfe@gmail.com>
+James Sanders <jimmyjazz14@gmail.com>
+Reid Burke <me@reidburke.com>
+Arlo Breault <arlolra@gmail.com>
+Timo Derstappen <teemow@gmail.com>
+Bart Teeuwisse <bart.teeuwisse@thecodemill.biz>
+Ben Noordhuis <info@bnoordhuis.nl>
+Tor Valamo <tor.valamo@gmail.com>
+Whyme.Lyu <5longluna@gmail.com>
+Daniel Santiago <daniel.santiago@highlevelwebs.com>
+Denis Gladkikh <outcoldman@gmail.com>
+Andrew Horton <andrew.j.horton@gmail.com>
+Zeke Sikelianos <zeke@sikelianos.com>
+Dylan Greene <dylang@gmail.com>
 Nicolas Morel <marsup@gmail.com>
+Franck Cuny <franck.cuny@gmail.com>
 Mark Dube <markisdee@gmail.com>
+dead_horse <dead_horse@qq.com>
+Yeonghoon Park <sola92@gmail.com>
 Nathan Rajlich <nathan@tootallnate.net>
+Kenan Yildirim <kenan@kenany.me>
+Rafael de Oleza <rafa@spotify.com>
 Maxim Bogushevich <boga1@mail.ru>
-Justin Beckwith <justbe@microsoft.com>
+Laurie Voss <git@seldo.com>
+Mikola Lysenko <mikolalysenko@gmail.com>
 Meaglin <Meaglin.wasabi@gmail.com>
+Rebecca Turner <turner@mikomi.org>
+Yazhong Liu <yorkiefixer@gmail.com>
 Ben Evans <ben@bensbit.co.uk>
+Hunter Loftis <hunter@hunterloftis.com>
 Nathan Zadoks <nathan@nathan7.eu>
-Brian White <mscdex@gmail.com>
+Peter Richardson <github@zoomy.net>
+Brian White <mscdex@mscdex.net>
+Jussi Kalliokoski <jussi.kalliokoski@gmail.com>
 Jed Schmidt <tr@nslator.jp>
+Filip Weiss <me@fiws.net>
 Ian Livingstone <ianl@cs.dal.ca>
-Patrick Pfeiffer <patrick@buzzle.at>
-Paul Miller <paul@paulmillr.com>
-seebees <seebees@gmail.com>
-Carl Lange <carl@flax.ie>
-Jan Lehnardt <jan@apache.org>
-Alexey Kreschuk <akrsch@gmail.com>
-Di Wu <dwu@palantir.com>
-Florian Margaine <florian@margaine.com>
-Forbes Lindesay <forbes@lindesay.co.uk>
-Ian Babrou <ibobrik@gmail.com>
-Jaakko Manninen <jaakko@rocketpack.fi>
-Johan Nordberg <its@johan-nordberg.com>
-Johan Sköld <johan@skold.cc>
-Larz Conwell <larz@larz-laptop.(none)>
-Luke Arduini <luke.arduini@gmail.com>
-Marcel Klehr <mklehr@gmx.net>
-Mathias Bynens <mathias@qiwi.be>
-Matt Lunn <matt@mattlunn.me.uk>
-Matt McClure <matt.mcclure@mapmyfitness.com>
-Nirk Niggler <nirk.niggler@gmail.com>
-Paolo Fragomeni <paolo@async.ly>
-Jake Verbaten (Raynos) <raynos2@gmail.com>
-Robert Kowalski <rok@kowalski.gd>
-Schabse Laks <Dev@SLaks.net>
-Stuart Knightley <stuart@stuartk.com>
-Stuart P. Bentley <stuart@testtrack4.com>
-Vaz Allen <vaz@tryptid.com>
-elisee <elisee@sparklin.org>
-Evan You <yyx990803@gmail.com>
-Wil Moore III <wil.moore@wilmoore.com>
-Dylan Greene <dylang@gmail.com>
-zeke <zeke@sikelianos.com>
-Andrew Horton <andrew.j.horton@gmail.com>
-Denis Gladkikh <outcoldman@gmail.com>
-Daniel Santiago <daniel.santiago@highlevelwebs.com>
-Alex Kocharin <alex@kocharin.ru>
-Evan Lucas <evanlucas@me.com>
-Steve Mason <stevem@brandwatch.com>
-Quinn Slack <qslack@qslack.com>
-Sébastien Santoro <dereckson@espace-win.org>
-CamilleM <camille.moulin@alterway.fr>
-Tom Huang <hzlhu.dargon@gmail.com>
-Sergey Belov <peimei@ya.ru>
-Younghoon Park <sola92@gmail.com>
-Yazhong Liu <yorkiefixer@gmail.com>
-Mikola Lysenko <mikolalysenko@gmail.com>
-Rafael de Oleza <rafa@spotify.com>
-Yeonghoon Park <sola92@gmail.com>
-Franck Cuny <franck.cuny@gmail.com>
-Alan Shaw <alan@freestyle-developments.co.uk>
-Alex Rodionov <p0deje@gmail.com>
-Alexej Yaroshevich <alex@qfox.ru>
-Elan Shanker <elan.shanker@gmail.com>
-François Frisch <francoisfrisch@gmail.com>
-Gabriel Falkenberg <gabriel.falkenberg@gmail.com>
-Jason Diamond <jason@diamond.name>
-Jess Martin <jessmartin@gmail.com>
-Jon Spencer <jon@jonspencer.ca>
-Matt Colyer <matt@colyer.name>
-Matt McClure <matt.mcclure@mapmyfitness.com>
-Maximilian Antoni <maximilian.antoni@juliusbaer.com>
-Nicholas Kinsey <pyro@feisty.io>
-Paulo Cesar <pauloc062@gmail.com>
-Quim Calpe <quim@kalpe.com>
-Robert Gieseke <robert.gieseke@gmail.com>
-Spain Train <michael.spainhower@opower.com>
-TJ Holowaychuk <tj@vision-media.ca>
-Thom Blake <tblake@brightroll.com>
-Trevor Burnham <tburnham@hubspot.com>
-bitspill <bitspill+github@bitspill.net>
-Neil Gentleman <ngentleman@gmail.com>
+timoweiss <timoweiss@Timo-MBP.local>
+Christopher Hiller <chiller@badwing.com>
+Olivier Melcher <olivier.melcher@gmail.com>
+Tomaž Muraus <kami@k5-storitve.net>
index 1a38e066190790dd5cec6359b40cea90e27801af..248de8908d2ec17e09ac4a10d07659aaa6bd14f0 100644 (file)
@@ -1,3 +1,78 @@
+### v2.5.1 (2015-02-06):
+
+This release doesn't look like much, but considerable effort went into ensuring
+that npm's tests will pass on io.js 1.1.0 and Node 0.11.16 / 0.12.0 on both OS
+X and Linux.
+
+**NOTE:** there are no actual changes to npm's code in `npm@2.5.1`. Only test
+code (and the upgrade of `request` to the latest version) has changed.
+
+#### `npm-registry-mock@1.0.0`:
+
+* [`0e8d473`](https://github.com/npm/npm/commit/0e8d4736a1cbdda41ae8eba8a02c7ff7ce80c2ff)
+  [#7281](https://github.com/npm/npm/issues/7281) `npm-registry-mock@1.0.0`:
+  Clean up API, set `connection: close`.
+  ([@robertkowalski](https://github.com/robertkowalski))
+* [`4707bba`](https://github.com/npm/npm/commit/4707bba7d44dfab85cc45c2ecafa9c1601ba2e9a)
+  Further update tests to work with `npm-registry-mock@1.0.0`.
+  ([@othiym23](https://github.com/othiym23))
+* [`41a0f89`](https://github.com/npm/npm/commit/41a0f8959d4e02af9661588afa7d2b4543cc21b6)
+  Got rid of completely gratuitous global config manipulation in tests.
+  ([@othiym23](https://github.com/othiym23))
+
+#### MINOR DEPENDENCY TWEAK
+
+* [`a4c7af9`](https://github.com/npm/npm/commit/a4c7af9c692f250c0fd017397ed9514fc263b752)
+  `request@2.53.0`: Tweaks to tunneling proxy behavior.
+  ([@nylen](https://github.com/nylen))
+
+### v2.5.0 (2015-01-29):
+
+#### SMALL FEATURE I HAVE ALREADY USED TO MAINTAIN NPM ITSELF
+
+* [`9d61e96`](https://github.com/npm/npm/commit/9d61e96fb1f48687a85c211e4e0cd44c7f95a38e)
+  `npm outdated --long` now includes a column showing the type of dependency.
+  ([@watilde](https://github.com/watilde))
+
+#### BUG FIXES & TWEAKS
+
+* [`fec4c96`](https://github.com/npm/npm/commit/fec4c967ee235030bf31393e8605e9e2811f4a39)
+  Allow `--no-proxy` to override `HTTP_PROXY` setting in environment.
+  ([@othiym23](https://github.com/othiym23))
+* [`589acb9`](https://github.com/npm/npm/commit/589acb9714f395c2ad0d98cb0ac4236f1842d2cc)
+  Only set `access` when publshing when it's explicitly set.
+  ([@othiym23](https://github.com/othiym23))
+* [`1027087`](https://github.com/npm/npm/commit/102708704c8c4f0ea99775d38f8d1efecf584940)
+  Add script and `Makefile` stanza to update AUTHORS.
+  ([@KenanY](https://github.com/KenanY))
+* [`eeff04d`](https://github.com/npm/npm/commit/eeff04da7979a0181becd36b8777d607e7aa1787)
+  Add `NPMOPTS` to top-level install in `Makefile` to override `userconfig`.
+  ([@aredridel](https://github.com/aredridel))
+* [`0d17328`](https://github.com/npm/npm/commit/0d173287336650606d4c91818bb7bcfb0c5d57a1)
+  `fstream@1.0.4`: Run chown only when necessary.
+  ([@silkentrance](https://github.com/silkentrance))
+* [`9aa4622`](https://github.com/npm/npm/commit/9aa46226ee63b9e183fd49fc72d9bdb0fae9605e)
+  `columnify@1.4.1`: ES6ified! ([@timoxley](https://github.com/timoxley))
+* [`51b2fd1`](https://github.com/npm/npm/commit/51b2fd1974e38b825ac5ca4a852ab3c4142624cc)
+  Update default version in `docs/npm-config.md`.
+  ([@lucthev](https://github.com/lucthev))
+
+#### `npm-registry-client@6.0.7`:
+
+* [`f9313a0`](https://github.com/npm/npm/commit/f9313a066c9889a0ee898d8a35676e40b8101e7f)
+  [#7226](https://github.com/npm/npm/issues/7226) Ensure that all request
+  settings are copied onto the agent.
+  ([@othiym23](https://github.com/othiym23))
+* [`e186f6e`](https://github.com/npm/npm/commit/e186f6e7cfeb4db9c94d7375638f0b2f0d472947)
+  Only set `access` on publish when it differs from the norm.
+  ([@othiym23](https://github.com/othiym23))
+* [`f9313a0`](https://github.com/npm/npm/commit/f9313a066c9889a0ee898d8a35676e40b8101e7f)
+  Allow overriding request's environment-based proxy handling.
+  ([@othiym23](https://github.com/othiym23))
+* [`f9313a0`](https://github.com/npm/npm/commit/f9313a066c9889a0ee898d8a35676e40b8101e7f)
+  Properly handle retry failures on fetch.
+  ([@othiym23](https://github.com/othiym23))
+
 ### v2.4.1 (2015-01-23):
 
 ![bridge that doesn't meet in the middle](http://www.static-18.themodernnomad.com/wp-content/uploads/2011/08/bridge-fail.jpg)
index 34d4b62de27527063ac4100b4a5a8d261cb2fc82..15655f3e5cfe0fa1c545cd3bf59a3d3f6dd26170 100644 (file)
@@ -85,10 +85,10 @@ latest:
        @echo "Installing latest published npm"
        @echo "Use 'make install' or 'make link' to install the code"
        @echo "in this folder that you're looking at right now."
-       node cli.js install -g -f npm
+       node cli.js install -g -f npm ${NPMOPTS}
 
 install: all
-       node cli.js install -g -f
+       node cli.js install -g -f ${NPMOPTS}
 
 # backwards compat
 dev: install
@@ -230,7 +230,12 @@ test: doc
 tag:
        npm tag npm@$(PUBLISHTAG) latest
 
-publish: link doc
+authors:
+       @bash scripts/update-authors.sh &&\
+       git add AUTHORS &&\
+       git commit -m "update AUTHORS" || true
+
+publish: link doc authors
        @git push origin :v$(shell npm -v) 2>&1 || true
        git clean -fd &&\
        git push origin $(BRANCH) &&\
@@ -243,4 +248,4 @@ release:
 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-clean docclean release
+.PHONY: all latest install dev link doc clean uninstall test man doc-clean docclean release authors
index 05637f21db43af0fd85300388c94465116f83de9..e17afcd259d61b17a01276691b4df636e892e4f5 100644 (file)
@@ -88,7 +88,7 @@ This generates npm-shrinkwrap.json, which will look something like this:
           "version": "0.0.1",
           "dependencies": {
             "C": {
-              "version": "0.1.0"
+              "version": "0.0.1"
             }
           }
         }
@@ -101,7 +101,7 @@ installs a package with a npm-shrinkwrap.json file in the package
 root, the shrinkwrap file (rather than package.json files) completely
 drives the installation of that package and all of its dependencies
 (recursively).  So now the author publishes A@0.1.0, and subsequent
-installs of this package will use B@0.0.1 and C@0.1.0, regardless the
+installs of this package will use B@0.0.1 and C@0.0.1, regardless the
 dependencies and versions listed in A's, B's, and C's package.json
 files.
 
index 1a54ec06b3c9791fb257fe312a03743bcd51a0eb..933c23a64aab5bbb616f6aadc58933e4ce085664 100644 (file)
@@ -452,7 +452,7 @@ For example:
 
     {
       "name": "tea-latte",
-      "version": "1.3.5"
+      "version": "1.3.5",
       "peerDependencies": {
         "tea": "2.x"
       }
index 1772b34ec1788975e98cdc69e92ec119dafcf295..96dda6b9f5843314fdb888816c09bacd3612fab8 100644 (file)
@@ -55,7 +55,6 @@ The following shorthands are parsed on the command-line:
 * `-m`: `--message`
 * `-p`, `--porcelain`: `--parseable`
 * `-reg`: `--registry`
-* `-v`: `--version`
 * `-f`: `--force`
 * `-desc`: `--description`
 * `-S`: `--save`
@@ -433,7 +432,7 @@ The value `npm init` should use by default for the package license.
 
 ### init-version
 
-* Default: "0.0.0"
+* Default: "1.0.0"
 * Type: semver
 
 The value that `npm init` should use by default for the package
@@ -690,7 +689,7 @@ Only works if there is already a package.json file present.
 Configure how versions of packages installed to a package.json file via
 `--save` or `--save-dev` get prefixed.
 
-For example if a package has version `1.2.3`, by default it's version is
+For example if a package has version `1.2.3`, by default its version is
 set to `^1.2.3` which allows minor upgrades for that package, but after
 `npm config set save-prefix='~'` it would be set to `~1.2.3` which only allows
 patch upgrades.
@@ -886,7 +885,6 @@ Set to `"browser"` to view html help content in the default web browser.
 ## SEE ALSO
 
 * npm-config(1)
-* npm-config(7)
 * npmrc(5)
 * npm-scripts(7)
 * npm-folders(5)
index 3edb83a9679f87a090086e37d9eeb9cad377c090..ca7b622ca2eac89f36d770078bdf8f87805f7bd5 100644 (file)
@@ -126,7 +126,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://docs.npmjs.com/misc/disputes">resolve it with the package
 owner</a>, please email
-<a href="&#109;&#x61;&#x69;&#108;&#116;&#111;&#x3a;&#x73;&#x75;&#x70;&#x70;&#x6f;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#109;">&#x73;&#x75;&#x70;&#x70;&#x6f;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#109;</a> and explain the situation.</p>
+<a href="&#109;&#97;&#x69;&#108;&#x74;&#x6f;&#58;&#x73;&#117;&#112;&#x70;&#111;&#x72;&#x74;&#64;&#110;&#x70;&#x6d;&#x6a;&#115;&#x2e;&#x63;&#x6f;&#x6d;">&#x73;&#117;&#112;&#x70;&#111;&#x72;&#x74;&#64;&#110;&#x70;&#x6d;&#x6a;&#115;&#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>
@@ -169,5 +169,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@2.4.1</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@2.5.1</p>
 
index b927594b10a1def4fbb119b15dcbc91683cc46dc..b1033738ad730ad534c5c801067f049e54847a94 100644 (file)
@@ -28,5 +28,5 @@ to the <code>npm.bin</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-bin &mdash; npm@2.4.1</p>
+<p id="footer">npm-bin &mdash; npm@2.5.1</p>
 
index 976535097e6ffa1ac56ed5a2d35d79b4a7b06992..47b11ef1410f54927b2fbf28365f53750bd7c850 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-bugs &mdash; npm@2.5.1</p>
 
index 94f242c4f0bdf1250cb428e332ebf72edae96b4f..aa7c2eea3f0c6ce96bda02388b1e71dbcf018edc 100644 (file)
@@ -42,5 +42,5 @@ incrementation.</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@2.4.1</p>
+<p id="footer">npm-cache &mdash; npm@2.5.1</p>
 
index 80968ebace38100bf992f453957012612721ca70..45af01d28362d1823442b044437a4aa8fedfe8bd 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-commands &mdash; npm@2.5.1</p>
 
index 6d763526fb245b9ebc1a718b8394c67c0b4cf48f..bea72420ca0ce70416ce8c9caf54a2e12280dc1c 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-config &mdash; npm@2.5.1</p>
 
index 6072d9371a0ea7adea53cebb4c6d5eb27fbfccdb..b00c11cf0c233ca893210aaf20b7fba207bf1f53 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-deprecate &mdash; npm@2.5.1</p>
 
index 42e0ed8f2ca05e50eed88a2625effcae92da38d3..c478fbbcf59cca4a517db9097ac821e97af392c9 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-docs &mdash; npm@2.5.1</p>
 
index b494c3eb4f487e3813895dc38edf90a26006c3d2..1f74d8f3dcde7099b7d2abbef7b7b39fab65dd6e 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-edit &mdash; npm@2.5.1</p>
 
index 31ada6942d07b9ab509a1d9e302d3e385aed00a5..4e8703563f5e6e78eb9940e02354be7047a0dd21 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-explore &mdash; npm@2.5.1</p>
 
index 42f3ca527d8a2fc02f39562e2207c876026b7c95..bb188c1ec24fedb32d0c030aa947f2824d186ba0 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-help-search &mdash; npm@2.5.1</p>
 
index 32526521c341b1da8aa311e2ae7b3f30a7f22824..6dcc3e2deaae063693a143b9d7944c4b282f5222 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-init &mdash; npm@2.5.1</p>
 
index 43ed6e366aa0589cec505a0866fe9a2b09d81382..f2f89c95a95e0c685f20ad152192ce7e8f5a7e5b 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-install &mdash; npm@2.5.1</p>
 
index 44cac12f47f55dd4a0253c123c97d22e9ffadc8d..195701e8991dcaf3b30b12c88f418d5d58ffa3cf 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-link &mdash; npm@2.5.1</p>
 
index 97f85a0abc1fff55f1ab933e80cca6c1f5221ee2..67c5216dcb4c0b5eb718f1af79140950faa49ffa 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-load &mdash; npm@2.5.1</p>
 
index 330c35fa6847d1b0b5ff036d55a1aeb831136386..3d80294fe09906be86de394761a39c2dc40fb17b 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-ls &mdash; npm@2.5.1</p>
 
index 37548fae9b25ef1d29e48ca3cd17a1f7086d1c03..a2c442d0c5b9b945baa7cb292095a5837a01229e 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-outdated &mdash; npm@2.5.1</p>
 
index 65216030a4291508dd42304687072ccb82693a6b..97e3671e35a86dd6b14cf7ae71a315f0e01a28ef 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-owner &mdash; npm@2.5.1</p>
 
index ec3e4cb670df4c7e772030ad56fc3702403bc05e..763199e991c0697939326e73cf517938d2625b0a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-pack &mdash; npm@2.5.1</p>
 
index 9b26a42de94cbb48e6f81d1d8fb0e37ced83159b..f4e6a703d6dd384e450d0771d82eb700dfb6cd7a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-prefix &mdash; npm@2.5.1</p>
 
index 645cb21b20376af5e2e837dedb91a4daffea17b6..6fb8718ca80b68a03d2faec391aada7b115ec1ec 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-prune &mdash; npm@2.5.1</p>
 
index cd7e7446b17bfc0d8796b60f5b2be7aa2bfd9548..bbbe2a10216cb54438af9862116be1907952e608 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-publish &mdash; npm@2.5.1</p>
 
index d957bfdf1cbdd9f38cd1168e4a45091402cd7213..7edc466ea38a19f220907540025c503cdabc8af7 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-rebuild &mdash; npm@2.5.1</p>
 
index 34ec71cab11638a9a1726d15c83d22e16a35b9f6..b5a41a08db4cfb7f79c64d05631a0f068944d7fc 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-repo &mdash; npm@2.5.1</p>
 
index 2c87673aba5b861c5125e8d19925e26d8e9ffacf..5be2e68cf8540519b4766b2c22e3361bcff343d2 100644 (file)
@@ -52,5 +52,5 @@ behavior will be accompanied by an increase in major 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-restart &mdash; npm@2.4.1</p>
+<p id="footer">npm-restart &mdash; npm@2.5.1</p>
 
index 8acc1a58f4b2f05b207071f2250f8c098e285a35..744df599fc9134ea246a160bac3050ed07b9d4c8 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-root &mdash; npm@2.5.1</p>
 
index 63befb7a5b23c14a3169c9ea9a48f935ca9d9a42..639a71fcac9da4019279f2f6ce4926123b91b7a2 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-run-script &mdash; npm@2.5.1</p>
 
index bc8f712647cf1ae7eeb2d74832e7bfa9d7e6044b..63121ffe26bd9eb9c39dba015e086a56b3b21b6c 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-search &mdash; npm@2.5.1</p>
 
index 5d686266ee61fb67fdcb89904512955f0feb074e..de43ebc0a338721205df8072c6354df99d075ffd 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@2.5.1</p>
 
index 497fe9eb6eaa57075411ad0fb987d54e4b955a6d..b10a6c499f6a53bf345a733e3778d2a8b3970cd5 100644 (file)
@@ -28,5 +28,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@2.4.1</p>
+<p id="footer">npm-start &mdash; npm@2.5.1</p>
 
index 65fc48fe6381c47e36d88b3aca434c19df4244bc..83e258bdd86fd1b127bbb6acdab685c65b0de64c 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-stop &mdash; npm@2.5.1</p>
 
index f2ef22f26d239b2be3aefcf0e819bcdb6128a9a8..104f5b733c240278b3886a0929e731cb00dedc14 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-tag &mdash; npm@2.5.1</p>
 
index 574006ece96b436da7ee9fe42fbb74c97c5af102..dd9677e76e76d1114f5745cc7b95557c6a78a47a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-test &mdash; npm@2.5.1</p>
 
index 8004e1a7f4bb17c3ddfbcac70d6f0c8f905ef493..f1fa1c3bccb2b724aa18623c6815157288f040f8 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-uninstall &mdash; npm@2.5.1</p>
 
index 0567809e1e251bec9eedc4679dc331f48d3e021f..3e0c4ab2efdad8951f608cf91c52f91797afb939 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-unpublish &mdash; npm@2.5.1</p>
 
index 044359cf1e35fbbe232c9d728c57654506136d1c..577101a21bd4ff046b21e07aa71bac6f156ad1b7 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-update &mdash; npm@2.5.1</p>
 
index 6627acec54302601d0a408ed3099f1cd537b513a..115f4f90cdd147c10b5c38781e84517a921f199d 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-version &mdash; npm@2.5.1</p>
 
index 938ade87dd544cdf2ff5061d402c68c131932a75..73286ece8b24c29791247d38c2a63b2206615f4f 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-view &mdash; npm@2.5.1</p>
 
index 2ae1832bfc43bb1a9c96e8df3aff0661876a82a5..5d1324d1c1fcbabaf30008ecf499052fe5282e76 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-whoami &mdash; npm@2.5.1</p>
 
index d5328254e9d4562c942584617fa837ae80ced9d1..4f41ebe49d2f048e561046c038fbfb149e167055 100644 (file)
@@ -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>2.4.1</p>
+<p>2.5.1</p>
 <h2 id="description">DESCRIPTION</h2>
 <p>This is the API documentation for npm.
 To find documentation of the command line
@@ -109,5 +109,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@2.4.1</p>
+<p id="footer">npm &mdash; npm@2.5.1</p>
 
index e9fe0e7f9692a4d758789ae969cd0d198937cd3d..f2d5b4c9c6ff2c9e13d525b2436bbb3a2bbfddfb 100644 (file)
@@ -75,4 +75,4 @@ with an HTTP 402 status code (logically enough), unless you use
 <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-access &mdash; npm@2.4.1</p>
+<p id="footer">npm-access &mdash; npm@2.5.1</p>
index e25299b6c90f31a2c11c7567d7308e5ce92c90e3..01d6b22aacca9d4083d71841a00ab697d32714ed 100644 (file)
@@ -68,5 +68,5 @@ precedence over any global configuration.</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@2.4.1</p>
+<p id="footer">npm-adduser &mdash; npm@2.5.1</p>
 
index e599f97a8337b1ea45198492e1240258d381fd5c..d896b96a1d8898584b8170d16ff96c671ffc4506 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-bin &mdash; npm@2.5.1</p>
 
index a0eb7624d9ad4adff4514754e979c6785a4ef151..ed55e03a71de6778c78298f962136e171651afec 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-bugs &mdash; npm@2.5.1</p>
 
index 09cbd1cdaf7c2ee8963eb0f3c1d58144f23f4920..52efad1940d187f41a2a9c8c4e5a8103e751e854 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-build &mdash; npm@2.5.1</p>
 
index 5ea73eda4fec9a11766b67cca72ef5b35d9aa3fd..9db76b5b12ef88903c56781224a49d6718692f88 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-bundle &mdash; npm@2.5.1</p>
 
index 82277f48ea3776b6af88b0c708a88da996924c9a..4b3fa05f07d50965cbe4999cb9b0930bee6ee6f6 100644 (file)
@@ -81,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@2.4.1</p>
+<p id="footer">npm-cache &mdash; npm@2.5.1</p>
 
index 1bfebc72830ffd33658fabbe3e157c14552af3ea..1d6870b04f7680c1573e3389e4c1c11283d14c61 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-completion &mdash; npm@2.5.1</p>
 
index 6c70244eac18783df95318ef03959295fec4758f..822f570acf6d446ca7368b1572e29e259422155a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-config &mdash; npm@2.5.1</p>
 
index 233b2ec5f502e3980701bc7c3262574c33fffe0f..1cc3f7431d9ca73a76304feb8a19598cd26fff19 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-dedupe &mdash; npm@2.5.1</p>
 
index 68dc7488d52d52ea0d289de7c51abfec2c4d81fc..574babd59b7a255be4f888621e8452e1284a7dba 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-deprecate &mdash; npm@2.5.1</p>
 
index a0cadee07d4af766a4235bf0a655596f7e909eb1..30ea03d53d549e2d2991e25b53a8063d1dd3fcbe 100644 (file)
@@ -76,4 +76,4 @@ begin with a number or the letter <code>v</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-dist-tag &mdash; npm@2.4.1</p>
+<p id="footer">npm-dist-tag &mdash; npm@2.5.1</p>
index e8c4f58161a86f79b3bd45062b845b06c06626f4..e08070ac5866157bba1a2610627e1ed1462faeb3 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-docs &mdash; npm@2.5.1</p>
 
index 34c261de894e91cc29766d8c66c6230f63455706..abf6feae5a7ba4292cd31a64758ed84337615092 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-edit &mdash; npm@2.5.1</p>
 
index 84396a3094b7f73a132b85a855500c4757d332eb..3bd89c91ed463e3bd51c4a4b4f3d686830fa38f7 100644 (file)
@@ -49,5 +49,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@2.4.1</p>
+<p id="footer">npm-explore &mdash; npm@2.5.1</p>
 
index 079fcc6c2fa3e4888a4eb204e92f8ac3fdc14919..dbc1b6db574cdcc25b10041d4f1c4951d7fe8fc9 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-help-search &mdash; npm@2.5.1</p>
 
index 8c93fbb3d0770b2b8a6cb9ea9d4c0cf4b6289a63..9983581828139fca4f1b5df250c8c9e7a8130585 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-help &mdash; npm@2.5.1</p>
 
index 4353534e7d29ef48ffbbf566025f04522ba4fd7b..09404ec01cca075d0b4208a6419524450211b235 100644 (file)
@@ -40,5 +40,5 @@ defaults and not prompt you for any options.</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@2.4.1</p>
+<p id="footer">npm-init &mdash; npm@2.5.1</p>
 
index 13adbec882750785efcaf37a4f6560b58a33f717..f3fb078ea98d9fd74b061c628061a4760b02595f 100644 (file)
@@ -239,5 +239,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@2.4.1</p>
+<p id="footer">npm-install &mdash; npm@2.5.1</p>
 
index 03e9dca9c27520f688a7d4c94e7a6a22d0b7310b..c52434c5910e7cc6ddc4b099b9e3e8894d31b2c2 100644 (file)
@@ -71,5 +71,5 @@ include that scope, e.g.</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@2.4.1</p>
+<p id="footer">npm-link &mdash; npm@2.5.1</p>
 
index 6beb97a637288f6b1c7a49de5f5f4489747885d7..cdbd56bfd9f0902c37f1175c1ae9c0cf5bfbe6b3 100644 (file)
@@ -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@2.4.1 /path/to/npm
+<pre><code>npm@2.5.1 /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@2.4.1</p>
+<p id="footer">npm-ls &mdash; npm@2.5.1</p>
 
index c4e5d91a85fd5ac0ab32b7bc937517e815f5bc1e..1b1414d710585c71c0c72d83df427360b2a429ca 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-outdated &mdash; npm@2.5.1</p>
 
index a295affe05c073e5f938d25014261b620248e126..9d6e4541ccdeecb73d19480d66b9fbe525ae9c19 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-owner &mdash; npm@2.5.1</p>
 
index 634aaa442879e429f630390420ae0a97c0a469c5..cf7fcaed9f38a3a18e7afbdf3ff542aa60179464 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-pack &mdash; npm@2.5.1</p>
 
index 2a186e65d71b1c8fda1c8b03baa8e329eb3efc91..98f44e133ddf2aec2e9ee8314d034416ff4dd8d6 100644 (file)
@@ -38,5 +38,5 @@ to contain a package.json file unless <code>-g</code> is also specified.</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-prefix &mdash; npm@2.4.1</p>
+<p id="footer">npm-prefix &mdash; npm@2.5.1</p>
 
index b7034bf7497520953c2869ab97db388931606874..247a291d787ff8c5e2826968742c46196ea9c4bd 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-prune &mdash; npm@2.5.1</p>
 
index 3ff6b37e98b044353bcd3e3d375b9f0c373c2b34..23559cacd6b200829f31dfb5bc6c05ca54301b55 100644 (file)
@@ -66,5 +66,5 @@ it is removed with <a href="../cli/npm-unpublish.html"><a href="../cli/npm-unpub
 <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@2.4.1</p>
+<p id="footer">npm-publish &mdash; npm@2.5.1</p>
 
index d130d328e198a295f4064acce7bfb84034f4aad5..bcf73eca7e5532bd802303d952a5bdfa06893a61 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-rebuild &mdash; npm@2.5.1</p>
 
index 21650e141439fe042b04ccfabf1760310de3c91c..5eb88eae94a0a756b4f61b4933f870210db3bc1f 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-repo &mdash; npm@2.5.1</p>
 
index a0b7f933f92855c856ec2a6ab648b65fd4ebc8a3..67b397552b43c4dad5d34ff2d2dd3aef00fdff01 100644 (file)
@@ -53,5 +53,5 @@ behavior will be accompanied by an increase in major 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-restart &mdash; npm@2.4.1</p>
+<p id="footer">npm-restart &mdash; npm@2.5.1</p>
 
index c99c99f56d232a324ad174d9a568a583908f3abc..c832eee203c206dd9fb8b32c5987cae40f0ff369 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-rm &mdash; npm@2.5.1</p>
 
index 99d01d9ab01b034a0459d7214aa69da20e6687ed..c9df7b98fd460c7db707774e853c38de92e36ecf 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-root &mdash; npm@2.5.1</p>
 
index 64c1c5076e26fd6b6f227fbee6739638d7c014ac..716ad484a4409d816f4c195f9789a6d39ededf86 100644 (file)
@@ -50,5 +50,5 @@ and not to any pre or post 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-run-script &mdash; npm@2.4.1</p>
+<p id="footer">npm-run-script &mdash; npm@2.5.1</p>
 
index af063aeee78ffbee17b6a5942a178f404e32df49..88ad801bc62434555ded15d1a1279110445fbd2a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-search &mdash; npm@2.5.1</p>
 
index 9eec81fa89d08b85aeba6aeb8f356886fdaa4878..21c104f59b54ea9151a6dc78fcf4463e0fbdaaa8 100644 (file)
@@ -78,7 +78,7 @@ when B hasn&#39;t changed at all.</p>
       &quot;version&quot;: &quot;0.0.1&quot;,
       &quot;dependencies&quot;: {
         &quot;C&quot;: {
-          &quot;version&quot;: &quot;0.1.0&quot;
+          &quot;version&quot;: &quot;0.0.1&quot;
         }
       }
     }
@@ -90,7 +90,7 @@ installs a package with a npm-shrinkwrap.json file in the package
 root, the shrinkwrap file (rather than package.json files) completely
 drives the installation of that package and all of its dependencies
 (recursively).  So now the author publishes A@0.1.0, and subsequent
-installs of this package will use B@0.0.1 and C@0.1.0, regardless the
+installs of this package will use B@0.0.1 and C@0.0.1, regardless the
 dependencies and versions listed in A&#39;s, B&#39;s, and C&#39;s package.json
 files.</p>
 <h3 id="using-shrinkwrapped-packages">Using shrinkwrapped packages</h3>
@@ -164,5 +164,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@2.4.1</p>
+<p id="footer">npm-shrinkwrap &mdash; npm@2.5.1</p>
 
index 14ea00285a19889ca0c083ebf9cccb0ecd303c93..58c2c240c17d5a66eb048bc759fd27af5a7ff3bf 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-star &mdash; npm@2.5.1</p>
 
index 9216d12163b81ab45bb3f86eb0e68402b7e4b921..0ffb3f4d5e389b0fe3c42226626db81a63db156a 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-stars &mdash; npm@2.5.1</p>
 
index 39d229780fd9776b104e97d0bd7ee9c3ece6e75c..330378cd81d92a396868975ea698532b700c5cb5 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-start &mdash; npm@2.5.1</p>
 
index 9318e5d09f64cb3a76d871bec8c943e8e9bddb1e..ee69ec0304a30b3a9da9a1b66c971d20008551bf 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-stop &mdash; npm@2.5.1</p>
 
index 6082a27b03adf2a79e7545f348ca36a396e67e8a..d66caeebd3ccb415f69da488e6ae4396940a24c4 100644 (file)
@@ -62,5 +62,5 @@ that do not begin with a number or the letter <code>v</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-tag &mdash; npm@2.4.1</p>
+<p id="footer">npm-tag &mdash; npm@2.5.1</p>
 
index 7a6a7f53fe2387540611b64f5b082318379621b6..401a51304e219b42173ae2e85e1f7a0e73b59cf8 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-test &mdash; npm@2.5.1</p>
 
index 253b02913c93a338ae962564a05767fcdb8e5457..ef33583b31c6908414db2d435b3d8ba074d77cfb 100644 (file)
@@ -57,5 +57,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@2.4.1</p>
+<p id="footer">npm-uninstall &mdash; npm@2.5.1</p>
 
index 7d96895bcd204719d53364502481c9551174943b..f31a4f03b8476d73223410891932ff47aefac7f0 100644 (file)
@@ -47,5 +47,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@2.4.1</p>
+<p id="footer">npm-unpublish &mdash; npm@2.5.1</p>
 
index 81501b70f2fe649d7f5ce19c32711cb6d91c678d..441c0b1a893d4efb858b37716d7a9f72efdc288e 100644 (file)
@@ -42,5 +42,5 @@ or local) will be updated.</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-update &mdash; npm@2.4.1</p>
+<p id="footer">npm-update &mdash; npm@2.5.1</p>
 
index 2a7f8af764a6c59773b2a5a22ea1ee756bca56f2..bb0fe413ad0efe3f83c28a5e34d51d2d95cddd29 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-version &mdash; npm@2.5.1</p>
 
index 31100a80b0d6e64e297693a4bab4d1156a9b8668..3fa8beb7890baae14f5031f6247d9f5f35af63ab 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-view &mdash; npm@2.5.1</p>
 
index 6d871fe91f939b217ef32fa5d0cb0cefdaf2f01b..eb8274f960ea6e857f531269d5514ec1037e49eb 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-whoami &mdash; npm@2.5.1</p>
 
index a25c71ae0b610a4dc3009b212e288294db3e9bef..8651e989377392bfd0786840a93221616df280f2 100644 (file)
@@ -13,7 +13,7 @@
 <h2 id="synopsis">SYNOPSIS</h2>
 <pre><code>npm &lt;command&gt; [args]
 </code></pre><h2 id="version">VERSION</h2>
-<p>2.4.1</p>
+<p>2.5.1</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
@@ -110,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;&#x6f;&#58;&#110;&#x70;&#x6d;&#45;&#64;&#x67;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#46;&#x63;&#111;&#109;">&#110;&#x70;&#x6d;&#45;&#64;&#x67;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#46;&#x63;&#111;&#109;</a></li>
+<li><a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#111;&#x3a;&#x6e;&#x70;&#109;&#x2d;&#64;&#103;&#111;&#x6f;&#x67;&#108;&#101;&#x67;&#x72;&#111;&#x75;&#x70;&#x73;&#46;&#99;&#111;&#x6d;">&#x6e;&#x70;&#109;&#x2d;&#64;&#103;&#111;&#x6f;&#x67;&#108;&#101;&#x67;&#x72;&#111;&#x75;&#x70;&#x73;&#46;&#99;&#111;&#x6d;</a></li>
 </ul>
 <h2 id="bugs">BUGS</h2>
 <p>When you find issues, please report them:</p>
@@ -118,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="&#x6d;&#97;&#105;&#x6c;&#x74;&#111;&#x3a;&#x6e;&#112;&#109;&#45;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#111;&#x6d;">&#x6e;&#112;&#109;&#45;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#111;&#x6d;</a></li>
+<a href="&#x6d;&#x61;&#x69;&#108;&#116;&#111;&#58;&#x6e;&#112;&#109;&#x2d;&#x40;&#x67;&#111;&#x6f;&#103;&#x6c;&#x65;&#103;&#x72;&#111;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#x6d;">&#x6e;&#112;&#109;&#x2d;&#x40;&#x67;&#111;&#x6f;&#103;&#x6c;&#x65;&#103;&#x72;&#111;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#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>
@@ -128,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="&#x6d;&#x61;&#x69;&#108;&#x74;&#111;&#58;&#105;&#x40;&#x69;&#x7a;&#x73;&#46;&#109;&#101;">&#105;&#x40;&#x69;&#x7a;&#x73;&#46;&#109;&#101;</a></p>
+<a href="&#109;&#x61;&#x69;&#108;&#116;&#111;&#58;&#105;&#64;&#105;&#122;&#x73;&#x2e;&#x6d;&#x65;">&#105;&#64;&#105;&#122;&#x73;&#x2e;&#x6d;&#x65;</a></p>
 <h2 id="see-also">SEE ALSO</h2>
 <ul>
 <li><a href="../cli/npm-help.html"><a href="../cli/npm-help.html">npm-help(1)</a></a></li>
@@ -154,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@2.4.1</p>
+<p id="footer">npm &mdash; npm@2.5.1</p>
 
index 42c37dab620b08cd4b7224ba9d1f9f79bb6289a6..a8e58e4185883d28fa5fb025ea58d29cd9e22593 100644 (file)
@@ -184,5 +184,5 @@ cannot be found elsewhere.  See <code><a href="../files/package.json.html"><a hr
 <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@2.4.1</p>
+<p id="footer">npm-folders &mdash; npm@2.5.1</p>
 
index 9c4d8467912cb316db36a550b6fa8ecd19216964..202d7f4974589d8d05c60f381724d393881ab129 100644 (file)
@@ -184,5 +184,5 @@ cannot be found elsewhere.  See <code><a href="../files/package.json.html"><a hr
 <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-global &mdash; npm@2.4.1</p>
+<p id="footer">npm-global &mdash; npm@2.5.1</p>
 
index b22a3add0765cd7e33754b8918f014771a943fb4..b915f8482eb5fbbee02b5a5198b162e3968184f0 100644 (file)
@@ -336,7 +336,7 @@ a specific interface, expected and specified by the host documentation.</p>
 <p>For example:</p>
 <pre><code>{
   &quot;name&quot;: &quot;tea-latte&quot;,
-  &quot;version&quot;: &quot;1.3.5&quot;
+  &quot;version&quot;: &quot;1.3.5&quot;,
   &quot;peerDependencies&quot;: {
     &quot;tea&quot;: &quot;2.x&quot;
   }
@@ -488,5 +488,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">npm-json &mdash; npm@2.4.1</p>
+<p id="footer">npm-json &mdash; npm@2.5.1</p>
 
index 7ba6dae47b431b4444d6b456a9800424b18f3a56..92dfa7f0197035c08e01c9fd15b33d28d80c6756 100644 (file)
@@ -77,5 +77,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@2.4.1</p>
+<p id="footer">npmrc &mdash; npm@2.5.1</p>
 
index 1d149f195a49d0889097706ee90a2847932a8046..e3213a34ad45f376799b78885147aaed2e46f4ae 100644 (file)
@@ -336,7 +336,7 @@ a specific interface, expected and specified by the host documentation.</p>
 <p>For example:</p>
 <pre><code>{
   &quot;name&quot;: &quot;tea-latte&quot;,
-  &quot;version&quot;: &quot;1.3.5&quot;
+  &quot;version&quot;: &quot;1.3.5&quot;,
   &quot;peerDependencies&quot;: {
     &quot;tea&quot;: &quot;2.x&quot;
   }
@@ -488,5 +488,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@2.4.1</p>
+<p id="footer">package.json &mdash; npm@2.5.1</p>
 
index 8e10418ba3e4c9e7006ab690855e120aa2f8c97e..f3d12987814b2343bb6f4aca19d878a92827bca7 100644 (file)
 <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">index &mdash; npm@2.4.1</p>
+<p id="footer">index &mdash; npm@2.5.1</p>
 
index 0197be845de8e68c78f42122f102c6e55a41d822..1c6d6a41f09a59b461419246179b134514398599 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">npm-coding-style &mdash; npm@2.5.1</p>
 
index 5b8754f7a96d9f5117df22418aa2827adeb1ccb5..702fef09d9645a4860f2ab5803c2bb1fe1b7bef9 100644 (file)
@@ -53,7 +53,6 @@ defaults if nothing else is specified.</p>
 <li><code>-m</code>: <code>--message</code></li>
 <li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li>
 <li><code>-reg</code>: <code>--registry</code></li>
-<li><code>-v</code>: <code>--version</code></li>
 <li><code>-f</code>: <code>--force</code></li>
 <li><code>-desc</code>: <code>--description</code></li>
 <li><code>-S</code>: <code>--save</code></li>
@@ -374,7 +373,7 @@ for more information, or <a href="../cli/npm-init.html"><a href="../cli/npm-init
 <p>The value <code>npm init</code> should use by default for the package license.</p>
 <h3 id="init-version">init-version</h3>
 <ul>
-<li>Default: &quot;0.0.0&quot;</li>
+<li>Default: &quot;1.0.0&quot;</li>
 <li>Type: semver</li>
 </ul>
 <p>The value that <code>npm init</code> should use by default for the package
@@ -592,7 +591,7 @@ optionalDependencies.</p>
 </ul>
 <p>Configure how versions of packages installed to a package.json file via
 <code>--save</code> or <code>--save-dev</code> get prefixed.</p>
-<p>For example if a package has version <code>1.2.3</code>, by default it&#39;s version is
+<p>For example if a package has version <code>1.2.3</code>, by default its version is
 set to <code>^1.2.3</code> which allows minor upgrades for that package, but after
 <code>npm config set save-prefix=&#39;~&#39;</code> it would be set to <code>~1.2.3</code> which only allows
 patch upgrades.</p>
@@ -758,7 +757,6 @@ exit successfully.</p>
 <h2 id="see-also">SEE ALSO</h2>
 <ul>
 <li><a href="../cli/npm-config.html"><a href="../cli/npm-config.html">npm-config(1)</a></a></li>
-<li><a href="../misc/npm-config.html"><a href="../misc/npm-config.html">npm-config(7)</a></a></li>
 <li><a href="../files/npmrc.html"><a href="../files/npmrc.html">npmrc(5)</a></a></li>
 <li><a href="../misc/npm-scripts.html"><a href="../misc/npm-scripts.html">npm-scripts(7)</a></a></li>
 <li><a href="../files/npm-folders.html"><a href="../files/npm-folders.html">npm-folders(5)</a></a></li>
@@ -776,5 +774,5 @@ 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@2.4.1</p>
+<p id="footer">npm-config &mdash; npm@2.5.1</p>
 
index 79cbbad909baa6ea6a3767b54b6dd261378ce126..64539b142ddcfeced89fe8bbc44c996bb2201b0f 100644 (file)
@@ -189,5 +189,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@2.4.1</p>
+<p id="footer">npm-developers &mdash; npm@2.5.1</p>
 
index 5aa8fa9f00c1ff55c32a4b5e4d4ba52280b2e62b..d60c083797ce3e7e98bfc6c13d44803318c540eb 100644 (file)
@@ -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="&#109;&#97;&#x69;&#108;&#x74;&#111;&#x3a;&#115;&#117;&#x70;&#x70;&#111;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#46;&#99;&#x6f;&#109;">&#115;&#117;&#x70;&#x70;&#111;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#46;&#99;&#x6f;&#109;</a></li>
+<li>Email the author, CC <a href="&#109;&#x61;&#105;&#x6c;&#x74;&#x6f;&#58;&#x73;&#117;&#112;&#112;&#111;&#114;&#116;&#x40;&#x6e;&#x70;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#x73;&#117;&#112;&#112;&#111;&#114;&#116;&#x40;&#x6e;&#x70;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#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;&#x6c;&#x74;&#111;&#58;&#115;&#x75;&#112;&#112;&#111;&#114;&#116;&#64;&#110;&#112;&#109;&#106;&#x73;&#46;&#99;&#111;&#x6d;">&#115;&#x75;&#112;&#112;&#111;&#114;&#116;&#64;&#110;&#112;&#109;&#106;&#x73;&#46;&#99;&#111;&#x6d;</a> to the CC list of
+adds the npm support staff <a href="&#109;&#x61;&#105;&#108;&#x74;&#111;&#x3a;&#115;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#x40;&#x6e;&#112;&#109;&#x6a;&#115;&#46;&#99;&#x6f;&#x6d;">&#115;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#x40;&#x6e;&#112;&#109;&#x6a;&#115;&#46;&#99;&#x6f;&#x6d;</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="&#x6d;&#97;&#x69;&#108;&#116;&#x6f;&#58;&#x73;&#117;&#112;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#x6d;">&#x73;&#117;&#112;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#x6d;</a> and we&#39;ll sort it out.  (&quot;Reasonable&quot; is
+<a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#x3a;&#x73;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#111;&#109;">&#x73;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#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@2.4.1</p>
+<p id="footer">npm-disputes &mdash; npm@2.5.1</p>
 
index 3d98ec39c20670999f447f28e3cf4f774afb4cbe..165b6258a15f78f527512a4cf2392fd97965aa7b 100644 (file)
@@ -236,7 +236,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;&#105;&#x6c;&#116;&#x6f;&#58;&#x73;&#x75;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#112;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;">&#x73;&#x75;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#112;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;</a>
+<p>If the registry IS down, let us know by emailing <a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#x6f;&#x3a;&#115;&#x75;&#112;&#x70;&#111;&#114;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#115;&#x75;&#112;&#x70;&#111;&#114;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;</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>
@@ -307,5 +307,5 @@ good folks at <a href="http://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@2.4.1</p>
+<p id="footer">npm-faq &mdash; npm@2.5.1</p>
 
index 5c05cd27819d89c6001b89f76a9666404601c490..9ad872c5bf42aee2cc46857aa1055eff548b88b4 100644 (file)
 <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@2.4.1</p>
+<p id="footer">npm-index &mdash; npm@2.5.1</p>
 
index 14fe5242a5a618cf8e1485eb9e86c9f73b465f5c..72e3a1b552a93e01e660441b59b2bcdb36eafac6 100644 (file)
@@ -70,5 +70,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@2.4.1</p>
+<p id="footer">npm-registry &mdash; npm@2.5.1</p>
 
index 77362bc4ce4dedfc586fb66aaf48700c546983e9..8e25e12c444b36c2e0db9438c181efc228ddc08b 100644 (file)
@@ -78,5 +78,5 @@ that registry 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-scope &mdash; npm@2.4.1</p>
+<p id="footer">npm-scope &mdash; npm@2.5.1</p>
 
index a40bb907941b0e15db1e7444332e83b5f3c0299d..4dcac1793efea70b81667d79d985b01126bfbefa 100644 (file)
@@ -216,5 +216,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@2.4.1</p>
+<p id="footer">npm-scripts &mdash; npm@2.5.1</p>
 
index dedb31f745cc5c57d9837fd6d8a1815d14d88317..2e497cdda8817d2e6b81e58347fc9844f69f115d 100644 (file)
@@ -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@2.4.1</p>
+<p id="footer">removing-npm &mdash; npm@2.5.1</p>
 
index 0d0a226db7e43ca403a21738a213e426c73c967e..c8baab6d136cd2bde1fa493d25b8109a1f559265 100644 (file)
@@ -279,5 +279,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@2.4.1</p>
+<p id="footer">semver &mdash; npm@2.5.1</p>
 
index c8d8291deb20359d720702b5fd6ec611f7d9b4dd..9dedc3b11b0141b420af76bfe9947198c7a62206 100644 (file)
@@ -115,7 +115,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://docs.npmjs.com/misc/disputes">resolve it with the package
 owner</a>, please email
-<a href="&#109;&#x61;&#x69;&#108;&#116;&#111;&#x3a;&#x73;&#x75;&#x70;&#x70;&#x6f;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#109;">&#x73;&#x75;&#x70;&#x70;&#x6f;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#109;</a> and explain the situation.</p>
+<a href="&#109;&#97;&#x69;&#108;&#x74;&#x6f;&#58;&#x73;&#117;&#112;&#x70;&#111;&#x72;&#x74;&#64;&#110;&#x70;&#x6d;&#x6a;&#115;&#x2e;&#x63;&#x6f;&#x6d;">&#x73;&#117;&#112;&#x70;&#111;&#x72;&#x74;&#64;&#110;&#x70;&#x6d;&#x6a;&#115;&#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>
index 6e50e49b6514796293ec84be61dfa029777601e9..207f251030053fe25c689fa9f58055c4231b94e3 100644 (file)
@@ -12,7 +12,7 @@ npm.load([configObject, ]function (er, npm) {
   npm.commands.install([&quot;package&quot;], cb)
 })
 </code></pre><h2 id="version">VERSION</h2>
-<p>2.4.1</p>
+<p>2.5.1</p>
 <h2 id="description">DESCRIPTION</h2>
 <p>This is the API documentation for npm.
 To find documentation of the command line
index 39d1668d9a68422532b854ea07b43d01473174d8..4ede498f3a08d6e35675e1577d7607e3e5ca8950 100644 (file)
@@ -11,7 +11,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@2.4.1 /path/to/npm
+<pre><code>npm@2.5.1 /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>
index 45b646c030043b63496fe02de5156ace622ac941..82bb81f168baec6064002a27eae0fa064a11bdf9 100644 (file)
@@ -67,7 +67,7 @@ when B hasn&#39;t changed at all.</p>
       &quot;version&quot;: &quot;0.0.1&quot;,
       &quot;dependencies&quot;: {
         &quot;C&quot;: {
-          &quot;version&quot;: &quot;0.1.0&quot;
+          &quot;version&quot;: &quot;0.0.1&quot;
         }
       }
     }
@@ -79,7 +79,7 @@ installs a package with a npm-shrinkwrap.json file in the package
 root, the shrinkwrap file (rather than package.json files) completely
 drives the installation of that package and all of its dependencies
 (recursively).  So now the author publishes A@0.1.0, and subsequent
-installs of this package will use B@0.0.1 and C@0.1.0, regardless the
+installs of this package will use B@0.0.1 and C@0.0.1, regardless the
 dependencies and versions listed in A&#39;s, B&#39;s, and C&#39;s package.json
 files.</p>
 <h3 id="using-shrinkwrapped-packages">Using shrinkwrapped packages</h3>
index a3f617a6aa3c12e2c4b895afd723d22afad001c7..e8178c2462e2c3ca3a480a59c1cecca75bdc5c03 100644 (file)
@@ -2,7 +2,7 @@
 <h2 id="synopsis">SYNOPSIS</h2>
 <pre><code>npm &lt;command&gt; [args]
 </code></pre><h2 id="version">VERSION</h2>
-<p>2.4.1</p>
+<p>2.5.1</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
@@ -99,7 +99,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;&#x6f;&#58;&#110;&#x70;&#x6d;&#45;&#64;&#x67;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#46;&#x63;&#111;&#109;">&#110;&#x70;&#x6d;&#45;&#64;&#x67;&#111;&#111;&#x67;&#108;&#101;&#x67;&#114;&#x6f;&#117;&#x70;&#115;&#46;&#x63;&#111;&#109;</a></li>
+<li><a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#111;&#x3a;&#x6e;&#x70;&#109;&#x2d;&#64;&#103;&#111;&#x6f;&#x67;&#108;&#101;&#x67;&#x72;&#111;&#x75;&#x70;&#x73;&#46;&#99;&#111;&#x6d;">&#x6e;&#x70;&#109;&#x2d;&#64;&#103;&#111;&#x6f;&#x67;&#108;&#101;&#x67;&#x72;&#111;&#x75;&#x70;&#x73;&#46;&#99;&#111;&#x6d;</a></li>
 </ul>
 <h2 id="bugs">BUGS</h2>
 <p>When you find issues, please report them:</p>
@@ -107,7 +107,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="&#x6d;&#97;&#105;&#x6c;&#x74;&#111;&#x3a;&#x6e;&#112;&#109;&#45;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#111;&#x6d;">&#x6e;&#112;&#109;&#45;&#x40;&#103;&#111;&#x6f;&#x67;&#108;&#x65;&#x67;&#114;&#111;&#x75;&#112;&#115;&#x2e;&#99;&#111;&#x6d;</a></li>
+<a href="&#x6d;&#x61;&#x69;&#108;&#116;&#111;&#58;&#x6e;&#112;&#109;&#x2d;&#x40;&#x67;&#111;&#x6f;&#103;&#x6c;&#x65;&#103;&#x72;&#111;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#x6d;">&#x6e;&#112;&#109;&#x2d;&#x40;&#x67;&#111;&#x6f;&#103;&#x6c;&#x65;&#103;&#x72;&#111;&#x75;&#112;&#x73;&#x2e;&#x63;&#111;&#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>
@@ -117,7 +117,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="&#x6d;&#x61;&#x69;&#108;&#x74;&#111;&#58;&#105;&#x40;&#x69;&#x7a;&#x73;&#46;&#109;&#101;">&#105;&#x40;&#x69;&#x7a;&#x73;&#46;&#109;&#101;</a></p>
+<a href="&#109;&#x61;&#x69;&#108;&#116;&#111;&#58;&#105;&#64;&#105;&#122;&#x73;&#x2e;&#x6d;&#x65;">&#105;&#64;&#105;&#122;&#x73;&#x2e;&#x6d;&#x65;</a></p>
 <h2 id="see-also">SEE ALSO</h2>
 <ul>
 <li><a href="../cli/npm-help.html">npm-help(1)</a></li>
index 95f26c6eebf2ba38c1adfe6a7eb8e67d319b0ab4..cc2b12a5eaed63dc9b18bf2f35648746144be66b 100644 (file)
@@ -325,7 +325,7 @@ a specific interface, expected and specified by the host documentation.</p>
 <p>For example:</p>
 <pre><code>{
   &quot;name&quot;: &quot;tea-latte&quot;,
-  &quot;version&quot;: &quot;1.3.5&quot;
+  &quot;version&quot;: &quot;1.3.5&quot;,
   &quot;peerDependencies&quot;: {
     &quot;tea&quot;: &quot;2.x&quot;
   }
index 95f26c6eebf2ba38c1adfe6a7eb8e67d319b0ab4..cc2b12a5eaed63dc9b18bf2f35648746144be66b 100644 (file)
@@ -325,7 +325,7 @@ a specific interface, expected and specified by the host documentation.</p>
 <p>For example:</p>
 <pre><code>{
   &quot;name&quot;: &quot;tea-latte&quot;,
-  &quot;version&quot;: &quot;1.3.5&quot;
+  &quot;version&quot;: &quot;1.3.5&quot;,
   &quot;peerDependencies&quot;: {
     &quot;tea&quot;: &quot;2.x&quot;
   }
index 919d82ebf66f5bbcbfbab83abf95f3f1e8ca8e58..48f179b43553685b36493bbaee2262a070715236 100644 (file)
@@ -42,7 +42,6 @@ defaults if nothing else is specified.</p>
 <li><code>-m</code>: <code>--message</code></li>
 <li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li>
 <li><code>-reg</code>: <code>--registry</code></li>
-<li><code>-v</code>: <code>--version</code></li>
 <li><code>-f</code>: <code>--force</code></li>
 <li><code>-desc</code>: <code>--description</code></li>
 <li><code>-S</code>: <code>--save</code></li>
@@ -363,7 +362,7 @@ for more information, or <a href="../cli/npm-init.html">npm-init(1)</a>.</p>
 <p>The value <code>npm init</code> should use by default for the package license.</p>
 <h3 id="init-version">init-version</h3>
 <ul>
-<li>Default: &quot;0.0.0&quot;</li>
+<li>Default: &quot;1.0.0&quot;</li>
 <li>Type: semver</li>
 </ul>
 <p>The value that <code>npm init</code> should use by default for the package
@@ -581,7 +580,7 @@ optionalDependencies.</p>
 </ul>
 <p>Configure how versions of packages installed to a package.json file via
 <code>--save</code> or <code>--save-dev</code> get prefixed.</p>
-<p>For example if a package has version <code>1.2.3</code>, by default it&#39;s version is
+<p>For example if a package has version <code>1.2.3</code>, by default its version is
 set to <code>^1.2.3</code> which allows minor upgrades for that package, but after
 <code>npm config set save-prefix=&#39;~&#39;</code> it would be set to <code>~1.2.3</code> which only allows
 patch upgrades.</p>
@@ -747,7 +746,6 @@ exit successfully.</p>
 <h2 id="see-also">SEE ALSO</h2>
 <ul>
 <li><a href="../cli/npm-config.html">npm-config(1)</a></li>
-<li><a href="../misc/npm-config.html">npm-config(7)</a></li>
 <li><a href="../files/npmrc.html">npmrc(5)</a></li>
 <li><a href="../misc/npm-scripts.html">npm-scripts(7)</a></li>
 <li><a href="../files/npm-folders.html">npm-folders(5)</a></li>
index d082ec78a67519576f79572b657f4ef0c083cab1..4d64370a006f99d5deece15f606ca01b0c6ed4a6 100644 (file)
@@ -2,7 +2,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="&#109;&#97;&#x69;&#108;&#x74;&#111;&#x3a;&#115;&#117;&#x70;&#x70;&#111;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#46;&#99;&#x6f;&#109;">&#115;&#117;&#x70;&#x70;&#111;&#x72;&#x74;&#x40;&#x6e;&#x70;&#109;&#106;&#x73;&#46;&#99;&#x6f;&#109;</a></li>
+<li>Email the author, CC <a href="&#109;&#x61;&#105;&#x6c;&#x74;&#x6f;&#58;&#x73;&#117;&#112;&#112;&#111;&#114;&#116;&#x40;&#x6e;&#x70;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#x73;&#117;&#112;&#112;&#111;&#114;&#116;&#x40;&#x6e;&#x70;&#109;&#106;&#115;&#x2e;&#99;&#x6f;&#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>
@@ -40,12 +40,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;&#x6c;&#x74;&#111;&#58;&#115;&#x75;&#112;&#112;&#111;&#114;&#116;&#64;&#110;&#112;&#109;&#106;&#x73;&#46;&#99;&#111;&#x6d;">&#115;&#x75;&#112;&#112;&#111;&#114;&#116;&#64;&#110;&#112;&#109;&#106;&#x73;&#46;&#99;&#111;&#x6d;</a> to the CC list of
+adds the npm support staff <a href="&#109;&#x61;&#105;&#108;&#x74;&#111;&#x3a;&#115;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#x40;&#x6e;&#112;&#109;&#x6a;&#115;&#46;&#99;&#x6f;&#x6d;">&#115;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#x40;&#x6e;&#112;&#109;&#x6a;&#115;&#46;&#99;&#x6f;&#x6d;</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="&#x6d;&#97;&#x69;&#108;&#116;&#x6f;&#58;&#x73;&#117;&#112;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#x6d;">&#x73;&#117;&#112;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#x6f;&#x6d;</a> and we&#39;ll sort it out.  (&quot;Reasonable&quot; is
+<a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#x3a;&#x73;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#99;&#111;&#109;">&#x73;&#117;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#x70;&#109;&#106;&#x73;&#x2e;&#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>
index 89d07552961fa5acc94e11332f96021e5d01560a..a81ae02bd2f403743095f635299f761d45d6a6d5 100644 (file)
@@ -225,7 +225,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;&#105;&#x6c;&#116;&#x6f;&#58;&#x73;&#x75;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#112;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;">&#x73;&#x75;&#x70;&#112;&#x6f;&#114;&#x74;&#64;&#x6e;&#112;&#x6d;&#106;&#x73;&#x2e;&#99;&#111;&#x6d;</a>
+<p>If the registry IS down, let us know by emailing <a href="&#x6d;&#x61;&#105;&#x6c;&#x74;&#x6f;&#x3a;&#115;&#x75;&#112;&#x70;&#111;&#114;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;">&#115;&#x75;&#112;&#x70;&#111;&#114;&#x74;&#64;&#x6e;&#x70;&#x6d;&#106;&#115;&#x2e;&#99;&#x6f;&#x6d;</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>
index b7443a7e036aa80e7a18b7cb8d2f008f18231558..a46e74b5ba33c92e1815d1269e0c2e6913089afa 100644 (file)
@@ -119,7 +119,7 @@ Object.defineProperty(exports, "defaults", {get: function () {
   }
 
   defaults = {
-    access : "restricted"
+    access : null
     , "always-auth" : false
 
     , "bin-links" : true
@@ -230,7 +230,7 @@ Object.defineProperty(exports, "defaults", {get: function () {
 }})
 
 exports.types =
-  { access : ["restricted", "public"]
+  { access : [null, "restricted", "public"]
   , "always-auth" : Boolean
   , "bin-links": Boolean
   , browser : [null, String]
@@ -287,7 +287,7 @@ exports.types =
   , prefix: path
   , production: Boolean
   , "proprietary-attribs": Boolean
-  , proxy : [null, url]
+  , proxy : [null, false, url] // allow proxy to be disabled explicitly
   , "rebuild-bundle" : Boolean
   , registry : [null, url]
   , rollback : Boolean
index fe25a8e910c2d084eb5b491e329f1a74384a29c2..f69d81550a367fe1f3de77142e92bcb5bfa50f65 100644 (file)
@@ -35,6 +35,7 @@ var path = require("path")
   , mapToRegistry = require("./utils/map-to-registry.js")
   , npa = require("npm-package-arg")
   , readInstalled = require("read-installed")
+  , long = npm.config.get("long")
 
 function outdated (args, silent, cb) {
   if (typeof cb !== "function") cb = silent, silent = false
@@ -47,12 +48,14 @@ function outdated (args, silent, cb) {
       console.log(makeParseable(list))
     } else {
       var outList = list.map(makePretty)
-      var outTable = [[ "Package"
-                      , "Current"
-                      , "Wanted"
-                      , "Latest"
-                      , "Location"
-                     ]].concat(outList)
+      var outHead = [ "Package"
+                    , "Current"
+                    , "Wanted"
+                    , "Latest"
+                    , "Location"
+                    ]
+      if (long) outHead.push("Package Type")
+      var outTable = [outHead].concat(outList)
 
       if (npm.color) {
         outTable[0] = outTable[0].map(function(heading) {
@@ -69,13 +72,14 @@ function outdated (args, silent, cb) {
   })
 }
 
-// [[ dir, dep, has, want, latest ]]
+// [[ dir, dep, has, want, latest, type ]]
 function makePretty (p) {
   var dep = p[1]
     , dir = path.resolve(p[0], "node_modules", dep)
     , has = p[2]
     , want = p[3]
     , latest = p[4]
+    , type = p[6]
 
   if (!npm.config.get("global")) {
     dir = path.relative(process.cwd(), dir)
@@ -87,12 +91,14 @@ function makePretty (p) {
                 , latest
                 , dirToPrettyLocation(dir)
                 ]
+  if (long) columns[5] = type
 
   if (npm.color) {
     columns[0] = color[has === want ? "yellow" : "red"](columns[0]) // dep
     columns[2] = color.green(columns[2]) // want
     columns[3] = color.magenta(columns[3]) // latest
     columns[4] = color.brightBlack(columns[4]) // dir
+    if (long) columns[5] = color.brightBlack(columns[5]) // type
   }
 
   return columns
@@ -111,17 +117,22 @@ function dirToPrettyLocation (dir) {
 
 function makeParseable (list) {
   return list.map(function (p) {
+
     var dep = p[1]
       , dir = path.resolve(p[0], "node_modules", dep)
       , has = p[2]
       , want = p[3]
       , latest = p[4]
+      , type = p[6]
 
-    return [ dir
+    var out = [ dir
            , dep + "@" + want
            , (has ? (dep + "@" + has) : "MISSING")
            , dep + "@" + latest
-           ].join(":")
+           ]
+   if (long) out.push(type)
+
+   return out.join(":")
   }).join(os.EOL)
 }
 
@@ -137,6 +148,7 @@ function makeJSON (list) {
                 , latest: p[4]
                 , location: dir
                 }
+    if (long) out[p[1]].type = p[6]
   })
   return JSON.stringify(out, null, 2)
 }
@@ -154,13 +166,23 @@ function outdated_ (args, dir, parentHas, depth, cb) {
     return cb(null, [])
   }
   var deps = null
+  var types = {}
   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 (!er) {
+      Object.keys(deps).forEach(function (k) {
+        types[k] = "dependencies"
+      })
+    }
 
     if (npm.config.get("save-dev")) {
       deps = d.devDependencies || {}
+      Object.keys(deps).forEach(function (k) {
+        types[k] = "devDependencies"
+      })
+
       return next()
     }
 
@@ -174,6 +196,9 @@ function outdated_ (args, dir, parentHas, depth, cb) {
 
     if (npm.config.get("save-optional")) {
       deps = d.optionalDependencies || {}
+      Object.keys(deps).forEach(function (k) {
+        types[k] = "optionalDependencies"
+      })
       return next()
     }
 
@@ -186,6 +211,7 @@ function outdated_ (args, dir, parentHas, depth, cb) {
       Object.keys(d.devDependencies || {}).forEach(function (k) {
         if (!(k in parentHas)) {
           deps[k] = d.devDependencies[k]
+          types[k] = "devDependencies"
         }
       })
     }
@@ -236,12 +262,14 @@ function outdated_ (args, dir, parentHas, depth, cb) {
     // if has[dep] !== shouldHave[dep], then cb with the data
     // otherwise dive into the folder
     asyncMap(Object.keys(deps), function (dep, cb) {
-      shouldUpdate(args, dir, dep, has, deps[dep], depth, cb)
+      if (!long) return shouldUpdate(args, dir, dep, has, deps[dep], depth, cb)
+
+      shouldUpdate(args, dir, dep, has, deps[dep], depth, cb, types[dep])
     }, cb)
   }
 }
 
-function shouldUpdate (args, dir, dep, has, req, depth, cb) {
+function shouldUpdate (args, dir, dep, has, req, depth, cb, type) {
   // look up the most recent version.
   // if that's what we already have, or if it's not on the args list,
   // then dive into it.  Otherwise, cb() with the data.
@@ -260,15 +288,14 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
   }
 
   function doIt (wanted, latest) {
-    cb(null, [[ dir, dep, curr && curr.version, wanted, latest, req ]])
-  }
-
-  if (args.length && args.indexOf(dep) === -1) {
-    return skip()
+    if (!long) {
+      return cb(null, [[ dir, dep, curr && curr.version, wanted, latest, req]])
+    }
+    cb(null, [[ dir, dep, curr && curr.version, wanted, latest, req, type]])
   }
 
-  if (npa(req).type === "git")
-    return doIt("git", "git")
+  if (args.length && args.indexOf(dep) === -1) return skip()
+  if (npa(req).type === "git") return doIt("git", "git")
 
   // search for the latest package
   mapToRegistry(dep, npm.config, function (er, uri, auth) {
@@ -318,10 +345,12 @@ function shouldUpdate (args, dir, dep, has, req, depth, cb) {
 
       if (!curr || dFromUrl && cFromUrl && d._from !== curr.from
           || d.version !== curr.version
-          || d.version !== l.version)
+          || d.version !== l.version) {
         doIt(d.version, l.version)
-      else
+      }
+      else {
         skip()
+      }
     }
   }
 }
index 18f45b087970436c0d06243855a3cfaad8723b41..06a3404af9e5ce4d15789708e021644e9b59064e 100644 (file)
@@ -124,12 +124,13 @@ function publish_ (arg, data, isRetry, cachedir, cb) {
 
     // registry-frontdoor cares about the access level, which is only
     // configurable for scoped packages
-    if (npa(data.name).scope) {
+    if (config.get("access")) {
+      if (!npa(data.name).scope && config.get("access") === "restricted") {
+        return cb(new Error("Can't restrict access to unscoped packages."))
+      }
+
       params.access = config.get("access")
     }
-    else {
-      params.access = "public"
-    }
 
     registry.publish(registryBase, params, function (er) {
       if (er && er.code === "EPUBLISHCONFLICT" &&
index 4f274c5c913c3ef621897209b303c2ed05ee5ed5..2d82982aef37569e7c9871e0cb67712b97fc3d04 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM" "1" "January 2015" "" ""
+.TH "NPM" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm\fR \- a JavaScript package manager
 .P
index 9b8e9d99dcab3bd39c6e88a0ae8a73e623896100..307a33747722bb1e0a5e7e45e94189663400ef82 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-ACCESS" "1" "January 2015" "" ""
+.TH "NPM\-ACCESS" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-access\fR \- Set access level on published packages
 .SH SYNOPSIS
index b3abf17b68a1d5c15aa3bebcf8c51b5178adde44..df4372e26d6ca800bc8b29c9ad3dd289e28e35c7 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-ADDUSER" "1" "January 2015" "" ""
+.TH "NPM\-ADDUSER" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-adduser\fR \- Add a registry user account
 .SH SYNOPSIS
index 8f0dc2ba57f9f03976f100e081b726be4cf3f2a2..26d14dfa8c9fdc67537b3a2351f4cb69ef7c369b 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BIN" "1" "January 2015" "" ""
+.TH "NPM\-BIN" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-bin\fR \- Display npm bin folder
 .SH SYNOPSIS
index 5acca82e2de7b8580d905dff66877a4a78d2ef23..94eec9f6ace885a3a4fa9d983336908e0f8366f9 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BUGS" "1" "January 2015" "" ""
+.TH "NPM\-BUGS" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-bugs\fR \- Bugs for a package in a web browser maybe
 .SH SYNOPSIS
index 1179298c5fecf999c3d752999ec5c2a449f8ff89..42f084d72c2a7a93d754eb40ad3c9b314ecacabe 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BUILD" "1" "January 2015" "" ""
+.TH "NPM\-BUILD" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-build\fR \- Build a package
 .SH SYNOPSIS
index 703c795c9b8e6f44c5ddfb231b314881bc6214f3..4da29437910963164b31fdcec7085daf29bf9369 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BUNDLE" "1" "January 2015" "" ""
+.TH "NPM\-BUNDLE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-bundle\fR \- REMOVED
 .SH DESCRIPTION
index 1cf1d7c71767e1800c0665aa85040250f56ca7e0..5ebf49d2549f572b670674c4ab996d6e582c5a0c 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CACHE" "1" "January 2015" "" ""
+.TH "NPM\-CACHE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-cache\fR \- Manipulates packages cache
 .SH SYNOPSIS
index 4cb06491007b20696218619dd93f269d320f15e9..22110a3b6dbedb12188f5bd0b9e51e5da6563cdc 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-COMPLETION" "1" "January 2015" "" ""
+.TH "NPM\-COMPLETION" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-completion\fR \- Tab Completion for npm
 .SH SYNOPSIS
index 716303c41b4b58e9267febfc7e917d10a82b832c..0b14aef1f60ed177aff681f8797d79f90fe33643 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "1" "January 2015" "" ""
+.TH "NPM\-CONFIG" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-config\fR \- Manage the npm configuration files
 .SH SYNOPSIS
index 743a5d027d6ac9dd1e2501c1a649753dad55594c..3ffdf836febfa9f902998861dd2337a56327aefb 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DEDUPE" "1" "January 2015" "" ""
+.TH "NPM\-DEDUPE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-dedupe\fR \- Reduce duplication
 .SH SYNOPSIS
index 95a8fd2515f03374427b3b89e069e105331dfcb4..d2a6c89397560e3daa06d523ba964119e964fec2 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DEPRECATE" "1" "January 2015" "" ""
+.TH "NPM\-DEPRECATE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-deprecate\fR \- Deprecate a version of a package
 .SH SYNOPSIS
index 1d099f960613114f5fce11a8335fa67193fee723..c1a51834dcfa4d94b07c2cdcd72ed972fe153017 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DIST\-TAG" "1" "January 2015" "" ""
+.TH "NPM\-DIST\-TAG" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-dist-tag\fR \- Modify package distribution tags
 .SH SYNOPSIS
index 1feecc263c4e128f0ae0aae9d9e3ac18666873db..2835d042470a857a2df9764ebc7642469d379654 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DOCS" "1" "January 2015" "" ""
+.TH "NPM\-DOCS" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-docs\fR \- Docs for a package in a web browser maybe
 .SH SYNOPSIS
index 1d905d06b993de7ec5ef61b59cb5eb5dafec3678..c260554e6d9402f239f23bf922182b75f07d7d74 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-EDIT" "1" "January 2015" "" ""
+.TH "NPM\-EDIT" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-edit\fR \- Edit an installed package
 .SH SYNOPSIS
index 5f29171a9e410c60ca1379bf32a76edf47b27ccf..527a9f221a8efd149226d1134b11966550de1048 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-EXPLORE" "1" "January 2015" "" ""
+.TH "NPM\-EXPLORE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-explore\fR \- Browse an installed package
 .SH SYNOPSIS
index 524081c93015a6fd417d1227624c7ce9eb25a9c5..3c95739336db25960e219ad989cf08d5c3da7ae5 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP\-SEARCH" "1" "January 2015" "" ""
+.TH "NPM\-HELP\-SEARCH" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-help-search\fR \- Search npm help documentation
 .SH SYNOPSIS
index 0d7f1af03cfb69349be9272caf257ced9a690036..3a43adc48575bc30c50501c547524851afc626e4 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP" "1" "January 2015" "" ""
+.TH "NPM\-HELP" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-help\fR \- Get help on npm
 .SH SYNOPSIS
index d2b6a298d50e22d4da6d40b0a13f5ac0dd003f7c..c145287358cd119dbdec162944aff53bae75efd3 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-INIT" "1" "January 2015" "" ""
+.TH "NPM\-INIT" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-init\fR \- Interactively create a package\.json file
 .SH SYNOPSIS
index ec355effeb655d2c84c71b02baae32a07f68ea05..db564b23f5871d7e111c3eaecf2a04c9b98a0444 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-INSTALL" "1" "January 2015" "" ""
+.TH "NPM\-INSTALL" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-install\fR \- Install a package
 .SH SYNOPSIS
index 86132ed1dd00e575ab53387312e12ff723b221d0..9151b68c0e01fa0f83ed1dbd0fbaf7dc7fd8b54c 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-LINK" "1" "January 2015" "" ""
+.TH "NPM\-LINK" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-link\fR \- Symlink a package folder
 .SH SYNOPSIS
index 53784cbc3991edd83026cb9a252ac058c73737f1..4f2d713e2e9ff1327929ff10f0c78f09b5fbef05 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-LS" "1" "January 2015" "" ""
+.TH "NPM\-LS" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-ls\fR \- List installed packages
 .SH SYNOPSIS
@@ -23,7 +23,7 @@ For example, running \fBnpm ls promzard\fR in npm's source tree will show:
 .P
 .RS 2
 .nf
-npm@2.4.1 /path/to/npm
+npm@2.5.1 /path/to/npm
 └─┬ init\-package\-json@0\.0\.4
   └── promzard@0\.1\.5
 .fi
index a1086ad322219150428968ee8f10cea340f9029f..002fe8887e9cd43afb6957811b8301c294ae2213 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-OUTDATED" "1" "January 2015" "" ""
+.TH "NPM\-OUTDATED" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-outdated\fR \- Check for outdated packages
 .SH SYNOPSIS
index 1c503795c6bcea398f21b074f32ab1387fed24a4..adb6d9d47b361c9bdebfd6d01792333375dc9e13 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-OWNER" "1" "January 2015" "" ""
+.TH "NPM\-OWNER" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-owner\fR \- Manage package owners
 .SH SYNOPSIS
index 3b39d6847a40a37345c4407c58e20f19876a6c56..b52ee1cf958210f1fddf3c85c38deca9c56f9fd9 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PACK" "1" "January 2015" "" ""
+.TH "NPM\-PACK" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-pack\fR \- Create a tarball from a package
 .SH SYNOPSIS
index 2ebdaa6777f614cc6813624b60ed1154c88e8bc2..d22601a16a96dcbfb79204dab3fa2e83758f3b0e 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PREFIX" "1" "January 2015" "" ""
+.TH "NPM\-PREFIX" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-prefix\fR \- Display prefix
 .SH SYNOPSIS
index 7b22233d5d59f2feb0e1171fc59b3edece33a35a..31d1c5cc53334a2e09577fac4cfba4453feba054 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PRUNE" "1" "January 2015" "" ""
+.TH "NPM\-PRUNE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-prune\fR \- Remove extraneous packages
 .SH SYNOPSIS
index d8a6368fc48bbe7f6978141cba0dbb71f751c970..0ffb5284fa779330ff3fd2dfa1e000fc1c2f4000 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PUBLISH" "1" "January 2015" "" ""
+.TH "NPM\-PUBLISH" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-publish\fR \- Publish a package
 .SH SYNOPSIS
index 1bb1e9acb3a5b47c3fe1151cfcfc57f9c2903a5a..b5b89c94234a0344060239525ed2a96bd0474f03 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REBUILD" "1" "January 2015" "" ""
+.TH "NPM\-REBUILD" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-rebuild\fR \- Rebuild a package
 .SH SYNOPSIS
index da8d6c9ad35bfc2c7ac590d232eebfaf22f05b5d..d9cd8441345e1da6fe6a25a380ec6266fb07766d 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REPO" "1" "January 2015" "" ""
+.TH "NPM\-REPO" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-repo\fR \- Open package repository page in the browser
 .SH SYNOPSIS
index 010e8153007a5a084b678bf6f2fc2b8954dc08b5..a769e212fca3098b84c3580e0c7a08e1c4e2ea5b 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RESTART" "1" "January 2015" "" ""
+.TH "NPM\-RESTART" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-restart\fR \- Restart a package
 .SH SYNOPSIS
index 94a0afa733f27a5883cf3cc516a75d43d5ec80ab..e2441e445cd79305c839ef5fed80631be03f80c8 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RM" "1" "January 2015" "" ""
+.TH "NPM\-RM" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-rm\fR \- Remove a package
 .SH SYNOPSIS
index 2067f9e55d2b975081f10be5b86d09f2c14f8c35..43f28d4203badbb55f319756a0c3f043061b73c7 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-ROOT" "1" "January 2015" "" ""
+.TH "NPM\-ROOT" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-root\fR \- Display npm root
 .SH SYNOPSIS
index 24ff5d9583e6220336ee111c582e8dec05dfd5d2..879fccad2decf385f127eb50cc4ae37ba67ae862 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RUN\-SCRIPT" "1" "January 2015" "" ""
+.TH "NPM\-RUN\-SCRIPT" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-run-script\fR \- Run arbitrary package scripts
 .SH SYNOPSIS
index 3f7d19bd8f129cb3392a48da70a68d510b45caf7..316060d12c7bfcf68537d586fa067ff433031ece 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SEARCH" "1" "January 2015" "" ""
+.TH "NPM\-SEARCH" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-search\fR \- Search for packages
 .SH SYNOPSIS
index 5fa9fb16eeff0591467abdae8ce4ff301d06fef3..5d3649e4c38ca27ebcba8e660471c0ff33ca9964 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SHRINKWRAP" "1" "January 2015" "" ""
+.TH "NPM\-SHRINKWRAP" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-shrinkwrap\fR \- Lock down dependency versions
 .SH SYNOPSIS
@@ -117,7 +117,7 @@ This generates npm\-shrinkwrap\.json, which will look something like this:
       "version": "0\.0\.1",
       "dependencies": {
         "C": {
-          "version": "0\.1\.0"
+          "version": "0\.0\.1"
         }
       }
     }
@@ -132,7 +132,7 @@ installs a package with a npm\-shrinkwrap\.json file in the package
 root, the shrinkwrap file (rather than package\.json files) completely
 drives the installation of that package and all of its dependencies
 (recursively)\.  So now the author publishes A@0\.1\.0, and subsequent
-installs of this package will use B@0\.0\.1 and C@0\.1\.0, regardless the
+installs of this package will use B@0\.0\.1 and C@0\.0\.1, regardless the
 dependencies and versions listed in A's, B's, and C's package\.json
 files\.
 .SS Using shrinkwrapped packages
index ced42ecaed737b0052a390bc56d8dd87d845dc97..091271293cfbfc174fab58f3b669a78e3c57af6e 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-STAR" "1" "January 2015" "" ""
+.TH "NPM\-STAR" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-star\fR \- Mark your favorite packages
 .SH SYNOPSIS
index d2124355c4750f0ce0e89eac61db6a773189318d..8aa6ae2bad2f4be908751b49c078bedc94808f88 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-STARS" "1" "January 2015" "" ""
+.TH "NPM\-STARS" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-stars\fR \- View packages marked as favorites
 .SH SYNOPSIS
index 36f0c26bc5855b1fcb351e7d20a09b872f3caa97..574281b500c5b489dbc17bba7350ee4360c177d9 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-START" "1" "January 2015" "" ""
+.TH "NPM\-START" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-start\fR \- Start a package
 .SH SYNOPSIS
index 0a20b4b6d4b20804f7582db96dbd06ee1edfceed..f0fb715c6d11800a4de2dd29f0dcab4ea4cf3045 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-STOP" "1" "January 2015" "" ""
+.TH "NPM\-STOP" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-stop\fR \- Stop a package
 .SH SYNOPSIS
index ed72fa30defdd5ce10e9a76afb4f607ee0729a9d..eb0549e924039bfa1a1b865080aafd03660680e8 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-TAG" "1" "January 2015" "" ""
+.TH "NPM\-TAG" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-tag\fR \- Tag a published version
 .SH SYNOPSIS
index b398e81eaf02c65659365ae61d6d34a9f229df69..c0b873fb0bc1af9cffc9089197975ada834e41e6 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-TEST" "1" "January 2015" "" ""
+.TH "NPM\-TEST" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-test\fR \- Test a package
 .SH SYNOPSIS
index 5568b48371e57f030a7b697e59606873a389a087..d79721bfbfd1d5a40aa0ca9bd3de93c3d99a9e78 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RM" "1" "January 2015" "" ""
+.TH "NPM\-RM" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-rm\fR \- Remove a package
 .SH SYNOPSIS
index 7f96d4f3676d40b901f6dfb0b1b55d13df8ca9dc..906f63069aa3fbc405630a6b098d1758d65578b2 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-UNPUBLISH" "1" "January 2015" "" ""
+.TH "NPM\-UNPUBLISH" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-unpublish\fR \- Remove a package from the registry
 .SH SYNOPSIS
index 969909482c5081d88404fa1a375152a66c1334ed..b200ad94c10bc7bdbab1a2fe29ad325a7e9de7a7 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-UPDATE" "1" "January 2015" "" ""
+.TH "NPM\-UPDATE" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-update\fR \- Update a package
 .SH SYNOPSIS
index 2ae02d093747a49637178c1acb5a6f9a353f5ac2..bbe6784cd6d90fb780f8517d53b36ba471465999 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-VERSION" "1" "January 2015" "" ""
+.TH "NPM\-VERSION" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-version\fR \- Bump a package version
 .SH SYNOPSIS
index 0eb7f3118535b5839a193c580e3c5df3558e1199..187c215d6cabfc701500976835c05c216d674cbe 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-VIEW" "1" "January 2015" "" ""
+.TH "NPM\-VIEW" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-view\fR \- View registry info
 .SH SYNOPSIS
index b993e0c9b53f92565409e07c5e2296a74f6881f8..fe2af1ec0386c4e506548c6e6806bc27745a1f06 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-WHOAMI" "1" "January 2015" "" ""
+.TH "NPM\-WHOAMI" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-whoami\fR \- Display npm username
 .SH SYNOPSIS
index 4fad03714572d68237bb0254a65c6782df3fb451..6794269320721bed84d5f515e4abffd6da14ed5e 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM" "1" "January 2015" "" ""
+.TH "NPM" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm\fR \- javascript package manager
 .SH SYNOPSIS
@@ -10,7 +10,7 @@ npm <command> [args]
 .RE
 .SH VERSION
 .P
-2.4.1
+2.5.1
 .SH DESCRIPTION
 .P
 npm is the package manager for the Node JavaScript platform\.  It puts
index 27588a2407ed0f9c10ccaa2dd5d30488486385fd..667f7188040519e52cc90d3e29ad5441130b7585 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BIN" "3" "January 2015" "" ""
+.TH "NPM\-BIN" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-bin\fR \- Display npm bin folder
 .SH SYNOPSIS
index 6b7503fefd11e326c9a0f21f6e74f772088e6761..eb8eff117a50cbe36e695243736e580be6c33010 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-BUGS" "3" "January 2015" "" ""
+.TH "NPM\-BUGS" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-bugs\fR \- Bugs for a package in a web browser maybe
 .SH SYNOPSIS
index 15a2839cce5a9fa5fd27daf974bdeab2d2cceea0..88a6c8ca2ca366549d7b8d7f039465d6b038bb4f 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CACHE" "3" "January 2015" "" ""
+.TH "NPM\-CACHE" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-cache\fR \- manage the npm cache programmatically
 .SH SYNOPSIS
index ee757dfce766fcaf3945b0a151bc414b9464a36c..e9725c971350638609cb5110eff9959cd7ea6f88 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-COMMANDS" "3" "January 2015" "" ""
+.TH "NPM\-COMMANDS" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-commands\fR \- npm commands
 .SH SYNOPSIS
index be2522cb49c9c7dd822eb344f19368a9db188e79..e0f838af916346c4e17c6e0edbfa8cb94ca97831 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "3" "January 2015" "" ""
+.TH "NPM\-CONFIG" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-config\fR \- Manage the npm configuration files
 .SH SYNOPSIS
index d04e25d43f822018994da3fa405b245f74a34d14..fbbaa693f68c91081115b1d8ad14814b194a172a 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DEPRECATE" "3" "January 2015" "" ""
+.TH "NPM\-DEPRECATE" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-deprecate\fR \- Deprecate a version of a package
 .SH SYNOPSIS
index 4dd5a84f7e2284b763b6640a95c547f92e715d6a..d772f53fa84063bfba706a014b6c5b801af3705f 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DOCS" "3" "January 2015" "" ""
+.TH "NPM\-DOCS" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-docs\fR \- Docs for a package in a web browser maybe
 .SH SYNOPSIS
index d7c2ad4f1de0a09aeb4400ec74d8a05b2d21cbdf..763c78a6baeb2311a1a9e48ef0d74e1a90bc343f 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-EDIT" "3" "January 2015" "" ""
+.TH "NPM\-EDIT" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-edit\fR \- Edit an installed package
 .SH SYNOPSIS
index 8648eac98e3f4d6da04afd5622a4df2716489640..4d55360803f536a6246514bde1a152594013bdd1 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-EXPLORE" "3" "January 2015" "" ""
+.TH "NPM\-EXPLORE" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-explore\fR \- Browse an installed package
 .SH SYNOPSIS
index a9baaf36d9e9864418311063c8f44e41821b01dd..68d29f5e4c98f8cfd0bcf429343c62452443faff 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-HELP\-SEARCH" "3" "January 2015" "" ""
+.TH "NPM\-HELP\-SEARCH" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-help-search\fR \- Search the help pages
 .SH SYNOPSIS
index 9a2ce6bc82e8fac77bebf0501cef218232f8a274..90336149ae3c5cc6968104e41795ab77e99a38b4 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM" "" "January 2015" "" ""
+.TH "NPM" "" "February 2015" "" ""
 .SH "NAME"
 \fBnpm\fR
 .SH SYNOPSIS
index 511791791d16459b8eeae176af6f1257fd70155c..b69cbf97b3b8ced9a92b662acbc02c038c18e8dc 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-INSTALL" "3" "January 2015" "" ""
+.TH "NPM\-INSTALL" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-install\fR \- install a package programmatically
 .SH SYNOPSIS
index 2d5bf77c3c12c410b3a7467e0df732db9e08ef15..9db043993ef42bceb1fa354d0f83f6dfc0da2350 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-LINK" "3" "January 2015" "" ""
+.TH "NPM\-LINK" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-link\fR \- Symlink a package folder
 .SH SYNOPSIS
index 68787c89b1917bcf030b460e30ff7a73c2d6f133..c5ca93a6223c27de74e8e2f91baea4bb6bf41205 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-LOAD" "3" "January 2015" "" ""
+.TH "NPM\-LOAD" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-load\fR \- Load config settings
 .SH SYNOPSIS
index de3d127df64e755d8bcfabb384dbfcf99ffccc97..df41a3ab826483d409fd4374d03230721cbb8067 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-LS" "3" "January 2015" "" ""
+.TH "NPM\-LS" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-ls\fR \- List installed packages
 .SH SYNOPSIS
index 9e96d44ab3f737bd001ae7d1f3ba87cfb2024640..2efa23585901f5975ecb625d89eb6d7c5126a915 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-OUTDATED" "3" "January 2015" "" ""
+.TH "NPM\-OUTDATED" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-outdated\fR \- Check for outdated packages
 .SH SYNOPSIS
index 35a993ba8b3003ef197c7ba60ed9176a2b36efb3..238f3c5da7d4a98cda01aa9166600513966e3e69 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-OWNER" "3" "January 2015" "" ""
+.TH "NPM\-OWNER" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-owner\fR \- Manage package owners
 .SH SYNOPSIS
index 7d95e5751378717dfdacf91dba0e420a6abbf9dc..13fc83a3a215866f2fb72da62e521b59a039bd3b 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PACK" "3" "January 2015" "" ""
+.TH "NPM\-PACK" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-pack\fR \- Create a tarball from a package
 .SH SYNOPSIS
index 4aaed71a734928db07ae2db4abed563f9dcfbad6..68c9f1042b788be22cb25a747fa5a8ddf8addde7 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PREFIX" "3" "January 2015" "" ""
+.TH "NPM\-PREFIX" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-prefix\fR \- Display prefix
 .SH SYNOPSIS
index 310dfe292e0baa28a75643204dc1f650c655bae2..614a551789c38329f257a8cd84149630b4a69ac8 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PRUNE" "3" "January 2015" "" ""
+.TH "NPM\-PRUNE" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-prune\fR \- Remove extraneous packages
 .SH SYNOPSIS
index 28f77205c5450e55cfc6daf42ae7f63120574b65..cf2be78692bb743987a31fe1763c01c08924ccb1 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-PUBLISH" "3" "January 2015" "" ""
+.TH "NPM\-PUBLISH" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-publish\fR \- Publish a package
 .SH SYNOPSIS
index 082589b5de8878503f843ad3ef07c2258c82f801..b79d99604c0ff039aa06a20d59ac8988428d6271 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REBUILD" "3" "January 2015" "" ""
+.TH "NPM\-REBUILD" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-rebuild\fR \- Rebuild a package
 .SH SYNOPSIS
index 64cc0bad698e8ecc74c52b9f7626fea74fc72881..bd0d915a63b1ed5f75b9c93b10a0aaaf346d5423 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REPO" "3" "January 2015" "" ""
+.TH "NPM\-REPO" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-repo\fR \- Open package repository page in the browser
 .SH SYNOPSIS
index 2cacefc5b18d3b27b7919f5a745f013e1e7449dc..5c24f61e28265008500e087a75868bc421f37e57 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RESTART" "3" "January 2015" "" ""
+.TH "NPM\-RESTART" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-restart\fR \- Restart a package
 .SH SYNOPSIS
index 15d5230d170c728dcce91a435a6c1b427d9fb9cb..5c64d99f8497cb1d2fe29a81fdc00e6d401aa581 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-ROOT" "3" "January 2015" "" ""
+.TH "NPM\-ROOT" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-root\fR \- Display npm root
 .SH SYNOPSIS
index 59bf90d965ab64add1ad317745e74c7b32d8ee49..e87405309db192cbd32f0bd083a8760b7db12a61 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-RUN\-SCRIPT" "3" "January 2015" "" ""
+.TH "NPM\-RUN\-SCRIPT" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-run-script\fR \- Run arbitrary package scripts
 .SH SYNOPSIS
index 4fffa3bd960fc2ddd147431e72b7a6d96aff152e..895e8ec1e4e593370e57a67b4026579f8a837574 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SEARCH" "3" "January 2015" "" ""
+.TH "NPM\-SEARCH" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-search\fR \- Search for packages
 .SH SYNOPSIS
index 92ce7b1b2fea9953a64050595c3cc304eb33f1dc..042e394128be0d62153da3adb62a4b55003ca02d 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SHRINKWRAP" "3" "January 2015" "" ""
+.TH "NPM\-SHRINKWRAP" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-shrinkwrap\fR \- programmatically generate package shrinkwrap file
 .SH SYNOPSIS
index f3330a5885e5b3684ee580037980019f9c9a99ca..bba1166e4df6771a47aabcc69e7d50d7b045ab83 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-START" "3" "January 2015" "" ""
+.TH "NPM\-START" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-start\fR \- Start a package
 .SH SYNOPSIS
index 551eedbc12c9080955974d2617427bff63a05f04..e1e536316b0fd2e7363d66a8e06075d8cfb080b1 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-STOP" "3" "January 2015" "" ""
+.TH "NPM\-STOP" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-stop\fR \- Stop a package
 .SH SYNOPSIS
index c0092c274f42744c7b2a9bb2cb5f699644f6f585..ef7e8351a3451e14d780bbe0f26a282b9bb81e54 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-TAG" "3" "January 2015" "" ""
+.TH "NPM\-TAG" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-tag\fR \- Tag a published version
 .SH SYNOPSIS
index ff969ec023d414276c3249124286fd9fd1c297b3..0e9dfdc41ab5256bcdfcf3df8c6766a4a9a8b707 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-TEST" "3" "January 2015" "" ""
+.TH "NPM\-TEST" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-test\fR \- Test a package
 .SH SYNOPSIS
index 0cf637ca2c94628e2617ee0e3fe9631ba03a1234..7920b0188fb05ad688e16acf3913192c7dd504ce 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-UNINSTALL" "3" "January 2015" "" ""
+.TH "NPM\-UNINSTALL" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-uninstall\fR \- uninstall a package programmatically
 .SH SYNOPSIS
index 48f865db19b2e89ed0b6442cabb689e949850030..17c3228a118a0f5b3fa6bfdd9a0347f2c0c0f6ce 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-UNPUBLISH" "3" "January 2015" "" ""
+.TH "NPM\-UNPUBLISH" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-unpublish\fR \- Remove a package from the registry
 .SH SYNOPSIS
index eee573b2d88bbd7a6d4506ad3b6732ee6d740581..81e86907bc34a5a5e5263ee6806c174079b945b5 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-UPDATE" "3" "January 2015" "" ""
+.TH "NPM\-UPDATE" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-update\fR \- Update a package
 .SH SYNOPSIS
@@ -8,7 +8,7 @@
 npm\.commands\.update(packages, callback)
 .fi
 .RE
-.TH "DESCRIPTION" "" "January 2015" "" ""
+.TH "DESCRIPTION" "" "February 2015" "" ""
 .SH "NAME"
 \fBDESCRIPTION\fR
 .P
index 2cf7fe21534e7f9ea94f55b6007418f62f12466c..be5def85553392554dab2279a055f8f34c1f20fd 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-VERSION" "3" "January 2015" "" ""
+.TH "NPM\-VERSION" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-version\fR \- Bump a package version
 .SH SYNOPSIS
index 42bbf40c508faae86110ffe55d5a7963fe9028cd..cbd2dae435513ca3a68de6f52636924e6b32c55f 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-VIEW" "3" "January 2015" "" ""
+.TH "NPM\-VIEW" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-view\fR \- View registry info
 .SH SYNOPSIS
index cb320ec46ab29fd5ee6d549bee93d32287e2d47a..81cda1b89c563c254e2b8a003072638e70aaadcf 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-WHOAMI" "3" "January 2015" "" ""
+.TH "NPM\-WHOAMI" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-whoami\fR \- Display npm username
 .SH SYNOPSIS
index 080c5ac1198576b210ee2ae77d4fdc86dbb1bc21..8fcfc1ebdc66926f30dc74e8b983e557a88f85fb 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM" "3" "January 2015" "" ""
+.TH "NPM" "3" "February 2015" "" ""
 .SH "NAME"
 \fBnpm\fR \- javascript package manager
 .SH SYNOPSIS
@@ -20,7 +20,7 @@ npm\.load([configObject, ]function (er, npm) {
 .RE
 .SH VERSION
 .P
-2.4.1
+2.5.1
 .SH DESCRIPTION
 .P
 This is the API documentation for npm\.
index 2ae88d142af438204382157c110bb9868785b540..2a945b168c97cca480e17f00122855a5367c239a 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-FOLDERS" "5" "January 2015" "" ""
+.TH "NPM\-FOLDERS" "5" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-folders\fR \- Folder Structures Used by npm
 .SH DESCRIPTION
index 2ae88d142af438204382157c110bb9868785b540..2a945b168c97cca480e17f00122855a5367c239a 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-FOLDERS" "5" "January 2015" "" ""
+.TH "NPM\-FOLDERS" "5" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-folders\fR \- Folder Structures Used by npm
 .SH DESCRIPTION
index d54eaddbe12d2cebd7f8b54be3999c7b11244149..e4a928569e638f0290473b2e5c06a22a15b4de40 100644 (file)
@@ -1,4 +1,4 @@
-.TH "PACKAGE\.JSON" "5" "January 2015" "" ""
+.TH "PACKAGE\.JSON" "5" "February 2015" "" ""
 .SH "NAME"
 \fBpackage.json\fR \- Specifics of npm's package\.json handling
 .SH DESCRIPTION
@@ -522,7 +522,7 @@ For example:
 .nf
 {
   "name": "tea\-latte",
-  "version": "1\.3\.5"
+  "version": "1\.3\.5",
   "peerDependencies": {
     "tea": "2\.x"
   }
index fc2986b901df555b5ea38a2049fb505cc2810050..a6b00e811c2a8b3d02de181b63ad71eec4219f59 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPMRC" "5" "January 2015" "" ""
+.TH "NPMRC" "5" "February 2015" "" ""
 .SH "NAME"
 \fBnpmrc\fR \- The npm config files
 .SH DESCRIPTION
index d54eaddbe12d2cebd7f8b54be3999c7b11244149..e4a928569e638f0290473b2e5c06a22a15b4de40 100644 (file)
@@ -1,4 +1,4 @@
-.TH "PACKAGE\.JSON" "5" "January 2015" "" ""
+.TH "PACKAGE\.JSON" "5" "February 2015" "" ""
 .SH "NAME"
 \fBpackage.json\fR \- Specifics of npm's package\.json handling
 .SH DESCRIPTION
@@ -522,7 +522,7 @@ For example:
 .nf
 {
   "name": "tea\-latte",
-  "version": "1\.3\.5"
+  "version": "1\.3\.5",
   "peerDependencies": {
     "tea": "2\.x"
   }
index ebaf0386c23207115a1d651c655487a107cab1d8..3607b86598f99383ca1a82f20acda7260be7c486 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CODING\-STYLE" "7" "January 2015" "" ""
+.TH "NPM\-CODING\-STYLE" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-coding-style\fR \- npm's "funny" coding style
 .SH DESCRIPTION
index a325169983e2ab050d975f0ca4a1b9540aee0c82..a712dce1dac5bd6801e6395298cffd5de69a469e 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-CONFIG" "7" "January 2015" "" ""
+.TH "NPM\-CONFIG" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-config\fR \- More than you probably want to know about npm configuration
 .SH DESCRIPTION
@@ -70,8 +70,6 @@ The following shorthands are parsed on the command\-line:
 .IP \(bu 2
 \fB\-reg\fR: \fB\-\-registry\fR
 .IP \(bu 2
-\fB\-v\fR: \fB\-\-version\fR
-.IP \(bu 2
 \fB\-f\fR: \fB\-\-force\fR
 .IP \(bu 2
 \fB\-desc\fR: \fB\-\-description\fR
@@ -608,7 +606,7 @@ The value \fBnpm init\fR should use by default for the package license\.
 .SS init\-version
 .RS 0
 .IP \(bu 2
-Default: "0\.0\.0"
+Default: "1\.0\.0"
 .IP \(bu 2
 Type: semver
 
@@ -955,7 +953,7 @@ Type: String
 Configure how versions of packages installed to a package\.json file via
 \fB\-\-save\fR or \fB\-\-save\-dev\fR get prefixed\.
 .P
-For example if a package has version \fB1\.2\.3\fR, by default it's version is
+For example if a package has version \fB1\.2\.3\fR, by default its version is
 set to \fB^1\.2\.3\fR which allows minor upgrades for that package, but after
 \fBnpm config set save\-prefix='~'\fR it would be set to \fB~1\.2\.3\fR which only allows
 patch upgrades\.
@@ -1216,8 +1214,6 @@ Set to \fB"browser"\fR to view html help content in the default web browser\.
 .IP \(bu 2
 npm help config
 .IP \(bu 2
-npm help 7 config
-.IP \(bu 2
 npm help 5 npmrc
 .IP \(bu 2
 npm help 7 scripts
index ba47e45fabb1e1ccfcfe2d8cf14212766d02fd11..76eda3cde23b573d1f733b06f62553432d4c8444 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DEVELOPERS" "7" "January 2015" "" ""
+.TH "NPM\-DEVELOPERS" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-developers\fR \- Developer Guide
 .SH DESCRIPTION
index 3d67933982cdc1c604e715ec0540d11dd643393e..136d670b621dce8188a394a1cddc752cda1fd16a 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-DISPUTES" "7" "January 2015" "" ""
+.TH "NPM\-DISPUTES" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-disputes\fR \- Handling Module Name Disputes
 .SH SYNOPSIS
index cf6a37cfdde22b52b057526628cf847eccc73850..45daad65dbaa6f8a76a284444c9ff557021797bb 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-FAQ" "7" "January 2015" "" ""
+.TH "NPM\-FAQ" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-faq\fR \- Frequently Asked Questions
 .SH Where can I find these docs in HTML?
index 7ca7b25606ae16aa8946f50dfd0a156899cd5fa5..f9c996fb78c66b09131627308292d45d51d2942f 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-INDEX" "7" "January 2015" "" ""
+.TH "NPM\-INDEX" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-index\fR \- Index of all npm documentation
 .SS npm help README
index f89b94507e7e3aaf41cb1b5d38823e7d72de41e3..8e53a12a5581301ee21d9e5398f9d877a6f2a42d 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REGISTRY" "7" "January 2015" "" ""
+.TH "NPM\-REGISTRY" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-registry\fR \- The JavaScript Package Registry
 .SH DESCRIPTION
index 2cae9e88c7bb27629010a733b3604001eec143ae..5a32862abbe44941a03018998a1da6ba590a82ae 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SCOPE" "7" "January 2015" "" ""
+.TH "NPM\-SCOPE" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-scope\fR \- Scoped packages
 .SH DESCRIPTION
index 69d880d34f19c03d23b2ef2df309fbbce315eeef..b90484d2f4cb8a212ca95b0f0cf6c7d361f0ee63 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-SCRIPTS" "7" "January 2015" "" ""
+.TH "NPM\-SCRIPTS" "7" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-scripts\fR \- How npm handles the "scripts" field
 .SH DESCRIPTION
index 73963fe3b377870cf411dfc1caeb935ff47c4052..e3f8b027608b420ad93f1c6ed3037cd3fe14dc80 100644 (file)
@@ -1,4 +1,4 @@
-.TH "NPM\-REMOVAL" "1" "January 2015" "" ""
+.TH "NPM\-REMOVAL" "1" "February 2015" "" ""
 .SH "NAME"
 \fBnpm-removal\fR \- Cleaning the Slate
 .SH SYNOPSIS
index bf239f7e621aff9684503105d1ca48e69ba1b99b..de6a8891854e965a770f5e171c7eefcae7cbd61d 100644 (file)
@@ -1,4 +1,4 @@
-.TH "SEMVER" "7" "January 2015" "" ""
+.TH "SEMVER" "7" "February 2015" "" ""
 .SH "NAME"
 \fBsemver\fR \- The semantic versioner for npm
 .SH Usage
diff --git a/deps/npm/node_modules/columnify/Makefile b/deps/npm/node_modules/columnify/Makefile
new file mode 100644 (file)
index 0000000..3ae543a
--- /dev/null
@@ -0,0 +1,9 @@
+
+all: columnify.js
+
+prepublish: all
+
+columnify.js: index.js package.json
+       6to5 index.js > columnify.js
+
+.PHONY: all prepublish
index 43ae36c2c40a3c7e1723f82bcfe2fd4ebc6d8e86..d0deee1bb6b374a8bb0f2f1e0a2806b666ad2a04 100644 (file)
@@ -1,6 +1,10 @@
 # columnify
 
 [![Build Status](https://travis-ci.org/timoxley/columnify.png?branch=master)](https://travis-ci.org/timoxley/columnify)
+[![NPM Version](https://img.shields.io/npm/v/columnify.svg?style=flat)](https://npmjs.org/package/columnify)
+[![License](http://img.shields.io/npm/l/columnify.svg?style=flat)](LICENSE)
+[![Dependency Status](https://david-dm.org/timoxley/columnify.svg)](https://david-dm.org/timoxley/columnify)
+[![devDependency Status](https://david-dm.org/timoxley/columnify/dev-status.svg)](https://david-dm.org/timoxley/columnify#info=devDependencies)
 
 Create text-based columns suitable for console output from objects or
 arrays of objects.
@@ -36,7 +40,6 @@ console.log(columns)
 Objects are converted to a list of key/value pairs:
 
 ```javascript
-
 var data = {
   "commander@0.6.1": 1,
   "minimatch@0.2.14": 3,
@@ -100,15 +103,58 @@ mod1    0.0.1
 module2 0.2.0  
 ```
 
-### Wrapping Column Cells
+### Filtering & Ordering Columns
 
-You can define the maximum width before wrapping for individual cells in
-columns. Minimum width is also supported. Wrapping will happen at word
-boundaries. Empty cells or those which do not fill the max/min width
-will be padded with spaces.
+By default, all properties are converted into columns, whether or not
+they exist on every object or not.
+
+To explicitly specify which columns to include, and in which order,
+supply a "columns" or "include" array ("include" is just an alias).
 
 ```javascript
+var data = [{
+  name: 'module1',
+  description: 'some description',
+  version: '0.0.1',
+}, {
+  name: 'module2',
+  description: 'another description',
+  version: '0.2.0',
+}]
 
+var columns = columnify(data, {
+  columns: ['name', 'version']
+})
+
+console.log(columns)
+```
+
+#### Output:
+```
+NAME    VERSION
+module1 0.0.1
+module2 0.2.0
+```
+
+## Global and Per Column Options
+You can set a number of options at a global level (ie. for all columns) or on a per column basis.
+
+Set options on a per column basis by using the `config` option to specify individual columns:
+
+```javascript
+var columns = columnify(data, {
+  optionName: optionValue,
+  config: {
+    columnName: {optionName: optionValue},
+    columnName: {optionName: optionValue},
+  }
+})
+```
+
+### Maximum and Minimum Column Widths
+As with all options, you can define the `maxWidth` and `minWidth` globally, or for specified columns. By default, wrapping will happen at word boundaries. Empty cells or those which do not fill the `minWidth` will be padded with spaces.
+
+```javascript
 var columns = columnify([{
   name: 'mod1',
   description: 'some description which happens to be far larger than the max',
@@ -117,24 +163,41 @@ var columns = columnify([{
   name: 'module-two',
   description: 'another description larger than the max',
   version: '0.2.0',
+}], {
+  minWidth: 20,
+  config: {
+    description: {maxWidth: 30}
+  }
 })
 
 console.log(columns)
 ```
+
 #### Output:
 ```
-NAME       DESCRIPTION                    VERSION
-mod1       some description which happens 0.0.1
-           to be far larger than the max
-module-two another description larger     0.2.0
-           than the max
+NAME                 DESCRIPTION                    VERSION
+mod1                 some description which happens 0.0.1
+                     to be far larger than the max
+module-two           another description larger     0.2.0
+                     than the max
 ```
 
-### Truncating Column Cells
+#### Maximum Line Width
+
+You can set a hard maximum line width using the `maxLineWidth` option.
+Beyond this value data is unceremoniously truncated with no truncation
+marker.
+
+This can either be a number or 'auto' to set the value to the width of
+stdout.
+
+Setting this value to 'auto' prevent TTY-imposed line-wrapping when
+lines exceed the screen width.
+
+#### Truncating Column Cells Instead of Wrapping
 
 You can disable wrapping and instead truncate content at the maximum
-column width. Truncation respects word boundaries.  A truncation marker,
-`…` will appear next to the last word in any truncated line.
+column width by using the `truncate` option. Truncation respects word boundaries.  A truncation marker, `…`, will appear next to the last word in any truncated line.
 
 ```javascript
 var columns = columnify(data, {
@@ -155,43 +218,9 @@ mod1       some description…    0.0.1
 module-two another description… 0.2.0  
 ```
 
-### Filtering & Ordering Columns
-
-By default, all properties are converted into columns, whether or not
-they exist on every object or not.
-
-To explicitly specify which columns to include, and in which order,
-supply a "columns" or "include" array ("include" is just an alias).
-
-```javascript
-var data = [{
-  name: 'module1',
-  description: 'some description',
-  version: '0.0.1',
-}, {
-  name: 'module2',
-  description: 'another description',
-  version: '0.2.0',
-}]
-
-var columns = columnify(data, {
-  columns: ['name', 'version'] // note description not included
-})
-
-console.log(columns)
-```
-
-#### Output:
-```
-NAME    VERSION
-module1 0.0.1
-module2 0.2.0
-```
-
-
-## Other Configuration Options
 
 ### Align Right/Center
+You can set the alignment of the column data by using the `align` option.
 
 ```js
 var data = {
@@ -211,10 +240,12 @@ commander@2.0.0          1
 debug@0.8.1              1
 ```
 
-Align Center works in a similar way.
+`align: 'center'` works in a similar way.
+
 
+### Padding Character
 
-### Padding
+Set a character to fill whitespace within columns with the `paddingChr` option.
 
 ```js
 var data = {
@@ -232,7 +263,7 @@ shortKey................... veryVeryVeryVeryVeryLongVal
 veryVeryVeryVeryVeryLongKey shortVal...................
 ```
 
-### Preserve existing newlines
+### Preserve Existing Newlines
 
 By default, `columnify` sanitises text by replacing any occurance of 1 or more whitespace characters with a single space.
 
@@ -284,7 +315,7 @@ runforcover@0.0.2 node_modules/tap/node_modules/runforcover
 ### Custom Truncation Marker
 
 You can change the truncation marker to something other than the default
-`…`.
+`…` by using the `truncateMarker` option.
 
 ```javascript
 var columns = columnify(data, {
@@ -309,10 +340,9 @@ module-two another description> 0.2.0
 ### Custom Column Splitter
 
 If your columns need some bling, you can split columns with custom
-characters.
+characters by using the `columnSplitter` option.
 
 ```javascript
-
 var columns = columnify(data, {
   columnSplitter: ' | '
 })
@@ -326,6 +356,48 @@ mod1       | some description which happens to be far larger than the max | 0.0.
 module-two | another description larger than the max                      | 0.2.0
 ```
 
+### Control Header Display
+
+Control whether column headers are displayed by using the `showHeaders` option.
+
+```javascript
+var columns = columnify(data, {
+  showHeaders: false
+})
+```
+
+### Transforming Column Data and Headers
+If you need to modify the presentation of column content or heading content there are two useful options for doing that: `dataTransform` and `headerTransform`. Both of these take a function and need to return a valid string.
+
+```javascript
+var columns = columnify([{
+    name: 'mod1',
+    description: 'SOME DESCRIPTION TEXT.'
+}, {
+    name: 'module-two',
+    description: 'SOME SLIGHTLY LONGER DESCRIPTION TEXT.'
+}], {
+    dataTransform: function(data) {
+        return data.toLowerCase()
+    },
+    config: {
+        name: {
+            headingTransform: function(heading) {
+              heading = "module " + heading
+              return "*" +  heading.toUpperCase() + "*"
+            }
+        }
+    }
+})
+```
+#### Output:
+```
+*MODULE NAME* DESCRIPTION
+mod1          some description text.
+module-two    some slightly longer description text.
+```
+
+
 ## Multibyte Character Support
 
 `columnify` uses [mycoboco/wcwidth.js](https://github.com/mycoboco/wcwidth.js) to calculate length of multibyte characters:
@@ -362,6 +434,25 @@ module-one               some description                   0.0.1
 这是一个很长的名字的模块 这真的是一个描述的内容这个描述很长 0.3.3
 ```
 
+## Contributions
+
+```
+ project  : columnify
+ repo age : 1 year, 2 months
+ active   : 32 days
+ commits  : 120
+ files    : 54
+ authors  :
+    90 Tim Oxley           75.0%
+     8 Tim                 6.7%
+     7 Arjun Mehta         5.8%
+     6 Dany                5.0%
+     5 Wei Gao             4.2%
+     2 Dany Shaanan        1.7%
+     1 Seth Miller         0.8%
+     1 Isaac Z. Schlueter  0.8%
+```
+
 ## License
 
 MIT
diff --git a/deps/npm/node_modules/columnify/columnify.js b/deps/npm/node_modules/columnify/columnify.js
new file mode 100644 (file)
index 0000000..912ab84
--- /dev/null
@@ -0,0 +1,300 @@
+"use strict";
+
+var _toArray = function (arr) { return Array.isArray(arr) ? arr : Array.from(arr); };
+
+var wcwidth = require("./width");
+var _require = require("./utils");
+
+var padRight = _require.padRight;
+var padCenter = _require.padCenter;
+var padLeft = _require.padLeft;
+var splitIntoLines = _require.splitIntoLines;
+var splitLongWords = _require.splitLongWords;
+var truncateString = _require.truncateString;
+
+
+var DEFAULT_HEADING_TRANSFORM = function (key) {
+  return key.toUpperCase();
+};
+
+var DEFAULT_DATA_TRANSFORM = function (cell, column, index) {
+  return cell;
+};
+
+var DEFAULTS = Object.freeze({
+  maxWidth: Infinity,
+  minWidth: 0,
+  columnSplitter: " ",
+  truncate: false,
+  truncateMarker: "…",
+  preserveNewLines: false,
+  paddingChr: " ",
+  showHeaders: true,
+  headingTransform: DEFAULT_HEADING_TRANSFORM,
+  dataTransform: DEFAULT_DATA_TRANSFORM
+});
+
+module.exports = function (items) {
+  var options = arguments[1] === undefined ? {} : arguments[1];
+
+
+  var columnConfigs = options.config || {};
+  delete options.config; // remove config so doesn't appear on every column.
+
+  var maxLineWidth = options.maxLineWidth || Infinity;
+  if (maxLineWidth === "auto") maxLineWidth = process.stdout.columns || Infinity;
+  delete options.maxLineWidth; // this is a line control option, don't pass it to column
+
+  // Option defaults inheritance:
+  // options.config[columnName] => options => DEFAULTS
+  options = mixin({}, DEFAULTS, options);
+
+  options.config = options.config || Object.create(null);
+
+  options.spacing = options.spacing || "\n"; // probably useless
+  options.preserveNewLines = !!options.preserveNewLines;
+  options.showHeaders = !!options.showHeaders;
+  options.columns = options.columns || options.include; // alias include/columns, prefer columns if supplied
+  var columnNames = options.columns || []; // optional user-supplied columns to include
+
+  items = toArray(items, columnNames);
+
+  // if not suppled column names, automatically determine columns from data keys
+  if (!columnNames.length) {
+    items.forEach(function (item) {
+      for (var columnName in item) {
+        if (columnNames.indexOf(columnName) === -1) columnNames.push(columnName);
+      }
+    });
+  }
+
+  // initialize column defaults (each column inherits from options.config)
+  var columns = columnNames.reduce(function (columns, columnName) {
+    var column = Object.create(options);
+    columns[columnName] = mixin(column, columnConfigs[columnName]);
+    return columns;
+  }, Object.create(null));
+
+  // sanitize column settings
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    column.name = columnName;
+    column.maxWidth = Math.ceil(column.maxWidth);
+    column.minWidth = Math.ceil(column.minWidth);
+    column.truncate = !!column.truncate;
+    column.align = column.align || "left";
+  });
+
+  // sanitize data
+  items = items.map(function (item) {
+    var result = Object.create(null);
+    columnNames.forEach(function (columnName) {
+      // null/undefined -> ''
+      result[columnName] = item[columnName] != null ? item[columnName] : "";
+      // toString everything
+      result[columnName] = "" + result[columnName];
+      if (columns[columnName].preserveNewLines) {
+        // merge non-newline whitespace chars
+        result[columnName] = result[columnName].replace(/[^\S\n]/gmi, " ");
+      } else {
+        // merge all whitespace chars
+        result[columnName] = result[columnName].replace(/\s/gmi, " ");
+      }
+    });
+    return result;
+  });
+
+  // transform data cells
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    items = items.map(function (item, index) {
+      var col = Object.create(column);
+      item[columnName] = column.dataTransform(item[columnName], col, index);
+
+      var changedKeys = Object.keys(col);
+      // disable default heading transform if we wrote to column.name
+      if (changedKeys.indexOf("name") !== -1) {
+        if (column.headingTransform !== DEFAULT_HEADING_TRANSFORM) return;
+        column.headingTransform = function (heading) {
+          return heading;
+        };
+      }
+      changedKeys.forEach(function (key) {
+        return column[key] = col[key];
+      });
+      return item;
+    });
+  });
+
+  // add headers
+  var headers = {};
+  if (options.showHeaders) {
+    columnNames.forEach(function (columnName) {
+      var column = columns[columnName];
+      headers[columnName] = column.headingTransform(column.name);
+    });
+    items.unshift(headers);
+  }
+  // get actual max-width between min & max
+  // based on length of data in columns
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    column.width = items.map(function (item) {
+      return item[columnName];
+    }).reduce(function (min, cur) {
+      return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, wcwidth(cur))));
+    }, 0);
+  });
+
+  // split long words so they can break onto multiple lines
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    items = items.map(function (item) {
+      item[columnName] = splitLongWords(item[columnName], column.width, column.truncateMarker);
+      return item;
+    });
+  });
+
+  // wrap long lines. each item is now an array of lines.
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    items = items.map(function (item, index) {
+      var cell = item[columnName];
+      item[columnName] = splitIntoLines(cell, column.width);
+
+      // if truncating required, only include first line + add truncation char
+      if (column.truncate && item[columnName].length > 1) {
+        item[columnName] = splitIntoLines(cell, column.width - wcwidth(column.truncateMarker));
+        var firstLine = item[columnName][0];
+        if (!endsWith(firstLine, column.truncateMarker)) item[columnName][0] += column.truncateMarker;
+        item[columnName] = item[columnName].slice(0, 1);
+      }
+      return item;
+    });
+  });
+
+  // recalculate column widths from truncated output/lines
+  columnNames.forEach(function (columnName) {
+    var column = columns[columnName];
+    column.width = items.map(function (item) {
+      return item[columnName].reduce(function (min, cur) {
+        return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, wcwidth(cur))));
+      }, 0);
+    }).reduce(function (min, cur) {
+      return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, cur)));
+    }, 0);
+  });
+
+
+  var rows = createRows(items, columns, columnNames, options.paddingChr); // merge lines into rows
+  // conceive output
+  return rows.reduce(function (output, row) {
+    return output.concat(row.reduce(function (rowOut, line) {
+      return rowOut.concat(line.join(options.columnSplitter));
+    }, []));
+  }, []).map(function (line) {
+    return truncateString(line, maxLineWidth);
+  }).join(options.spacing);
+};
+
+/**
+ * Convert wrapped lines into rows with padded values.
+ *
+ * @param Array items data to process
+ * @param Array columns column width settings for wrapping
+ * @param Array columnNames column ordering
+ * @return Array items wrapped in arrays, corresponding to lines
+ */
+
+function createRows(items, columns, columnNames, paddingChr) {
+  return items.map(function (item) {
+    var row = [];
+    var numLines = 0;
+    columnNames.forEach(function (columnName) {
+      numLines = Math.max(numLines, item[columnName].length);
+    });
+    // combine matching lines of each rows
+    for (var i = 0; i < numLines; i++) {
+      (function (i) {
+        row[i] = row[i] || [];
+        columnNames.forEach(function (columnName) {
+          var column = columns[columnName];
+          var val = item[columnName][i] || ""; // || '' ensures empty columns get padded
+          if (column.align === "right") row[i].push(padLeft(val, column.width, paddingChr));else if (column.align === "center" || column.align === "centre") row[i].push(padCenter(val, column.width, paddingChr));else row[i].push(padRight(val, column.width, paddingChr));
+        });
+      })(i);
+    }
+    return row;
+  });
+}
+
+/**
+ * Object.assign
+ *
+ * @return Object Object with properties mixed in.
+ */
+
+function mixin() {
+  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+    args[_key] = arguments[_key];
+  }
+
+  if (Object.assign) return Object.assign.apply(Object, _toArray(args));
+  return ObjectAssign.apply(undefined, _toArray(args));
+}
+
+function ObjectAssign(target, firstSource) {
+  "use strict";
+  if (target === undefined || target === null) throw new TypeError("Cannot convert first argument to object");
+
+  var to = Object(target);
+
+  var hasPendingException = false;
+  var pendingException;
+
+  for (var i = 1; i < arguments.length; i++) {
+    var nextSource = arguments[i];
+    if (nextSource === undefined || nextSource === null) continue;
+
+    var keysArray = Object.keys(Object(nextSource));
+    for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
+      var nextKey = keysArray[nextIndex];
+      try {
+        var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
+        if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey];
+      } catch (e) {
+        if (!hasPendingException) {
+          hasPendingException = true;
+          pendingException = e;
+        }
+      }
+    }
+
+    if (hasPendingException) throw pendingException;
+  }
+  return to;
+}
+
+/**
+ * Adapted from String.prototype.endsWith polyfill.
+ */
+
+function endsWith(target, searchString, position) {
+  position = position || target.length;
+  position = position - searchString.length;
+  var lastIndex = target.lastIndexOf(searchString);
+  return lastIndex !== -1 && lastIndex === position;
+}
+
+
+function toArray(items, columnNames) {
+  if (Array.isArray(items)) return items;
+  var rows = [];
+  for (var key in items) {
+    var item = {};
+    item[columnNames[0] || "key"] = key;
+    item[columnNames[1] || "value"] = items[key];
+    rows.push(item);
+  }
+  return rows;
+}
index 8c15c993eaf1bed46984f1f079b8fcf7d931de91..781e683aa866a94c7aea7178d5a9c507cc0f908c 100644 (file)
@@ -1,23 +1,20 @@
 "use strict"
 
-var wcwidth = require('./width')
-var utils = require('./utils')
-var padRight = utils.padRight
-var padCenter = utils.padCenter
-var padLeft = utils.padLeft
-var splitIntoLines = utils.splitIntoLines
-var splitLongWords = utils.splitLongWords
-var truncateString = utils.truncateString
-
-var DEFAULT_HEADING_TRANSFORM = function(key) {
-  return key.toUpperCase()
-}
+const wcwidth = require('./width')
+const {
+  padRight,
+  padCenter,
+  padLeft,
+  splitIntoLines,
+  splitLongWords,
+  truncateString
+} = require('./utils')
 
-var DEFAULT_DATA_TRANSFORM = function(cell, column, index) {
-  return cell
-}
+const DEFAULT_HEADING_TRANSFORM = key => key.toUpperCase()
+
+const DEFAULT_DATA_TRANSFORM = (cell, column, index) => cell
 
-var DEFAULTS = {
+const DEFAULTS = Object.freeze({
   maxWidth: Infinity,
   minWidth: 0,
   columnSplitter: ' ',
@@ -28,50 +25,50 @@ var DEFAULTS = {
   showHeaders: true,
   headingTransform: DEFAULT_HEADING_TRANSFORM,
   dataTransform: DEFAULT_DATA_TRANSFORM
-}
-
-module.exports = function(items, options) {
+})
 
-  options = options || {}
+module.exports = function(items, options = {}) {
 
-  var columnConfigs = options.config || {}
+  let columnConfigs = options.config || {}
   delete options.config // remove config so doesn't appear on every column.
 
-  var maxLineWidth = options.maxLineWidth || Infinity
+  let maxLineWidth = options.maxLineWidth || Infinity
+  if (maxLineWidth === 'auto') maxLineWidth = process.stdout.columns || Infinity
   delete options.maxLineWidth // this is a line control option, don't pass it to column
 
   // Option defaults inheritance:
   // options.config[columnName] => options => DEFAULTS
-  options = mixin(options, DEFAULTS)
+  options = mixin({}, DEFAULTS, options)
+
   options.config = options.config || Object.create(null)
 
   options.spacing = options.spacing || '\n' // probably useless
   options.preserveNewLines = !!options.preserveNewLines
   options.showHeaders = !!options.showHeaders;
   options.columns = options.columns || options.include // alias include/columns, prefer columns if supplied
-  var columnNames = options.columns || [] // optional user-supplied columns to include
+  let columnNames = options.columns || [] // optional user-supplied columns to include
 
   items = toArray(items, columnNames)
 
   // if not suppled column names, automatically determine columns from data keys
   if (!columnNames.length) {
     items.forEach(function(item) {
-      for (var columnName in item) {
+      for (let columnName in item) {
         if (columnNames.indexOf(columnName) === -1) columnNames.push(columnName)
       }
     })
   }
 
   // initialize column defaults (each column inherits from options.config)
-  var columns = columnNames.reduce(function(columns, columnName) {
-    var column = Object.create(options)
+  let columns = columnNames.reduce((columns, columnName) => {
+    let column = Object.create(options)
     columns[columnName] = mixin(column, columnConfigs[columnName])
     return columns
   }, Object.create(null))
 
   // sanitize column settings
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
     column.name = columnName
     column.maxWidth = Math.ceil(column.maxWidth)
     column.minWidth = Math.ceil(column.minWidth)
@@ -80,9 +77,9 @@ module.exports = function(items, options) {
   })
 
   // sanitize data
-  items = items.map(function(item) {
-    var result = Object.create(null)
-    columnNames.forEach(function(columnName) {
+  items = items.map(item => {
+    let result = Object.create(null)
+    columnNames.forEach(columnName => {
       // null/undefined -> ''
       result[columnName] = item[columnName] != null ? item[columnName] : ''
       // toString everything
@@ -99,94 +96,92 @@ module.exports = function(items, options) {
   })
 
   // transform data cells
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
-    items = items.map(function(item, index) {
-      var col = Object.create(column)
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
+    items = items.map((item, index) => {
+      let col = Object.create(column)
       item[columnName] = column.dataTransform(item[columnName], col, index)
 
-      var changedKeys = Object.keys(col)
+      let changedKeys = Object.keys(col)
       // disable default heading transform if we wrote to column.name
       if (changedKeys.indexOf('name') !== -1) {
         if (column.headingTransform !== DEFAULT_HEADING_TRANSFORM) return
-        column.headingTransform = function(heading) {return heading}
+        column.headingTransform = heading => heading
       }
-      changedKeys.forEach(function(key) {
-        column[key] = col[key]
-      })
+      changedKeys.forEach(key => column[key] = col[key])
       return item
     })
   })
 
   // add headers
-  var headers = {}
+  let headers = {}
   if(options.showHeaders) {
-    columnNames.forEach(function(columnName) {
-      var column = columns[columnName]
+    columnNames.forEach(columnName => {
+      let column = columns[columnName]
       headers[columnName] = column.headingTransform(column.name)
     })
     items.unshift(headers)
   }
   // get actual max-width between min & max
   // based on length of data in columns
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
-    column.width = items.map(function(item) {
-      return item[columnName]
-    }).reduce(function(min, cur) {
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
+    column.width = items
+    .map(item => item[columnName])
+    .reduce((min, cur) => {
       return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, wcwidth(cur))))
     }, 0)
   })
 
   // split long words so they can break onto multiple lines
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
-    items = items.map(function(item) {
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
+    items = items.map(item => {
       item[columnName] = splitLongWords(item[columnName], column.width, column.truncateMarker)
       return item
     })
   })
 
   // wrap long lines. each item is now an array of lines.
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
-    items = items.map(function(item, index) {
-      var cell = item[columnName]
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
+    items = items.map((item, index) => {
+      let cell = item[columnName]
       item[columnName] = splitIntoLines(cell, column.width)
 
       // if truncating required, only include first line + add truncation char
       if (column.truncate && item[columnName].length > 1) {
-          item[columnName] = splitIntoLines(cell, column.width - wcwidth(column.truncateMarker))
-          var firstLine = item[columnName][0]
-          if (!endsWith(firstLine, column.truncateMarker)) item[columnName][0] += column.truncateMarker
-          item[columnName] = item[columnName].slice(0, 1)
+        item[columnName] = splitIntoLines(cell, column.width - wcwidth(column.truncateMarker))
+        let firstLine = item[columnName][0]
+        if (!endsWith(firstLine, column.truncateMarker)) item[columnName][0] += column.truncateMarker
+        item[columnName] = item[columnName].slice(0, 1)
       }
       return item
     })
   })
 
   // recalculate column widths from truncated output/lines
-  columnNames.forEach(function(columnName) {
-    var column = columns[columnName]
-    column.width = items.map(function(item) {
-      return item[columnName].reduce(function(min, cur) {
+  columnNames.forEach(columnName => {
+    let column = columns[columnName]
+    column.width = items.map(item => {
+      return item[columnName].reduce((min, cur) => {
         return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, wcwidth(cur))))
       }, 0)
-    }).reduce(function(min, cur) {
+    }).reduce((min, cur) => {
       return Math.max(min, Math.min(column.maxWidth, Math.max(column.minWidth, cur)))
     }, 0)
   })
 
 
-  var rows = createRows(items, columns, columnNames, options.paddingChr) // merge lines into rows
+  let rows = createRows(items, columns, columnNames, options.paddingChr) // merge lines into rows
   // conceive output
-  return rows.reduce(function(output, row) {
-    return output.concat(row.reduce(function(rowOut, line) {
+  return rows.reduce((output, row) => {
+    return output.concat(row.reduce((rowOut, line) => {
       return rowOut.concat(line.join(options.columnSplitter))
     }, []))
-  }, []).map(function(line) {
-    return truncateString(line, maxLineWidth)
-  }).join(options.spacing)
+  }, [])
+  .map(line => truncateString(line, maxLineWidth))
+  .join(options.spacing)
 }
 
 /**
@@ -199,18 +194,18 @@ module.exports = function(items, options) {
  */
 
 function createRows(items, columns, columnNames, paddingChr) {
-  return items.map(function(item) {
-    var row = []
-    var numLines = 0
-    columnNames.forEach(function(columnName) {
+  return items.map(item => {
+    let row = []
+    let numLines = 0
+    columnNames.forEach(columnName => {
       numLines = Math.max(numLines, item[columnName].length)
     })
     // combine matching lines of each rows
-    for (var i = 0; i < numLines; i++) {
+    for (let i = 0; i < numLines; i++) {
       row[i] = row[i] || []
-      columnNames.forEach(function(columnName) {
-        var column = columns[columnName]
-        var val = item[columnName][i] || '' // || '' ensures empty columns get padded
+      columnNames.forEach(columnName => {
+        let column = columns[columnName]
+        let val = item[columnName][i] || '' // || '' ensures empty columns get padded
         if (column.align === 'right') row[i].push(padLeft(val, column.width, paddingChr))
         else if (column.align === 'center' || column.align === 'centre') row[i].push(padCenter(val, column.width, paddingChr))
         else row[i].push(padRight(val, column.width, paddingChr))
@@ -221,22 +216,50 @@ function createRows(items, columns, columnNames, paddingChr) {
 }
 
 /**
- * Generic source->target mixin.
- * Copy properties from `source` into `target` if target doesn't have them.
- * Destructive. Modifies `target`.
+ * Object.assign
  *
- * @param target Object target for mixin properties.
- * @param source Object source of mixin properties.
- * @return Object `target` after mixin applied.
+ * @return Object Object with properties mixed in.
  */
 
-function mixin(target, source) {
-  source = source || {}
-  for (var key in source) {
-    if (target.hasOwnProperty(key)) continue
-    target[key] = source[key]
+function mixin(...args) {
+  if (Object.assign) return Object.assign(...args)
+  return ObjectAssign(...args)
+}
+
+function ObjectAssign(target, firstSource) {
+  "use strict";
+  if (target === undefined || target === null)
+    throw new TypeError("Cannot convert first argument to object");
+
+  var to = Object(target);
+
+  var hasPendingException = false;
+  var pendingException;
+
+  for (var i = 1; i < arguments.length; i++) {
+    var nextSource = arguments[i];
+    if (nextSource === undefined || nextSource === null)
+      continue;
+
+    var keysArray = Object.keys(Object(nextSource));
+    for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
+      var nextKey = keysArray[nextIndex];
+      try {
+        var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
+        if (desc !== undefined && desc.enumerable)
+          to[nextKey] = nextSource[nextKey];
+      } catch (e) {
+        if (!hasPendingException) {
+          hasPendingException = true;
+          pendingException = e;
+        }
+      }
+    }
+
+    if (hasPendingException)
+      throw pendingException;
   }
-  return target
+  return to;
 }
 
 /**
@@ -246,16 +269,16 @@ function mixin(target, source) {
 function endsWith(target, searchString, position) {
   position = position || target.length;
   position = position - searchString.length;
-  var lastIndex = target.lastIndexOf(searchString);
+  let lastIndex = target.lastIndexOf(searchString);
   return lastIndex !== -1 && lastIndex === position;
 }
 
 
 function toArray(items, columnNames) {
   if (Array.isArray(items)) return items
-  var rows = []
-  for (var key in items) {
-    var item = {}
+  let rows = []
+  for (let key in items) {
+    let item = {}
     item[columnNames[0] || 'key'] = key
     item[columnNames[1] || 'value'] = items[key]
     rows.push(item)
index 5b9546aabf8a2ecf266dc0e7476ed1133c222a7b..b83f63b907e2e0409c96bebf842339b528b771c4 100755 (executable)
@@ -34,12 +34,12 @@ if (argv.indexOf('--version') !== -1) {
        return;
 }
 
-if (process.stdin.isTTY) {
-       if (!input) {
-               help();
-               return;
-       }
+if (!input && process.stdin.isTTY) {
+       help();
+       return;
+}
 
+if (input) {
        init(fs.readFileSync(input, 'utf8'));
 } else {
        process.stdin.setEncoding('utf8');
index 89d1041bd7a8b8555d73a5ced3d7e0c584a256dd..f04f66f75d111eac18d1f9062dbdbcad9a6f3738 100644 (file)
@@ -1,11 +1,11 @@
 {
   "name": "strip-ansi",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Strip ANSI escape codes",
   "license": "MIT",
   "repository": {
     "type": "git",
-    "url": "git://github.com/sindresorhus/strip-ansi"
+    "url": "https://github.com/sindresorhus/strip-ansi"
   },
   "author": {
     "name": "Sindre Sorhus",
   "devDependencies": {
     "mocha": "*"
   },
-  "gitHead": "c5e780acc07532f5d651cfb6ea035198095c6c74",
+  "gitHead": "1eff0936c01f89efa312d9d51deed137259871a1",
   "bugs": {
     "url": "https://github.com/sindresorhus/strip-ansi/issues"
   },
   "homepage": "https://github.com/sindresorhus/strip-ansi",
-  "_id": "strip-ansi@2.0.0",
-  "_shasum": "fa8d69432e97674746f55f51d076ae78b18df13f",
+  "_id": "strip-ansi@2.0.1",
+  "_shasum": "df62c1aa94ed2f114e1d0f21fd1d50482b79a60e",
   "_from": "strip-ansi@>=2.0.0 <3.0.0",
-  "_npmVersion": "1.4.14",
+  "_npmVersion": "1.4.28",
   "_npmUser": {
     "name": "sindresorhus",
     "email": "sindresorhus@gmail.com"
     }
   ],
   "dist": {
-    "shasum": "fa8d69432e97674746f55f51d076ae78b18df13f",
-    "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.0.tgz"
+    "shasum": "df62c1aa94ed2f114e1d0f21fd1d50482b79a60e",
+    "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.0.tgz",
-  "readme": "ERROR: No README data found!"
+  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz"
 }
index 5477079d00f9531a75cb55b31cfbd24b86b56771..53ec26436ca545acc8bf712c543af0c73b3f3245 100644 (file)
@@ -15,7 +15,7 @@ $ npm install --save strip-ansi
 ```js
 var stripAnsi = require('strip-ansi');
 
-stripAnsi('\x1b[4mcake\x1b[0m');
+stripAnsi('\u001b[4mcake\u001b[0m');
 //=> 'cake'
 ```
 
@@ -29,12 +29,12 @@ $ npm install --global strip-ansi
 ```sh
 $ strip-ansi --help
 
-Usage
-  $ strip-ansi <input-file> > <output-file>
-  $ cat <input-file> | strip-ansi > <output-file>
+  Usage
+    strip-ansi <input-file> > <output-file>
+    cat <input-file> | strip-ansi > <output-file>
 
-Example
-  $ strip-ansi unicorn.txt > unicorn-stripped.txt
+  Example
+    strip-ansi unicorn.txt > unicorn-stripped.txt
 ```
 
 
index 4744d9dc3f7f7b8d630d8fa7516e1082b5a3ec14..49fc6f0408a7a547035e2480f0db1bce5697b8c9 100644 (file)
@@ -56,5 +56,6 @@
     "shasum": "02d059ff7a8fc741e0f6b5da1e69b2b40daeca6f",
     "tarball": "http://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz"
   },
-  "_resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz"
+  "_resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz",
+  "readme": "ERROR: No README data found!"
 }
index c60e1d9de6bbe6e272528123940d071946874603..a275672342d3991af9a2cd7a631bf2d859fd7f5f 100644 (file)
@@ -1,18 +1,20 @@
 {
   "name": "columnify",
-  "version": "1.3.2",
+  "version": "1.4.1",
   "description": "Render data in text columns. supports in-column text-wrap.",
-  "main": "index.js",
+  "main": "columnify.js",
   "scripts": {
     "pretest": "npm prune",
-    "test": "tape test/*.js | tap-spec",
-    "bench": "npm test && node bench"
+    "test": "make prepublish && tape test/*.js | tap-spec",
+    "bench": "npm test && node bench",
+    "prepublish": "make prepublish"
   },
   "author": {
     "name": "Tim Oxley"
   },
   "license": "MIT",
   "devDependencies": {
+    "6to5": "^3.0.9",
     "chalk": "^0.5.1",
     "tap-spec": "^2.1.1",
     "tape": "^3.0.3"
   "directories": {
     "test": "test"
   },
-  "gitHead": "5c7d4363a8d6178f0d415e8bdaf692281fe71975",
-  "_id": "columnify@1.3.2",
-  "_shasum": "61bd578a9269ae6fd949ce36fff589f3702c7867",
-  "_from": "columnify@>=1.3.2 <1.4.0",
-  "_npmVersion": "2.1.10",
-  "_nodeVersion": "0.10.33",
+  "gitHead": "24371e9c12287ce4d28f19d704a28059f3acd42b",
+  "_id": "columnify@1.4.1",
+  "_shasum": "30555796379865b016189c228cb0061764270ed0",
+  "_from": "columnify@>=1.4.1 <1.5.0",
+  "_npmVersion": "2.3.0",
+  "_nodeVersion": "0.10.35",
   "_npmUser": {
     "name": "timoxley",
     "email": "secoif@gmail.com"
@@ -58,8 +60,8 @@
     }
   ],
   "dist": {
-    "shasum": "61bd578a9269ae6fd949ce36fff589f3702c7867",
-    "tarball": "http://registry.npmjs.org/columnify/-/columnify-1.3.2.tgz"
+    "shasum": "30555796379865b016189c228cb0061764270ed0",
+    "tarball": "http://registry.npmjs.org/columnify/-/columnify-1.4.1.tgz"
   },
-  "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.3.2.tgz"
+  "_resolved": "https://registry.npmjs.org/columnify/-/columnify-1.4.1.tgz"
 }
index 8b1bbf94f0c8b9d3d523245c1dd18cb531aa4939..0700813b6797fcf8825bac4f9a44b033f5d57e12 100644 (file)
@@ -195,7 +195,7 @@ function endChmod (me, want, current, path, cb) {
 function endChown (me, want, current, path, cb) {
   // Don't even try it unless root.  Too easy to EPERM.
   if (process.platform === "win32") return cb()
-  if (!process.getuid || !process.getuid() === 0) return cb()
+  if (!process.getuid || process.getuid() !== 0) return cb()
   if (typeof want.uid !== "number" &&
       typeof want.gid !== "number" ) return cb()
 
index f920c10036b75d61e649611bf00e2ecd0e1f73cc..6b2de73a2fdaed03b8eb36b63fe10cc231f24ef8 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "fstream",
   "description": "Advanced file system stream things",
-  "version": "1.0.3",
+  "version": "1.0.4",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/fstream.git"
   "license": "BSD",
   "readme": "Like FS streams, but with stat on them, and supporting directories and\nsymbolic links, as well as normal files.  Also, you can use this to set\nthe stats on a file, even if you don't change its contents, or to create\na symlink, etc.\n\nSo, for example, you can \"write\" a directory, and it'll call `mkdir`.  You\ncan specify a uid and gid, and it'll call `chown`.  You can specify a\n`mtime` and `atime`, and it'll call `utimes`.  You can call it a symlink\nand provide a `linkpath` and it'll call `symlink`.\n\nNote that it won't automatically resolve symbolic links.  So, if you\ncall `fstream.Reader('/some/symlink')` then you'll get an object\nthat stats and then ends immediately (since it has no data).  To follow\nsymbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:\ntrue })`.\n\nThere are various checks to make sure that the bytes emitted are the\nsame as the intended size, if the size is set.\n\n## Examples\n\n```javascript\nfstream\n  .Writer({ path: \"path/to/file\"\n          , mode: 0755\n          , size: 6\n          })\n  .write(\"hello\\n\")\n  .end()\n```\n\nThis will create the directories if they're missing, and then write\n`hello\\n` into the file, chmod it to 0755, and assert that 6 bytes have\nbeen written when it's done.\n\n```javascript\nfstream\n  .Writer({ path: \"path/to/file\"\n          , mode: 0755\n          , size: 6\n          , flags: \"a\"\n          })\n  .write(\"hello\\n\")\n  .end()\n```\n\nYou can pass flags in, if you want to append to a file.\n\n```javascript\nfstream\n  .Writer({ path: \"path/to/symlink\"\n          , linkpath: \"./file\"\n          , SymbolicLink: true\n          , mode: \"0755\" // octal strings supported\n          })\n  .end()\n```\n\nIf isSymbolicLink is a function, it'll be called, and if it returns\ntrue, then it'll treat it as a symlink.  If it's not a function, then\nany truish value will make a symlink, or you can set `type:\n'SymbolicLink'`, which does the same thing.\n\nNote that the linkpath is relative to the symbolic link location, not\nthe parent dir or cwd.\n\n```javascript\nfstream\n  .Reader(\"path/to/dir\")\n  .pipe(fstream.Writer(\"path/to/other/dir\"))\n```\n\nThis will do like `cp -Rp path/to/dir path/to/other/dir`.  If the other\ndir exists and isn't a directory, then it'll emit an error.  It'll also\nset the uid, gid, mode, etc. to be identical.  In this way, it's more\nlike `rsync -a` than simply a copy.\n",
   "readmeFilename": "README.md",
-  "gitHead": "d205397b27d93eee5314e9d2d87693e82b560106",
+  "gitHead": "0bdcf1db6f9b04755b644f8268fc3726875367a6",
   "bugs": {
     "url": "https://github.com/isaacs/fstream/issues"
   },
   "homepage": "https://github.com/isaacs/fstream",
-  "_id": "fstream@1.0.3",
-  "_shasum": "5ce69767710d7a39c8cd9232470d9426790195da",
-  "_from": "fstream@>=1.0.3 <1.1.0"
+  "_id": "fstream@1.0.4",
+  "_shasum": "6c52298473fd6351fd22fc4bf9254fcfebe80f2b",
+  "_from": "fstream@>=1.0.4 <1.1.0"
 }
index 63fefe3d16c80b959782dc0f93d6408afd591326..0b81fab2027ff713837286a6d7b3de031be38368 100644 (file)
@@ -42,7 +42,7 @@
           '-luuid.lib',
           '-lodbc32.lib',
           '-lDelayImp.lib',
-          '-l"<(node_root_dir)/$(ConfigurationName)/iojs.lib"'
+          '-l"<(node_root_dir)/$(ConfigurationName)/node.lib"'
         ],
         # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
         # needs to have dll-interface to be used by clients of class 'node::ObjectWrap'
index 3d3c58785f1795dafcfd4d5e8e33433c91ef351a..f3605902e93c10440f4842feee188929a6ccfe97 100644 (file)
@@ -173,7 +173,7 @@ function build (gyp, argv, callback) {
   }
 
   /**
-   * Copies the iojs.lib file for the current target architecture into the
+   * Copies the node.lib file for the current target architecture into the
    * current proper dev dir location.
    */
 
@@ -181,15 +181,15 @@ function build (gyp, argv, callback) {
     if (!win || !copyDevLib) return doBuild()
 
     var buildDir = path.resolve(nodeDir, buildType)
-      , archNodeLibPath = path.resolve(nodeDir, arch, 'iojs.lib')
-      , buildNodeLibPath = path.resolve(buildDir, 'iojs.lib')
+      , archNodeLibPath = path.resolve(nodeDir, arch, 'node.lib')
+      , buildNodeLibPath = path.resolve(buildDir, 'node.lib')
 
     mkdirp(buildDir, function (err, isNew) {
       if (err) return callback(err)
       log.verbose('"' + buildType + '" dir needed to be created?', isNew)
       var rs = fs.createReadStream(archNodeLibPath)
         , ws = fs.createWriteStream(buildNodeLibPath)
-      log.verbose('copying "iojs.lib" for ' + arch, buildNodeLibPath)
+      log.verbose('copying "node.lib" for ' + arch, buildNodeLibPath)
       rs.pipe(ws)
       rs.on('error', callback)
       ws.on('error', callback)
index 378fbfae4769b56c76ce13acf54edf643e06554e..6f72e6a93d6cf88410ec7313dfbb64282c32bc4f 100644 (file)
@@ -39,7 +39,7 @@ function install (gyp, argv, callback) {
     }
   }
 
-  var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'https://iojs.org/dist'
+  var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'http://nodejs.org/dist'
 
 
   // Determine which node dev files version we are installing
@@ -185,7 +185,7 @@ function install (gyp, argv, callback) {
 
       // now download the node tarball
       var tarPath = gyp.opts['tarball']
-      var tarballUrl = tarPath ? tarPath : distUrl + '/v' + version + '/iojs-v' + version + '.tar.gz'
+      var tarballUrl = tarPath ? tarPath : distUrl + '/v' + version + '/node-v' + version + '.tar.gz'
         , badDownload = false
         , extractCount = 0
         , gunzip = zlib.createGunzip()
@@ -267,7 +267,7 @@ function install (gyp, argv, callback) {
         var async = 0
 
         if (win) {
-          // need to download iojs.lib
+          // need to download node.lib
           async++
           downloadNodeLib(deref)
         }
@@ -295,8 +295,7 @@ function install (gyp, argv, callback) {
             // check content shasums
             for (var k in contentShasums) {
               log.verbose('validating download checksum for ' + k, '(%s == %s)', contentShasums[k], expectShasums[k])
-              // TODO(piscisaureus) re-enable checksum verification when the correct files are in place.
-              if (false || contentShasums[k] !== expectShasums[k]) {
+              if (contentShasums[k] !== expectShasums[k]) {
                 cb(new Error(k + ' local checksum ' + contentShasums[k] + ' not match remote ' + expectShasums[k]))
                 return
               }
@@ -344,36 +343,36 @@ function install (gyp, argv, callback) {
       }
 
       function downloadNodeLib (done) {
-        log.verbose('on Windows; need to download `iojs.lib`...')
+        log.verbose('on Windows; need to download `node.lib`...')
         var dir32 = path.resolve(devDir, 'ia32')
           , dir64 = path.resolve(devDir, 'x64')
-          , nodeLibPath32 = path.resolve(dir32, 'iojs.lib')
-          , nodeLibPath64 = path.resolve(dir64, 'iojs.lib')
-          , nodeLibUrl32 = distUrl + '/v' + version + '/win-x86/iojs.lib'
-          , nodeLibUrl64 = distUrl + '/v' + version + '/win-x64/iojs.lib'
+          , nodeLibPath32 = path.resolve(dir32, 'node.lib')
+          , nodeLibPath64 = path.resolve(dir64, 'node.lib')
+          , nodeLibUrl32 = distUrl + '/v' + version + '/node.lib'
+          , nodeLibUrl64 = distUrl + '/v' + version + '/x64/node.lib'
 
-        log.verbose('32-bit iojs.lib dir', dir32)
-        log.verbose('64-bit iojs.lib dir', dir64)
-        log.verbose('`iojs.lib` 32-bit url', nodeLibUrl32)
-        log.verbose('`iojs.lib` 64-bit url', nodeLibUrl64)
+        log.verbose('32-bit node.lib dir', dir32)
+        log.verbose('64-bit node.lib dir', dir64)
+        log.verbose('`node.lib` 32-bit url', nodeLibUrl32)
+        log.verbose('`node.lib` 64-bit url', nodeLibUrl64)
 
         var async = 2
         mkdir(dir32, function (err) {
           if (err) return done(err)
-          log.verbose('streaming 32-bit iojs.lib to:', nodeLibPath32)
+          log.verbose('streaming 32-bit node.lib to:', nodeLibPath32)
 
           var req = download(nodeLibUrl32)
           if (!req) return
           req.on('error', done)
           req.on('response', function (res) {
             if (res.statusCode !== 200) {
-              done(new Error(res.statusCode + ' status code downloading 32-bit iojs.lib'))
+              done(new Error(res.statusCode + ' status code downloading 32-bit node.lib'))
               return
             }
 
             getContentSha(res, function (_, checksum) {
-              contentShasums['win-x86/iojs.lib'] = checksum
-              log.verbose('content checksum', 'win-x86/iojs.lib', checksum)
+              contentShasums['node.lib'] = checksum
+              log.verbose('content checksum', 'node.lib', checksum)
             })
 
             var ws = fs.createWriteStream(nodeLibPath32)
@@ -386,20 +385,20 @@ function install (gyp, argv, callback) {
         })
         mkdir(dir64, function (err) {
           if (err) return done(err)
-          log.verbose('streaming 64-bit iojs.lib to:', nodeLibPath64)
+          log.verbose('streaming 64-bit node.lib to:', nodeLibPath64)
 
           var req = download(nodeLibUrl64)
           if (!req) return
           req.on('error', done)
           req.on('response', function (res) {
             if (res.statusCode !== 200) {
-              done(new Error(res.statusCode + ' status code downloading 64-bit iojs.lib'))
+              done(new Error(res.statusCode + ' status code downloading 64-bit node.lib'))
               return
             }
 
             getContentSha(res, function (_, checksum) {
-              contentShasums['win-x64/iojs.lib'] = checksum
-              log.verbose('content checksum', 'win-x64/iojs.lib', checksum)
+              contentShasums['x64/node.lib'] = checksum
+              log.verbose('content checksum', 'x64/node.lib', checksum)
             })
 
             var ws = fs.createWriteStream(nodeLibPath64)
index b0764b6104758bfcf58ad2c16915d5da9ee7b706..2d1c6f6b82312ba47e22f6b656a83b8d1ec105c1 100644 (file)
@@ -22,6 +22,9 @@ function fetch (uri, params, cb) {
         if (operation.retry(er)) {
           client.log.info("retry", "will retry, error on last attempt: " + er)
         }
+        else {
+          cb(er)
+        }
       })
 
       req.on("response", function (res) {
index bd5a4caae3fe15a6beebcf5a38f388ce3b38c410..e7215bc7802fcff3d3e608f9201a27fe8c3e95eb 100644 (file)
@@ -4,8 +4,8 @@ var HttpsAgent = require("https").Agent
 
 var pkg = require("../package.json")
 
-var httpAgent = new HttpAgent({ keepAlive : true })
-var httpsAgent = new HttpsAgent({ keepAlive : true })
+var httpAgent
+var httpsAgent
 
 module.exports = initialize
 
@@ -23,21 +23,28 @@ function initialize (uri, method, accept, headers) {
     strictSSL    : this.config.ssl.strict,
     cert         : this.config.ssl.certificate,
     key          : this.config.ssl.key,
-    ca           : this.config.ssl.ca
+    ca           : this.config.ssl.ca,
+    agent        : getAgent(uri.protocol, this.config)
   }
 
-  // request will not pay attention to the NOPROXY environment variable if a
-  // config value named proxy is passed in, even if it's set to null.
-  var proxy
-  if (uri.protocol === "https:") {
-    proxy = this.config.proxy.https
-    opts.agent = httpsAgent
+  // allow explicit disabling of proxy in environment via CLI
+  //
+  // how false gets here is the CLI's problem (it's gross)
+  if (this.config.proxy.http === false) {
+    opts.proxy = null
   }
   else {
-    proxy = this.config.proxy.http
-    opts.agent = httpAgent
+    // request will not pay attention to the NOPROXY environment variable if a
+    // config value named proxy is passed in, even if it's set to null.
+    var proxy
+    if (uri.protocol === "https:") {
+      proxy = this.config.proxy.https
+    }
+    else {
+      proxy = this.config.proxy.http
+    }
+    if (typeof proxy === "string") opts.proxy = proxy
   }
-  if (typeof proxy === "string") opts.proxy = proxy
 
   headers.version = this.version || pkg.version
   headers.accept = accept
@@ -49,3 +56,30 @@ function initialize (uri, method, accept, headers) {
 
   return opts
 }
+
+function getAgent (protocol, config) {
+  if (protocol === "https:") {
+    if (!httpsAgent) {
+      httpsAgent = new HttpsAgent({
+        keepAlive          : true,
+        localAddress       : config.proxy.localAddress,
+        rejectUnauthorized : config.ssl.strict,
+        ca                 : config.ssl.ca,
+        cert               : config.ssl.cert,
+        key                : config.ssl.key
+      })
+    }
+
+    return httpsAgent
+  }
+  else {
+    if (!httpAgent) {
+      httpAgent = new HttpAgent({
+        keepAlive    : true,
+        localAddress : config.proxy.localAddress
+      })
+    }
+
+    return httpAgent
+  }
+}
index 24034a6b868a307cc3de483f92ad48f4866487e6..348648b2eec154a0e0b8852a64a85572280e48af 100644 (file)
@@ -18,10 +18,9 @@ function publish (uri, params, cb) {
   assert(typeof cb === "function", "must pass callback to publish")
 
   var access = params.access
-  assert(access && typeof access === "string", "must pass access for package")
   assert(
-    ["public", "restricted"].indexOf(access) !== -1,
-    "access level must be either 'public' or 'restricted'"
+    (!access) || ["public", "restricted"].indexOf(access) !== -1,
+    "if present, access level must be either 'public' or 'restricted'"
   )
 
   var auth = params.auth
@@ -68,12 +67,13 @@ function putFirst (registry, data, tarbuffer, access, auth, cb) {
     { _id : data.name
     , name : data.name
     , description : data.description
-    , access : access
     , "dist-tags" : {}
     , versions : {}
     , readme: data.readme || ""
     }
 
+  if (access) root.access = access
+
   if (!auth.token) {
     root.maintainers = [{name : auth.username, email : auth.email}]
     data.maintainers = JSON.parse(JSON.stringify(root.maintainers))
index fa969ac22378a73bdfc9144b99cb07bbf9931f9a..c2a7944e9f2d36a485dbdace35c4954a1ffba3aa 100644 (file)
@@ -123,7 +123,7 @@ function makeRequest (uri, params, cb_) {
 
   if (params.lastModified && params.method === "GET") {
     this.log.verbose("lastModified", params.lastModified)
-    headers["if-modified-since"] = params.lastModified;
+    headers["if-modified-since"] = params.lastModified
   }
 
   // figure out wth body is
@@ -226,8 +226,8 @@ function requestDone (method, where, cb) {
       parsed._etag = response.headers.etag
     }
 
-    if (parsed && response.headers['last-modified']) {
-      parsed._lastModified = response.headers['last-modified']
+    if (parsed && response.headers["last-modified"]) {
+      parsed._lastModified = response.headers["last-modified"]
     }
 
     // for the search endpoint, the "error" property can be an object
index 6dbc9185011de6c9036ed22e5718aeb8715ba83a..00606f6a460e89f216fb572c39be88f1d7e570a2 100644 (file)
@@ -32,7 +32,7 @@
   "gitHead": "153325f997813ebf8a7ae07b322b4fa89aa25f7d",
   "_id": "hosted-git-info@1.5.3",
   "_shasum": "1f46e25e9c0e207852fb7a4b94422ed5f09a03f5",
-  "_from": "hosted-git-info@>=1.4.0 <2.0.0",
+  "_from": "hosted-git-info@>=1.5.3 <2.0.0",
   "_npmVersion": "2.4.0",
   "_nodeVersion": "0.10.33",
   "_npmUser": {
index d5b72e01cdbd0c8db1b0c0d4024a7fa3228e66cb..ad8c540f32318abb0f60cd4ee09fea95855f78f2 100644 (file)
@@ -1,13 +1,13 @@
 {
   "name": "npm-package-arg",
-  "version": "3.0.0",
+  "version": "3.1.0",
   "description": "Parse the things that can be arguments to `npm install`",
   "main": "npa.js",
   "directories": {
     "test": "test"
   },
   "dependencies": {
-    "hosted-git-info": "^1.4.0",
+    "hosted-git-info": "^1.5.3",
     "semver": "4"
   },
   "devDependencies": {
     "url": "https://github.com/npm/npm-package-arg/issues"
   },
   "homepage": "https://github.com/npm/npm-package-arg",
-  "gitHead": "263fd43295ac8f6eca046be108782cfbf9a78bfe",
-  "_id": "npm-package-arg@3.0.0",
-  "_shasum": "84e91836fa2e4e35ae26dc984440b1e5b5aee1ee",
+  "gitHead": "3d5c7f91c5e90e4b9792d881080c462f718f4747",
+  "_id": "npm-package-arg@3.1.0",
+  "_shasum": "8ce9d8ad83ae9fcc433783ca813e4e91f885703e",
   "_from": "npm-package-arg@>=3.0.0 <4.0.0",
-  "_npmVersion": "1.4.28",
+  "_npmVersion": "2.4.1",
+  "_nodeVersion": "1.0.4",
   "_npmUser": {
     "name": "iarna",
     "email": "me@re-becca.org"
@@ -54,9 +55,9 @@
     }
   ],
   "dist": {
-    "shasum": "84e91836fa2e4e35ae26dc984440b1e5b5aee1ee",
-    "tarball": "http://registry.npmjs.org/npm-package-arg/-/npm-package-arg-3.0.0.tgz"
+    "shasum": "8ce9d8ad83ae9fcc433783ca813e4e91f885703e",
+    "tarball": "http://registry.npmjs.org/npm-package-arg/-/npm-package-arg-3.1.0.tgz"
   },
-  "_resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-3.0.0.tgz",
+  "_resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-3.1.0.tgz",
   "readme": "ERROR: No README data found!"
 }
index 4b804454db616627cc49c64ffb42b6bae2e39835..0cd832ad7d177ca3dfb3f259e5811019eadc128a 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "npm-registry-client",
   "description": "Client for the npm registry",
-  "version": "6.0.3",
+  "version": "6.0.7",
   "repository": {
     "url": "git://github.com/isaacs/npm-registry-client"
   },
     "npmlog": ""
   },
   "license": "ISC",
-  "gitHead": "7d3d14eb825aa376c63854a08e67d2c9b3415927",
   "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)\nvar uri = \"npm://registry.npmjs.org/npm\"\nvar params = {timeout: 1000}\n\nclient.get(uri, params, function (error, 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# Registry URLs\n\nThe registry calls take either a full URL pointing to a resource in the\nregistry, or a base URL for the registry as a whole (including the registry\npath – but be sure to terminate the path with `/`). `http` and `https` URLs are\nthe only ones supported.\n\n## Using the client\n\nEvery call to the client follows the same pattern:\n\n* `uri` {String} The *fully-qualified* URI of the registry API method being\n  invoked.\n* `params` {Object} Per-request parameters.\n* `callback` {Function} Callback to be invoked when the call is complete.\n\n### Credentials\n\nMany requests to the registry can by authenticated, and require credentials\nfor authorization. These credentials always look the same:\n\n* `username` {String}\n* `password` {String}\n* `email` {String}\n* `alwaysAuth` {Boolean} Whether calls to the target registry are always\n  authed.\n\n**or**\n\n* `token` {String}\n* `alwaysAuth` {Boolean} Whether calls to the target registry are always\n  authed.\n\n## API\n\n### client.access(uri, params, cb)\n\n* `uri` {String} Registry URL for the package's access API endpoint.\n  Looks like `/-/package/<package name>/access`.\n* `params` {Object} Object containing per-request properties.\n  * `access` {String} New access level for the package. Can be either\n    `public` or `restricted`. Registry will raise an error if trying\n    to change the access level of an unscoped package.\n  * `auth` {Credentials}\n\nSet the access level for scoped packages. For now, there are only two\naccess levels: \"public\" and \"restricted\".\n\n### client.adduser(uri, params, cb)\n\n* `uri` {String} Base registry URL.\n* `params` {Object} Object containing per-request properties.\n  * `auth` {Credentials}\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\nAdd a user account to the registry, or verify the credentials.\n\n### client.deprecate(uri, params, cb)\n\n* `uri` {String} Full registry URI for the deprecated package.\n* `params` {Object} Object containing per-request properties.\n  * `version` {String} Semver version range.\n  * `message` {String} The message to use as a deprecation warning.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nDeprecate a version of a package in the registry.\n\n### client.distTags.fetch(uri, params, cb)\n\n* `uri` {String} Base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `package` {String} Name of the package.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nFetch all of the `dist-tags` for the named package.\n\n### client.distTags.add(uri, params, cb)\n\n* `uri` {String} Base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `package` {String} Name of the package.\n  * `distTag` {String} Name of the new `dist-tag`.\n  * `version` {String} Exact version to be mapped to the `dist-tag`.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nAdd (or replace) a single dist-tag onto the named package.\n\n### client.distTags.set(uri, params, cb)\n\n* `uri` {String} Base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `package` {String} Name of the package.\n  * `distTags` {Object} Object containing a map from tag names to package\n     versions.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nSet all of the `dist-tags` for the named package at once, creating any\n`dist-tags` that do not already exit. Any `dist-tags` not included in the\n`distTags` map will be removed.\n\n### client.distTags.update(uri, params, cb)\n\n* `uri` {String} Base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `package` {String} Name of the package.\n  * `distTags` {Object} Object containing a map from tag names to package\n     versions.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nUpdate the values of multiple `dist-tags`, creating any `dist-tags` that do\nnot already exist. Any pre-existing `dist-tags` not included in the `distTags`\nmap will be left alone.\n\n### client.distTags.rm(uri, params, cb)\n\n* `uri` {String} Base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `package` {String} Name of the package.\n  * `distTag` {String} Name of the new `dist-tag`.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nRemove a single `dist-tag` from the named package.\n\n### client.get(uri, params, cb)\n\n* `uri` {String} The complete registry URI to fetch\n* `params` {Object} Object containing per-request properties.\n  * `timeout` {Number} Duration before the request times out. Optional\n    (default: never).\n  * `follow` {Boolean} Follow 302/301 responses. Optional (default: true).\n  * `staleOk` {Boolean} If there's cached data available, then return that to\n    the callback quickly, and update the cache the background. Optional\n    (default: false).\n  * `auth` {Credentials} Optional.\n* `cb` {Function}\n\nFetches data from the registry via a GET request, saving it in the cache folder\nwith the ETag or the \"Last Modified\" timestamp.\n\n### client.publish(uri, params, cb)\n\n* `uri` {String} The registry URI for the package to publish.\n* `params` {Object} Object containing per-request properties.\n  * `metadata` {Object} Package metadata.\n  * `access` {String} Access for the package. Can be `public` or `restricted` (no default).\n  * `body` {Stream} Stream of the package body / tarball.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nPublish a package to the registry.\n\nNote that this does not create the tarball from a folder.\n\n### client.star(uri, params, cb)\n\n* `uri` {String} The complete registry URI for the package to star.\n* `params` {Object} Object containing per-request properties.\n  * `starred` {Boolean} True to star the package, false to unstar it. Optional\n    (default: false).\n  * `auth` {Credentials}\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 unstar a\npackage, though other writes do require that the user be the package owner.\n\n### client.stars(uri, params, cb)\n\n* `uri` {String} The base URL for the registry.\n* `params` {Object} Object containing per-request properties.\n  * `username` {String} Name of user to fetch starred packages for. Optional\n    (default: user in `auth`).\n  * `auth` {Credentials} Optional (required if `username` is omitted).\n* `cb` {Function}\n\nView your own or another user's starred packages.\n\n### client.tag(uri, params, cb)\n\n* `uri` {String} The complete registry URI to tag\n* `params` {Object} Object containing per-request properties.\n  * `version` {String} Version to tag.\n  * `tag` {String} Tag name to apply.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nMark a version in the `dist-tags` hash, so that `pkg@tag` will fetch the\nspecified version.\n\n### client.unpublish(uri, params, cb)\n\n* `uri` {String} The complete registry URI of the package to unpublish.\n* `params` {Object} Object containing per-request properties.\n  * `version` {String} version to unpublish. Optional – omit to unpublish all\n    versions.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nRemove a version of a package (or all versions) from the registry.  When the\nlast version us unpublished, the entire document is removed from the database.\n\n### client.whoami(uri, params, cb)\n\n* `uri` {String} The base registry for the URI.\n* `params` {Object} Object containing per-request properties.\n  * `auth` {Credentials}\n* `cb` {Function}\n\nSimple call to see who the registry thinks you are. Especially useful with\ntoken-based auth.\n\n\n## PLUMBING\n\nThe below are primarily intended for use by the rest of the API, or by the npm\ncaching logic directly.\n\n### client.request(uri, params, cb)\n\n* `uri` {String} URI pointing to the resource to request.\n* `params` {Object} Object containing per-request properties.\n  * `method` {String} HTTP method. Optional (default: \"GET\").\n  * `body` {Stream | Buffer | String | Object} The request body.  Objects\n    that are not Buffers or Streams are encoded as JSON. Optional – body\n    only used for write operations.\n  * `etag` {String} The cached ETag. Optional.\n  * `lastModified` {String} The cached Last-Modified timestamp. Optional.\n  * `follow` {Boolean} Follow 302/301 responses. Optional (default: true).\n  * `auth` {Credentials} Optional.\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 generic request to the registry. All the other methods are wrappers\naround `client.request`.\n\n### client.fetch(uri, params, cb)\n\n* `uri` {String} The complete registry URI to upload to\n* `params` {Object} Object containing per-request properties.\n  * `headers` {Stream} HTTP headers to be included with the request. Optional.\n  * `auth` {Credentials} Optional.\n* `cb` {Function}\n\nFetch a package from a URL, with auth set appropriately if included. Used to\ncache remote tarballs as well as request package tarballs from the registry.\n\n# Configuration\n\nThe client uses its own configuration, which is just passed in as a simple\nnested object. The following are the supported values (with their defaults, if\nany):\n\n* `proxy.http` {URL} The URL to proxy HTTP requests through.\n* `proxy.https` {URL} The URL to proxy HTTPS requests through. Defaults to be\n  the same as `proxy.http` if unset.\n* `proxy.localAddress` {IP} The local address to use on multi-homed systems.\n* `ssl.ca` {String} Certificate signing authority certificates to trust.\n* `ssl.certificate` {String} Client certificate (PEM encoded). Enable access\n  to servers that require client certificates.\n* `ssl.key` {String} Private key (PEM encoded) for client certificate.\n* `ssl.strict` {Boolean} Whether or not to be strict with SSL certificates.\n  Default = `true`\n* `retry.count` {Number} Number of times to retry on GET failures. Default = 2.\n* `retry.factor` {Number} `factor` setting for `node-retry`. Default = 10.\n* `retry.minTimeout` {Number} `minTimeout` setting for `node-retry`.\n  Default = 10000 (10 seconds)\n* `retry.maxTimeout` {Number} `maxTimeout` setting for `node-retry`.\n  Default = 60000 (60 seconds)\n* `userAgent` {String} User agent header to send. Default =\n  `\"node/{process.version}\"`\n* `log` {Object} The logger to use.  Defaults to `require(\"npmlog\")` if\n  that works, otherwise logs are disabled.\n* `defaultTag` {String} The default tag to use when publishing new packages.\n  Default = `\"latest\"`\n* `couchToken` {Object} A token for use with\n  [couch-login](https://npmjs.org/package/couch-login).\n* `sessionToken` {string} A random identifier for this set of client requests.\n  Default = 8 random hexadecimal bytes.\n",
   "readmeFilename": "README.md",
+  "gitHead": "8691eaf8ca1f4c8a4d16389da6e8f6d0a0042ed9",
   "bugs": {
     "url": "https://github.com/isaacs/npm-registry-client/issues"
   },
   "homepage": "https://github.com/isaacs/npm-registry-client",
-  "_id": "npm-registry-client@6.0.3",
-  "_shasum": "ae19f33b1cd6b4f5e81b7614bde7b97393c57cdc",
-  "_from": "npm-registry-client@>=6.0.3 <6.1.0"
+  "_id": "npm-registry-client@6.0.7",
+  "_shasum": "c9f36f727f0b72f47a9ed11a539829770565e0fb",
+  "_from": "npm-registry-client@>=6.0.7 <6.1.0"
 }
diff --git a/deps/npm/node_modules/npm-registry-client/test/initialize.js b/deps/npm/node_modules/npm-registry-client/test/initialize.js
new file mode 100644 (file)
index 0000000..980a9a7
--- /dev/null
@@ -0,0 +1,74 @@
+var test = require("tap").test
+
+// var server = require("./lib/server.js")
+var Client = require("../")
+
+test("defaulted initialization", function (t) {
+  var client = new Client()
+  var options = client.initialize(
+    "http://localhost:1337/",
+    "GET",
+    "application/json",
+    {}
+  )
+
+  t.equal(options.url, "http://localhost:1337/", "URLs match")
+  t.equal(options.method, "GET", "methods match")
+  t.equal(options.proxy, undefined, "proxy won't overwrite environment")
+  t.equal(options.localAddress, undefined, "localAddress has no default value")
+  t.equal(options.strictSSL, true, "SSL is strict by default")
+
+  t.equal(options.headers.accept, "application/json", "accept header set")
+  t.equal(
+    options.headers.version,
+    require("../package.json").version,
+    "npm-registry-client version is present in headers"
+  )
+  t.ok(options.headers["npm-session"], "request ID generated")
+  t.ok(options.headers["user-agent"], "user-agent preset")
+
+  var HttpAgent = require("http").Agent
+  t.ok(options.agent instanceof HttpAgent, "got an HTTP agent for an HTTP URL")
+
+  t.end()
+})
+
+test("referer set on client", function (t) {
+  var client = new Client()
+  client.refer = "xtestx"
+  var options = client.initialize(
+    "http://localhost:1337/",
+    "GET",
+    "application/json",
+    {}
+  )
+
+  t.equal(options.headers.referer, "xtestx", "referer header set")
+
+  t.end()
+})
+
+test("initializing with proxy explicitly disabled", function (t) {
+  var client = new Client({ proxy : { http : false }})
+  var options = client.initialize(
+    "http://localhost:1337/",
+    "GET",
+    "application/json",
+    {}
+  )
+  t.ok("proxy" in options, "proxy overridden by explicitly setting to false")
+  t.equal(options.proxy, null, "request will override proxy when empty proxy passed in")
+  t.end()
+})
+
+test("initializing with proxy undefined", function (t) {
+  var client = new Client({ proxy : { http : undefined }})
+  var options = client.initialize(
+    "http://localhost:1337/",
+    "GET",
+    "application/json",
+    {}
+  )
+  t.notOk("proxy" in options, "proxy can be read from env.PROXY by request")
+  t.end()
+})
index 40bfdf2bbc15bfcc121dbdce61c8fa4f068ae35a..5a87b64c09ed3aa18c0d90400bd486dded6974a5 100644 (file)
@@ -67,19 +67,6 @@ test("publish call contract", function (t) {
     "params must include metadata for package"
   )
 
-  t.throws(
-    function () {
-      var params = {
-        metadata : METADATA,
-        body : BODY,
-        auth : AUTH
-      }
-      client.publish(URI, params, nop)
-    },
-    { name : "AssertionError", message : "must pass access for package" },
-    "params must include access for package"
-  )
-
   t.throws(
     function () {
       var params = {
@@ -132,7 +119,7 @@ test("publish call contract", function (t) {
     },
     {
       name    : "AssertionError",
-      message : "access level must be either 'public' or 'restricted'"
+      message : "if present, access level must be either 'public' or 'restricted'"
     },
     "access level must be 'public' or 'restricted'"
   )
index 80e59ef5251022faa6322fe65d0277d999d0cdfd..53fc9efa995a21674c5c2c961915f611b4ca2aea 100644 (file)
@@ -1,2 +1,3 @@
+coverage
 tests
 node_modules
index 90e06c13e3c01b8e5a965545f9b23a7b70c96f8d..0988483f3b077918717ff57099d91d816ef0f868 100644 (file)
@@ -9,3 +9,4 @@ webhooks:
   on_success: change  # options: [always|never|change] default: always
   on_failure: always  # options: [always|never|change] default: always
   on_start: false     # default: false
+sudo: false
index f4e5431b427dec4e2c847ce680c76e82a0df1f01..cfaf17384883b8f7503a38bc5e8429298690d7a1 100644 (file)
@@ -1,5 +1,41 @@
 ## Change Log
 
+### v2.53.0 (2015/02/02)
+- [#1396](https://github.com/request/request/pull/1396) Do not rfc3986 escape JSON bodies (@nylen, @simov)
+- [#1392](https://github.com/request/request/pull/1392) Improve `timeout` option description (@watson)
+
+### v2.52.0 (2015/02/02)
+- [#1383](https://github.com/request/request/pull/1383) Add missing HTTPS options that were not being passed to tunnel (@brichard19) (@nylen, @brichard19)
+- [#1388](https://github.com/request/request/pull/1388) Upgrade mime-types package version (@roderickhsiao)
+- [#1389](https://github.com/request/request/pull/1389) Revise Setup Tunnel Function (@seanstrom)
+- [#1374](https://github.com/request/request/pull/1374) Allow explicitly disabling tunneling for proxied https destinations (@nylen)
+- [#1376](https://github.com/request/request/pull/1376) Use karma-browserify for tests. Add browser test coverage reporter. (@eiriksm)
+- [#1366](https://github.com/request/request/pull/1366) Refactor OAuth into separate module (@simov)
+- [#1373](https://github.com/request/request/pull/1373) Rewrite tunnel test to be pure Node.js (@nylen)
+- [#1371](https://github.com/request/request/pull/1371) Upgrade test reporter (@nylen)
+- [#1360](https://github.com/request/request/pull/1360) Refactor basic, bearer, digest auth logic into separate class (@simov)
+- [#1354](https://github.com/request/request/pull/1354) Remove circular dependency from debugging code (@nylen)
+- [#1351](https://github.com/request/request/pull/1351) Move digest auth into private prototype method (@simov)
+- [#1352](https://github.com/request/request/pull/1352) Update hawk dependency to ~2.3.0 (@mridgway)
+- [#1353](https://github.com/request/request/pull/1353) Correct travis-ci badge (@dogancelik)
+- [#1349](https://github.com/request/request/pull/1349) Make sure we return on errored browser requests. (@eiriksm)
+- [#1346](https://github.com/request/request/pull/1346) getProxyFromURI Extraction Refactor (@seanstrom)
+- [#1337](https://github.com/request/request/pull/1337) Standardize test ports on 6767 (@nylen)
+- [#1341](https://github.com/request/request/pull/1341) Emit FormData error events as Request error events (@nylen, @rwky)
+- [#1343](https://github.com/request/request/pull/1343) Clean up readme badges, and add Travis and Coveralls badges (@nylen)
+- [#1345](https://github.com/request/request/pull/1345) Update README.md (@Aaron-Hartwig)
+- [#1338](https://github.com/request/request/pull/1338) Always wait for server.close() callback in tests (@nylen)
+- [#1342](https://github.com/request/request/pull/1342) Add mock https server and redo start of browser tests for this purpose. (@eiriksm)
+- [#1339](https://github.com/request/request/pull/1339) Improve auth docs (@nylen)
+- [#1335](https://github.com/request/request/pull/1335) Add support for OAuth plaintext signature method (@simov)
+- [#1332](https://github.com/request/request/pull/1332) Add clean script to remove test-browser.js after the tests run (@seanstrom)
+- [#1327](https://github.com/request/request/pull/1327) Fix errors generating coverage reports. (@nylen)
+- [#1330](https://github.com/request/request/pull/1330) Return empty buffer upon empty response body and encoding is set to null (@seanstrom)
+- [#1326](https://github.com/request/request/pull/1326) Use faster container-based infrastructure on Travis (@nylen)
+- [#1315](https://github.com/request/request/pull/1315) Implement rfc3986 option (@simov)
+- [#1314](https://github.com/request/request/pull/1314) Detect urlencoded form data header via regex (@simov)
+- [#1317](https://github.com/request/request/pull/1317) Improve OAuth1.0 server side flow example (@simov)
+
 ### v2.51.0 (2014/12/10)
 - [#1310](https://github.com/request/request/pull/1310) Revert changes introduced in https://github.com/request/request/pull/1282 (@simov)
 
 - [#987](https://github.com/request/request/pull/987) Show optional modules as being loaded by the module that reqeusted them (@iarna)
 
 ### v2.39.0 (2014/07/24)
-- [#976](https://github.com/request/request/pull/976) Update README.md (@fosco-maestro)
+- [#976](https://github.com/request/request/pull/976) Update README.md (@pvoznenko)
 
 ### v2.38.0 (2014/07/22)
 - [#952](https://github.com/request/request/pull/952) Adding support to client certificate with proxy use case (@ofirshaked)
index 59d62c2c1a77e401b4bf96dbc8b014bda9e4dcd2..8b668f99f72660fc1569acdab2ef45d1cbc1c8a4 100644 (file)
@@ -1,7 +1,9 @@
 # Request — Simplified HTTP client
-[![NPM](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/)
+[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/)
 
-[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/request/request?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Build status](https://img.shields.io/travis/request/request.svg?style=flat)](https://travis-ci.org/request/request)
+[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat)](https://coveralls.io/r/request/request)
+[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat)](https://gitter.im/request/request?utm_source=badge)
 
 ## Super simple to use
 
@@ -11,7 +13,7 @@ Request is designed to be the simplest way possible to make http calls. It suppo
 var request = require('request');
 request('http://www.google.com', function (error, response, body) {
   if (!error && response.statusCode == 200) {
-    console.log(body) // Print the google web page.
+    console.log(body) // Show the HTML for the Google homepage.
   }
 })
 ```
@@ -155,6 +157,10 @@ or other features, it is generally simpler to go with a
 straightforward HTTP proxy in this case.  However, if you would like
 to force a tunneling proxy, you may set the `tunnel` option to `true`.
 
+You can also make a standard proxied `http` request by explicitly setting
+`tunnel : false`, but **note that this will allow the proxy to see the traffic
+to/from the destination server**.
+
 If you are using a tunneling proxy, you may set the
 `proxyHeaderWhiteList` to share certain headers with the proxy.
 
@@ -352,12 +358,25 @@ request.get('http://some.server.com/', {
 });
 ```
 
-If passed as an option, `auth` should be a hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional).  The method form takes parameters `auth(username, password, sendImmediately)`.
+If passed as an option, `auth` should be a hash containing values:
+
+- `user` || `username`
+- `pass` || `password`
+- `sendImmediately` (optional)
+- `bearer` (optional)
 
-`sendImmediately` defaults to `true`, which causes a basic authentication header to be sent.  If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a `401` response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).
+The method form takes parameters
+`auth(username, password, sendImmediately, bearer)`.
 
-Note that you can also use for basic authentication a trick using the URL itself, as specified in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt).
-Simply pass the `user:password` before the host with an `@` sign.
+`sendImmediately` defaults to `true`, which causes a basic or bearer
+authentication header to be sent.  If `sendImmediately` is `false`, then
+`request` will retry with a proper authentication header after receiving a
+`401` response from the server (which must contain a `WWW-Authenticate` header
+indicating the required authentication method).
+
+Note that you can also specify basic authentication using the URL itself, as
+detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt).  Simply pass the
+`user:password` before the host with an `@` sign:
 
 ```javascript
 var username = 'username',
@@ -369,9 +388,15 @@ request({url: url}, function (error, response, body) {
 });
 ```
 
-Digest authentication is supported, but it only works with `sendImmediately` set to `false`; otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail.
+Digest authentication is supported, but it only works with `sendImmediately`
+set to `false`; otherwise `request` will send basic authentication on the
+initial request, which will probably cause the request to fail.
 
-Bearer authentication is supported, and is activated when the `bearer` value is available. The value may be either a `String` or a `Function` returning a `String`. Using a function to supply the bearer token is particularly useful if used in conjuction with `defaults` to allow a single function to supply the last known token at the time or sending a request or to compute one on the fly.
+Bearer authentication is supported, and is activated when the `bearer` value is
+available. The value may be either a `String` or a `Function` returning a
+`String`. Using a function to supply the bearer token is particularly useful if
+used in conjuction with `defaults` to allow a single function to supply the
+last known token at the time of sending a request, or to compute one on the fly.
 
 ## OAuth Signing
 
@@ -380,7 +405,8 @@ default signing algorithm is
 [HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2):
 
 ```javascript
-// Twitter OAuth
+// OAuth1.0 - 3-legged server side flow (Twitter example)
+// step 1
 var qs = require('querystring')
   , oauth =
     { callback: 'http://mysite.com/callback/'
@@ -394,30 +420,40 @@ request.post({url:url, oauth:oauth}, function (e, r, body) {
   // and construct a URL that a user clicks on (like a sign in button).
   // The verifier is only available in the response after a user has
   // verified with twitter that they are authorizing your app.
-  var access_token = qs.parse(body)
+
+  // step 2
+  var req_data = qs.parse(body)
+  var uri = 'https://api.twitter.com/oauth/authenticate'
+    + '?' + qs.stringify({oauth_token: req_data.oauth_token})
+  // redirect the user to the authorize uri
+
+  // step 3
+  // after the user is redirected back to your server
+  var auth_data = qs.parse(body)
     , oauth =
       { consumer_key: CONSUMER_KEY
       , consumer_secret: CONSUMER_SECRET
-      , token: access_token.oauth_token
-      , verifier: access_token.oauth_verifier
+      , token: auth_data.oauth_token
+      , token_secret: req_data.oauth_token_secret
+      , verifier: auth_data.oauth_verifier
       }
     , url = 'https://api.twitter.com/oauth/access_token'
     ;
   request.post({url:url, oauth:oauth}, function (e, r, body) {
-    var perm_token = qs.parse(body)
+    // ready to make signed requests on behalf of the user
+    var perm_data = qs.parse(body)
       , oauth =
         { consumer_key: CONSUMER_KEY
         , consumer_secret: CONSUMER_SECRET
-        , token: perm_token.oauth_token
-        , token_secret: perm_token.oauth_token_secret
+        , token: perm_data.oauth_token
+        , token_secret: perm_data.oauth_token_secret
         }
-      , url = 'https://api.twitter.com/1.1/users/show.json?'
-      , params =
-        { screen_name: perm_token.screen_name
-        , user_id: perm_token.user_id
+      , url = 'https://api.twitter.com/1.1/users/show.json'
+      , qs =
+        { screen_name: perm_data.screen_name
+        , user_id: perm_data.user_id
         }
       ;
-    url += qs.stringify(params)
     request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {
       console.log(user)
     })
@@ -431,6 +467,17 @@ the following changes to the OAuth options object:
 * Instead of `consumer_secret`, specify a `private_key` string in
   [PEM format](http://how2ssl.com/articles/working_with_pem_files/)
 
+For [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make
+the following changes to the OAuth options object:
+* Pass `signature_method : 'PLAINTEXT'`
+
+To send OAuth parameters via query params or in a post body as described in The
+[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param)
+section of the oauth1 spec:
+* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth
+  options object.
+* `transport_method` defaults to `'header'`
+
 ## Custom HTTP Headers
 
 HTTP Headers, such as `User-Agent`, can be set in the `options` object.
@@ -534,8 +581,7 @@ The first argument can be either a `url` or an `options` object. The only requir
   * Alternatively you can pass in an object `{chunked: false, data: []}` where
     `chunked` is used to specify whether the request is sent in
     [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)
-    (the default is `chunked: true`).  In non-chunked requests, data items with
-    body streams are not allowed.
+    In non-chunked requests, data items with body streams are not allowed.
 * `auth` - A hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional).  See documentation above.
 * `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as JSON.
 * `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body.
@@ -552,7 +598,10 @@ The first argument can be either a `url` or an `options` object. The only requir
     work around this, either use [`request.defaults`](#requestdefaultsoptions)
     with your pool options or create the pool object with the `maxSockets`
     property outside of the loop.
-* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request
+* `timeout` - Integer containing the number of milliseconds to wait for a
+  request to respond before aborting the request.  Note that if the underlying
+  TCP connection cannot be established, the OS-wide TCP connection timeout will
+  overrule the `timeout` option ([the default in Linux is around 20 seconds](http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout)).
 * `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`)
 * `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above.
 * `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).
@@ -564,10 +613,14 @@ The first argument can be either a `url` or an `options` object. The only requir
 * `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.
 * `localAddress` - Local interface to bind for network connections.
 * `gzip` - If `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response.  **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below.
-* `tunnel` - If `true`, then *always* use a tunneling proxy.  If
-  `false` (default), then tunneling will only be used if the
-  destination is `https`, or if a previous request in the redirect
-  chain used a tunneling proxy.
+* `tunnel` - controls the behavior of
+  [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling)
+  as follows:
+   * `undefined` (default) - `true` if the destination is `https` or a previous
+     request in the redirect chain used a tunneling proxy, `false` otherwise
+   * `true` - always tunnel to the destination by making a `CONNECT` request to
+     the proxy
+   * `false` - request the destination as a `GET` request.
 * `proxyHeaderWhiteList` - A whitelist of headers to send to a
   tunneling proxy.
 * `proxyHeaderExclusiveList` - A whitelist of headers to send
@@ -635,7 +688,7 @@ request.post(url)
 
 ### request.head
 
-Same as request() but defaults to `method: "HEAD"`.
+Same as `request()`, but defaults to `method: "HEAD"`.
 
 ```javascript
 request.head(url)
index 99b8386b592a7623be5158e8be07f22831f05af6..3581b83b46e306931b333981d6fe8dd5ff17d324 100755 (executable)
@@ -172,5 +172,15 @@ request.forever = function (agentOptions, optionsArg) {
 
 module.exports = request
 request.Request = require('./request')
-request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG)
 request.initParams = initParams
+
+// Backwards compatibility for request.debug
+Object.defineProperty(request, 'debug', {
+  enumerable : true,
+  get : function() {
+    return request.Request.debug
+  },
+  set : function(debug) {
+    request.Request.debug = debug
+  }
+})
diff --git a/deps/npm/node_modules/request/lib/auth.js b/deps/npm/node_modules/request/lib/auth.js
new file mode 100644 (file)
index 0000000..abe6274
--- /dev/null
@@ -0,0 +1,133 @@
+'use strict'
+
+var caseless = require('caseless')
+  , uuid = require('node-uuid')
+  , helpers = require('./helpers')
+
+var md5 = helpers.md5
+  , toBase64 = helpers.toBase64
+
+
+function Auth () {
+  // define all public properties here
+  this.hasAuth = false
+  this.sentAuth = false
+  this.bearerToken = null
+  this.user = null
+  this.pass = null
+}
+
+Auth.prototype.basic = function (user, pass, sendImmediately) {
+  var self = this
+  if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
+    throw new Error('auth() received invalid user or password')
+  }
+  self.user = user
+  self.pass = pass
+  self.hasAuth = true
+  var header = typeof pass !== 'undefined' ? user + ':' + pass : user
+  if (sendImmediately || typeof sendImmediately === 'undefined') {
+    var authHeader = 'Basic ' + toBase64(header)
+    self.sentAuth = true
+    return authHeader
+  }
+}
+
+Auth.prototype.bearer = function (bearer, sendImmediately) {
+  var self = this
+  self.bearerToken = bearer
+  self.hasAuth = true
+  if (sendImmediately || typeof sendImmediately === 'undefined') {
+    if (typeof bearer === 'function') {
+      bearer = bearer()
+    }
+    var authHeader = 'Bearer ' + bearer
+    self.sentAuth = true
+    return authHeader
+  }
+}
+
+Auth.prototype.digest = function (method, path, authHeader) {
+  // TODO: More complete implementation of RFC 2617.
+  //   - check challenge.algorithm
+  //   - support algorithm="MD5-sess"
+  //   - handle challenge.domain
+  //   - support qop="auth-int" only
+  //   - handle Authentication-Info (not necessarily?)
+  //   - check challenge.stale (not necessarily?)
+  //   - increase nc (not necessarily?)
+  // For reference:
+  // http://tools.ietf.org/html/rfc2617#section-3
+  // https://github.com/bagder/curl/blob/master/lib/http_digest.c
+
+  var self = this
+
+  var challenge = {}
+  var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
+  for (;;) {
+    var match = re.exec(authHeader)
+    if (!match) {
+      break
+    }
+    challenge[match[1]] = match[2] || match[3]
+  }
+
+  var ha1 = md5(self.user + ':' + challenge.realm + ':' + self.pass)
+  var ha2 = md5(method + ':' + path)
+  var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
+  var nc = qop && '00000001'
+  var cnonce = qop && uuid().replace(/-/g, '')
+  var digestResponse = qop
+    ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2)
+    : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
+  var authValues = {
+    username: self.user,
+    realm: challenge.realm,
+    nonce: challenge.nonce,
+    uri: path,
+    qop: qop,
+    response: digestResponse,
+    nc: nc,
+    cnonce: cnonce,
+    algorithm: challenge.algorithm,
+    opaque: challenge.opaque
+  }
+
+  authHeader = []
+  for (var k in authValues) {
+    if (authValues[k]) {
+      if (k === 'qop' || k === 'nc' || k === 'algorithm') {
+        authHeader.push(k + '=' + authValues[k])
+      } else {
+        authHeader.push(k + '="' + authValues[k] + '"')
+      }
+    }
+  }
+  authHeader = 'Digest ' + authHeader.join(', ')
+  self.sentAuth = true
+  return authHeader
+}
+
+Auth.prototype.response = function (method, path, headers) {
+  var self = this
+  if (!self.hasAuth || self.sentAuth) { return null }
+
+  var c = caseless(headers)
+
+  var authHeader = c.get('www-authenticate')
+  var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
+  // debug('reauth', authVerb)
+
+  switch (authVerb) {
+    case 'basic':
+      return self.basic(self.user, self.pass, true)
+
+    case 'bearer':
+      return self.bearer(self.bearerToken, true)
+
+    case 'digest':
+      return self.digest(method, path, authHeader)
+  }
+}
+
+exports.Auth = Auth
diff --git a/deps/npm/node_modules/request/lib/debug.js b/deps/npm/node_modules/request/lib/debug.js
deleted file mode 100644 (file)
index 25e3ded..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict'
-
-var util = require('util')
-  , request = require('../index')
-
-
-module.exports = function debug() {
-  if (request.debug) {
-    console.error('REQUEST %s', util.format.apply(util, arguments))
-  }
-}
diff --git a/deps/npm/node_modules/request/lib/getProxyFromURI.js b/deps/npm/node_modules/request/lib/getProxyFromURI.js
new file mode 100644 (file)
index 0000000..c2013a6
--- /dev/null
@@ -0,0 +1,79 @@
+'use strict'
+
+function formatHostname(hostname) {
+  // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'
+  return hostname.replace(/^\.*/, '.').toLowerCase()
+}
+
+function parseNoProxyZone(zone) {
+  zone = zone.trim().toLowerCase()
+
+  var zoneParts = zone.split(':', 2)
+    , zoneHost = formatHostname(zoneParts[0])
+    , zonePort = zoneParts[1]
+    , hasPort = zone.indexOf(':') > -1
+
+  return {hostname: zoneHost, port: zonePort, hasPort: hasPort}
+}
+
+function uriInNoProxy(uri, noProxy) {
+  var port = uri.port || (uri.protocol === 'https:' ? '443' : '80')
+    , hostname = formatHostname(uri.hostname)
+    , noProxyList = noProxy.split(',')
+
+  // iterate through the noProxyList until it finds a match.
+  return noProxyList.map(parseNoProxyZone).some(function(noProxyZone) {
+    var isMatchedAt = hostname.indexOf(noProxyZone.hostname)
+      , hostnameMatched = (
+          isMatchedAt > -1 &&
+          (isMatchedAt === hostname.length - noProxyZone.hostname.length)
+        )
+
+    if (noProxyZone.hasPort) {
+      return (port === noProxyZone.port) && hostnameMatched
+    }
+
+    return hostnameMatched
+  })
+}
+
+function getProxyFromURI(uri) {
+  // Decide the proper request proxy to use based on the request URI object and the
+  // environmental variables (NO_PROXY, HTTP_PROXY, etc.)
+  // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html)
+
+  var noProxy = process.env.NO_PROXY || process.env.no_proxy || ''
+
+  // if the noProxy is a wildcard then return null
+
+  if (noProxy === '*') {
+    return null
+  }
+
+  // if the noProxy is not empty and the uri is found return null
+
+  if (noProxy !== '' && uriInNoProxy(uri, noProxy)) {
+    return null
+  }
+
+  // Check for HTTP or HTTPS Proxy in environment Else default to null
+
+  if (uri.protocol === 'http:') {
+    return process.env.HTTP_PROXY ||
+           process.env.http_proxy || null
+  }
+
+  if (uri.protocol === 'https:') {
+    return process.env.HTTPS_PROXY ||
+           process.env.https_proxy ||
+           process.env.HTTP_PROXY  ||
+           process.env.http_proxy  || null
+  }
+
+  // if none of that works, return null
+  // (What uri protocol are you using then?)
+
+  return null
+}
+
+module.exports = getProxyFromURI
diff --git a/deps/npm/node_modules/request/lib/oauth.js b/deps/npm/node_modules/request/lib/oauth.js
new file mode 100644 (file)
index 0000000..3224601
--- /dev/null
@@ -0,0 +1,121 @@
+'use strict'
+
+var querystring = require('querystring')
+  , qs = require('qs')
+  , caseless = require('caseless')
+  , uuid = require('node-uuid')
+  , oauth = require('oauth-sign')
+
+
+exports.buildParams = function (_oauth, uri, method, query, form, qsLib) {
+  var oa = {}
+  for (var i in _oauth) {
+    oa['oauth_' + i] = _oauth[i]
+  }
+  if (!oa.oauth_version) {
+    oa.oauth_version = '1.0'
+  }
+  if (!oa.oauth_timestamp) {
+    oa.oauth_timestamp = Math.floor( Date.now() / 1000 ).toString()
+  }
+  if (!oa.oauth_nonce) {
+    oa.oauth_nonce = uuid().replace(/-/g, '')
+  }
+  if (!oa.oauth_signature_method) {
+    oa.oauth_signature_method = 'HMAC-SHA1'
+  }
+
+  var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key
+  delete oa.oauth_consumer_secret
+  delete oa.oauth_private_key
+
+  var token_secret = oa.oauth_token_secret
+  delete oa.oauth_token_secret
+
+  var realm = oa.oauth_realm
+  delete oa.oauth_realm
+  delete oa.oauth_transport_method
+
+  var baseurl = uri.protocol + '//' + uri.host + uri.pathname
+  var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&'))
+
+  oa.oauth_signature = oauth.sign(
+    oa.oauth_signature_method,
+    method,
+    baseurl,
+    params,
+    consumer_secret_or_private_key,
+    token_secret)
+
+  if (realm) {
+    oa.realm = realm
+  }
+
+  return oa
+}
+
+exports.concatParams = function (oa, sep, wrap) {
+  wrap = wrap || ''
+
+  var params = Object.keys(oa).filter(function (i) {
+    return i !== 'realm' && i !== 'oauth_signature'
+  }).sort()
+
+  if (oa.realm) {
+    params.splice(0, 1, 'realm')
+  }
+  params.push('oauth_signature')
+
+  return params.map(function (i) {
+    return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap
+  }).join(sep)
+}
+
+exports.oauth = function (args) {
+  var uri = args.uri || {}
+    , method = args.method || ''
+    , headers = caseless(args.headers)
+    , body = args.body || ''
+    , _oauth = args.oauth || {}
+    , qsLib = args.qsLib || qs
+
+  var form
+    , query
+    , contentType = headers.get('content-type') || ''
+    , formContentType = 'application/x-www-form-urlencoded'
+    , transport = _oauth.transport_method || 'header'
+
+  if (contentType.slice(0, formContentType.length) === formContentType) {
+    contentType = formContentType
+    form = body
+  }
+  if (uri.query) {
+    query = uri.query
+  }
+  if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) {
+    throw new Error('oauth: transport_method of \'body\' requires \'POST\' ' +
+      'and content-type \'' + formContentType + '\'')
+  }
+
+  var oa = this.buildParams(_oauth, uri, method, query, form, qsLib)
+
+  var data
+  switch (transport) {
+    case 'header':
+      data = 'OAuth ' + this.concatParams(oa, ',', '"')
+      break
+
+    case 'query':
+      data = (query ? '&' : '?') + this.concatParams(oa, '&')
+      break
+
+    case 'body':
+      data = (form ? form + '&' : '') + this.concatParams(oa, '&')
+      break
+
+    default:
+      throw new Error('oauth: transport_method invalid')
+  }
+
+  return {oauth:data, transport:transport}
+}
index 1753cc40b10117ce9f9fdd172f358680042b9155..6b7fb6d3486e78030d80f7891f335ba34b0aec2a 100644 (file)
@@ -190,6 +190,9 @@ See the <b><code>[Buffer](http://nodejs.org/docs/latest/api/buffer.html)</code><
 
 =======
 
-## License
+<a name="license"></a>
+## License &amp; copyright
 
-**bl** is Copyright (c) 2013 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licenced under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
+Copyright (c) 2013-2014 bl contributors (listed above).
+
+bl is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
index d1ea3b5c2e22975a65c8b9c59d83df9e48df5ea1..7a2f99788e628e2e10ae35273dcb52f37f567ff3 100644 (file)
@@ -1,4 +1,4 @@
-var DuplexStream = require('readable-stream').Duplex
+var DuplexStream = require('readable-stream/duplex')
   , util         = require('util')
 
 function BufferList (callback) {
index a5692e03c70626bc120f24218bf33c81e8c35431..3ffbd6a8ad4a2dc226791cb109c1a738ad927153 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "bl",
-  "version": "0.9.3",
+  "version": "0.9.4",
   "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
   "main": "bl.js",
   "scripts": {
     "faucet": "~0.0.1",
     "brtapsauce": "~0.3.0"
   },
-  "gitHead": "4987a76bf6bafd7616e62c7023c955e62f3a9461",
+  "gitHead": "e7f90703c5f90ca26f60455ea6ad0b6be4a9feee",
   "bugs": {
     "url": "https://github.com/rvagg/bl/issues"
   },
-  "_id": "bl@0.9.3",
-  "_shasum": "c41eff3e7cb31bde107c8f10076d274eff7f7d44",
+  "_id": "bl@0.9.4",
+  "_shasum": "4702ddf72fbe0ecd82787c00c113aea1935ad0e7",
   "_from": "bl@>=0.9.0 <0.10.0",
-  "_npmVersion": "1.4.27",
+  "_npmVersion": "2.1.18",
+  "_nodeVersion": "1.0.3",
   "_npmUser": {
     "name": "rvagg",
     "email": "rod@vagg.org"
     }
   ],
   "dist": {
-    "shasum": "c41eff3e7cb31bde107c8f10076d274eff7f7d44",
-    "tarball": "http://registry.npmjs.org/bl/-/bl-0.9.3.tgz"
+    "shasum": "4702ddf72fbe0ecd82787c00c113aea1935ad0e7",
+    "tarball": "http://registry.npmjs.org/bl/-/bl-0.9.4.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz",
+  "_resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz",
   "readme": "ERROR: No README data found!"
 }
index 607eea22bc611470055cccff53d3d45c337c90b9..ba711f68db12bae2242f4192080fa66f47c55dde 100644 (file)
@@ -1,5 +1,5 @@
 function Caseless (dict) {
-  this.dict = dict
+  this.dict = dict || {}
 }
 Caseless.prototype.set = function (name, value, clobber) {
   if (typeof name === 'object') {
index 1efd04a975067c669cd2172a03f523f2f579e01f..39153e614470e034a199219908938c65c4e2108a 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "caseless",
-  "version": "0.8.0",
+  "version": "0.9.0",
   "description": "Caseless object set/get/has, very useful when working with HTTP headers.",
   "main": "index.js",
   "scripts": {
   "devDependencies": {
     "tape": "^2.10.2"
   },
-  "gitHead": "1bfbf01d4481c057738a64ba284749222a944176",
+  "gitHead": "5ff0ccebbbf14dad5dc91def1f274887801db3e3",
   "homepage": "https://github.com/mikeal/caseless",
-  "_id": "caseless@0.8.0",
-  "_shasum": "5bca2881d41437f54b2407ebe34888c7b9ad4f7d",
-  "_from": "caseless@>=0.8.0 <0.9.0",
-  "_npmVersion": "2.0.0",
+  "_id": "caseless@0.9.0",
+  "_shasum": "b7b65ce6bf1413886539cfd533f0b30effa9cf88",
+  "_from": "caseless@>=0.9.0 <0.10.0",
+  "_npmVersion": "1.4.14",
   "_npmUser": {
-    "name": "mikeal",
-    "email": "mikeal.rogers@gmail.com"
+    "name": "nylen",
+    "email": "jnylen@gmail.com"
   },
   "maintainers": [
     {
       "name": "mikeal",
       "email": "mikeal.rogers@gmail.com"
+    },
+    {
+      "name": "nylen",
+      "email": "jnylen@gmail.com"
     }
   ],
   "dist": {
-    "shasum": "5bca2881d41437f54b2407ebe34888c7b9ad4f7d",
-    "tarball": "http://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz"
+    "shasum": "b7b65ce6bf1413886539cfd533f0b30effa9cf88",
+    "tarball": "http://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz",
+  "_resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz",
   "readme": "ERROR: No README data found!"
 }
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/HISTORY.md b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/HISTORY.md
deleted file mode 100644 (file)
index c749c71..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-2.0.4 / 2014-12-10
-==================
-
-  * deps: mime-db@~1.3.0
-    - Add new mime types
-
-2.0.3 / 2014-11-09
-==================
-
-  * deps: mime-db@~1.2.0
-    - Add new mime types
-
-2.0.2 / 2014-09-28
-==================
-
-  * deps: mime-db@~1.1.0
-    - Add new mime types
-    - Add additional compressible
-    - Update charsets
-
-2.0.1 / 2014-09-07
-==================
-
-  * Support Node.js 0.6
-
-2.0.0 / 2014-09-02
-==================
-
-  * Use `mime-db`
-  * Remove `.define()`
-
-1.0.2 / 2014-08-04
-==================
-
-  * Set charset=utf-8 for `text/javascript`
-
-1.0.1 / 2014-06-24
-==================
-
-  * Add `text/jsx` type
-
-1.0.0 / 2014-05-12
-==================
-
-  * Return `false` for unknown types
-  * Set charset=utf-8 for `application/json`
-
-0.1.0 / 2014-05-02
-==================
-
-  * Initial release
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/LICENSE b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/LICENSE
deleted file mode 100644 (file)
index a7ae8ee..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Jonathan Ong me@jongleberry.com
-
-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.
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/README.md b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/README.md
deleted file mode 100644 (file)
index 99d658b..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-# mime-types
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-The ultimate javascript content-type utility.
-
-Similar to [node-mime](https://github.com/broofa/node-mime), except:
-
-- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`,
-  so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
-- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`.
-- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db)
-- No `.define()` functionality
-
-Otherwise, the API is compatible.
-
-## Install
-
-```sh
-$ npm install mime-types
-```
-
-## Adding Types
-
-All mime types are based on [mime-db](https://github.com/jshttp/mime-db),
-so open a PR there if you'd like to add mime types.
-
-## API
-
-```js
-var mime = require('mime-types')
-```
-
-All functions return `false` if input is invalid or not found.
-
-### mime.lookup(path)
-
-Lookup the content-type associated with a file.
-
-```js
-mime.lookup('json')           // 'application/json'
-mime.lookup('.md')            // 'text/x-markdown'
-mime.lookup('file.html')      // 'text/html'
-mime.lookup('folder/file.js') // 'application/javascript'
-
-mime.lookup('cats') // false
-```
-
-### mime.contentType(type)
-
-Create a full content-type header given a content-type or extension.
-
-```js
-mime.contentType('markdown')  // 'text/x-markdown; charset=utf-8'
-mime.contentType('file.json') // 'application/json; charset=utf-8'
-```
-
-### mime.extension(type)
-
-Get the default extension for a content-type.
-
-```js
-mime.extension('application/octet-stream') // 'bin'
-```
-
-### mime.charset(type)
-
-Lookup the implied default charset of a content-type.
-
-```js
-mime.charset('text/x-markdown') // 'UTF-8'
-```
-
-### var type = mime.types[extension]
-
-A map of content-types by extension.
-
-### [extensions...] = mime.extensions[type]
-
-A map of extensions by content-type.
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/mime-types.svg?style=flat
-[npm-url]: https://npmjs.org/package/mime-types
-[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat
-[node-version-url]: http://nodejs.org/download/
-[travis-image]: https://img.shields.io/travis/jshttp/mime-types.svg?style=flat
-[travis-url]: https://travis-ci.org/jshttp/mime-types
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types.svg?style=flat
-[coveralls-url]: https://coveralls.io/r/jshttp/mime-types
-[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg?style=flat
-[downloads-url]: https://npmjs.org/package/mime-types
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/index.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/index.js
deleted file mode 100644 (file)
index b46a202..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-
-var db = require('mime-db')
-
-// types[extension] = type
-exports.types = Object.create(null)
-// extensions[type] = [extensions]
-exports.extensions = Object.create(null)
-
-Object.keys(db).forEach(function (name) {
-  var mime = db[name]
-  var exts = mime.extensions
-  if (!exts || !exts.length) return
-  exports.extensions[name] = exts
-  exts.forEach(function (ext) {
-    exports.types[ext] = name
-  })
-})
-
-exports.lookup = function (string) {
-  if (!string || typeof string !== "string") return false
-  // remove any leading paths, though we should just use path.basename
-  string = string.replace(/.*[\.\/\\]/, '').toLowerCase()
-  if (!string) return false
-  return exports.types[string] || false
-}
-
-exports.extension = function (type) {
-  if (!type || typeof type !== "string") return false
-  // to do: use media-typer
-  type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/)
-  if (!type) return false
-  var exts = exports.extensions[type[1].toLowerCase()]
-  if (!exts || !exts.length) return false
-  return exts[0]
-}
-
-// type has to be an exact mime type
-exports.charset = function (type) {
-  var mime = db[type]
-  if (mime && mime.charset) return mime.charset
-
-  // default text/* to utf-8
-  if (/^text\//.test(type)) return 'UTF-8'
-
-  return false
-}
-
-// backwards compatibility
-exports.charsets = {
-  lookup: exports.charset
-}
-
-// to do: maybe use set-type module or something
-exports.contentType = function (type) {
-  if (!type || typeof type !== "string") return false
-  if (!~type.indexOf('/')) type = exports.lookup(type)
-  if (!type) return false
-  if (!~type.indexOf('charset')) {
-    var charset = exports.charset(type)
-    if (charset) type += '; charset=' + charset.toLowerCase()
-  }
-  return type
-}
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/LICENSE b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/LICENSE
deleted file mode 100644 (file)
index a7ae8ee..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Jonathan Ong me@jongleberry.com
-
-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.
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/README.md b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/README.md
deleted file mode 100644 (file)
index 3b6364e..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# mime-db
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][travis-image]][travis-url]
-[![Coverage Status][coveralls-image]][coveralls-url]
-
-This is a database of all mime types.
-It consistents of a single, public JSON file and does not include any logic,
-allowing it to remain as unopinionated as possible with an API.
-It aggregates data from the following sources:
-
-- http://www.iana.org/assignments/media-types/media-types.xhtml
-- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
-
-## Usage
-
-```bash
-npm i mime-db
-```
-
-```js
-var db = require('mime-db');
-
-// grab data on .js files
-var data = db['application/javascript'];
-```
-
-If you're crazy enough to use this in the browser,
-you can just grab the JSON file:
-
-```
-https://cdn.rawgit.com/jshttp/mime-db/master/db.json
-```
-
-## Data Structure
-
-The JSON file is a map lookup for lowercased mime types.
-Each mime type has the following properties:
-
-- `.source` - where the mime type is defined.
-    If not set, it's probably a custom media type.
-    - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
-    - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml)
-- `.extensions[]` - known extensions associated with this mime type.
-- `.compressible` - whether a file of this type is can be gzipped.
-- `.charset` - the default charset associated with this type, if any.
-
-If unknown, every property could be `undefined`.
-
-## Repository Structure
-
-- `scripts` - these are scripts to run to build the database
-- `src/` - this is a folder of files created from remote sources like Apache and IANA
-- `lib/` - this is a folder of our own custom sources and db, which will be merged into `db.json`
-- `db.json` - the final built JSON file for end-user usage
-
-## Contributing
-
-To edit the database, only make PRs against files in the `lib/` folder.
-To update the build, run `npm run update`.
-
-[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg?style=flat
-[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg?style=flat
-[npm-url]: https://npmjs.org/package/mime-db
-[travis-image]: https://img.shields.io/travis/jshttp/mime-db.svg?style=flat
-[travis-url]: https://travis-ci.org/jshttp/mime-db
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db.svg?style=flat
-[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master
-[node-image]: https://img.shields.io/node/v/mime-db.svg?style=flat
-[node-url]: http://nodejs.org/download/
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/db.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/db.json
deleted file mode 100644 (file)
index f9f7a6b..0000000
+++ /dev/null
@@ -1,6385 +0,0 @@
-{
-  "application/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "application/3gpdash-qoe-report+xml": {
-    "source": "iana"
-  },
-  "application/3gpp-ims+xml": {
-    "source": "iana"
-  },
-  "application/a2l": {
-    "source": "iana"
-  },
-  "application/activemessage": {
-    "source": "iana"
-  },
-  "application/alto-costmap+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-costmapfilter+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-directory+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointcost+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointcostparams+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointprop+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointpropparams+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-error+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-networkmap+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-networkmapfilter+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/aml": {
-    "source": "iana"
-  },
-  "application/andrew-inset": {
-    "source": "iana",
-    "extensions": ["ez"]
-  },
-  "application/applefile": {
-    "source": "iana"
-  },
-  "application/applixware": {
-    "source": "apache",
-    "extensions": ["aw"]
-  },
-  "application/atf": {
-    "source": "iana"
-  },
-  "application/atfx": {
-    "source": "iana"
-  },
-  "application/atom+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["atom"]
-  },
-  "application/atomcat+xml": {
-    "source": "iana",
-    "extensions": ["atomcat"]
-  },
-  "application/atomdeleted+xml": {
-    "source": "iana"
-  },
-  "application/atomicmail": {
-    "source": "iana"
-  },
-  "application/atomsvc+xml": {
-    "source": "iana",
-    "extensions": ["atomsvc"]
-  },
-  "application/atxml": {
-    "source": "iana"
-  },
-  "application/auth-policy+xml": {
-    "source": "iana"
-  },
-  "application/bacnet-xdd+zip": {
-    "source": "iana"
-  },
-  "application/batch-smtp": {
-    "source": "iana"
-  },
-  "application/beep+xml": {
-    "source": "iana"
-  },
-  "application/calendar+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/calendar+xml": {
-    "source": "iana"
-  },
-  "application/call-completion": {
-    "source": "iana"
-  },
-  "application/cals-1840": {
-    "source": "iana"
-  },
-  "application/cbor": {
-    "source": "iana"
-  },
-  "application/ccmp+xml": {
-    "source": "iana"
-  },
-  "application/ccxml+xml": {
-    "source": "iana",
-    "extensions": ["ccxml"]
-  },
-  "application/cdfx+xml": {
-    "source": "iana"
-  },
-  "application/cdmi-capability": {
-    "source": "iana",
-    "extensions": ["cdmia"]
-  },
-  "application/cdmi-container": {
-    "source": "iana",
-    "extensions": ["cdmic"]
-  },
-  "application/cdmi-domain": {
-    "source": "iana",
-    "extensions": ["cdmid"]
-  },
-  "application/cdmi-object": {
-    "source": "iana",
-    "extensions": ["cdmio"]
-  },
-  "application/cdmi-queue": {
-    "source": "iana",
-    "extensions": ["cdmiq"]
-  },
-  "application/cea": {
-    "source": "iana"
-  },
-  "application/cea-2018+xml": {
-    "source": "iana"
-  },
-  "application/cellml+xml": {
-    "source": "iana"
-  },
-  "application/cfw": {
-    "source": "iana"
-  },
-  "application/cms": {
-    "source": "iana"
-  },
-  "application/cnrp+xml": {
-    "source": "iana"
-  },
-  "application/coap-group+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/commonground": {
-    "source": "iana"
-  },
-  "application/conference-info+xml": {
-    "source": "iana"
-  },
-  "application/cpl+xml": {
-    "source": "iana"
-  },
-  "application/csrattrs": {
-    "source": "iana"
-  },
-  "application/csta+xml": {
-    "source": "iana"
-  },
-  "application/cstadata+xml": {
-    "source": "iana"
-  },
-  "application/cu-seeme": {
-    "source": "apache",
-    "extensions": ["cu"]
-  },
-  "application/cybercash": {
-    "source": "iana"
-  },
-  "application/dart": {
-    "compressible": true
-  },
-  "application/dash+xml": {
-    "source": "iana",
-    "extensions": ["mdp"]
-  },
-  "application/dashdelta": {
-    "source": "iana"
-  },
-  "application/davmount+xml": {
-    "source": "iana",
-    "extensions": ["davmount"]
-  },
-  "application/dca-rft": {
-    "source": "iana"
-  },
-  "application/dcd": {
-    "source": "iana"
-  },
-  "application/dec-dx": {
-    "source": "iana"
-  },
-  "application/dialog-info+xml": {
-    "source": "iana"
-  },
-  "application/dicom": {
-    "source": "iana"
-  },
-  "application/dii": {
-    "source": "iana"
-  },
-  "application/dit": {
-    "source": "iana"
-  },
-  "application/dns": {
-    "source": "iana"
-  },
-  "application/docbook+xml": {
-    "source": "apache",
-    "extensions": ["dbk"]
-  },
-  "application/dskpp+xml": {
-    "source": "iana"
-  },
-  "application/dssc+der": {
-    "source": "iana",
-    "extensions": ["dssc"]
-  },
-  "application/dssc+xml": {
-    "source": "iana",
-    "extensions": ["xdssc"]
-  },
-  "application/dvcs": {
-    "source": "iana"
-  },
-  "application/ecmascript": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["ecma"]
-  },
-  "application/edi-consent": {
-    "source": "iana"
-  },
-  "application/edi-x12": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/edifact": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/emma+xml": {
-    "source": "iana",
-    "extensions": ["emma"]
-  },
-  "application/emotionml+xml": {
-    "source": "iana"
-  },
-  "application/encaprtp": {
-    "source": "iana"
-  },
-  "application/epp+xml": {
-    "source": "iana"
-  },
-  "application/epub+zip": {
-    "source": "iana",
-    "extensions": ["epub"]
-  },
-  "application/eshop": {
-    "source": "iana"
-  },
-  "application/example": {
-    "source": "iana"
-  },
-  "application/exi": {
-    "source": "iana",
-    "extensions": ["exi"]
-  },
-  "application/fastinfoset": {
-    "source": "iana"
-  },
-  "application/fastsoap": {
-    "source": "iana"
-  },
-  "application/fdt+xml": {
-    "source": "iana"
-  },
-  "application/fits": {
-    "source": "iana"
-  },
-  "application/font-sfnt": {
-    "source": "iana"
-  },
-  "application/font-tdpfr": {
-    "source": "iana",
-    "extensions": ["pfr"]
-  },
-  "application/font-woff": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["woff"]
-  },
-  "application/font-woff2": {
-    "compressible": false,
-    "extensions": ["woff2"]
-  },
-  "application/framework-attributes+xml": {
-    "source": "iana"
-  },
-  "application/gml+xml": {
-    "source": "apache",
-    "extensions": ["gml"]
-  },
-  "application/gpx+xml": {
-    "source": "apache",
-    "extensions": ["gpx"]
-  },
-  "application/gxf": {
-    "source": "apache",
-    "extensions": ["gxf"]
-  },
-  "application/gzip": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/h224": {
-    "source": "iana"
-  },
-  "application/held+xml": {
-    "source": "iana"
-  },
-  "application/http": {
-    "source": "iana"
-  },
-  "application/hyperstudio": {
-    "source": "iana",
-    "extensions": ["stk"]
-  },
-  "application/ibe-key-request+xml": {
-    "source": "iana"
-  },
-  "application/ibe-pkg-reply+xml": {
-    "source": "iana"
-  },
-  "application/ibe-pp-data": {
-    "source": "iana"
-  },
-  "application/iges": {
-    "source": "iana"
-  },
-  "application/im-iscomposing+xml": {
-    "source": "iana"
-  },
-  "application/index": {
-    "source": "iana"
-  },
-  "application/index.cmd": {
-    "source": "iana"
-  },
-  "application/index.obj": {
-    "source": "iana"
-  },
-  "application/index.response": {
-    "source": "iana"
-  },
-  "application/index.vnd": {
-    "source": "iana"
-  },
-  "application/inkml+xml": {
-    "source": "iana",
-    "extensions": ["ink","inkml"]
-  },
-  "application/iotp": {
-    "source": "iana"
-  },
-  "application/ipfix": {
-    "source": "iana",
-    "extensions": ["ipfix"]
-  },
-  "application/ipp": {
-    "source": "iana"
-  },
-  "application/isup": {
-    "source": "iana"
-  },
-  "application/its+xml": {
-    "source": "iana"
-  },
-  "application/java-archive": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["jar"]
-  },
-  "application/java-serialized-object": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["ser"]
-  },
-  "application/java-vm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["class"]
-  },
-  "application/javascript": {
-    "source": "iana",
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["js"]
-  },
-  "application/jrd+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/json": {
-    "source": "iana",
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["json","map"]
-  },
-  "application/json-patch+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/jsonml+json": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["jsonml"]
-  },
-  "application/kpml-request+xml": {
-    "source": "iana"
-  },
-  "application/kpml-response+xml": {
-    "source": "iana"
-  },
-  "application/ld+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/link-format": {
-    "source": "iana"
-  },
-  "application/load-control+xml": {
-    "source": "iana"
-  },
-  "application/lost+xml": {
-    "source": "iana",
-    "extensions": ["lostxml"]
-  },
-  "application/lostsync+xml": {
-    "source": "iana"
-  },
-  "application/lxf": {
-    "source": "iana"
-  },
-  "application/mac-binhex40": {
-    "source": "iana",
-    "extensions": ["hqx"]
-  },
-  "application/mac-compactpro": {
-    "source": "apache",
-    "extensions": ["cpt"]
-  },
-  "application/macwriteii": {
-    "source": "iana"
-  },
-  "application/mads+xml": {
-    "source": "iana",
-    "extensions": ["mads"]
-  },
-  "application/marc": {
-    "source": "iana",
-    "extensions": ["mrc"]
-  },
-  "application/marcxml+xml": {
-    "source": "iana",
-    "extensions": ["mrcx"]
-  },
-  "application/mathematica": {
-    "source": "iana",
-    "extensions": ["ma","nb","mb"]
-  },
-  "application/mathml+xml": {
-    "source": "iana",
-    "extensions": ["mathml"]
-  },
-  "application/mathml-content+xml": {
-    "source": "iana"
-  },
-  "application/mathml-presentation+xml": {
-    "source": "iana"
-  },
-  "application/mbms-associated-procedure-description+xml": {
-    "source": "iana"
-  },
-  "application/mbms-deregister+xml": {
-    "source": "iana"
-  },
-  "application/mbms-envelope+xml": {
-    "source": "iana"
-  },
-  "application/mbms-msk+xml": {
-    "source": "iana"
-  },
-  "application/mbms-msk-response+xml": {
-    "source": "iana"
-  },
-  "application/mbms-protection-description+xml": {
-    "source": "iana"
-  },
-  "application/mbms-reception-report+xml": {
-    "source": "iana"
-  },
-  "application/mbms-register+xml": {
-    "source": "iana"
-  },
-  "application/mbms-register-response+xml": {
-    "source": "iana"
-  },
-  "application/mbms-schedule+xml": {
-    "source": "iana"
-  },
-  "application/mbms-user-service-description+xml": {
-    "source": "iana"
-  },
-  "application/mbox": {
-    "source": "apache",
-    "extensions": ["mbox"]
-  },
-  "application/mbox+xml": {
-    "source": "iana"
-  },
-  "application/media-policy-dataset+xml": {
-    "source": "iana"
-  },
-  "application/media_control+xml": {
-    "source": "iana"
-  },
-  "application/mediaservercontrol+xml": {
-    "source": "iana",
-    "extensions": ["mscml"]
-  },
-  "application/merge-patch+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/metalink+xml": {
-    "source": "apache",
-    "extensions": ["metalink"]
-  },
-  "application/metalink4+xml": {
-    "source": "iana",
-    "extensions": ["meta4"]
-  },
-  "application/mets+xml": {
-    "source": "iana",
-    "extensions": ["mets"]
-  },
-  "application/mf4": {
-    "source": "iana"
-  },
-  "application/mikey": {
-    "source": "iana"
-  },
-  "application/mods+xml": {
-    "source": "iana",
-    "extensions": ["mods"]
-  },
-  "application/moss-keys": {
-    "source": "iana"
-  },
-  "application/moss-signature": {
-    "source": "iana"
-  },
-  "application/mosskey-data": {
-    "source": "iana"
-  },
-  "application/mosskey-request": {
-    "source": "iana"
-  },
-  "application/mp21": {
-    "source": "iana",
-    "extensions": ["m21","mp21"]
-  },
-  "application/mp4": {
-    "source": "iana",
-    "extensions": ["mp4s","m4p"]
-  },
-  "application/mpeg4-generic": {
-    "source": "iana"
-  },
-  "application/mpeg4-iod": {
-    "source": "iana"
-  },
-  "application/mpeg4-iod-xmt": {
-    "source": "iana"
-  },
-  "application/mrb-consumer+xml": {
-    "source": "iana"
-  },
-  "application/mrb-publish+xml": {
-    "source": "iana"
-  },
-  "application/msc-ivr+xml": {
-    "source": "iana"
-  },
-  "application/msc-mixer+xml": {
-    "source": "iana"
-  },
-  "application/msword": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["doc","dot"]
-  },
-  "application/mxf": {
-    "source": "iana",
-    "extensions": ["mxf"]
-  },
-  "application/nasdata": {
-    "source": "iana"
-  },
-  "application/news-checkgroups": {
-    "source": "iana"
-  },
-  "application/news-groupinfo": {
-    "source": "iana"
-  },
-  "application/news-transmission": {
-    "source": "iana"
-  },
-  "application/nlsml+xml": {
-    "source": "iana"
-  },
-  "application/nss": {
-    "source": "iana"
-  },
-  "application/ocsp-request": {
-    "source": "iana"
-  },
-  "application/ocsp-response": {
-    "source": "apache"
-  },
-  "application/octet-stream": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","buffer"]
-  },
-  "application/oda": {
-    "source": "iana",
-    "extensions": ["oda"]
-  },
-  "application/odx": {
-    "source": "iana"
-  },
-  "application/oebps-package+xml": {
-    "source": "iana",
-    "extensions": ["opf"]
-  },
-  "application/ogg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ogx"]
-  },
-  "application/omdoc+xml": {
-    "source": "apache",
-    "extensions": ["omdoc"]
-  },
-  "application/onenote": {
-    "source": "apache",
-    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
-  },
-  "application/oscp-response": {
-    "source": "iana"
-  },
-  "application/oxps": {
-    "source": "iana",
-    "extensions": ["oxps"]
-  },
-  "application/p2p-overlay+xml": {
-    "source": "iana"
-  },
-  "application/parityfec": {
-    "source": "iana"
-  },
-  "application/patch-ops-error+xml": {
-    "source": "iana",
-    "extensions": ["xer"]
-  },
-  "application/pdf": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pdf"]
-  },
-  "application/pdx": {
-    "source": "iana"
-  },
-  "application/pgp-encrypted": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pgp"]
-  },
-  "application/pgp-keys": {
-    "source": "iana"
-  },
-  "application/pgp-signature": {
-    "source": "iana",
-    "extensions": ["asc","sig"]
-  },
-  "application/pics-rules": {
-    "source": "apache",
-    "extensions": ["prf"]
-  },
-  "application/pidf+xml": {
-    "source": "iana"
-  },
-  "application/pidf-diff+xml": {
-    "source": "iana"
-  },
-  "application/pkcs10": {
-    "source": "iana",
-    "extensions": ["p10"]
-  },
-  "application/pkcs7-mime": {
-    "source": "iana",
-    "extensions": ["p7m","p7c"]
-  },
-  "application/pkcs7-signature": {
-    "source": "iana",
-    "extensions": ["p7s"]
-  },
-  "application/pkcs8": {
-    "source": "iana",
-    "extensions": ["p8"]
-  },
-  "application/pkix-attr-cert": {
-    "source": "iana",
-    "extensions": ["ac"]
-  },
-  "application/pkix-cert": {
-    "source": "iana",
-    "extensions": ["cer"]
-  },
-  "application/pkix-crl": {
-    "source": "iana",
-    "extensions": ["crl"]
-  },
-  "application/pkix-pkipath": {
-    "source": "iana",
-    "extensions": ["pkipath"]
-  },
-  "application/pkixcmp": {
-    "source": "iana",
-    "extensions": ["pki"]
-  },
-  "application/pls+xml": {
-    "source": "iana",
-    "extensions": ["pls"]
-  },
-  "application/poc-settings+xml": {
-    "source": "iana"
-  },
-  "application/postscript": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["ai","eps","ps"]
-  },
-  "application/provenance+xml": {
-    "source": "iana"
-  },
-  "application/prs.alvestrand.titrax-sheet": {
-    "source": "iana"
-  },
-  "application/prs.cww": {
-    "source": "iana",
-    "extensions": ["cww"]
-  },
-  "application/prs.hpub+zip": {
-    "source": "iana"
-  },
-  "application/prs.nprend": {
-    "source": "iana"
-  },
-  "application/prs.plucker": {
-    "source": "iana"
-  },
-  "application/prs.rdf-xml-crypt": {
-    "source": "iana"
-  },
-  "application/prs.xsf+xml": {
-    "source": "iana"
-  },
-  "application/pskc+xml": {
-    "source": "iana",
-    "extensions": ["pskcxml"]
-  },
-  "application/qsig": {
-    "source": "iana"
-  },
-  "application/raptorfec": {
-    "source": "iana"
-  },
-  "application/rdf+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rdf"]
-  },
-  "application/reginfo+xml": {
-    "source": "iana",
-    "extensions": ["rif"]
-  },
-  "application/relax-ng-compact-syntax": {
-    "source": "iana",
-    "extensions": ["rnc"]
-  },
-  "application/remote-printing": {
-    "source": "iana"
-  },
-  "application/reputon+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/resource-lists+xml": {
-    "source": "iana",
-    "extensions": ["rl"]
-  },
-  "application/resource-lists-diff+xml": {
-    "source": "iana",
-    "extensions": ["rld"]
-  },
-  "application/riscos": {
-    "source": "iana"
-  },
-  "application/rlmi+xml": {
-    "source": "iana"
-  },
-  "application/rls-services+xml": {
-    "source": "iana",
-    "extensions": ["rs"]
-  },
-  "application/rpki-ghostbusters": {
-    "source": "iana",
-    "extensions": ["gbr"]
-  },
-  "application/rpki-manifest": {
-    "source": "iana",
-    "extensions": ["mft"]
-  },
-  "application/rpki-roa": {
-    "source": "iana",
-    "extensions": ["roa"]
-  },
-  "application/rpki-updown": {
-    "source": "iana"
-  },
-  "application/rsd+xml": {
-    "source": "apache",
-    "extensions": ["rsd"]
-  },
-  "application/rss+xml": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["rss"]
-  },
-  "application/rtf": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rtf"]
-  },
-  "application/rtploopback": {
-    "source": "iana"
-  },
-  "application/rtx": {
-    "source": "iana"
-  },
-  "application/samlassertion+xml": {
-    "source": "iana"
-  },
-  "application/samlmetadata+xml": {
-    "source": "iana"
-  },
-  "application/sbml+xml": {
-    "source": "iana",
-    "extensions": ["sbml"]
-  },
-  "application/scaip+xml": {
-    "source": "iana"
-  },
-  "application/scvp-cv-request": {
-    "source": "iana",
-    "extensions": ["scq"]
-  },
-  "application/scvp-cv-response": {
-    "source": "iana",
-    "extensions": ["scs"]
-  },
-  "application/scvp-vp-request": {
-    "source": "iana",
-    "extensions": ["spq"]
-  },
-  "application/scvp-vp-response": {
-    "source": "iana",
-    "extensions": ["spp"]
-  },
-  "application/sdp": {
-    "source": "iana",
-    "extensions": ["sdp"]
-  },
-  "application/sep+xml": {
-    "source": "iana"
-  },
-  "application/sep-exi": {
-    "source": "iana"
-  },
-  "application/session-info": {
-    "source": "iana"
-  },
-  "application/set-payment": {
-    "source": "iana"
-  },
-  "application/set-payment-initiation": {
-    "source": "iana",
-    "extensions": ["setpay"]
-  },
-  "application/set-registration": {
-    "source": "iana"
-  },
-  "application/set-registration-initiation": {
-    "source": "iana",
-    "extensions": ["setreg"]
-  },
-  "application/sgml": {
-    "source": "iana"
-  },
-  "application/sgml-open-catalog": {
-    "source": "iana"
-  },
-  "application/shf+xml": {
-    "source": "iana",
-    "extensions": ["shf"]
-  },
-  "application/sieve": {
-    "source": "iana"
-  },
-  "application/simple-filter+xml": {
-    "source": "iana"
-  },
-  "application/simple-message-summary": {
-    "source": "iana"
-  },
-  "application/simplesymbolcontainer": {
-    "source": "iana"
-  },
-  "application/slate": {
-    "source": "iana"
-  },
-  "application/smil": {
-    "source": "iana"
-  },
-  "application/smil+xml": {
-    "source": "iana",
-    "extensions": ["smi","smil"]
-  },
-  "application/smpte336m": {
-    "source": "iana"
-  },
-  "application/soap+fastinfoset": {
-    "source": "iana"
-  },
-  "application/soap+xml": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/sparql-query": {
-    "source": "iana",
-    "extensions": ["rq"]
-  },
-  "application/sparql-results+xml": {
-    "source": "iana",
-    "extensions": ["srx"]
-  },
-  "application/spirits-event+xml": {
-    "source": "iana"
-  },
-  "application/sql": {
-    "source": "iana"
-  },
-  "application/srgs": {
-    "source": "iana",
-    "extensions": ["gram"]
-  },
-  "application/srgs+xml": {
-    "source": "iana",
-    "extensions": ["grxml"]
-  },
-  "application/sru+xml": {
-    "source": "iana",
-    "extensions": ["sru"]
-  },
-  "application/ssdl+xml": {
-    "source": "apache",
-    "extensions": ["ssdl"]
-  },
-  "application/ssml+xml": {
-    "source": "iana",
-    "extensions": ["ssml"]
-  },
-  "application/tamp-apex-update": {
-    "source": "iana"
-  },
-  "application/tamp-apex-update-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-community-update": {
-    "source": "iana"
-  },
-  "application/tamp-community-update-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-error": {
-    "source": "iana"
-  },
-  "application/tamp-sequence-adjust": {
-    "source": "iana"
-  },
-  "application/tamp-sequence-adjust-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-status-query": {
-    "source": "iana"
-  },
-  "application/tamp-status-response": {
-    "source": "iana"
-  },
-  "application/tamp-update": {
-    "source": "iana"
-  },
-  "application/tamp-update-confirm": {
-    "source": "iana"
-  },
-  "application/tar": {
-    "compressible": true
-  },
-  "application/tei+xml": {
-    "source": "iana",
-    "extensions": ["tei","teicorpus"]
-  },
-  "application/thraud+xml": {
-    "source": "iana",
-    "extensions": ["tfi"]
-  },
-  "application/timestamp-query": {
-    "source": "iana"
-  },
-  "application/timestamp-reply": {
-    "source": "iana"
-  },
-  "application/timestamped-data": {
-    "source": "iana",
-    "extensions": ["tsd"]
-  },
-  "application/ttml+xml": {
-    "source": "iana"
-  },
-  "application/tve-trigger": {
-    "source": "iana"
-  },
-  "application/ulpfec": {
-    "source": "iana"
-  },
-  "application/urc-grpsheet+xml": {
-    "source": "iana"
-  },
-  "application/urc-ressheet+xml": {
-    "source": "iana"
-  },
-  "application/urc-targetdesc+xml": {
-    "source": "iana"
-  },
-  "application/urc-uisocketdesc+xml": {
-    "source": "iana"
-  },
-  "application/vcard+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vcard+xml": {
-    "source": "iana"
-  },
-  "application/vemmi": {
-    "source": "iana"
-  },
-  "application/vividence.scriptfile": {
-    "source": "apache"
-  },
-  "application/vnd-acucobol": {
-    "source": "iana"
-  },
-  "application/vnd-curl": {
-    "source": "iana"
-  },
-  "application/vnd-dart": {
-    "source": "iana"
-  },
-  "application/vnd-dxr": {
-    "source": "iana"
-  },
-  "application/vnd-fdf": {
-    "source": "iana"
-  },
-  "application/vnd-mif": {
-    "source": "iana"
-  },
-  "application/vnd-sema": {
-    "source": "iana"
-  },
-  "application/vnd-wap-wmlc": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.bsf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.pic-bw-large": {
-    "source": "iana",
-    "extensions": ["plb"]
-  },
-  "application/vnd.3gpp.pic-bw-small": {
-    "source": "iana",
-    "extensions": ["psb"]
-  },
-  "application/vnd.3gpp.pic-bw-var": {
-    "source": "iana",
-    "extensions": ["pvb"]
-  },
-  "application/vnd.3gpp.sms": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.bcmcsinfo+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.sms": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.tcap": {
-    "source": "iana",
-    "extensions": ["tcap"]
-  },
-  "application/vnd.3m.post-it-notes": {
-    "source": "iana",
-    "extensions": ["pwn"]
-  },
-  "application/vnd.accpac.simply.aso": {
-    "source": "iana",
-    "extensions": ["aso"]
-  },
-  "application/vnd.accpac.simply.imp": {
-    "source": "iana",
-    "extensions": ["imp"]
-  },
-  "application/vnd.acucobol": {
-    "source": "apache",
-    "extensions": ["acu"]
-  },
-  "application/vnd.acucorp": {
-    "source": "iana",
-    "extensions": ["atc","acutc"]
-  },
-  "application/vnd.adobe.air-application-installer-package+zip": {
-    "source": "apache",
-    "extensions": ["air"]
-  },
-  "application/vnd.adobe.flash-movie": {
-    "source": "iana"
-  },
-  "application/vnd.adobe.formscentral.fcdt": {
-    "source": "iana",
-    "extensions": ["fcdt"]
-  },
-  "application/vnd.adobe.fxp": {
-    "source": "iana",
-    "extensions": ["fxp","fxpl"]
-  },
-  "application/vnd.adobe.partial-upload": {
-    "source": "iana"
-  },
-  "application/vnd.adobe.xdp+xml": {
-    "source": "iana",
-    "extensions": ["xdp"]
-  },
-  "application/vnd.adobe.xfdf": {
-    "source": "iana",
-    "extensions": ["xfdf"]
-  },
-  "application/vnd.aether.imp": {
-    "source": "iana"
-  },
-  "application/vnd.ah-barcode": {
-    "source": "iana"
-  },
-  "application/vnd.ahead.space": {
-    "source": "iana",
-    "extensions": ["ahead"]
-  },
-  "application/vnd.airzip.filesecure.azf": {
-    "source": "iana",
-    "extensions": ["azf"]
-  },
-  "application/vnd.airzip.filesecure.azs": {
-    "source": "iana",
-    "extensions": ["azs"]
-  },
-  "application/vnd.amazon.ebook": {
-    "source": "apache",
-    "extensions": ["azw"]
-  },
-  "application/vnd.americandynamics.acc": {
-    "source": "iana",
-    "extensions": ["acc"]
-  },
-  "application/vnd.amiga.ami": {
-    "source": "iana",
-    "extensions": ["ami"]
-  },
-  "application/vnd.amundsen.maze+xml": {
-    "source": "iana"
-  },
-  "application/vnd.android.package-archive": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["apk"]
-  },
-  "application/vnd.anser-web-certificate-issue-initiation": {
-    "source": "iana",
-    "extensions": ["cii"]
-  },
-  "application/vnd.anser-web-funds-transfer-initiation": {
-    "source": "apache",
-    "extensions": ["fti"]
-  },
-  "application/vnd.antix.game-component": {
-    "source": "iana",
-    "extensions": ["atx"]
-  },
-  "application/vnd.apache.thrift.binary": {
-    "source": "iana"
-  },
-  "application/vnd.apache.thrift.compact": {
-    "source": "iana"
-  },
-  "application/vnd.apache.thrift.json": {
-    "source": "iana"
-  },
-  "application/vnd.api+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.apple.installer+xml": {
-    "source": "iana",
-    "extensions": ["mpkg"]
-  },
-  "application/vnd.apple.mpegurl": {
-    "source": "iana",
-    "extensions": ["m3u8"]
-  },
-  "application/vnd.arastra.swi": {
-    "source": "iana"
-  },
-  "application/vnd.aristanetworks.swi": {
-    "source": "iana",
-    "extensions": ["swi"]
-  },
-  "application/vnd.artsquare": {
-    "source": "iana"
-  },
-  "application/vnd.astraea-software.iota": {
-    "source": "iana",
-    "extensions": ["iota"]
-  },
-  "application/vnd.audiograph": {
-    "source": "iana",
-    "extensions": ["aep"]
-  },
-  "application/vnd.autopackage": {
-    "source": "iana"
-  },
-  "application/vnd.avistar+xml": {
-    "source": "iana"
-  },
-  "application/vnd.balsamiq.bmml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.bekitzur-stech+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.blueice.multipass": {
-    "source": "iana",
-    "extensions": ["mpm"]
-  },
-  "application/vnd.bluetooth.ep.oob": {
-    "source": "iana"
-  },
-  "application/vnd.bluetooth.le.oob": {
-    "source": "iana"
-  },
-  "application/vnd.bmi": {
-    "source": "iana",
-    "extensions": ["bmi"]
-  },
-  "application/vnd.businessobjects": {
-    "source": "iana",
-    "extensions": ["rep"]
-  },
-  "application/vnd.cab-jscript": {
-    "source": "iana"
-  },
-  "application/vnd.canon-cpdl": {
-    "source": "iana"
-  },
-  "application/vnd.canon-lips": {
-    "source": "iana"
-  },
-  "application/vnd.cendio.thinlinc.clientconf": {
-    "source": "iana"
-  },
-  "application/vnd.century-systems.tcp_stream": {
-    "source": "iana"
-  },
-  "application/vnd.chemdraw+xml": {
-    "source": "iana",
-    "extensions": ["cdxml"]
-  },
-  "application/vnd.chipnuts.karaoke-mmd": {
-    "source": "iana",
-    "extensions": ["mmd"]
-  },
-  "application/vnd.cinderella": {
-    "source": "iana",
-    "extensions": ["cdy"]
-  },
-  "application/vnd.cirpack.isdn-ext": {
-    "source": "iana"
-  },
-  "application/vnd.claymore": {
-    "source": "iana",
-    "extensions": ["cla"]
-  },
-  "application/vnd.cloanto.rp9": {
-    "source": "iana",
-    "extensions": ["rp9"]
-  },
-  "application/vnd.clonk.c4group": {
-    "source": "iana",
-    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
-  },
-  "application/vnd.cluetrust.cartomobile-config": {
-    "source": "iana",
-    "extensions": ["c11amc"]
-  },
-  "application/vnd.cluetrust.cartomobile-config-pkg": {
-    "source": "iana",
-    "extensions": ["c11amz"]
-  },
-  "application/vnd.coffeescript": {
-    "source": "iana"
-  },
-  "application/vnd.collection+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.collection.doc+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.collection.next+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.commerce-battelle": {
-    "source": "iana"
-  },
-  "application/vnd.commonspace": {
-    "source": "iana",
-    "extensions": ["csp"]
-  },
-  "application/vnd.contact.cmsg": {
-    "source": "iana",
-    "extensions": ["cdbcmsg"]
-  },
-  "application/vnd.cosmocaller": {
-    "source": "iana",
-    "extensions": ["cmc"]
-  },
-  "application/vnd.crick.clicker": {
-    "source": "iana",
-    "extensions": ["clkx"]
-  },
-  "application/vnd.crick.clicker.keyboard": {
-    "source": "iana",
-    "extensions": ["clkk"]
-  },
-  "application/vnd.crick.clicker.palette": {
-    "source": "iana",
-    "extensions": ["clkp"]
-  },
-  "application/vnd.crick.clicker.template": {
-    "source": "iana",
-    "extensions": ["clkt"]
-  },
-  "application/vnd.crick.clicker.wordbank": {
-    "source": "iana",
-    "extensions": ["clkw"]
-  },
-  "application/vnd.criticaltools.wbs+xml": {
-    "source": "iana",
-    "extensions": ["wbs"]
-  },
-  "application/vnd.ctc-posml": {
-    "source": "iana",
-    "extensions": ["pml"]
-  },
-  "application/vnd.ctct.ws+xml": {
-    "source": "iana"
-  },
-  "application/vnd.cups-pdf": {
-    "source": "iana"
-  },
-  "application/vnd.cups-postscript": {
-    "source": "iana"
-  },
-  "application/vnd.cups-ppd": {
-    "source": "iana",
-    "extensions": ["ppd"]
-  },
-  "application/vnd.cups-raster": {
-    "source": "iana"
-  },
-  "application/vnd.cups-raw": {
-    "source": "iana"
-  },
-  "application/vnd.curl": {
-    "source": "apache"
-  },
-  "application/vnd.curl.car": {
-    "source": "apache",
-    "extensions": ["car"]
-  },
-  "application/vnd.curl.pcurl": {
-    "source": "apache",
-    "extensions": ["pcurl"]
-  },
-  "application/vnd.cyan.dean.root+xml": {
-    "source": "iana"
-  },
-  "application/vnd.cybank": {
-    "source": "iana"
-  },
-  "application/vnd.dart": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["dart"]
-  },
-  "application/vnd.data-vision.rdz": {
-    "source": "iana",
-    "extensions": ["rdz"]
-  },
-  "application/vnd.debian.binary-package": {
-    "source": "iana"
-  },
-  "application/vnd.dece-zip": {
-    "source": "iana"
-  },
-  "application/vnd.dece.data": {
-    "source": "iana",
-    "extensions": ["uvf","uvvf","uvd","uvvd"]
-  },
-  "application/vnd.dece.ttml+xml": {
-    "source": "iana",
-    "extensions": ["uvt","uvvt"]
-  },
-  "application/vnd.dece.unspecified": {
-    "source": "iana",
-    "extensions": ["uvx","uvvx"]
-  },
-  "application/vnd.dece.zip": {
-    "source": "apache",
-    "extensions": ["uvz","uvvz"]
-  },
-  "application/vnd.denovo.fcselayout-link": {
-    "source": "iana",
-    "extensions": ["fe_launch"]
-  },
-  "application/vnd.desmume-movie": {
-    "source": "iana"
-  },
-  "application/vnd.dir-bi.plate-dl-nosuffix": {
-    "source": "iana"
-  },
-  "application/vnd.dm.delegation+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dna": {
-    "source": "iana",
-    "extensions": ["dna"]
-  },
-  "application/vnd.document+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.dolby.mlp": {
-    "source": "apache",
-    "extensions": ["mlp"]
-  },
-  "application/vnd.dolby.mobile.1": {
-    "source": "iana"
-  },
-  "application/vnd.dolby.mobile.2": {
-    "source": "iana"
-  },
-  "application/vnd.doremir.scorecloud-binary-document": {
-    "source": "iana"
-  },
-  "application/vnd.dpgraph": {
-    "source": "iana",
-    "extensions": ["dpg"]
-  },
-  "application/vnd.dreamfactory": {
-    "source": "iana",
-    "extensions": ["dfac"]
-  },
-  "application/vnd.ds-keypoint": {
-    "source": "apache",
-    "extensions": ["kpxx"]
-  },
-  "application/vnd.dtg.local": {
-    "source": "iana"
-  },
-  "application/vnd.dtg.local.flash": {
-    "source": "iana"
-  },
-  "application/vnd.dtg.local.html": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ait": {
-    "source": "iana",
-    "extensions": ["ait"]
-  },
-  "application/vnd.dvb.dvbj": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.esgcontainer": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcdftnotifaccess": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgaccess": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgaccess2": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgpdd": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcroaming": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.iptv.alfec-base": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.iptv.alfec-enhancement": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-aggregate-root+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-container+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-generic+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-msglist+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-registration-request+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-registration-response+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-init+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.pfr": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.service": {
-    "source": "apache",
-    "extensions": ["svc"]
-  },
-  "application/vnd.dvb_service": {
-    "source": "iana"
-  },
-  "application/vnd.dxr": {
-    "source": "apache"
-  },
-  "application/vnd.dynageo": {
-    "source": "iana",
-    "extensions": ["geo"]
-  },
-  "application/vnd.dzr": {
-    "source": "iana"
-  },
-  "application/vnd.easykaraoke.cdgdownload": {
-    "source": "iana"
-  },
-  "application/vnd.ecdis-update": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.chart": {
-    "source": "iana",
-    "extensions": ["mag"]
-  },
-  "application/vnd.ecowin.filerequest": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.fileupdate": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.series": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.seriesrequest": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.seriesupdate": {
-    "source": "iana"
-  },
-  "application/vnd.emclient.accessrequest+xml": {
-    "source": "iana"
-  },
-  "application/vnd.enliven": {
-    "source": "iana",
-    "extensions": ["nml"]
-  },
-  "application/vnd.enphase.envoy": {
-    "source": "iana"
-  },
-  "application/vnd.eprints.data+xml": {
-    "source": "iana"
-  },
-  "application/vnd.epson.esf": {
-    "source": "iana",
-    "extensions": ["esf"]
-  },
-  "application/vnd.epson.msf": {
-    "source": "iana",
-    "extensions": ["msf"]
-  },
-  "application/vnd.epson.quickanime": {
-    "source": "iana",
-    "extensions": ["qam"]
-  },
-  "application/vnd.epson.salt": {
-    "source": "iana",
-    "extensions": ["slt"]
-  },
-  "application/vnd.epson.ssf": {
-    "source": "iana",
-    "extensions": ["ssf"]
-  },
-  "application/vnd.ericsson.quickcall": {
-    "source": "iana"
-  },
-  "application/vnd.eszigno3+xml": {
-    "source": "iana",
-    "extensions": ["es3","et3"]
-  },
-  "application/vnd.etsi.aoc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.asic-e+zip": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.asic-s+zip": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.cug+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvcommand+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvdiscovery+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-bc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-cod+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-npvr+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvservice+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsync+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvueprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.mcid+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.mheg5": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.overload-control-policy-dataset+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.pstn+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.sci+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.simservs+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.timestamp-token": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.tsl+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.tsl.der": {
-    "source": "iana"
-  },
-  "application/vnd.eudora.data": {
-    "source": "iana"
-  },
-  "application/vnd.ezpix-album": {
-    "source": "iana",
-    "extensions": ["ez2"]
-  },
-  "application/vnd.ezpix-package": {
-    "source": "iana",
-    "extensions": ["ez3"]
-  },
-  "application/vnd.f-secure.mobile": {
-    "source": "iana"
-  },
-  "application/vnd.fdf": {
-    "source": "apache",
-    "extensions": ["fdf"]
-  },
-  "application/vnd.fdsn.mseed": {
-    "source": "iana",
-    "extensions": ["mseed"]
-  },
-  "application/vnd.fdsn.seed": {
-    "source": "iana",
-    "extensions": ["seed","dataless"]
-  },
-  "application/vnd.ffsns": {
-    "source": "iana"
-  },
-  "application/vnd.fints": {
-    "source": "iana"
-  },
-  "application/vnd.flographit": {
-    "source": "iana",
-    "extensions": ["gph"]
-  },
-  "application/vnd.fluxtime.clip": {
-    "source": "iana",
-    "extensions": ["ftc"]
-  },
-  "application/vnd.font-fontforge-sfd": {
-    "source": "iana"
-  },
-  "application/vnd.framemaker": {
-    "source": "iana",
-    "extensions": ["fm","frame","maker","book"]
-  },
-  "application/vnd.frogans.fnc": {
-    "source": "iana",
-    "extensions": ["fnc"]
-  },
-  "application/vnd.frogans.ltf": {
-    "source": "iana",
-    "extensions": ["ltf"]
-  },
-  "application/vnd.fsc.weblaunch": {
-    "source": "iana",
-    "extensions": ["fsc"]
-  },
-  "application/vnd.fujitsu.oasys": {
-    "source": "iana",
-    "extensions": ["oas"]
-  },
-  "application/vnd.fujitsu.oasys2": {
-    "source": "iana",
-    "extensions": ["oa2"]
-  },
-  "application/vnd.fujitsu.oasys3": {
-    "source": "iana",
-    "extensions": ["oa3"]
-  },
-  "application/vnd.fujitsu.oasysgp": {
-    "source": "iana",
-    "extensions": ["fg5"]
-  },
-  "application/vnd.fujitsu.oasysprs": {
-    "source": "iana",
-    "extensions": ["bh2"]
-  },
-  "application/vnd.fujixerox.art-ex": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.art4": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.ddd": {
-    "source": "iana",
-    "extensions": ["ddd"]
-  },
-  "application/vnd.fujixerox.docuworks": {
-    "source": "iana",
-    "extensions": ["xdw"]
-  },
-  "application/vnd.fujixerox.docuworks.binder": {
-    "source": "iana",
-    "extensions": ["xbd"]
-  },
-  "application/vnd.fujixerox.docuworks.container": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.hbpl": {
-    "source": "iana"
-  },
-  "application/vnd.fut-misnet": {
-    "source": "iana"
-  },
-  "application/vnd.fuzzysheet": {
-    "source": "iana",
-    "extensions": ["fzs"]
-  },
-  "application/vnd.genomatix.tuxedo": {
-    "source": "iana",
-    "extensions": ["txd"]
-  },
-  "application/vnd.geo+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.geocube+xml": {
-    "source": "iana"
-  },
-  "application/vnd.geogebra.file": {
-    "source": "iana",
-    "extensions": ["ggb"]
-  },
-  "application/vnd.geogebra.tool": {
-    "source": "iana",
-    "extensions": ["ggt"]
-  },
-  "application/vnd.geometry-explorer": {
-    "source": "iana",
-    "extensions": ["gex","gre"]
-  },
-  "application/vnd.geonext": {
-    "source": "iana",
-    "extensions": ["gxt"]
-  },
-  "application/vnd.geoplan": {
-    "source": "iana",
-    "extensions": ["g2w"]
-  },
-  "application/vnd.geospace": {
-    "source": "iana",
-    "extensions": ["g3w"]
-  },
-  "application/vnd.globalplatform.card-content-mgt": {
-    "source": "iana"
-  },
-  "application/vnd.globalplatform.card-content-mgt-response": {
-    "source": "iana"
-  },
-  "application/vnd.gmx": {
-    "source": "iana",
-    "extensions": ["gmx"]
-  },
-  "application/vnd.google-earth.kml+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["kml"]
-  },
-  "application/vnd.google-earth.kmz": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["kmz"]
-  },
-  "application/vnd.gov.sk.e-form+zip": {
-    "source": "iana"
-  },
-  "application/vnd.grafeq": {
-    "source": "iana",
-    "extensions": ["gqf","gqs"]
-  },
-  "application/vnd.gridmp": {
-    "source": "iana"
-  },
-  "application/vnd.groove-account": {
-    "source": "iana",
-    "extensions": ["gac"]
-  },
-  "application/vnd.groove-help": {
-    "source": "iana",
-    "extensions": ["ghf"]
-  },
-  "application/vnd.groove-identity-message": {
-    "source": "iana",
-    "extensions": ["gim"]
-  },
-  "application/vnd.groove-injector": {
-    "source": "iana",
-    "extensions": ["grv"]
-  },
-  "application/vnd.groove-tool-message": {
-    "source": "iana",
-    "extensions": ["gtm"]
-  },
-  "application/vnd.groove-tool-template": {
-    "source": "iana",
-    "extensions": ["tpl"]
-  },
-  "application/vnd.groove-vcard": {
-    "source": "iana",
-    "extensions": ["vcg"]
-  },
-  "application/vnd.hal+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.hal+xml": {
-    "source": "iana",
-    "extensions": ["hal"]
-  },
-  "application/vnd.handheld-entertainment+xml": {
-    "source": "iana",
-    "extensions": ["zmm"]
-  },
-  "application/vnd.hbci": {
-    "source": "iana",
-    "extensions": ["hbci"]
-  },
-  "application/vnd.hcl-bireports": {
-    "source": "iana"
-  },
-  "application/vnd.heroku+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.hhe.lesson-player": {
-    "source": "iana",
-    "extensions": ["les"]
-  },
-  "application/vnd.hp-hpgl": {
-    "source": "iana",
-    "extensions": ["hpgl"]
-  },
-  "application/vnd.hp-hpid": {
-    "source": "iana",
-    "extensions": ["hpid"]
-  },
-  "application/vnd.hp-hps": {
-    "source": "iana",
-    "extensions": ["hps"]
-  },
-  "application/vnd.hp-jlyt": {
-    "source": "iana",
-    "extensions": ["jlt"]
-  },
-  "application/vnd.hp-pcl": {
-    "source": "iana",
-    "extensions": ["pcl"]
-  },
-  "application/vnd.hp-pclxl": {
-    "source": "iana",
-    "extensions": ["pclxl"]
-  },
-  "application/vnd.httphone": {
-    "source": "iana"
-  },
-  "application/vnd.hydrostatix.sof-data": {
-    "source": "iana"
-  },
-  "application/vnd.hzn-3d-crossword": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.afplinedata": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.electronic-media": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.minipay": {
-    "source": "iana",
-    "extensions": ["mpy"]
-  },
-  "application/vnd.ibm.modcap": {
-    "source": "iana",
-    "extensions": ["afp","listafp","list3820"]
-  },
-  "application/vnd.ibm.rights-management": {
-    "source": "iana",
-    "extensions": ["irm"]
-  },
-  "application/vnd.ibm.secure-container": {
-    "source": "iana",
-    "extensions": ["sc"]
-  },
-  "application/vnd.iccprofile": {
-    "source": "iana",
-    "extensions": ["icc","icm"]
-  },
-  "application/vnd.ieee.1905": {
-    "source": "iana"
-  },
-  "application/vnd.igloader": {
-    "source": "iana",
-    "extensions": ["igl"]
-  },
-  "application/vnd.immervision-ivp": {
-    "source": "iana",
-    "extensions": ["ivp"]
-  },
-  "application/vnd.immervision-ivu": {
-    "source": "iana",
-    "extensions": ["ivu"]
-  },
-  "application/vnd.ims.imsccv1p1": {
-    "source": "iana"
-  },
-  "application/vnd.ims.lis.v2.result+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolproxy+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolproxy.id+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolsettings+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.informedcontrol.rms+xml": {
-    "source": "iana"
-  },
-  "application/vnd.informix-visionary": {
-    "source": "iana"
-  },
-  "application/vnd.infotech.project": {
-    "source": "iana"
-  },
-  "application/vnd.infotech.project+xml": {
-    "source": "iana"
-  },
-  "application/vnd.innopath.wamp.notification": {
-    "source": "iana"
-  },
-  "application/vnd.insors.igm": {
-    "source": "iana",
-    "extensions": ["igm"]
-  },
-  "application/vnd.intercon.formnet": {
-    "source": "iana",
-    "extensions": ["xpw","xpx"]
-  },
-  "application/vnd.intergeo": {
-    "source": "iana",
-    "extensions": ["i2g"]
-  },
-  "application/vnd.intertrust.digibox": {
-    "source": "iana"
-  },
-  "application/vnd.intertrust.nncp": {
-    "source": "iana"
-  },
-  "application/vnd.intu.qbo": {
-    "source": "iana",
-    "extensions": ["qbo"]
-  },
-  "application/vnd.intu.qfx": {
-    "source": "iana",
-    "extensions": ["qfx"]
-  },
-  "application/vnd.iptc.g2.catalogitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.conceptitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.knowledgeitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.newsitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.newsmessage+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.packageitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.planningitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ipunplugged.rcprofile": {
-    "source": "iana",
-    "extensions": ["rcprofile"]
-  },
-  "application/vnd.irepository.package+xml": {
-    "source": "iana",
-    "extensions": ["irp"]
-  },
-  "application/vnd.is-xpr": {
-    "source": "iana",
-    "extensions": ["xpr"]
-  },
-  "application/vnd.isac.fcs": {
-    "source": "iana",
-    "extensions": ["fcs"]
-  },
-  "application/vnd.jam": {
-    "source": "iana",
-    "extensions": ["jam"]
-  },
-  "application/vnd.japannet-directory-service": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-jpnstore-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-payment-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-registration": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-registration-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-setstore-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-verification": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-verification-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.jcp.javame.midlet-rms": {
-    "source": "iana",
-    "extensions": ["rms"]
-  },
-  "application/vnd.jisp": {
-    "source": "iana",
-    "extensions": ["jisp"]
-  },
-  "application/vnd.joost.joda-archive": {
-    "source": "iana",
-    "extensions": ["joda"]
-  },
-  "application/vnd.jsk.isdn-ngn": {
-    "source": "iana"
-  },
-  "application/vnd.kahootz": {
-    "source": "iana",
-    "extensions": ["ktz","ktr"]
-  },
-  "application/vnd.kde.karbon": {
-    "source": "iana",
-    "extensions": ["karbon"]
-  },
-  "application/vnd.kde.kchart": {
-    "source": "iana",
-    "extensions": ["chrt"]
-  },
-  "application/vnd.kde.kformula": {
-    "source": "iana",
-    "extensions": ["kfo"]
-  },
-  "application/vnd.kde.kivio": {
-    "source": "iana",
-    "extensions": ["flw"]
-  },
-  "application/vnd.kde.kontour": {
-    "source": "iana",
-    "extensions": ["kon"]
-  },
-  "application/vnd.kde.kpresenter": {
-    "source": "iana",
-    "extensions": ["kpr","kpt"]
-  },
-  "application/vnd.kde.kspread": {
-    "source": "iana",
-    "extensions": ["ksp"]
-  },
-  "application/vnd.kde.kword": {
-    "source": "iana",
-    "extensions": ["kwd","kwt"]
-  },
-  "application/vnd.kenameaapp": {
-    "source": "iana",
-    "extensions": ["htke"]
-  },
-  "application/vnd.kidspiration": {
-    "source": "iana",
-    "extensions": ["kia"]
-  },
-  "application/vnd.kinar": {
-    "source": "iana",
-    "extensions": ["kne","knp"]
-  },
-  "application/vnd.koan": {
-    "source": "iana",
-    "extensions": ["skp","skd","skt","skm"]
-  },
-  "application/vnd.kodak-descriptor": {
-    "source": "iana",
-    "extensions": ["sse"]
-  },
-  "application/vnd.las.las+xml": {
-    "source": "iana",
-    "extensions": ["lasxml"]
-  },
-  "application/vnd.liberty-request+xml": {
-    "source": "iana"
-  },
-  "application/vnd.llamagraphics.life-balance.desktop": {
-    "source": "iana",
-    "extensions": ["lbd"]
-  },
-  "application/vnd.llamagraphics.life-balance.exchange+xml": {
-    "source": "iana",
-    "extensions": ["lbe"]
-  },
-  "application/vnd.lotus-1-2-3": {
-    "source": "iana",
-    "extensions": ["123"]
-  },
-  "application/vnd.lotus-approach": {
-    "source": "iana",
-    "extensions": ["apr"]
-  },
-  "application/vnd.lotus-freelance": {
-    "source": "iana",
-    "extensions": ["pre"]
-  },
-  "application/vnd.lotus-notes": {
-    "source": "iana",
-    "extensions": ["nsf"]
-  },
-  "application/vnd.lotus-organizer": {
-    "source": "iana",
-    "extensions": ["org"]
-  },
-  "application/vnd.lotus-screencam": {
-    "source": "iana",
-    "extensions": ["scm"]
-  },
-  "application/vnd.lotus-wordpro": {
-    "source": "iana",
-    "extensions": ["lwp"]
-  },
-  "application/vnd.macports.portpkg": {
-    "source": "iana",
-    "extensions": ["portpkg"]
-  },
-  "application/vnd.marlin.drm.actiontoken+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.conftoken+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.license+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.mdcf": {
-    "source": "iana"
-  },
-  "application/vnd.mason+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.maxmind.maxmind-db": {
-    "source": "iana"
-  },
-  "application/vnd.mcd": {
-    "source": "iana",
-    "extensions": ["mcd"]
-  },
-  "application/vnd.medcalcdata": {
-    "source": "iana",
-    "extensions": ["mc1"]
-  },
-  "application/vnd.mediastation.cdkey": {
-    "source": "iana",
-    "extensions": ["cdkey"]
-  },
-  "application/vnd.meridian-slingshot": {
-    "source": "iana"
-  },
-  "application/vnd.mfer": {
-    "source": "iana",
-    "extensions": ["mwf"]
-  },
-  "application/vnd.mfmp": {
-    "source": "iana",
-    "extensions": ["mfm"]
-  },
-  "application/vnd.micrografx-igx": {
-    "source": "iana"
-  },
-  "application/vnd.micrografx.flo": {
-    "source": "iana",
-    "extensions": ["flo"]
-  },
-  "application/vnd.micrografx.igx": {
-    "source": "apache",
-    "extensions": ["igx"]
-  },
-  "application/vnd.miele+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.mif": {
-    "source": "apache",
-    "extensions": ["mif"]
-  },
-  "application/vnd.minisoft-hp3000-save": {
-    "source": "iana"
-  },
-  "application/vnd.mitsubishi.misty-guard.trustweb": {
-    "source": "iana"
-  },
-  "application/vnd.mobius.daf": {
-    "source": "iana",
-    "extensions": ["daf"]
-  },
-  "application/vnd.mobius.dis": {
-    "source": "iana",
-    "extensions": ["dis"]
-  },
-  "application/vnd.mobius.mbk": {
-    "source": "iana",
-    "extensions": ["mbk"]
-  },
-  "application/vnd.mobius.mqy": {
-    "source": "iana",
-    "extensions": ["mqy"]
-  },
-  "application/vnd.mobius.msl": {
-    "source": "iana",
-    "extensions": ["msl"]
-  },
-  "application/vnd.mobius.plc": {
-    "source": "iana",
-    "extensions": ["plc"]
-  },
-  "application/vnd.mobius.txf": {
-    "source": "iana",
-    "extensions": ["txf"]
-  },
-  "application/vnd.mophun.application": {
-    "source": "iana",
-    "extensions": ["mpn"]
-  },
-  "application/vnd.mophun.certificate": {
-    "source": "iana",
-    "extensions": ["mpc"]
-  },
-  "application/vnd.motorola.flexsuite": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.adsi": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.fis": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.gotap": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.kmr": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.ttc": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.wem": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.iprm": {
-    "source": "iana"
-  },
-  "application/vnd.mozilla.xul+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xul"]
-  },
-  "application/vnd.ms-3mfdocument": {
-    "source": "iana"
-  },
-  "application/vnd.ms-artgalry": {
-    "source": "iana",
-    "extensions": ["cil"]
-  },
-  "application/vnd.ms-asf": {
-    "source": "iana"
-  },
-  "application/vnd.ms-cab-compressed": {
-    "source": "iana",
-    "extensions": ["cab"]
-  },
-  "application/vnd.ms-color.iccprofile": {
-    "source": "apache"
-  },
-  "application/vnd.ms-excel": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
-  },
-  "application/vnd.ms-excel.addin.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlam"]
-  },
-  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlsb"]
-  },
-  "application/vnd.ms-excel.sheet.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlsm"]
-  },
-  "application/vnd.ms-excel.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xltm"]
-  },
-  "application/vnd.ms-fontobject": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["eot"]
-  },
-  "application/vnd.ms-htmlhelp": {
-    "source": "iana",
-    "extensions": ["chm"]
-  },
-  "application/vnd.ms-ims": {
-    "source": "iana",
-    "extensions": ["ims"]
-  },
-  "application/vnd.ms-lrm": {
-    "source": "iana",
-    "extensions": ["lrm"]
-  },
-  "application/vnd.ms-office.activex+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-officetheme": {
-    "source": "iana",
-    "extensions": ["thmx"]
-  },
-  "application/vnd.ms-opentype": {
-    "source": "apache",
-    "compressible": true
-  },
-  "application/vnd.ms-package.obfuscated-opentype": {
-    "source": "apache"
-  },
-  "application/vnd.ms-pki.seccat": {
-    "source": "apache",
-    "extensions": ["cat"]
-  },
-  "application/vnd.ms-pki.stl": {
-    "source": "apache",
-    "extensions": ["stl"]
-  },
-  "application/vnd.ms-playready.initiator+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-powerpoint": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ppt","pps","pot"]
-  },
-  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["ppam"]
-  },
-  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["pptm"]
-  },
-  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["sldm"]
-  },
-  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["ppsm"]
-  },
-  "application/vnd.ms-powerpoint.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["potm"]
-  },
-  "application/vnd.ms-printing.printticket+xml": {
-    "source": "apache"
-  },
-  "application/vnd.ms-project": {
-    "source": "iana",
-    "extensions": ["mpp","mpt"]
-  },
-  "application/vnd.ms-tnef": {
-    "source": "iana"
-  },
-  "application/vnd.ms-windows.printerpairing": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.lic-chlg-req": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.lic-resp": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.meter-chlg-req": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.meter-resp": {
-    "source": "iana"
-  },
-  "application/vnd.ms-word.document.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["docm"]
-  },
-  "application/vnd.ms-word.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["dotm"]
-  },
-  "application/vnd.ms-works": {
-    "source": "iana",
-    "extensions": ["wps","wks","wcm","wdb"]
-  },
-  "application/vnd.ms-wpl": {
-    "source": "iana",
-    "extensions": ["wpl"]
-  },
-  "application/vnd.ms-xpsdocument": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xps"]
-  },
-  "application/vnd.mseq": {
-    "source": "iana",
-    "extensions": ["mseq"]
-  },
-  "application/vnd.msign": {
-    "source": "iana"
-  },
-  "application/vnd.multiad.creator": {
-    "source": "iana"
-  },
-  "application/vnd.multiad.creator.cif": {
-    "source": "iana"
-  },
-  "application/vnd.music-niff": {
-    "source": "iana"
-  },
-  "application/vnd.musician": {
-    "source": "iana",
-    "extensions": ["mus"]
-  },
-  "application/vnd.muvee.style": {
-    "source": "iana",
-    "extensions": ["msty"]
-  },
-  "application/vnd.mynfc": {
-    "source": "iana",
-    "extensions": ["taglet"]
-  },
-  "application/vnd.ncd.control": {
-    "source": "iana"
-  },
-  "application/vnd.ncd.reference": {
-    "source": "iana"
-  },
-  "application/vnd.nervana": {
-    "source": "iana"
-  },
-  "application/vnd.netfpx": {
-    "source": "iana"
-  },
-  "application/vnd.neurolanguage.nlu": {
-    "source": "iana",
-    "extensions": ["nlu"]
-  },
-  "application/vnd.nintendo.nitro.rom": {
-    "source": "iana"
-  },
-  "application/vnd.nintendo.snes.rom": {
-    "source": "iana"
-  },
-  "application/vnd.nitf": {
-    "source": "iana",
-    "extensions": ["ntf","nitf"]
-  },
-  "application/vnd.noblenet-directory": {
-    "source": "iana",
-    "extensions": ["nnd"]
-  },
-  "application/vnd.noblenet-sealer": {
-    "source": "iana",
-    "extensions": ["nns"]
-  },
-  "application/vnd.noblenet-web": {
-    "source": "iana",
-    "extensions": ["nnw"]
-  },
-  "application/vnd.nokia.catalogs": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.conml+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.conml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.iptv.config+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.isds-radio-presets": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmark+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmark+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmarkcollection+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.n-gage.ac+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.n-gage.data": {
-    "source": "iana",
-    "extensions": ["ngdat"]
-  },
-  "application/vnd.nokia.n-gage.symbian.install": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.ncd": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.pcd+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.pcd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.radio-preset": {
-    "source": "iana",
-    "extensions": ["rpst"]
-  },
-  "application/vnd.nokia.radio-presets": {
-    "source": "iana",
-    "extensions": ["rpss"]
-  },
-  "application/vnd.novadigm.edm": {
-    "source": "iana",
-    "extensions": ["edm"]
-  },
-  "application/vnd.novadigm.edx": {
-    "source": "iana",
-    "extensions": ["edx"]
-  },
-  "application/vnd.novadigm.ext": {
-    "source": "iana",
-    "extensions": ["ext"]
-  },
-  "application/vnd.ntt-local.content-share": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.file-transfer": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.ogw_remote-access": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.sip-ta_remote": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.sip-ta_tcp_stream": {
-    "source": "iana"
-  },
-  "application/vnd.oasis.opendocument.chart": {
-    "source": "iana",
-    "extensions": ["odc"]
-  },
-  "application/vnd.oasis.opendocument.chart-template": {
-    "source": "iana",
-    "extensions": ["otc"]
-  },
-  "application/vnd.oasis.opendocument.database": {
-    "source": "iana",
-    "extensions": ["odb"]
-  },
-  "application/vnd.oasis.opendocument.formula": {
-    "source": "iana",
-    "extensions": ["odf"]
-  },
-  "application/vnd.oasis.opendocument.formula-template": {
-    "source": "iana",
-    "extensions": ["odft"]
-  },
-  "application/vnd.oasis.opendocument.graphics": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odg"]
-  },
-  "application/vnd.oasis.opendocument.graphics-template": {
-    "source": "iana",
-    "extensions": ["otg"]
-  },
-  "application/vnd.oasis.opendocument.image": {
-    "source": "iana",
-    "extensions": ["odi"]
-  },
-  "application/vnd.oasis.opendocument.image-template": {
-    "source": "iana",
-    "extensions": ["oti"]
-  },
-  "application/vnd.oasis.opendocument.presentation": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odp"]
-  },
-  "application/vnd.oasis.opendocument.presentation-template": {
-    "source": "iana",
-    "extensions": ["otp"]
-  },
-  "application/vnd.oasis.opendocument.spreadsheet": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ods"]
-  },
-  "application/vnd.oasis.opendocument.spreadsheet-template": {
-    "source": "iana",
-    "extensions": ["ots"]
-  },
-  "application/vnd.oasis.opendocument.text": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odt"]
-  },
-  "application/vnd.oasis.opendocument.text-master": {
-    "source": "iana",
-    "extensions": ["odm"]
-  },
-  "application/vnd.oasis.opendocument.text-template": {
-    "source": "iana",
-    "extensions": ["ott"]
-  },
-  "application/vnd.oasis.opendocument.text-web": {
-    "source": "iana",
-    "extensions": ["oth"]
-  },
-  "application/vnd.obn": {
-    "source": "iana"
-  },
-  "application/vnd.oftn.l10n+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.oipf.contentaccessdownload+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.contentaccessstreaming+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.cspg-hexbinary": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.dae.svg+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.dae.xhtml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.mippvcontrolmessage+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.pae.gem": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.spdiscovery+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.spdlist+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.ueprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.userprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.olpc-sugar": {
-    "source": "iana",
-    "extensions": ["xo"]
-  },
-  "application/vnd.oma-scws-config": {
-    "source": "iana"
-  },
-  "application/vnd.oma-scws-http-request": {
-    "source": "iana"
-  },
-  "application/vnd.oma-scws-http-response": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.drm-trigger+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.imd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.ltkm": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.notification+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.provisioningtrigger": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgboot": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgdd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgdu": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.simple-symbol-container": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.smartcard-trigger+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sprov+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.stkm": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-address-book+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-feature-handler+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-pcc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-subs-invite+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-user-prefs+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dcd": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dcdc": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dd2+xml": {
-    "source": "iana",
-    "extensions": ["dd2"]
-  },
-  "application/vnd.oma.drm.risd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.group-usage-list+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.pal+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.detailed-progress-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.final-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.groups+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.invocation-descriptor+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.optimized-progress-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.push": {
-    "source": "iana"
-  },
-  "application/vnd.oma.scidm.messages+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.xcap-directory+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-email+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-file+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-folder+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omaloc-supl-init": {
-    "source": "iana"
-  },
-  "application/vnd.openeye.oeb": {
-    "source": "iana"
-  },
-  "application/vnd.openofficeorg.extension": {
-    "source": "apache",
-    "extensions": ["oxt"]
-  },
-  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawing+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pptx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
-    "source": "iana",
-    "extensions": ["sldx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
-    "source": "iana",
-    "extensions": ["ppsx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.template": {
-    "source": "apache",
-    "extensions": ["potx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xlsx"]
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
-    "source": "apache",
-    "extensions": ["xltx"]
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.theme+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.vmldrawing": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["docx"]
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
-    "source": "apache",
-    "extensions": ["dotx"]
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.core-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.relationships+xml": {
-    "source": "iana"
-  },
-  "application/vnd.orange.indata": {
-    "source": "iana"
-  },
-  "application/vnd.osa.netdeploy": {
-    "source": "iana"
-  },
-  "application/vnd.osgeo.mapguide.package": {
-    "source": "iana",
-    "extensions": ["mgp"]
-  },
-  "application/vnd.osgi.bundle": {
-    "source": "iana"
-  },
-  "application/vnd.osgi.dp": {
-    "source": "iana",
-    "extensions": ["dp"]
-  },
-  "application/vnd.osgi.subsystem": {
-    "source": "iana",
-    "extensions": ["esa"]
-  },
-  "application/vnd.otps.ct-kip+xml": {
-    "source": "iana"
-  },
-  "application/vnd.palm": {
-    "source": "iana",
-    "extensions": ["pdb","pqa","oprc"]
-  },
-  "application/vnd.panoply": {
-    "source": "iana"
-  },
-  "application/vnd.paos+xml": {
-    "source": "iana"
-  },
-  "application/vnd.paos.xml": {
-    "source": "apache"
-  },
-  "application/vnd.pawaafile": {
-    "source": "iana",
-    "extensions": ["paw"]
-  },
-  "application/vnd.pcos": {
-    "source": "iana"
-  },
-  "application/vnd.pg.format": {
-    "source": "iana",
-    "extensions": ["str"]
-  },
-  "application/vnd.pg.osasli": {
-    "source": "iana",
-    "extensions": ["ei6"]
-  },
-  "application/vnd.piaccess.application-licence": {
-    "source": "iana"
-  },
-  "application/vnd.picsel": {
-    "source": "iana",
-    "extensions": ["efif"]
-  },
-  "application/vnd.pmi.widget": {
-    "source": "iana",
-    "extensions": ["wg"]
-  },
-  "application/vnd.poc.group-advertisement+xml": {
-    "source": "iana"
-  },
-  "application/vnd.pocketlearn": {
-    "source": "iana",
-    "extensions": ["plf"]
-  },
-  "application/vnd.powerbuilder6": {
-    "source": "iana",
-    "extensions": ["pbd"]
-  },
-  "application/vnd.powerbuilder6-s": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder7": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder7-s": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder75": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder75-s": {
-    "source": "iana"
-  },
-  "application/vnd.preminet": {
-    "source": "iana"
-  },
-  "application/vnd.previewsystems.box": {
-    "source": "iana",
-    "extensions": ["box"]
-  },
-  "application/vnd.proteus.magazine": {
-    "source": "iana",
-    "extensions": ["mgz"]
-  },
-  "application/vnd.publishare-delta-tree": {
-    "source": "iana",
-    "extensions": ["qps"]
-  },
-  "application/vnd.pvi.ptid1": {
-    "source": "iana",
-    "extensions": ["ptid"]
-  },
-  "application/vnd.pwg-multiplexed": {
-    "source": "apache"
-  },
-  "application/vnd.pwg-xhtml-print+xml": {
-    "source": "iana"
-  },
-  "application/vnd.qualcomm.brew-app-res": {
-    "source": "iana"
-  },
-  "application/vnd.quark.quarkxpress": {
-    "source": "iana",
-    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
-  },
-  "application/vnd.quobject-quoxdocument": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.moml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-conf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-conn+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-dialog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-stream+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-conf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-base+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-group+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-speech+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-transform+xml": {
-    "source": "iana"
-  },
-  "application/vnd.rainstor.data": {
-    "source": "iana"
-  },
-  "application/vnd.rapid": {
-    "source": "iana"
-  },
-  "application/vnd.realvnc.bed": {
-    "source": "iana",
-    "extensions": ["bed"]
-  },
-  "application/vnd.recordare.musicxml": {
-    "source": "iana",
-    "extensions": ["mxl"]
-  },
-  "application/vnd.recordare.musicxml+xml": {
-    "source": "iana",
-    "extensions": ["musicxml"]
-  },
-  "application/vnd.renlearn.rlprint": {
-    "source": "iana"
-  },
-  "application/vnd.rig.cryptonote": {
-    "source": "iana",
-    "extensions": ["cryptonote"]
-  },
-  "application/vnd.rim.cod": {
-    "source": "apache",
-    "extensions": ["cod"]
-  },
-  "application/vnd.rn-realmedia": {
-    "source": "apache",
-    "extensions": ["rm"]
-  },
-  "application/vnd.rn-realmedia-vbr": {
-    "source": "apache",
-    "extensions": ["rmvb"]
-  },
-  "application/vnd.route66.link66+xml": {
-    "source": "iana",
-    "extensions": ["link66"]
-  },
-  "application/vnd.rs-274x": {
-    "source": "iana"
-  },
-  "application/vnd.ruckus.download": {
-    "source": "iana"
-  },
-  "application/vnd.s3sms": {
-    "source": "iana"
-  },
-  "application/vnd.sailingtracker.track": {
-    "source": "iana",
-    "extensions": ["st"]
-  },
-  "application/vnd.sbm.cid": {
-    "source": "iana"
-  },
-  "application/vnd.sbm.mid2": {
-    "source": "iana"
-  },
-  "application/vnd.scribus": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-doc": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-eml": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-mht": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-ppt": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-tiff": {
-    "source": "iana"
-  },
-  "application/vnd.sealed-xls": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.3df": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.csf": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.doc": {
-    "source": "apache"
-  },
-  "application/vnd.sealed.eml": {
-    "source": "apache"
-  },
-  "application/vnd.sealed.mht": {
-    "source": "apache"
-  },
-  "application/vnd.sealed.net": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.ppt": {
-    "source": "apache"
-  },
-  "application/vnd.sealed.tiff": {
-    "source": "apache"
-  },
-  "application/vnd.sealed.xls": {
-    "source": "apache"
-  },
-  "application/vnd.sealedmedia.softseal-html": {
-    "source": "iana"
-  },
-  "application/vnd.sealedmedia.softseal-pdf": {
-    "source": "iana"
-  },
-  "application/vnd.sealedmedia.softseal.html": {
-    "source": "apache"
-  },
-  "application/vnd.sealedmedia.softseal.pdf": {
-    "source": "apache"
-  },
-  "application/vnd.seemail": {
-    "source": "iana",
-    "extensions": ["see"]
-  },
-  "application/vnd.sema": {
-    "source": "apache",
-    "extensions": ["sema"]
-  },
-  "application/vnd.semd": {
-    "source": "iana",
-    "extensions": ["semd"]
-  },
-  "application/vnd.semf": {
-    "source": "iana",
-    "extensions": ["semf"]
-  },
-  "application/vnd.shana.informed.formdata": {
-    "source": "iana",
-    "extensions": ["ifm"]
-  },
-  "application/vnd.shana.informed.formtemplate": {
-    "source": "iana",
-    "extensions": ["itp"]
-  },
-  "application/vnd.shana.informed.interchange": {
-    "source": "iana",
-    "extensions": ["iif"]
-  },
-  "application/vnd.shana.informed.package": {
-    "source": "iana",
-    "extensions": ["ipk"]
-  },
-  "application/vnd.simtech-mindmapper": {
-    "source": "iana",
-    "extensions": ["twd","twds"]
-  },
-  "application/vnd.siren+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.smaf": {
-    "source": "iana",
-    "extensions": ["mmf"]
-  },
-  "application/vnd.smart.notebook": {
-    "source": "iana"
-  },
-  "application/vnd.smart.teacher": {
-    "source": "iana",
-    "extensions": ["teacher"]
-  },
-  "application/vnd.software602.filler.form+xml": {
-    "source": "iana"
-  },
-  "application/vnd.software602.filler.form-xml-zip": {
-    "source": "iana"
-  },
-  "application/vnd.solent.sdkm+xml": {
-    "source": "iana",
-    "extensions": ["sdkm","sdkd"]
-  },
-  "application/vnd.spotfire.dxp": {
-    "source": "iana",
-    "extensions": ["dxp"]
-  },
-  "application/vnd.spotfire.sfs": {
-    "source": "iana",
-    "extensions": ["sfs"]
-  },
-  "application/vnd.sss-cod": {
-    "source": "iana"
-  },
-  "application/vnd.sss-dtf": {
-    "source": "iana"
-  },
-  "application/vnd.sss-ntf": {
-    "source": "iana"
-  },
-  "application/vnd.stardivision.calc": {
-    "source": "apache",
-    "extensions": ["sdc"]
-  },
-  "application/vnd.stardivision.draw": {
-    "source": "apache",
-    "extensions": ["sda"]
-  },
-  "application/vnd.stardivision.impress": {
-    "source": "apache",
-    "extensions": ["sdd"]
-  },
-  "application/vnd.stardivision.math": {
-    "source": "apache",
-    "extensions": ["smf"]
-  },
-  "application/vnd.stardivision.writer": {
-    "source": "apache",
-    "extensions": ["sdw","vor"]
-  },
-  "application/vnd.stardivision.writer-global": {
-    "source": "apache",
-    "extensions": ["sgl"]
-  },
-  "application/vnd.stepmania.package": {
-    "source": "iana",
-    "extensions": ["smzip"]
-  },
-  "application/vnd.stepmania.stepchart": {
-    "source": "iana",
-    "extensions": ["sm"]
-  },
-  "application/vnd.street-stream": {
-    "source": "iana"
-  },
-  "application/vnd.sun.wadl+xml": {
-    "source": "iana"
-  },
-  "application/vnd.sun.xml.calc": {
-    "source": "apache",
-    "extensions": ["sxc"]
-  },
-  "application/vnd.sun.xml.calc.template": {
-    "source": "apache",
-    "extensions": ["stc"]
-  },
-  "application/vnd.sun.xml.draw": {
-    "source": "apache",
-    "extensions": ["sxd"]
-  },
-  "application/vnd.sun.xml.draw.template": {
-    "source": "apache",
-    "extensions": ["std"]
-  },
-  "application/vnd.sun.xml.impress": {
-    "source": "apache",
-    "extensions": ["sxi"]
-  },
-  "application/vnd.sun.xml.impress.template": {
-    "source": "apache",
-    "extensions": ["sti"]
-  },
-  "application/vnd.sun.xml.math": {
-    "source": "apache",
-    "extensions": ["sxm"]
-  },
-  "application/vnd.sun.xml.writer": {
-    "source": "apache",
-    "extensions": ["sxw"]
-  },
-  "application/vnd.sun.xml.writer.global": {
-    "source": "apache",
-    "extensions": ["sxg"]
-  },
-  "application/vnd.sun.xml.writer.template": {
-    "source": "apache",
-    "extensions": ["stw"]
-  },
-  "application/vnd.sus-calendar": {
-    "source": "iana",
-    "extensions": ["sus","susp"]
-  },
-  "application/vnd.svd": {
-    "source": "iana",
-    "extensions": ["svd"]
-  },
-  "application/vnd.swiftview-ics": {
-    "source": "iana"
-  },
-  "application/vnd.symbian.install": {
-    "source": "apache",
-    "extensions": ["sis","sisx"]
-  },
-  "application/vnd.syncml+xml": {
-    "source": "iana",
-    "extensions": ["xsm"]
-  },
-  "application/vnd.syncml.dm+wbxml": {
-    "source": "iana",
-    "extensions": ["bdm"]
-  },
-  "application/vnd.syncml.dm+xml": {
-    "source": "iana",
-    "extensions": ["xdm"]
-  },
-  "application/vnd.syncml.dm.notification": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmddf+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmddf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmtnds+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmtnds+xml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.ds.notification": {
-    "source": "iana"
-  },
-  "application/vnd.tao.intent-module-archive": {
-    "source": "iana",
-    "extensions": ["tao"]
-  },
-  "application/vnd.tcpdump.pcap": {
-    "source": "iana",
-    "extensions": ["pcap","cap","dmp"]
-  },
-  "application/vnd.tmd.mediaflex.api+xml": {
-    "source": "iana"
-  },
-  "application/vnd.tmobile-livetv": {
-    "source": "iana",
-    "extensions": ["tmo"]
-  },
-  "application/vnd.trid.tpt": {
-    "source": "iana",
-    "extensions": ["tpt"]
-  },
-  "application/vnd.triscape.mxs": {
-    "source": "iana",
-    "extensions": ["mxs"]
-  },
-  "application/vnd.trueapp": {
-    "source": "iana",
-    "extensions": ["tra"]
-  },
-  "application/vnd.truedoc": {
-    "source": "iana"
-  },
-  "application/vnd.ubisoft.webplayer": {
-    "source": "iana"
-  },
-  "application/vnd.ufdl": {
-    "source": "iana",
-    "extensions": ["ufd","ufdl"]
-  },
-  "application/vnd.uiq.theme": {
-    "source": "iana",
-    "extensions": ["utz"]
-  },
-  "application/vnd.umajin": {
-    "source": "iana",
-    "extensions": ["umj"]
-  },
-  "application/vnd.unity": {
-    "source": "iana",
-    "extensions": ["unityweb"]
-  },
-  "application/vnd.uoml+xml": {
-    "source": "iana",
-    "extensions": ["uoml"]
-  },
-  "application/vnd.uplanet.alert": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.alert-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.bearer-choice": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.bearer-choice-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.cacheop": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.cacheop-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.channel": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.channel-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.list": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.list-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.listcmd": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.listcmd-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.signal": {
-    "source": "iana"
-  },
-  "application/vnd.valve.source.material": {
-    "source": "iana"
-  },
-  "application/vnd.vcx": {
-    "source": "iana",
-    "extensions": ["vcx"]
-  },
-  "application/vnd.vd-study": {
-    "source": "iana"
-  },
-  "application/vnd.vectorworks": {
-    "source": "iana"
-  },
-  "application/vnd.verimatrix.vcas": {
-    "source": "iana"
-  },
-  "application/vnd.vidsoft.vidconference": {
-    "source": "iana"
-  },
-  "application/vnd.visio": {
-    "source": "iana",
-    "extensions": ["vsd","vst","vss","vsw"]
-  },
-  "application/vnd.visionary": {
-    "source": "iana",
-    "extensions": ["vis"]
-  },
-  "application/vnd.vividence.scriptfile": {
-    "source": "iana"
-  },
-  "application/vnd.vsf": {
-    "source": "iana",
-    "extensions": ["vsf"]
-  },
-  "application/vnd.wap-slc": {
-    "source": "iana"
-  },
-  "application/vnd.wap-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.wap.sic": {
-    "source": "iana"
-  },
-  "application/vnd.wap.slc": {
-    "source": "apache"
-  },
-  "application/vnd.wap.wbxml": {
-    "source": "apache",
-    "extensions": ["wbxml"]
-  },
-  "application/vnd.wap.wmlc": {
-    "source": "apache",
-    "extensions": ["wmlc"]
-  },
-  "application/vnd.wap.wmlscriptc": {
-    "source": "iana",
-    "extensions": ["wmlsc"]
-  },
-  "application/vnd.webturbo": {
-    "source": "iana",
-    "extensions": ["wtb"]
-  },
-  "application/vnd.wfa.p2p": {
-    "source": "iana"
-  },
-  "application/vnd.wfa.wsc": {
-    "source": "iana"
-  },
-  "application/vnd.windows.devicepairing": {
-    "source": "iana"
-  },
-  "application/vnd.wmc": {
-    "source": "iana"
-  },
-  "application/vnd.wmf.bootstrap": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.mathematica": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.mathematica.package": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.player": {
-    "source": "iana",
-    "extensions": ["nbp"]
-  },
-  "application/vnd.wordperfect": {
-    "source": "iana",
-    "extensions": ["wpd"]
-  },
-  "application/vnd.wqd": {
-    "source": "iana",
-    "extensions": ["wqd"]
-  },
-  "application/vnd.wrq-hp3000-labelled": {
-    "source": "iana"
-  },
-  "application/vnd.wt.stf": {
-    "source": "iana",
-    "extensions": ["stf"]
-  },
-  "application/vnd.wv.csp+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.wv.csp+xml": {
-    "source": "iana"
-  },
-  "application/vnd.wv.ssp+xml": {
-    "source": "iana"
-  },
-  "application/vnd.xacml+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.xara": {
-    "source": "iana",
-    "extensions": ["xar"]
-  },
-  "application/vnd.xfdl": {
-    "source": "iana",
-    "extensions": ["xfdl"]
-  },
-  "application/vnd.xfdl.webform": {
-    "source": "iana"
-  },
-  "application/vnd.xmi+xml": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.cpkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.dpkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.plan": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.ppkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.xlim": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.hv-dic": {
-    "source": "iana",
-    "extensions": ["hvd"]
-  },
-  "application/vnd.yamaha.hv-script": {
-    "source": "iana",
-    "extensions": ["hvs"]
-  },
-  "application/vnd.yamaha.hv-voice": {
-    "source": "iana",
-    "extensions": ["hvp"]
-  },
-  "application/vnd.yamaha.openscoreformat": {
-    "source": "iana",
-    "extensions": ["osf"]
-  },
-  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
-    "source": "iana",
-    "extensions": ["osfpvg"]
-  },
-  "application/vnd.yamaha.remote-setup": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.smaf-audio": {
-    "source": "iana",
-    "extensions": ["saf"]
-  },
-  "application/vnd.yamaha.smaf-phrase": {
-    "source": "iana",
-    "extensions": ["spf"]
-  },
-  "application/vnd.yamaha.through-ngn": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.tunnel-udpencap": {
-    "source": "iana"
-  },
-  "application/vnd.yaoweme": {
-    "source": "iana"
-  },
-  "application/vnd.yellowriver-custom-menu": {
-    "source": "iana",
-    "extensions": ["cmp"]
-  },
-  "application/vnd.zul": {
-    "source": "iana",
-    "extensions": ["zir","zirz"]
-  },
-  "application/vnd.zzazz.deck+xml": {
-    "source": "iana",
-    "extensions": ["zaz"]
-  },
-  "application/voicexml+xml": {
-    "source": "iana",
-    "extensions": ["vxml"]
-  },
-  "application/vq-rtcpxr": {
-    "source": "iana"
-  },
-  "application/vwg-multiplexed": {
-    "source": "iana"
-  },
-  "application/watcherinfo+xml": {
-    "source": "iana"
-  },
-  "application/whoispp-query": {
-    "source": "iana"
-  },
-  "application/whoispp-response": {
-    "source": "iana"
-  },
-  "application/widget": {
-    "source": "iana",
-    "extensions": ["wgt"]
-  },
-  "application/winhlp": {
-    "source": "apache",
-    "extensions": ["hlp"]
-  },
-  "application/wita": {
-    "source": "iana"
-  },
-  "application/wordperfect5.1": {
-    "source": "iana"
-  },
-  "application/wsdl+xml": {
-    "source": "iana",
-    "extensions": ["wsdl"]
-  },
-  "application/wspolicy+xml": {
-    "source": "iana",
-    "extensions": ["wspolicy"]
-  },
-  "application/x-7z-compressed": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["7z"]
-  },
-  "application/x-abiword": {
-    "source": "apache",
-    "extensions": ["abw"]
-  },
-  "application/x-ace-compressed": {
-    "source": "apache",
-    "extensions": ["ace"]
-  },
-  "application/x-amf": {
-    "source": "apache"
-  },
-  "application/x-apple-diskimage": {
-    "source": "apache",
-    "extensions": ["dmg"]
-  },
-  "application/x-authorware-bin": {
-    "source": "apache",
-    "extensions": ["aab","x32","u32","vox"]
-  },
-  "application/x-authorware-map": {
-    "source": "apache",
-    "extensions": ["aam"]
-  },
-  "application/x-authorware-seg": {
-    "source": "apache",
-    "extensions": ["aas"]
-  },
-  "application/x-bcpio": {
-    "source": "apache",
-    "extensions": ["bcpio"]
-  },
-  "application/x-bittorrent": {
-    "source": "apache",
-    "extensions": ["torrent"]
-  },
-  "application/x-blorb": {
-    "source": "apache",
-    "extensions": ["blb","blorb"]
-  },
-  "application/x-bzip": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["bz"]
-  },
-  "application/x-bzip2": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["bz2","boz"]
-  },
-  "application/x-cbr": {
-    "source": "apache",
-    "extensions": ["cbr","cba","cbt","cbz","cb7"]
-  },
-  "application/x-cdlink": {
-    "source": "apache",
-    "extensions": ["vcd"]
-  },
-  "application/x-cfs-compressed": {
-    "source": "apache",
-    "extensions": ["cfs"]
-  },
-  "application/x-chat": {
-    "source": "apache",
-    "extensions": ["chat"]
-  },
-  "application/x-chess-pgn": {
-    "source": "apache",
-    "extensions": ["pgn"]
-  },
-  "application/x-chrome-extension": {
-    "extensions": ["crx"]
-  },
-  "application/x-compress": {
-    "source": "apache"
-  },
-  "application/x-conference": {
-    "source": "apache",
-    "extensions": ["nsc"]
-  },
-  "application/x-cpio": {
-    "source": "apache",
-    "extensions": ["cpio"]
-  },
-  "application/x-csh": {
-    "source": "apache",
-    "extensions": ["csh"]
-  },
-  "application/x-deb": {
-    "compressible": false
-  },
-  "application/x-debian-package": {
-    "source": "apache",
-    "extensions": ["deb","udeb"]
-  },
-  "application/x-dgc-compressed": {
-    "source": "apache",
-    "extensions": ["dgc"]
-  },
-  "application/x-director": {
-    "source": "apache",
-    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
-  },
-  "application/x-doom": {
-    "source": "apache",
-    "extensions": ["wad"]
-  },
-  "application/x-dtbncx+xml": {
-    "source": "apache",
-    "extensions": ["ncx"]
-  },
-  "application/x-dtbook+xml": {
-    "source": "apache",
-    "extensions": ["dtb"]
-  },
-  "application/x-dtbresource+xml": {
-    "source": "apache",
-    "extensions": ["res"]
-  },
-  "application/x-dvi": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["dvi"]
-  },
-  "application/x-envoy": {
-    "source": "apache",
-    "extensions": ["evy"]
-  },
-  "application/x-eva": {
-    "source": "apache",
-    "extensions": ["eva"]
-  },
-  "application/x-font-bdf": {
-    "source": "apache",
-    "extensions": ["bdf"]
-  },
-  "application/x-font-dos": {
-    "source": "apache"
-  },
-  "application/x-font-framemaker": {
-    "source": "apache"
-  },
-  "application/x-font-ghostscript": {
-    "source": "apache",
-    "extensions": ["gsf"]
-  },
-  "application/x-font-libgrx": {
-    "source": "apache"
-  },
-  "application/x-font-linux-psf": {
-    "source": "apache",
-    "extensions": ["psf"]
-  },
-  "application/x-font-otf": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["otf"]
-  },
-  "application/x-font-pcf": {
-    "source": "apache",
-    "extensions": ["pcf"]
-  },
-  "application/x-font-snf": {
-    "source": "apache",
-    "extensions": ["snf"]
-  },
-  "application/x-font-speedo": {
-    "source": "apache"
-  },
-  "application/x-font-sunos-news": {
-    "source": "apache"
-  },
-  "application/x-font-ttf": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["ttf","ttc"]
-  },
-  "application/x-font-type1": {
-    "source": "apache",
-    "extensions": ["pfa","pfb","pfm","afm"]
-  },
-  "application/x-font-vfont": {
-    "source": "apache"
-  },
-  "application/x-freearc": {
-    "source": "apache",
-    "extensions": ["arc"]
-  },
-  "application/x-futuresplash": {
-    "source": "apache",
-    "extensions": ["spl"]
-  },
-  "application/x-gca-compressed": {
-    "source": "apache",
-    "extensions": ["gca"]
-  },
-  "application/x-glulx": {
-    "source": "apache",
-    "extensions": ["ulx"]
-  },
-  "application/x-gnumeric": {
-    "source": "apache",
-    "extensions": ["gnumeric"]
-  },
-  "application/x-gramps-xml": {
-    "source": "apache",
-    "extensions": ["gramps"]
-  },
-  "application/x-gtar": {
-    "source": "apache",
-    "extensions": ["gtar"]
-  },
-  "application/x-gzip": {
-    "source": "apache"
-  },
-  "application/x-hdf": {
-    "source": "apache",
-    "extensions": ["hdf"]
-  },
-  "application/x-install-instructions": {
-    "source": "apache",
-    "extensions": ["install"]
-  },
-  "application/x-iso9660-image": {
-    "source": "apache",
-    "extensions": ["iso"]
-  },
-  "application/x-java-jnlp-file": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["jnlp"]
-  },
-  "application/x-javascript": {
-    "compressible": true
-  },
-  "application/x-latex": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["latex"]
-  },
-  "application/x-lua-bytecode": {
-    "extensions": ["luac"]
-  },
-  "application/x-lzh-compressed": {
-    "source": "apache",
-    "extensions": ["lzh","lha"]
-  },
-  "application/x-mie": {
-    "source": "apache",
-    "extensions": ["mie"]
-  },
-  "application/x-mobipocket-ebook": {
-    "source": "apache",
-    "extensions": ["prc","mobi"]
-  },
-  "application/x-mpegurl": {
-    "compressible": false
-  },
-  "application/x-ms-application": {
-    "source": "apache",
-    "extensions": ["application"]
-  },
-  "application/x-ms-shortcut": {
-    "source": "apache",
-    "extensions": ["lnk"]
-  },
-  "application/x-ms-wmd": {
-    "source": "apache",
-    "extensions": ["wmd"]
-  },
-  "application/x-ms-wmz": {
-    "source": "apache",
-    "extensions": ["wmz"]
-  },
-  "application/x-ms-xbap": {
-    "source": "apache",
-    "extensions": ["xbap"]
-  },
-  "application/x-msaccess": {
-    "source": "apache",
-    "extensions": ["mdb"]
-  },
-  "application/x-msbinder": {
-    "source": "apache",
-    "extensions": ["obd"]
-  },
-  "application/x-mscardfile": {
-    "source": "apache",
-    "extensions": ["crd"]
-  },
-  "application/x-msclip": {
-    "source": "apache",
-    "extensions": ["clp"]
-  },
-  "application/x-msdownload": {
-    "source": "apache",
-    "extensions": ["exe","dll","com","bat","msi"]
-  },
-  "application/x-msmediaview": {
-    "source": "apache",
-    "extensions": ["mvb","m13","m14"]
-  },
-  "application/x-msmetafile": {
-    "source": "apache",
-    "extensions": ["wmf","wmz","emf","emz"]
-  },
-  "application/x-msmoney": {
-    "source": "apache",
-    "extensions": ["mny"]
-  },
-  "application/x-mspublisher": {
-    "source": "apache",
-    "extensions": ["pub"]
-  },
-  "application/x-msschedule": {
-    "source": "apache",
-    "extensions": ["scd"]
-  },
-  "application/x-msterminal": {
-    "source": "apache",
-    "extensions": ["trm"]
-  },
-  "application/x-mswrite": {
-    "source": "apache",
-    "extensions": ["wri"]
-  },
-  "application/x-netcdf": {
-    "source": "apache",
-    "extensions": ["nc","cdf"]
-  },
-  "application/x-nzb": {
-    "source": "apache",
-    "extensions": ["nzb"]
-  },
-  "application/x-pkcs12": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["p12","pfx"]
-  },
-  "application/x-pkcs7-certificates": {
-    "source": "apache",
-    "extensions": ["p7b","spc"]
-  },
-  "application/x-pkcs7-certreqresp": {
-    "source": "apache",
-    "extensions": ["p7r"]
-  },
-  "application/x-rar-compressed": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["rar"]
-  },
-  "application/x-research-info-systems": {
-    "source": "apache",
-    "extensions": ["ris"]
-  },
-  "application/x-sh": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["sh"]
-  },
-  "application/x-shar": {
-    "source": "apache",
-    "extensions": ["shar"]
-  },
-  "application/x-shockwave-flash": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["swf"]
-  },
-  "application/x-silverlight-app": {
-    "source": "apache",
-    "extensions": ["xap"]
-  },
-  "application/x-sql": {
-    "source": "apache",
-    "extensions": ["sql"]
-  },
-  "application/x-stuffit": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["sit"]
-  },
-  "application/x-stuffitx": {
-    "source": "apache",
-    "extensions": ["sitx"]
-  },
-  "application/x-subrip": {
-    "source": "apache",
-    "extensions": ["srt"]
-  },
-  "application/x-sv4cpio": {
-    "source": "apache",
-    "extensions": ["sv4cpio"]
-  },
-  "application/x-sv4crc": {
-    "source": "apache",
-    "extensions": ["sv4crc"]
-  },
-  "application/x-t3vm-image": {
-    "source": "apache",
-    "extensions": ["t3"]
-  },
-  "application/x-tads": {
-    "source": "apache",
-    "extensions": ["gam"]
-  },
-  "application/x-tar": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["tar"]
-  },
-  "application/x-tcl": {
-    "source": "apache",
-    "extensions": ["tcl"]
-  },
-  "application/x-tex": {
-    "source": "apache",
-    "extensions": ["tex"]
-  },
-  "application/x-tex-tfm": {
-    "source": "apache",
-    "extensions": ["tfm"]
-  },
-  "application/x-texinfo": {
-    "source": "apache",
-    "extensions": ["texinfo","texi"]
-  },
-  "application/x-tgif": {
-    "source": "apache",
-    "extensions": ["obj"]
-  },
-  "application/x-ustar": {
-    "source": "apache",
-    "extensions": ["ustar"]
-  },
-  "application/x-wais-source": {
-    "source": "apache",
-    "extensions": ["src"]
-  },
-  "application/x-web-app-manifest+json": {
-    "compressible": true,
-    "extensions": ["webapp"]
-  },
-  "application/x-www-form-urlencoded": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/x-x509-ca-cert": {
-    "source": "apache",
-    "extensions": ["der","crt"]
-  },
-  "application/x-xfig": {
-    "source": "apache",
-    "extensions": ["fig"]
-  },
-  "application/x-xliff+xml": {
-    "source": "apache",
-    "extensions": ["xlf"]
-  },
-  "application/x-xpinstall": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["xpi"]
-  },
-  "application/x-xz": {
-    "source": "apache",
-    "extensions": ["xz"]
-  },
-  "application/x-zmachine": {
-    "source": "apache",
-    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
-  },
-  "application/x400-bp": {
-    "source": "iana"
-  },
-  "application/xacml+xml": {
-    "source": "iana"
-  },
-  "application/xaml+xml": {
-    "source": "apache",
-    "extensions": ["xaml"]
-  },
-  "application/xcap-att+xml": {
-    "source": "iana"
-  },
-  "application/xcap-caps+xml": {
-    "source": "iana"
-  },
-  "application/xcap-diff+xml": {
-    "source": "iana",
-    "extensions": ["xdf"]
-  },
-  "application/xcap-el+xml": {
-    "source": "iana"
-  },
-  "application/xcap-error+xml": {
-    "source": "iana"
-  },
-  "application/xcap-ns+xml": {
-    "source": "iana"
-  },
-  "application/xcon-conference-info+xml": {
-    "source": "iana"
-  },
-  "application/xcon-conference-info-diff+xml": {
-    "source": "iana"
-  },
-  "application/xenc+xml": {
-    "source": "iana",
-    "extensions": ["xenc"]
-  },
-  "application/xhtml+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xhtml","xht"]
-  },
-  "application/xhtml-voice+xml": {
-    "source": "iana"
-  },
-  "application/xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xml","xsl","xsd"]
-  },
-  "application/xml-dtd": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["dtd"]
-  },
-  "application/xml-external-parsed-entity": {
-    "source": "iana"
-  },
-  "application/xml-patch+xml": {
-    "source": "iana"
-  },
-  "application/xmpp+xml": {
-    "source": "iana"
-  },
-  "application/xop+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xop"]
-  },
-  "application/xproc+xml": {
-    "source": "apache",
-    "extensions": ["xpl"]
-  },
-  "application/xslt+xml": {
-    "source": "iana",
-    "extensions": ["xslt"]
-  },
-  "application/xspf+xml": {
-    "source": "apache",
-    "extensions": ["xspf"]
-  },
-  "application/xv+xml": {
-    "source": "iana",
-    "extensions": ["mxml","xhvml","xvml","xvm"]
-  },
-  "application/yang": {
-    "source": "iana",
-    "extensions": ["yang"]
-  },
-  "application/yin+xml": {
-    "source": "iana",
-    "extensions": ["yin"]
-  },
-  "application/zip": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["zip"]
-  },
-  "application/zlib": {
-    "source": "iana"
-  },
-  "audio/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "audio/32kadpcm": {
-    "source": "iana"
-  },
-  "audio/3gpp": {
-    "source": "iana"
-  },
-  "audio/3gpp2": {
-    "source": "iana"
-  },
-  "audio/ac3": {
-    "source": "iana"
-  },
-  "audio/adpcm": {
-    "source": "apache",
-    "extensions": ["adp"]
-  },
-  "audio/amr": {
-    "source": "iana"
-  },
-  "audio/amr-wb": {
-    "source": "iana"
-  },
-  "audio/amr-wb+": {
-    "source": "iana"
-  },
-  "audio/aptx": {
-    "source": "iana"
-  },
-  "audio/asc": {
-    "source": "iana"
-  },
-  "audio/atrac-advanced-lossless": {
-    "source": "iana"
-  },
-  "audio/atrac-x": {
-    "source": "iana"
-  },
-  "audio/atrac3": {
-    "source": "iana"
-  },
-  "audio/basic": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["au","snd"]
-  },
-  "audio/bv16": {
-    "source": "iana"
-  },
-  "audio/bv32": {
-    "source": "iana"
-  },
-  "audio/clearmode": {
-    "source": "iana"
-  },
-  "audio/cn": {
-    "source": "iana"
-  },
-  "audio/dat12": {
-    "source": "iana"
-  },
-  "audio/dls": {
-    "source": "iana"
-  },
-  "audio/dsr-es201108": {
-    "source": "iana"
-  },
-  "audio/dsr-es202050": {
-    "source": "iana"
-  },
-  "audio/dsr-es202211": {
-    "source": "iana"
-  },
-  "audio/dsr-es202212": {
-    "source": "iana"
-  },
-  "audio/dv": {
-    "source": "iana"
-  },
-  "audio/dvi4": {
-    "source": "iana"
-  },
-  "audio/eac3": {
-    "source": "iana"
-  },
-  "audio/encaprtp": {
-    "source": "iana"
-  },
-  "audio/evrc": {
-    "source": "iana"
-  },
-  "audio/evrc-qcp": {
-    "source": "iana"
-  },
-  "audio/evrc0": {
-    "source": "iana"
-  },
-  "audio/evrc1": {
-    "source": "iana"
-  },
-  "audio/evrcb": {
-    "source": "iana"
-  },
-  "audio/evrcb0": {
-    "source": "iana"
-  },
-  "audio/evrcb1": {
-    "source": "iana"
-  },
-  "audio/evrcnw": {
-    "source": "iana"
-  },
-  "audio/evrcnw0": {
-    "source": "iana"
-  },
-  "audio/evrcnw1": {
-    "source": "iana"
-  },
-  "audio/evrcwb": {
-    "source": "iana"
-  },
-  "audio/evrcwb0": {
-    "source": "iana"
-  },
-  "audio/evrcwb1": {
-    "source": "iana"
-  },
-  "audio/example": {
-    "source": "iana"
-  },
-  "audio/fwdred": {
-    "source": "iana"
-  },
-  "audio/g719": {
-    "source": "iana"
-  },
-  "audio/g721": {
-    "source": "iana"
-  },
-  "audio/g722": {
-    "source": "iana"
-  },
-  "audio/g7221": {
-    "source": "apache"
-  },
-  "audio/g723": {
-    "source": "iana"
-  },
-  "audio/g726-16": {
-    "source": "iana"
-  },
-  "audio/g726-24": {
-    "source": "iana"
-  },
-  "audio/g726-32": {
-    "source": "iana"
-  },
-  "audio/g726-40": {
-    "source": "iana"
-  },
-  "audio/g728": {
-    "source": "iana"
-  },
-  "audio/g729": {
-    "source": "iana"
-  },
-  "audio/g7291": {
-    "source": "iana"
-  },
-  "audio/g729d": {
-    "source": "iana"
-  },
-  "audio/g729e": {
-    "source": "iana"
-  },
-  "audio/gsm": {
-    "source": "iana"
-  },
-  "audio/gsm-efr": {
-    "source": "iana"
-  },
-  "audio/gsm-hr-08": {
-    "source": "iana"
-  },
-  "audio/ilbc": {
-    "source": "iana"
-  },
-  "audio/ip-mr_v2.5": {
-    "source": "iana"
-  },
-  "audio/isac": {
-    "source": "apache"
-  },
-  "audio/l16": {
-    "source": "iana"
-  },
-  "audio/l20": {
-    "source": "iana"
-  },
-  "audio/l24": {
-    "source": "iana",
-    "compressible": false
-  },
-  "audio/l8": {
-    "source": "iana"
-  },
-  "audio/lpc": {
-    "source": "iana"
-  },
-  "audio/midi": {
-    "source": "apache",
-    "extensions": ["mid","midi","kar","rmi"]
-  },
-  "audio/mobile-xmf": {
-    "source": "iana"
-  },
-  "audio/mp4": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["mp4a","m4a"]
-  },
-  "audio/mp4a-latm": {
-    "source": "iana"
-  },
-  "audio/mpa": {
-    "source": "iana"
-  },
-  "audio/mpa-robust": {
-    "source": "iana"
-  },
-  "audio/mpeg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
-  },
-  "audio/mpeg4-generic": {
-    "source": "iana"
-  },
-  "audio/musepack": {
-    "source": "apache"
-  },
-  "audio/ogg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["oga","ogg","spx"]
-  },
-  "audio/opus": {
-    "source": "apache"
-  },
-  "audio/parityfec": {
-    "source": "iana"
-  },
-  "audio/pcma": {
-    "source": "iana"
-  },
-  "audio/pcma-wb": {
-    "source": "iana"
-  },
-  "audio/pcmu": {
-    "source": "iana"
-  },
-  "audio/pcmu-wb": {
-    "source": "iana"
-  },
-  "audio/prs.sid": {
-    "source": "iana"
-  },
-  "audio/qcelp": {
-    "source": "iana"
-  },
-  "audio/raptorfec": {
-    "source": "iana"
-  },
-  "audio/red": {
-    "source": "iana"
-  },
-  "audio/rtp-enc-aescm128": {
-    "source": "iana"
-  },
-  "audio/rtp-midi": {
-    "source": "iana"
-  },
-  "audio/rtploopback": {
-    "source": "iana"
-  },
-  "audio/rtx": {
-    "source": "iana"
-  },
-  "audio/s3m": {
-    "source": "apache",
-    "extensions": ["s3m"]
-  },
-  "audio/silk": {
-    "source": "apache",
-    "extensions": ["sil"]
-  },
-  "audio/smv": {
-    "source": "iana"
-  },
-  "audio/smv-qcp": {
-    "source": "iana"
-  },
-  "audio/smv0": {
-    "source": "iana"
-  },
-  "audio/sp-midi": {
-    "source": "iana"
-  },
-  "audio/speex": {
-    "source": "iana"
-  },
-  "audio/t140c": {
-    "source": "iana"
-  },
-  "audio/t38": {
-    "source": "iana"
-  },
-  "audio/telephone-event": {
-    "source": "iana"
-  },
-  "audio/tone": {
-    "source": "iana"
-  },
-  "audio/uemclip": {
-    "source": "iana"
-  },
-  "audio/ulpfec": {
-    "source": "iana"
-  },
-  "audio/vdvi": {
-    "source": "iana"
-  },
-  "audio/vmr-wb": {
-    "source": "iana"
-  },
-  "audio/vnd.3gpp.iufp": {
-    "source": "iana"
-  },
-  "audio/vnd.4sb": {
-    "source": "iana"
-  },
-  "audio/vnd.audiokoz": {
-    "source": "iana"
-  },
-  "audio/vnd.celp": {
-    "source": "iana"
-  },
-  "audio/vnd.cisco.nse": {
-    "source": "iana"
-  },
-  "audio/vnd.cmles.radio-events": {
-    "source": "iana"
-  },
-  "audio/vnd.cns.anp1": {
-    "source": "iana"
-  },
-  "audio/vnd.cns.inf1": {
-    "source": "iana"
-  },
-  "audio/vnd.dece.audio": {
-    "source": "iana",
-    "extensions": ["uva","uvva"]
-  },
-  "audio/vnd.digital-winds": {
-    "source": "iana",
-    "extensions": ["eol"]
-  },
-  "audio/vnd.dlna.adts": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.heaac.1": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.heaac.2": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.mlp": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.mps": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2x": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2z": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pulse.1": {
-    "source": "iana"
-  },
-  "audio/vnd.dra": {
-    "source": "iana",
-    "extensions": ["dra"]
-  },
-  "audio/vnd.dts": {
-    "source": "iana",
-    "extensions": ["dts"]
-  },
-  "audio/vnd.dts.hd": {
-    "source": "iana",
-    "extensions": ["dtshd"]
-  },
-  "audio/vnd.dvb.file": {
-    "source": "iana"
-  },
-  "audio/vnd.everad.plj": {
-    "source": "iana"
-  },
-  "audio/vnd.hns.audio": {
-    "source": "iana"
-  },
-  "audio/vnd.lucent.voice": {
-    "source": "iana",
-    "extensions": ["lvp"]
-  },
-  "audio/vnd.ms-playready.media.pya": {
-    "source": "iana",
-    "extensions": ["pya"]
-  },
-  "audio/vnd.nokia.mobile-xmf": {
-    "source": "iana"
-  },
-  "audio/vnd.nortel.vbk": {
-    "source": "iana"
-  },
-  "audio/vnd.nuera.ecelp4800": {
-    "source": "iana",
-    "extensions": ["ecelp4800"]
-  },
-  "audio/vnd.nuera.ecelp7470": {
-    "source": "iana",
-    "extensions": ["ecelp7470"]
-  },
-  "audio/vnd.nuera.ecelp9600": {
-    "source": "iana",
-    "extensions": ["ecelp9600"]
-  },
-  "audio/vnd.octel.sbc": {
-    "source": "iana"
-  },
-  "audio/vnd.qcelp": {
-    "source": "iana"
-  },
-  "audio/vnd.rhetorex.32kadpcm": {
-    "source": "iana"
-  },
-  "audio/vnd.rip": {
-    "source": "iana",
-    "extensions": ["rip"]
-  },
-  "audio/vnd.rn-realaudio": {
-    "compressible": false
-  },
-  "audio/vnd.sealedmedia.softseal-mpeg": {
-    "source": "iana"
-  },
-  "audio/vnd.sealedmedia.softseal.mpeg": {
-    "source": "apache"
-  },
-  "audio/vnd.vmx.cvsd": {
-    "source": "iana"
-  },
-  "audio/vnd.wave": {
-    "compressible": false
-  },
-  "audio/vorbis": {
-    "source": "iana",
-    "compressible": false
-  },
-  "audio/vorbis-config": {
-    "source": "iana"
-  },
-  "audio/webm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["weba"]
-  },
-  "audio/x-aac": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["aac"]
-  },
-  "audio/x-aiff": {
-    "source": "apache",
-    "extensions": ["aif","aiff","aifc"]
-  },
-  "audio/x-caf": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["caf"]
-  },
-  "audio/x-flac": {
-    "source": "apache",
-    "extensions": ["flac"]
-  },
-  "audio/x-matroska": {
-    "source": "apache",
-    "extensions": ["mka"]
-  },
-  "audio/x-mpegurl": {
-    "source": "apache",
-    "extensions": ["m3u"]
-  },
-  "audio/x-ms-wax": {
-    "source": "apache",
-    "extensions": ["wax"]
-  },
-  "audio/x-ms-wma": {
-    "source": "apache",
-    "extensions": ["wma"]
-  },
-  "audio/x-pn-realaudio": {
-    "source": "apache",
-    "extensions": ["ram","ra"]
-  },
-  "audio/x-pn-realaudio-plugin": {
-    "source": "apache",
-    "extensions": ["rmp"]
-  },
-  "audio/x-tta": {
-    "source": "apache"
-  },
-  "audio/x-wav": {
-    "source": "apache",
-    "extensions": ["wav"]
-  },
-  "audio/xm": {
-    "source": "apache",
-    "extensions": ["xm"]
-  },
-  "chemical/x-cdx": {
-    "source": "apache",
-    "extensions": ["cdx"]
-  },
-  "chemical/x-cif": {
-    "source": "apache",
-    "extensions": ["cif"]
-  },
-  "chemical/x-cmdf": {
-    "source": "apache",
-    "extensions": ["cmdf"]
-  },
-  "chemical/x-cml": {
-    "source": "apache",
-    "extensions": ["cml"]
-  },
-  "chemical/x-csml": {
-    "source": "apache",
-    "extensions": ["csml"]
-  },
-  "chemical/x-pdb": {
-    "source": "apache"
-  },
-  "chemical/x-xyz": {
-    "source": "apache",
-    "extensions": ["xyz"]
-  },
-  "font/opentype": {
-    "compressible": true,
-    "extensions": ["otf"]
-  },
-  "image/bmp": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["bmp"]
-  },
-  "image/cgm": {
-    "source": "iana",
-    "extensions": ["cgm"]
-  },
-  "image/example": {
-    "source": "iana"
-  },
-  "image/fits": {
-    "source": "iana"
-  },
-  "image/g3fax": {
-    "source": "iana",
-    "extensions": ["g3"]
-  },
-  "image/gif": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["gif"]
-  },
-  "image/ief": {
-    "source": "iana",
-    "extensions": ["ief"]
-  },
-  "image/jp2": {
-    "source": "iana"
-  },
-  "image/jpeg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["jpeg","jpg","jpe"]
-  },
-  "image/jpm": {
-    "source": "iana"
-  },
-  "image/jpx": {
-    "source": "iana"
-  },
-  "image/ktx": {
-    "source": "iana",
-    "extensions": ["ktx"]
-  },
-  "image/naplps": {
-    "source": "iana"
-  },
-  "image/pjpeg": {
-    "compressible": false
-  },
-  "image/png": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["png"]
-  },
-  "image/prs.btif": {
-    "source": "iana",
-    "extensions": ["btif"]
-  },
-  "image/prs.pti": {
-    "source": "iana"
-  },
-  "image/pwg-raster": {
-    "source": "iana"
-  },
-  "image/sgi": {
-    "source": "apache",
-    "extensions": ["sgi"]
-  },
-  "image/svg+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["svg","svgz"]
-  },
-  "image/t38": {
-    "source": "iana"
-  },
-  "image/tiff": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["tiff","tif"]
-  },
-  "image/tiff-fx": {
-    "source": "iana"
-  },
-  "image/vnd-djvu": {
-    "source": "iana"
-  },
-  "image/vnd-svf": {
-    "source": "iana"
-  },
-  "image/vnd-wap-wbmp": {
-    "source": "iana"
-  },
-  "image/vnd.adobe.photoshop": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["psd"]
-  },
-  "image/vnd.airzip.accelerator.azv": {
-    "source": "iana"
-  },
-  "image/vnd.cns.inf2": {
-    "source": "iana"
-  },
-  "image/vnd.dece.graphic": {
-    "source": "iana",
-    "extensions": ["uvi","uvvi","uvg","uvvg"]
-  },
-  "image/vnd.djvu": {
-    "source": "apache",
-    "extensions": ["djvu","djv"]
-  },
-  "image/vnd.dvb.subtitle": {
-    "source": "iana",
-    "extensions": ["sub"]
-  },
-  "image/vnd.dwg": {
-    "source": "iana",
-    "extensions": ["dwg"]
-  },
-  "image/vnd.dxf": {
-    "source": "iana",
-    "extensions": ["dxf"]
-  },
-  "image/vnd.fastbidsheet": {
-    "source": "iana",
-    "extensions": ["fbs"]
-  },
-  "image/vnd.fpx": {
-    "source": "iana",
-    "extensions": ["fpx"]
-  },
-  "image/vnd.fst": {
-    "source": "iana",
-    "extensions": ["fst"]
-  },
-  "image/vnd.fujixerox.edmics-mmr": {
-    "source": "iana",
-    "extensions": ["mmr"]
-  },
-  "image/vnd.fujixerox.edmics-rlc": {
-    "source": "iana",
-    "extensions": ["rlc"]
-  },
-  "image/vnd.globalgraphics.pgb": {
-    "source": "iana"
-  },
-  "image/vnd.microsoft.icon": {
-    "source": "iana"
-  },
-  "image/vnd.mix": {
-    "source": "iana"
-  },
-  "image/vnd.ms-modi": {
-    "source": "iana",
-    "extensions": ["mdi"]
-  },
-  "image/vnd.ms-photo": {
-    "source": "apache",
-    "extensions": ["wdp"]
-  },
-  "image/vnd.net-fpx": {
-    "source": "iana",
-    "extensions": ["npx"]
-  },
-  "image/vnd.radiance": {
-    "source": "iana"
-  },
-  "image/vnd.sealed-png": {
-    "source": "iana"
-  },
-  "image/vnd.sealed.png": {
-    "source": "apache"
-  },
-  "image/vnd.sealedmedia.softseal-gif": {
-    "source": "iana"
-  },
-  "image/vnd.sealedmedia.softseal-jpg": {
-    "source": "iana"
-  },
-  "image/vnd.sealedmedia.softseal.gif": {
-    "source": "apache"
-  },
-  "image/vnd.sealedmedia.softseal.jpg": {
-    "source": "apache"
-  },
-  "image/vnd.svf": {
-    "source": "apache"
-  },
-  "image/vnd.tencent.tap": {
-    "source": "iana"
-  },
-  "image/vnd.valve.source.texture": {
-    "source": "iana"
-  },
-  "image/vnd.wap.wbmp": {
-    "source": "apache",
-    "extensions": ["wbmp"]
-  },
-  "image/vnd.xiff": {
-    "source": "iana",
-    "extensions": ["xif"]
-  },
-  "image/webp": {
-    "source": "apache",
-    "extensions": ["webp"]
-  },
-  "image/x-3ds": {
-    "source": "apache",
-    "extensions": ["3ds"]
-  },
-  "image/x-cmu-raster": {
-    "source": "apache",
-    "extensions": ["ras"]
-  },
-  "image/x-cmx": {
-    "source": "apache",
-    "extensions": ["cmx"]
-  },
-  "image/x-freehand": {
-    "source": "apache",
-    "extensions": ["fh","fhc","fh4","fh5","fh7"]
-  },
-  "image/x-icon": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["ico"]
-  },
-  "image/x-mrsid-image": {
-    "source": "apache",
-    "extensions": ["sid"]
-  },
-  "image/x-pcx": {
-    "source": "apache",
-    "extensions": ["pcx"]
-  },
-  "image/x-pict": {
-    "source": "apache",
-    "extensions": ["pic","pct"]
-  },
-  "image/x-portable-anymap": {
-    "source": "apache",
-    "extensions": ["pnm"]
-  },
-  "image/x-portable-bitmap": {
-    "source": "apache",
-    "extensions": ["pbm"]
-  },
-  "image/x-portable-graymap": {
-    "source": "apache",
-    "extensions": ["pgm"]
-  },
-  "image/x-portable-pixmap": {
-    "source": "apache",
-    "extensions": ["ppm"]
-  },
-  "image/x-rgb": {
-    "source": "apache",
-    "extensions": ["rgb"]
-  },
-  "image/x-tga": {
-    "source": "apache",
-    "extensions": ["tga"]
-  },
-  "image/x-xbitmap": {
-    "source": "apache",
-    "extensions": ["xbm"]
-  },
-  "image/x-xcf": {
-    "compressible": false
-  },
-  "image/x-xpixmap": {
-    "source": "apache",
-    "extensions": ["xpm"]
-  },
-  "image/x-xwindowdump": {
-    "source": "apache",
-    "extensions": ["xwd"]
-  },
-  "message/cpim": {
-    "source": "iana"
-  },
-  "message/delivery-status": {
-    "source": "iana"
-  },
-  "message/disposition-notification": {
-    "source": "iana"
-  },
-  "message/example": {
-    "source": "iana"
-  },
-  "message/external-body": {
-    "source": "iana"
-  },
-  "message/feedback-report": {
-    "source": "iana"
-  },
-  "message/global": {
-    "source": "iana"
-  },
-  "message/global-delivery-status": {
-    "source": "iana"
-  },
-  "message/global-disposition-notification": {
-    "source": "iana"
-  },
-  "message/global-headers": {
-    "source": "iana"
-  },
-  "message/http": {
-    "source": "iana",
-    "compressible": false
-  },
-  "message/imdn+xml": {
-    "source": "iana",
-    "compressible": true
-  },
-  "message/news": {
-    "source": "iana"
-  },
-  "message/partial": {
-    "source": "iana",
-    "compressible": false
-  },
-  "message/rfc822": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["eml","mime"]
-  },
-  "message/s-http": {
-    "source": "iana"
-  },
-  "message/sip": {
-    "source": "iana"
-  },
-  "message/sipfrag": {
-    "source": "iana"
-  },
-  "message/tracking-status": {
-    "source": "iana"
-  },
-  "message/vnd.si.simp": {
-    "source": "iana"
-  },
-  "message/vnd.wfa.wsc": {
-    "source": "iana"
-  },
-  "model/example": {
-    "source": "iana",
-    "compressible": false
-  },
-  "model/iges": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["igs","iges"]
-  },
-  "model/mesh": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["msh","mesh","silo"]
-  },
-  "model/vnd-dwf": {
-    "source": "iana"
-  },
-  "model/vnd.collada+xml": {
-    "source": "iana",
-    "extensions": ["dae"]
-  },
-  "model/vnd.dwf": {
-    "source": "apache",
-    "extensions": ["dwf"]
-  },
-  "model/vnd.flatland.3dml": {
-    "source": "iana"
-  },
-  "model/vnd.gdl": {
-    "source": "iana",
-    "extensions": ["gdl"]
-  },
-  "model/vnd.gs-gdl": {
-    "source": "iana"
-  },
-  "model/vnd.gs.gdl": {
-    "source": "apache"
-  },
-  "model/vnd.gtw": {
-    "source": "iana",
-    "extensions": ["gtw"]
-  },
-  "model/vnd.moml+xml": {
-    "source": "iana"
-  },
-  "model/vnd.mts": {
-    "source": "iana",
-    "extensions": ["mts"]
-  },
-  "model/vnd.opengex": {
-    "source": "iana"
-  },
-  "model/vnd.parasolid.transmit-binary": {
-    "source": "iana"
-  },
-  "model/vnd.parasolid.transmit-text": {
-    "source": "iana"
-  },
-  "model/vnd.parasolid.transmit.binary": {
-    "source": "apache"
-  },
-  "model/vnd.parasolid.transmit.text": {
-    "source": "apache"
-  },
-  "model/vnd.valve.source.compiled-map": {
-    "source": "iana"
-  },
-  "model/vnd.vtu": {
-    "source": "iana",
-    "extensions": ["vtu"]
-  },
-  "model/vrml": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["wrl","vrml"]
-  },
-  "model/x3d+binary": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["x3db","x3dbz"]
-  },
-  "model/x3d+fastinfoset": {
-    "source": "iana"
-  },
-  "model/x3d+vrml": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["x3dv","x3dvz"]
-  },
-  "model/x3d+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["x3d","x3dz"]
-  },
-  "model/x3d-vrml": {
-    "source": "iana"
-  },
-  "multipart/alternative": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/appledouble": {
-    "source": "iana"
-  },
-  "multipart/byteranges": {
-    "source": "iana"
-  },
-  "multipart/digest": {
-    "source": "iana"
-  },
-  "multipart/encrypted": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/example": {
-    "source": "iana"
-  },
-  "multipart/form-data": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/header-set": {
-    "source": "iana"
-  },
-  "multipart/mixed": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/parallel": {
-    "source": "iana"
-  },
-  "multipart/related": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/report": {
-    "source": "iana"
-  },
-  "multipart/signed": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/voice-message": {
-    "source": "iana"
-  },
-  "multipart/x-mixed-replace": {
-    "source": "iana"
-  },
-  "text/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "text/cache-manifest": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["appcache","manifest"]
-  },
-  "text/calendar": {
-    "source": "iana",
-    "extensions": ["ics","ifb"]
-  },
-  "text/calender": {
-    "compressible": true
-  },
-  "text/cmd": {
-    "compressible": true
-  },
-  "text/coffeescript": {
-    "extensions": ["coffee"]
-  },
-  "text/css": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["css"]
-  },
-  "text/csv": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["csv"]
-  },
-  "text/csv-schema": {
-    "source": "iana"
-  },
-  "text/directory": {
-    "source": "iana"
-  },
-  "text/dns": {
-    "source": "iana"
-  },
-  "text/ecmascript": {
-    "source": "iana"
-  },
-  "text/encaprtp": {
-    "source": "iana"
-  },
-  "text/enriched": {
-    "source": "iana"
-  },
-  "text/example": {
-    "source": "iana"
-  },
-  "text/fwdred": {
-    "source": "iana"
-  },
-  "text/grammar-ref-list": {
-    "source": "iana"
-  },
-  "text/html": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["html","htm"]
-  },
-  "text/jade": {
-    "extensions": ["jade"]
-  },
-  "text/javascript": {
-    "source": "iana",
-    "compressible": true
-  },
-  "text/jcr-cnd": {
-    "source": "iana"
-  },
-  "text/jsx": {
-    "compressible": true,
-    "extensions": ["jsx"]
-  },
-  "text/less": {
-    "extensions": ["less"]
-  },
-  "text/markdown": {
-    "source": "iana"
-  },
-  "text/mizar": {
-    "source": "iana"
-  },
-  "text/n3": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["n3"]
-  },
-  "text/parameters": {
-    "source": "iana"
-  },
-  "text/parityfec": {
-    "source": "iana"
-  },
-  "text/plain": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["txt","text","conf","def","list","log","in","ini"]
-  },
-  "text/provenance-notation": {
-    "source": "iana"
-  },
-  "text/prs.fallenstein.rst": {
-    "source": "iana"
-  },
-  "text/prs.lines.tag": {
-    "source": "iana",
-    "extensions": ["dsc"]
-  },
-  "text/raptorfec": {
-    "source": "iana"
-  },
-  "text/red": {
-    "source": "iana"
-  },
-  "text/rfc822-headers": {
-    "source": "iana"
-  },
-  "text/richtext": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rtx"]
-  },
-  "text/rtf": {
-    "source": "iana"
-  },
-  "text/rtp-enc-aescm128": {
-    "source": "iana"
-  },
-  "text/rtploopback": {
-    "source": "iana"
-  },
-  "text/rtx": {
-    "source": "iana"
-  },
-  "text/sgml": {
-    "source": "iana",
-    "extensions": ["sgml","sgm"]
-  },
-  "text/stylus": {
-    "extensions": ["stylus","styl"]
-  },
-  "text/t140": {
-    "source": "iana"
-  },
-  "text/tab-separated-values": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["tsv"]
-  },
-  "text/troff": {
-    "source": "iana",
-    "extensions": ["t","tr","roff","man","me","ms"]
-  },
-  "text/turtle": {
-    "source": "iana",
-    "extensions": ["ttl"]
-  },
-  "text/ulpfec": {
-    "source": "iana"
-  },
-  "text/uri-list": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["uri","uris","urls"]
-  },
-  "text/vcard": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["vcard"]
-  },
-  "text/vnd-a": {
-    "source": "iana"
-  },
-  "text/vnd-curl": {
-    "source": "iana"
-  },
-  "text/vnd.abc": {
-    "source": "iana"
-  },
-  "text/vnd.curl": {
-    "source": "apache",
-    "extensions": ["curl"]
-  },
-  "text/vnd.curl.dcurl": {
-    "source": "apache",
-    "extensions": ["dcurl"]
-  },
-  "text/vnd.curl.mcurl": {
-    "source": "apache",
-    "extensions": ["mcurl"]
-  },
-  "text/vnd.curl.scurl": {
-    "source": "apache",
-    "extensions": ["scurl"]
-  },
-  "text/vnd.debian.copyright": {
-    "source": "iana"
-  },
-  "text/vnd.dmclientscript": {
-    "source": "iana"
-  },
-  "text/vnd.dvb.subtitle": {
-    "source": "iana",
-    "extensions": ["sub"]
-  },
-  "text/vnd.esmertec.theme-descriptor": {
-    "source": "iana"
-  },
-  "text/vnd.fly": {
-    "source": "iana",
-    "extensions": ["fly"]
-  },
-  "text/vnd.fmi.flexstor": {
-    "source": "iana",
-    "extensions": ["flx"]
-  },
-  "text/vnd.graphviz": {
-    "source": "iana",
-    "extensions": ["gv"]
-  },
-  "text/vnd.in3d.3dml": {
-    "source": "iana",
-    "extensions": ["3dml"]
-  },
-  "text/vnd.in3d.spot": {
-    "source": "iana",
-    "extensions": ["spot"]
-  },
-  "text/vnd.iptc.newsml": {
-    "source": "iana"
-  },
-  "text/vnd.iptc.nitf": {
-    "source": "iana"
-  },
-  "text/vnd.latex-z": {
-    "source": "iana"
-  },
-  "text/vnd.motorola.reflex": {
-    "source": "iana"
-  },
-  "text/vnd.ms-mediapackage": {
-    "source": "iana"
-  },
-  "text/vnd.net2phone.commcenter.command": {
-    "source": "iana"
-  },
-  "text/vnd.radisys.msml-basic-layout": {
-    "source": "iana"
-  },
-  "text/vnd.si.uricatalogue": {
-    "source": "iana"
-  },
-  "text/vnd.sun.j2me.app-descriptor": {
-    "source": "iana",
-    "extensions": ["jad"]
-  },
-  "text/vnd.trolltech.linguist": {
-    "source": "iana"
-  },
-  "text/vnd.wap-wml": {
-    "source": "iana"
-  },
-  "text/vnd.wap.si": {
-    "source": "iana"
-  },
-  "text/vnd.wap.sl": {
-    "source": "iana"
-  },
-  "text/vnd.wap.wml": {
-    "source": "apache",
-    "extensions": ["wml"]
-  },
-  "text/vnd.wap.wmlscript": {
-    "source": "iana",
-    "extensions": ["wmls"]
-  },
-  "text/vtt": {
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["vtt"]
-  },
-  "text/x-asm": {
-    "source": "apache",
-    "extensions": ["s","asm"]
-  },
-  "text/x-c": {
-    "source": "apache",
-    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
-  },
-  "text/x-component": {
-    "extensions": ["htc"]
-  },
-  "text/x-fortran": {
-    "source": "apache",
-    "extensions": ["f","for","f77","f90"]
-  },
-  "text/x-gwt-rpc": {
-    "compressible": true
-  },
-  "text/x-handlebars-template": {
-    "extensions": ["hbs"]
-  },
-  "text/x-java-source": {
-    "source": "apache",
-    "extensions": ["java"]
-  },
-  "text/x-jquery-tmpl": {
-    "compressible": true
-  },
-  "text/x-lua": {
-    "extensions": ["lua"]
-  },
-  "text/x-markdown": {
-    "compressible": true,
-    "extensions": ["markdown","md","mkd"]
-  },
-  "text/x-nfo": {
-    "source": "apache",
-    "extensions": ["nfo"]
-  },
-  "text/x-opml": {
-    "source": "apache",
-    "extensions": ["opml"]
-  },
-  "text/x-pascal": {
-    "source": "apache",
-    "extensions": ["p","pas"]
-  },
-  "text/x-sass": {
-    "extensions": ["sass"]
-  },
-  "text/x-scss": {
-    "extensions": ["scss"]
-  },
-  "text/x-setext": {
-    "source": "apache",
-    "extensions": ["etx"]
-  },
-  "text/x-sfv": {
-    "source": "apache",
-    "extensions": ["sfv"]
-  },
-  "text/x-uuencode": {
-    "source": "apache",
-    "extensions": ["uu"]
-  },
-  "text/x-vcalendar": {
-    "source": "apache",
-    "extensions": ["vcs"]
-  },
-  "text/x-vcard": {
-    "source": "apache",
-    "extensions": ["vcf"]
-  },
-  "text/xml": {
-    "source": "iana",
-    "compressible": true
-  },
-  "text/xml-external-parsed-entity": {
-    "source": "iana"
-  },
-  "text/yaml": {
-    "extensions": ["yaml","yml"]
-  },
-  "video/1d-interleaved-parityfec": {
-    "source": "apache"
-  },
-  "video/3gpp": {
-    "source": "apache",
-    "extensions": ["3gp"]
-  },
-  "video/3gpp-tt": {
-    "source": "apache"
-  },
-  "video/3gpp2": {
-    "source": "apache",
-    "extensions": ["3g2"]
-  },
-  "video/bmpeg": {
-    "source": "apache"
-  },
-  "video/bt656": {
-    "source": "apache"
-  },
-  "video/celb": {
-    "source": "apache"
-  },
-  "video/dv": {
-    "source": "apache"
-  },
-  "video/example": {
-    "source": "apache"
-  },
-  "video/h261": {
-    "source": "apache",
-    "extensions": ["h261"]
-  },
-  "video/h263": {
-    "source": "apache",
-    "extensions": ["h263"]
-  },
-  "video/h263-1998": {
-    "source": "apache"
-  },
-  "video/h263-2000": {
-    "source": "apache"
-  },
-  "video/h264": {
-    "source": "apache",
-    "extensions": ["h264"]
-  },
-  "video/h264-rcdo": {
-    "source": "apache"
-  },
-  "video/h264-svc": {
-    "source": "apache"
-  },
-  "video/jpeg": {
-    "source": "apache",
-    "extensions": ["jpgv"]
-  },
-  "video/jpeg2000": {
-    "source": "apache"
-  },
-  "video/jpm": {
-    "source": "apache",
-    "extensions": ["jpm","jpgm"]
-  },
-  "video/mj2": {
-    "source": "apache",
-    "extensions": ["mj2","mjp2"]
-  },
-  "video/mp1s": {
-    "source": "apache"
-  },
-  "video/mp2p": {
-    "source": "apache"
-  },
-  "video/mp2t": {
-    "source": "apache",
-    "extensions": ["ts"]
-  },
-  "video/mp4": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mp4","mp4v","mpg4"]
-  },
-  "video/mp4v-es": {
-    "source": "apache"
-  },
-  "video/mpeg": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
-  },
-  "video/mpeg4-generic": {
-    "source": "apache"
-  },
-  "video/mpv": {
-    "source": "apache"
-  },
-  "video/nv": {
-    "source": "apache"
-  },
-  "video/ogg": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["ogv"]
-  },
-  "video/parityfec": {
-    "source": "apache"
-  },
-  "video/pointer": {
-    "source": "apache"
-  },
-  "video/quicktime": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["qt","mov"]
-  },
-  "video/raw": {
-    "source": "apache"
-  },
-  "video/rtp-enc-aescm128": {
-    "source": "apache"
-  },
-  "video/rtx": {
-    "source": "apache"
-  },
-  "video/smpte292m": {
-    "source": "apache"
-  },
-  "video/ulpfec": {
-    "source": "apache"
-  },
-  "video/vc1": {
-    "source": "apache"
-  },
-  "video/vnd.cctv": {
-    "source": "apache"
-  },
-  "video/vnd.dece.hd": {
-    "source": "apache",
-    "extensions": ["uvh","uvvh"]
-  },
-  "video/vnd.dece.mobile": {
-    "source": "apache",
-    "extensions": ["uvm","uvvm"]
-  },
-  "video/vnd.dece.mp4": {
-    "source": "apache"
-  },
-  "video/vnd.dece.pd": {
-    "source": "apache",
-    "extensions": ["uvp","uvvp"]
-  },
-  "video/vnd.dece.sd": {
-    "source": "apache",
-    "extensions": ["uvs","uvvs"]
-  },
-  "video/vnd.dece.video": {
-    "source": "apache",
-    "extensions": ["uvv","uvvv"]
-  },
-  "video/vnd.directv.mpeg": {
-    "source": "apache"
-  },
-  "video/vnd.directv.mpeg-tts": {
-    "source": "apache"
-  },
-  "video/vnd.dlna.mpeg-tts": {
-    "source": "apache"
-  },
-  "video/vnd.dvb.file": {
-    "source": "apache",
-    "extensions": ["dvb"]
-  },
-  "video/vnd.fvt": {
-    "source": "apache",
-    "extensions": ["fvt"]
-  },
-  "video/vnd.hns.video": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.1dparityfec-1010": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.1dparityfec-2005": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.2dparityfec-1010": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.2dparityfec-2005": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.ttsavc": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.ttsmpeg2": {
-    "source": "apache"
-  },
-  "video/vnd.motorola.video": {
-    "source": "apache"
-  },
-  "video/vnd.motorola.videop": {
-    "source": "apache"
-  },
-  "video/vnd.mpegurl": {
-    "source": "apache",
-    "extensions": ["mxu","m4u"]
-  },
-  "video/vnd.ms-playready.media.pyv": {
-    "source": "apache",
-    "extensions": ["pyv"]
-  },
-  "video/vnd.nokia.interleaved-multimedia": {
-    "source": "apache"
-  },
-  "video/vnd.nokia.videovoip": {
-    "source": "apache"
-  },
-  "video/vnd.objectvideo": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.mpeg1": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.mpeg4": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.swf": {
-    "source": "apache"
-  },
-  "video/vnd.sealedmedia.softseal.mov": {
-    "source": "apache"
-  },
-  "video/vnd.uvvu.mp4": {
-    "source": "apache",
-    "extensions": ["uvu","uvvu"]
-  },
-  "video/vnd.vivo": {
-    "source": "apache",
-    "extensions": ["viv"]
-  },
-  "video/webm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["webm"]
-  },
-  "video/x-f4v": {
-    "source": "apache",
-    "extensions": ["f4v"]
-  },
-  "video/x-fli": {
-    "source": "apache",
-    "extensions": ["fli"]
-  },
-  "video/x-flv": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["flv"]
-  },
-  "video/x-m4v": {
-    "source": "apache",
-    "extensions": ["m4v"]
-  },
-  "video/x-matroska": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mkv","mk3d","mks"]
-  },
-  "video/x-mng": {
-    "source": "apache",
-    "extensions": ["mng"]
-  },
-  "video/x-ms-asf": {
-    "source": "apache",
-    "extensions": ["asf","asx"]
-  },
-  "video/x-ms-vob": {
-    "source": "apache",
-    "extensions": ["vob"]
-  },
-  "video/x-ms-wm": {
-    "source": "apache",
-    "extensions": ["wm"]
-  },
-  "video/x-ms-wmv": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["wmv"]
-  },
-  "video/x-ms-wmx": {
-    "source": "apache",
-    "extensions": ["wmx"]
-  },
-  "video/x-ms-wvx": {
-    "source": "apache",
-    "extensions": ["wvx"]
-  },
-  "video/x-msvideo": {
-    "source": "apache",
-    "extensions": ["avi"]
-  },
-  "video/x-sgi-movie": {
-    "source": "apache",
-    "extensions": ["movie"]
-  },
-  "video/x-smv": {
-    "source": "apache",
-    "extensions": ["smv"]
-  },
-  "x-conference/x-cooltalk": {
-    "source": "apache",
-    "extensions": ["ice"]
-  },
-  "x-shader/x-fragment": {
-    "compressible": true
-  },
-  "x-shader/x-vertex": {
-    "compressible": true
-  }
-}
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/index.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/index.js
deleted file mode 100644 (file)
index 551031f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * mime-db
- * Copyright(c) 2014 Jonathan Ong
- * MIT Licensed
- */
-
-/**
- * Module exports.
- */
-
-module.exports = require('./db.json')
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/node_modules/mime-db/package.json
deleted file mode 100644 (file)
index ff01bd5..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "name": "mime-db",
-  "description": "Media Type Database",
-  "version": "1.3.0",
-  "author": {
-    "name": "Jonathan Ong",
-    "email": "me@jongleberry.com",
-    "url": "http://jongleberry.com"
-  },
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jshttp/mime-db"
-  },
-  "devDependencies": {
-    "co": "3",
-    "cogent": "1",
-    "csv-parse": "0",
-    "gnode": "0.1.0",
-    "istanbul": "0.3.4",
-    "mocha": "~1.21.4",
-    "stream-to-array": "2"
-  },
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "files": [
-    "LICENSE",
-    "db.json",
-    "index.js"
-  ],
-  "scripts": {
-    "update": "gnode scripts/extensions && gnode scripts/types && node scripts/build",
-    "clean": "rm src/*",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  },
-  "keywords": [
-    "mime",
-    "db",
-    "type",
-    "types",
-    "database",
-    "charset",
-    "charsets"
-  ],
-  "gitHead": "dc3a4d4948e9e6814404712d0f3560f1fffe7d73",
-  "bugs": {
-    "url": "https://github.com/jshttp/mime-db/issues"
-  },
-  "homepage": "https://github.com/jshttp/mime-db",
-  "_id": "mime-db@1.3.0",
-  "_shasum": "5fefeb25dd9b097c5d45091c60f8149b98d749ec",
-  "_from": "mime-db@>=1.3.0 <1.4.0",
-  "_npmVersion": "1.4.21",
-  "_npmUser": {
-    "name": "dougwilson",
-    "email": "doug@somethingdoug.com"
-  },
-  "maintainers": [
-    {
-      "name": "jongleberry",
-      "email": "jonathanrichardong@gmail.com"
-    },
-    {
-      "name": "dougwilson",
-      "email": "doug@somethingdoug.com"
-    }
-  ],
-  "dist": {
-    "shasum": "5fefeb25dd9b097c5d45091c60f8149b98d749ec",
-    "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.3.0.tgz"
-  },
-  "directories": {},
-  "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.3.0.tgz",
-  "readme": "ERROR: No README data found!"
-}
diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/mime-types/package.json
deleted file mode 100644 (file)
index 1544629..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "name": "mime-types",
-  "description": "The ultimate javascript content-type utility.",
-  "version": "2.0.4",
-  "contributors": [
-    {
-      "name": "Jeremiah Senkpiel",
-      "email": "fishrock123@rocketmail.com",
-      "url": "https://searchbeam.jit.su"
-    },
-    {
-      "name": "Jonathan Ong",
-      "email": "me@jongleberry.com",
-      "url": "http://jongleberry.com"
-    }
-  ],
-  "license": "MIT",
-  "keywords": [
-    "mime",
-    "types"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jshttp/mime-types"
-  },
-  "dependencies": {
-    "mime-db": "~1.3.0"
-  },
-  "devDependencies": {
-    "istanbul": "0",
-    "mocha": "~1.21.5"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "test": "mocha --reporter spec test/test.js",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js"
-  },
-  "gitHead": "63a9b82e6e364d62428ed5459e5486504c489bf2",
-  "bugs": {
-    "url": "https://github.com/jshttp/mime-types/issues"
-  },
-  "homepage": "https://github.com/jshttp/mime-types",
-  "_id": "mime-types@2.0.4",
-  "_shasum": "855a612979141d806ba5104294a28c731c6ea790",
-  "_from": "mime-types@>=2.0.3 <2.1.0",
-  "_npmVersion": "1.4.21",
-  "_npmUser": {
-    "name": "dougwilson",
-    "email": "doug@somethingdoug.com"
-  },
-  "maintainers": [
-    {
-      "name": "jongleberry",
-      "email": "jonathanrichardong@gmail.com"
-    },
-    {
-      "name": "fishrock123",
-      "email": "fishrock123@rocketmail.com"
-    },
-    {
-      "name": "dougwilson",
-      "email": "doug@somethingdoug.com"
-    }
-  ],
-  "dist": {
-    "shasum": "855a612979141d806ba5104294a28c731c6ea790",
-    "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.0.4.tgz"
-  },
-  "directories": {},
-  "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.4.tgz",
-  "readme": "ERROR: No README data found!"
-}
index b3bb51763052d2523f4d9fa6148084ea19d95a67..ab108bf92f34a75fff185981a1e199710796f3f1 100644 (file)
@@ -1,18 +1,19 @@
-.idea\r
-*.iml\r
-npm-debug.log\r
-dump.rdb\r
-node_modules\r
-results.tap\r
-results.xml\r
-npm-shrinkwrap.json\r
-config.json\r
-.DS_Store\r
-*/.DS_Store\r
-*/*/.DS_Store\r
-._*\r
-*/._*\r
-*/*/._*\r
-coverage.*\r
-lib-cov\r
-\r
+.idea
+*.iml
+npm-debug.log
+dump.rdb
+node_modules
+components
+build
+results.tap
+results.xml
+npm-shrinkwrap.json
+config.json
+.DS_Store
+*/.DS_Store
+*/*/.DS_Store
+._*
+*/._*
+*/*/._*
+coverage.*
+lib-cov
index 40ca59eeebdd3a6b57da226c32e3feba45a267f9..77795c6a9b47df7362037a006600e179a68e1960 100755 (executable)
@@ -1,5 +1,4 @@
-language: node_js\r
-\r
-node_js:\r
-  - 0.10\r
-\r
+language: node_js
+
+node_js:
+  - 0.10
index e699a7bdbaa168de34896b86992937ca92ba26e6..78809368472fce4d2fc27c183610ccddebddc5d2 100755 (executable)
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2013, Eran Hammer.
+Copyright (c) 2012-2014, Eran Hammer and other contributors.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -8,17 +8,21 @@ modification, are permitted provided that the following conditions are met:
     * 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.
-    * Neither the name of Eran Hammer nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
+    * The names of any contributors may not be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 ERAN HAMMER BE LIABLE FOR ANY
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND 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.
+
+                                  *   *   *
+
+The complete list of contributors can be found at: https://github.com/hueniverse/hawk/graphs/contributors
index 5f339bf34743cfff261c4656f1e3d98d3900f390..b102d5ab800b6c4723089b2dca22b1f10f7fb328 100755 (executable)
@@ -1,10 +1,8 @@
 test:
-       @node node_modules/lab/bin/lab
+       @node node_modules/lab/bin/lab -a code
 test-cov: 
-       @node node_modules/lab/bin/lab -r threshold -t 100
+       @node node_modules/lab/bin/lab -a code -t 100
 test-cov-html:
-       @node node_modules/lab/bin/lab -r html -o coverage.html
-complexity:
-       @node node_modules/complexity-report/src/cli.js -o complexity.md -f markdown lib
+       @node node_modules/lab/bin/lab -a code -r html -o coverage.html
 
-.PHONY: test test-cov test-cov-html complexity
+.PHONY: test test-cov test-cov-html
index 36312f4feb2d63b4c1a318519a9ee1b8cc6e763d..0bcd2879012bd8482c20fef4d4e28176938c0463 100755 (executable)
@@ -3,7 +3,10 @@
 <img align="right" src="https://raw.github.com/hueniverse/hawk/master/images/logo.png" /> **Hawk** is an HTTP authentication scheme using a message authentication code (MAC) algorithm to provide partial
 HTTP request cryptographic verification. For more complex use cases such as access delegation, see [Oz](https://github.com/hueniverse/oz).
 
-Current version: **1.0**
+Current version: **2.3**
+
+Note: 2.x is the same exact protocol as 1.1. The version increment reflects a change in the internal error format
+used by the module and used by the node API.
 
 [![Build Status](https://secure.travis-ci.org/hueniverse/hawk.png)](http://travis-ci.org/hueniverse/hawk)
 
@@ -34,6 +37,7 @@ Current version: **1.0**
 <p></p>
 - [**Frequently Asked Questions**](#frequently-asked-questions)
 <p></p>
+- [**Implementations**](#implementations)
 - [**Acknowledgements**](#acknowledgements)
 
 # Introduction
@@ -346,7 +350,7 @@ Server-Authorization: Hawk mac="XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", h
 
 ## Browser Support and Considerations
 
-A browser script is provided for including using a `<script>` tag in [lib/browser.js](/lib/browser.js).
+A browser script is provided for including using a `<script>` tag in [lib/browser.js](/lib/browser.js). It's also a [component](http://component.io/hueniverse/hawk).
 
 **Hawk** relies on the _Server-Authorization_ and _WWW-Authenticate_ headers in its response to communicate with the client.
 Therefore, in case of CORS requests, it is important to consider sending _Access-Control-Expose-Headers_ with the value
@@ -542,7 +546,7 @@ something? Open an issue!
 
 ### Is it done?
 
-At if version 0.10.0, **Hawk** is feature-complete. However, until this module reaches version 1.0.0 it is considered experimental
+As of version 0.10.0, **Hawk** is feature-complete. However, until this module reaches version 1.0.0 it is considered experimental
 and is likely to change. This also means your feedback and contribution are very welcome. Feel free to open issues with questions
 and suggestions.
 
@@ -598,7 +602,7 @@ but with the additional security of delegated credentials.
 
 When calculating a hash or MAC, a static prefix (tag) is added. The prefix is used to prevent MAC values from being
 used or reused for a purpose other than what they were created for (i.e. prevents switching MAC values between a request,
-response, and a bewit use cases). It also protects against expliots created after a potential change in how the protocol
+response, and a bewit use cases). It also protects against exploits created after a potential change in how the protocol
 creates the normalized string. For example, if a future version would switch the order of nonce and timestamp, it
 can create an exploit opportunity for cases where the nonce is similar in format to a timestamp.
 
@@ -614,6 +618,12 @@ at work to produce more garbage.
 **Hawk** provides a simple HTTP authentication scheme for making client-server requests. It does not address the OAuth use case
 of delegating access to a third party. If you are looking for an OAuth alternative, check out [Oz](https://github.com/hueniverse/oz).
 
+# Implementations
+
+- [Logibit Hawk in F#/.Net](https://github.com/logibit/logibit.hawk/)
+- [Tent Hawk in Ruby](https://github.com/tent/hawk-ruby)
+- [Wealdtech in Java](https://github.com/wealdtech/hawk)
+- [Kumar's Mohawk in Python](https://github.com/kumar303/mohawk/)
 
 # Acknowledgements
 
diff --git a/deps/npm/node_modules/request/node_modules/hawk/bower.json b/deps/npm/node_modules/request/node_modules/hawk/bower.json
new file mode 100644 (file)
index 0000000..7d2d120
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "name": "hawk",
+  "main": "lib/browser.js",
+  "license": "./LICENSE",
+  "ignore": [
+    "!lib",
+    "lib/*",
+    "!lib/browser.js",
+    "index.js"
+  ],
+  "keywords": [
+    "http",
+    "authentication",
+    "scheme",
+    "hawk"
+  ],
+  "authors": [
+    "Eran Hammer <eran@hammer.io>"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/hueniverse/hawk.git"
+  }
+}
diff --git a/deps/npm/node_modules/request/node_modules/hawk/component.json b/deps/npm/node_modules/request/node_modules/hawk/component.json
new file mode 100644 (file)
index 0000000..63e76a2
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "name": "hawk",
+  "repo": "hueniverse/hawk",
+  "description": "HTTP Hawk Authentication Scheme",
+  "version": "1.0.0",
+  "keywords": [
+    "http",
+    "authentication",
+    "scheme",
+    "hawk"
+  ],
+  "dependencies": {},
+  "development": {},
+  "license": "BSD",
+  "main": "lib/browser.js",
+  "scripts": [
+    "lib/browser.js"
+  ]
+}
\ No newline at end of file
index 1ff0cd328677f2981ab3c3b1268ee3c08b96a6e8..3307fa243ad758bf0b52db3caaf414ac79f522f4 100755 (executable)
@@ -1,27 +1,23 @@
 /*
     HTTP Hawk Authentication Scheme
-    Copyright (c) 2012-2013, Eran Hammer <eran@hueniverse.com>
-    MIT Licensed
+    Copyright (c) 2012-2014, Eran Hammer <eran@hammer.io>
+    BSD Licensed
 */
 
 
 // Declare namespace
 
-var hawk = {};
-
-
-// Export if used as a module
+var hawk = {
+    internals: {}
+};
 
-if (typeof module !== "undefined" && module.exports) {
-    module.exports = hawk;
-}
 
 hawk.client = {
 
     // Generate an Authorization header for a given request
 
     /*
-        uri: 'http://example.com/resource?a=b'
+        uri: 'http://example.com/resource?a=b' or object generated by hawk.utils.parseUri()
         method: HTTP verb (e.g. 'GET', 'POST')
         options: {
 
@@ -66,7 +62,7 @@ hawk.client = {
 
         // Application time
 
-        var timestamp = options.timestamp || Math.floor((hawk.utils.now() + (options.localtimeOffsetMsec || 0)) / 1000)
+        var timestamp = options.timestamp || hawk.utils.now(options.localtimeOffsetMsec);
 
         // Validate credentials
 
@@ -76,7 +72,7 @@ hawk.client = {
             !credentials.key ||
             !credentials.algorithm) {
 
-            result.err = 'Invalid credential object';
+            result.err = 'Invalid credentials object';
             return result;
         }
 
@@ -111,7 +107,7 @@ hawk.client = {
         // Calculate payload hash
 
         if (!artifacts.hash &&
-            options.hasOwnProperty('payload')) {
+            (options.payload || options.payload === '')) {
 
             artifacts.hash = hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
         }
@@ -138,12 +134,90 @@ hawk.client = {
         return result;
     },
 
+    // Generate a bewit value for a given URI
+
+    /*
+        uri: 'http://example.com/resource?a=b'
+        options: {
+
+            // Required
+
+            credentials: {
+            id: 'dh37fgj492je',
+            key: 'aoijedoaijsdlaksjdl',
+            algorithm: 'sha256'                             // 'sha1', 'sha256'
+            },
+            ttlSec: 60 * 60,                                    // TTL in seconds
+
+            // Optional
+
+            ext: 'application-specific',                        // Application specific data sent via the ext attribute
+            localtimeOffsetMsec: 400                            // Time offset to sync with server time
+         };
+    */
+
+    bewit: function (uri, options) {
+
+        // Validate inputs
+
+        if (!uri ||
+            (typeof uri !== 'string') ||
+            !options ||
+            typeof options !== 'object' ||
+            !options.ttlSec) {
+
+            return '';
+        }
+
+        options.ext = (options.ext === null || options.ext === undefined ? '' : options.ext);       // Zero is valid value
+
+        // Application time
+
+        var now = hawk.utils.now(options.localtimeOffsetMsec);
+
+        // Validate credentials
+
+        var credentials = options.credentials;
+        if (!credentials ||
+            !credentials.id ||
+            !credentials.key ||
+            !credentials.algorithm) {
+
+            return '';
+        }
+
+        if (hawk.crypto.algorithms.indexOf(credentials.algorithm) === -1) {
+            return '';
+        }
+
+        // Parse URI
+
+        uri = hawk.utils.parseUri(uri);
+
+        // Calculate signature
+
+        var exp = now + options.ttlSec;
+        var mac = hawk.crypto.calculateMac('bewit', credentials, {
+            ts: exp,
+            nonce: '',
+            method: 'GET',
+            resource: uri.relative,                            // Maintain trailing '?' and query params
+            host: uri.hostname,
+            port: uri.port,
+            ext: options.ext
+        });
+
+        // Construct bewit: id\exp\mac\ext
+
+        var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext;
+        return hawk.utils.base64urlEncode(bewit);
+    },
 
     // Validate server response
 
     /*
         request:    object created via 'new XMLHttpRequest()' after response received
-        artifacts:  object recieved from header().artifacts
+        artifacts:  object received from header().artifacts
         options: {
             payload:    optional payload received
             required:   specifies if a Server-Authorization header is required. Defaults to 'false'
@@ -154,11 +228,17 @@ hawk.client = {
 
         options = options || {};
 
-        if (request.getResponseHeader('www-authenticate')) {
+        var getHeader = function (name) {
+
+            return request.getResponseHeader ? request.getResponseHeader(name) : request.getHeader(name);
+        };
+
+        var wwwAuthenticate = getHeader('www-authenticate');
+        if (wwwAuthenticate) {
 
             // Parse HTTP WWW-Authenticate header
 
-            var attributes = hawk.utils.parseAuthorizationHeader(request.getResponseHeader('www-authenticate'), ['ts', 'tsm', 'error']);
+            var attributes = hawk.utils.parseAuthorizationHeader(wwwAuthenticate, ['ts', 'tsm', 'error']);
             if (!attributes) {
                 return false;
             }
@@ -169,19 +249,20 @@ hawk.client = {
                     return false;
                 }
 
-                hawk.utils.setNtpOffset(attributes.ts - Math.floor(Date.now() / 1000));     // Keep offset at 1 second precision
+                hawk.utils.setNtpOffset(attributes.ts - Math.floor((new Date()).getTime() / 1000));     // Keep offset at 1 second precision
             }
         }
 
         // Parse HTTP Server-Authorization header
 
-        if (!request.getResponseHeader('server-authorization') &&
+        var serverAuthorization = getHeader('server-authorization');
+        if (!serverAuthorization &&
             !options.required) {
 
             return true;
         }
 
-        var attributes = hawk.utils.parseAuthorizationHeader(request.getResponseHeader('server-authorization'), ['mac', 'ext', 'hash']);
+        var attributes = hawk.utils.parseAuthorizationHeader(serverAuthorization, ['mac', 'ext', 'hash']);
         if (!attributes) {
             return false;
         }
@@ -204,7 +285,9 @@ hawk.client = {
             return false;
         }
 
-        if (!options.hasOwnProperty('payload')) {
+        if (!options.payload &&
+            options.payload !== '') {
+
             return true;
         }
 
@@ -212,7 +295,7 @@ hawk.client = {
             return false;
         }
 
-        var calculatedHash = hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, request.getResponseHeader('content-type'));
+        var calculatedHash = hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, getHeader('content-type'));
         return (calculatedHash === attributes.hash);
     },
 
@@ -230,7 +313,7 @@ hawk.client = {
 
         // Application time
 
-        var timestamp = options.timestamp || Math.floor((hawk.utils.now() + (options.localtimeOffsetMsec || 0)) / 1000)
+        var timestamp = options.timestamp || hawk.utils.now(options.localtimeOffsetMsec);
 
         // Validate credentials
 
@@ -279,7 +362,7 @@ hawk.client = {
         }
 
         if (updateClock !== false) {
-            hawk.utils.setNtpOffset(message.ts - Math.floor(Date.now() / 1000));    // Keep offset at 1 second precision
+            hawk.utils.setNtpOffset(message.ts - Math.floor((new Date()).getTime() / 1000));    // Keep offset at 1 second precision
         }
 
         return true;
@@ -331,7 +414,7 @@ hawk.crypto = {
         var hash = CryptoJS.algo[algorithm.toUpperCase()].create();
         hash.update('hawk.' + hawk.crypto.headerVersion + '.payload\n');
         hash.update(hawk.utils.parseContentType(contentType) + '\n');
-        hash.update(payload || '');
+        hash.update(payload);
         hash.update('\n');
         return hash.finalize().toString(CryptoJS.enc.Base64);
     },
@@ -344,46 +427,80 @@ hawk.crypto = {
 };
 
 
-hawk.utils = {
+// localStorage compatible interface
 
-    storage: {                                      // localStorage compatible interface
-        _cache: {},
-        setItem: function (key, value) {
+hawk.internals.LocalStorage = function () {
 
-            hawk.utils.storage._cache[key] = value;
-        },
-        getItem: function (key) {
+    this._cache = {};
+    this.length = 0;
 
-            return hawk.utils.storage._cache[key];
-        }
-    },
+    this.getItem = function (key) {
+
+        return this._cache.hasOwnProperty(key) ? String(this._cache[key]) : null;
+    };
+
+    this.setItem = function (key, value) {
+
+        this._cache[key] = String(value);
+        this.length = Object.keys(this._cache).length;
+    };
+
+    this.removeItem = function (key) {
+
+        delete this._cache[key];
+        this.length = Object.keys(this._cache).length;
+    };
+
+    this.clear = function () {
+
+        this._cache = {};
+        this.length = 0;
+    };
+
+    this.key = function (i) {
+
+        return Object.keys(this._cache)[i || 0];
+    };
+};
+
+
+hawk.utils = {
+
+    storage: new hawk.internals.LocalStorage(),
 
     setStorage: function (storage) {
 
-        var ntpOffset = hawk.utils.getNtpOffset() || 0;
+        var ntpOffset = hawk.utils.storage.getItem('hawk_ntp_offset');
         hawk.utils.storage = storage;
-        hawk.utils.setNtpOffset(ntpOffset);
+        if (ntpOffset) {
+            hawk.utils.setNtpOffset(ntpOffset);
+        }
     },
 
     setNtpOffset: function (offset) {
 
         try {
-          hawk.utils.storage.setItem('hawk_ntp_offset', offset);
+            hawk.utils.storage.setItem('hawk_ntp_offset', offset);
         }
         catch (err) {
-          console.error('[hawk] could not write to storage.');
-          console.error(err);
+            console.error('[hawk] could not write to storage.');
+            console.error(err);
         }
     },
 
     getNtpOffset: function () {
 
-        return parseInt(hawk.utils.storage.getItem('hawk_ntp_offset') || '0', 10);
+        var offset = hawk.utils.storage.getItem('hawk_ntp_offset');
+        if (!offset) {
+            return 0;
+        }
+
+        return parseInt(offset, 10);
     },
 
-    now: function () {
+    now: function (localtimeOffsetMsec) {
 
-        return Date.now() + hawk.utils.getNtpOffset();
+        return Math.floor(((new Date()).getTime() + (localtimeOffsetMsec || 0)) / 1000) + hawk.utils.getNtpOffset();
     },
 
     escapeHeaderAttribute: function (attribute) {
@@ -397,7 +514,7 @@ hawk.utils = {
             return '';
         }
 
-        return header.split(';')[0].trim().toLowerCase();
+        return header.split(';')[0].replace(/^\s+|\s+$/g, '').toLowerCase();
     },
 
     parseAuthorizationHeader: function (header, keys) {
@@ -476,32 +593,49 @@ hawk.utils = {
         var keys = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'hostname', 'port', 'resource', 'relative', 'pathname', 'directory', 'file', 'query', 'fragment'];
 
         var uriRegex = /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?(((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?)(?:#(.*))?)/;
-        var uriByNumber = uriRegex.exec(input);
+        var uriByNumber = input.match(uriRegex);
         var uri = {};
 
-        var i = 15;
-        while (i--) {
+        for (var i = 0, il = keys.length; i < il; ++i) {
             uri[keys[i]] = uriByNumber[i] || '';
         }
 
-        if (uri.port === null ||
-            uri.port === '') {
-
+        if (uri.port === '') {
             uri.port = (uri.protocol.toLowerCase() === 'http' ? '80' : (uri.protocol.toLowerCase() === 'https' ? '443' : ''));
         }
 
         return uri;
+    },
+
+    base64urlEncode: function (value) {
+
+        var wordArray = CryptoJS.enc.Utf8.parse(value);
+        var encoded = CryptoJS.enc.Base64.stringify(wordArray);
+        return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
     }
 };
 
 
+// $lab:coverage:off$
+
 // Based on: Crypto-JS v3.1.2
 // Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
 // http://code.google.com/p/crypto-js/
 // http://code.google.com/p/crypto-js/wiki/License
 
-var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e<a;e++)b[c+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)b[c+e>>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d<a;d+=4)b.push(4294967296*h.random()|0);return new j.init(b,a)}}),m=k.enc={},s=m.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var e=b[c>>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);b.sigBytes-=c}return new j.init(g,c)},clone:function(){var a=f.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new u.HMAC.init(a,d)).finalize(b)}}});var u=k.algo={};return k}(Math);
+var CryptoJS = CryptoJS || function (h, r) { var k = {}, l = k.lib = {}, n = function () { }, f = l.Base = { extend: function (a) { n.prototype = this; var b = new n; a && b.mixIn(a); b.hasOwnProperty("init") || (b.init = function () { b.$super.init.apply(this, arguments) }); b.init.prototype = b; b.$super = this; return b }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var b in a) a.hasOwnProperty(b) && (this[b] = a[b]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } }, j = l.WordArray = f.extend({ init: function (a, b) { a = this.words = a || []; this.sigBytes = b != r ? b : 4 * a.length }, toString: function (a) { return (a || s).stringify(this) }, concat: function (a) { var b = this.words, d = a.words, c = this.sigBytes; a = a.sigBytes; this.clamp(); if (c % 4) for (var e = 0; e < a; e++) b[c + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((c + e) % 4); else if (65535 < d.length) for (e = 0; e < a; e += 4) b[c + e >>> 2] = d[e >>> 2]; else b.push.apply(b, d); this.sigBytes += a; return this }, clamp: function () { var a = this.words, b = this.sigBytes; a[b >>> 2] &= 4294967295 << 32 - 8 * (b % 4); a.length = h.ceil(b / 4) }, clone: function () { var a = f.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var b = [], d = 0; d < a; d += 4) b.push(4294967296 * h.random() | 0); return new j.init(b, a) } }), m = k.enc = {}, s = m.Hex = { stringify: function (a) { var b = a.words; a = a.sigBytes; for (var d = [], c = 0; c < a; c++) { var e = b[c >>> 2] >>> 24 - 8 * (c % 4) & 255; d.push((e >>> 4).toString(16)); d.push((e & 15).toString(16)) } return d.join("") }, parse: function (a) { for (var b = a.length, d = [], c = 0; c < b; c += 2) d[c >>> 3] |= parseInt(a.substr(c, 2), 16) << 24 - 4 * (c % 8); return new j.init(d, b / 2) } }, p = m.Latin1 = { stringify: function (a) { var b = a.words; a = a.sigBytes; for (var d = [], c = 0; c < a; c++) d.push(String.fromCharCode(b[c >>> 2] >>> 24 - 8 * (c % 4) & 255)); return d.join("") }, parse: function (a) { for (var b = a.length, d = [], c = 0; c < b; c++) d[c >>> 2] |= (a.charCodeAt(c) & 255) << 24 - 8 * (c % 4); return new j.init(d, b) } }, t = m.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(p.stringify(a))) } catch (b) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return p.parse(unescape(encodeURIComponent(a))) } }, q = l.BufferedBlockAlgorithm = f.extend({ reset: function () { this._data = new j.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = t.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var b = this._data, d = b.words, c = b.sigBytes, e = this.blockSize, f = c / (4 * e), f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0); a = f * e; c = h.min(4 * a, c); if (a) { for (var g = 0; g < a; g += e) this._doProcessBlock(d, g); g = d.splice(0, a); b.sigBytes -= c } return new j.init(g, c) }, clone: function () { var a = f.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); l.Hasher = q.extend({ cfg: f.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, d) { return (new a.init(d)).finalize(b) } }, _createHmacHelper: function (a) { return function (b, d) { return (new u.HMAC.init(a, d)).finalize(b) } } }); var u = k.algo = {}; return k }(Math);
 (function () { var k = CryptoJS, b = k.lib, m = b.WordArray, l = b.Hasher, d = [], b = k.algo.SHA1 = l.extend({ _doReset: function () { this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (n, p) { for (var a = this._hash.words, e = a[0], f = a[1], h = a[2], j = a[3], b = a[4], c = 0; 80 > c; c++) { if (16 > c) d[c] = n[p + c] | 0; else { var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16]; d[c] = g << 1 | g >>> 31 } g = (e << 5 | e >>> 27) + b + d[c]; g = 20 > c ? g + ((f & h | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h ^ j) + 1859775393) : 60 > c ? g + ((f & h | f & j | h & j) - 1894007588) : g + ((f ^ h ^ j) - 899497514); b = j; j = h; h = f << 30 | f >>> 2; f = e; e = g } a[0] = a[0] + e | 0; a[1] = a[1] + f | 0; a[2] = a[2] + h | 0; a[3] = a[3] + j | 0; a[4] = a[4] + b | 0 }, _doFinalize: function () { var b = this._data, d = b.words, a = 8 * this._nDataBytes, e = 8 * b.sigBytes; d[e >>> 5] |= 128 << 24 - e % 32; d[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296); d[(e + 64 >>> 9 << 4) + 15] = a; b.sigBytes = 4 * d.length; this._process(); return this._hash }, clone: function () { var b = l.clone.call(this); b._hash = this._hash.clone(); return b } }); k.SHA1 = l._createHelper(b); k.HmacSHA1 = l._createHmacHelper(b) })();
 (function (k) { for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function (q) { return 4294967296 * (q - (q | 0)) | 0 }, l = 2, b = 0; 64 > b;) { var d; a: { d = l; for (var w = k.sqrt(d), r = 2; r <= w; r++) if (!(d % r)) { d = !1; break a } d = !0 } d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++); l++ } var n = [], h = h.SHA256 = j.extend({ _doReset: function () { this._hash = new v.init(s.slice(0)) }, _doProcessBlock: function (q, h) { for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) { if (16 > e) n[e] = q[h + e] | 0; else { var m = n[e - 15], p = n[e - 2]; n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16] } m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e]; p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b); l = j; j = g; g = f; f = k + m | 0; k = b; b = d; d = c; c = m + p | 0 } a[0] = a[0] + c | 0; a[1] = a[1] + d | 0; a[2] = a[2] + b | 0; a[3] = a[3] + k | 0; a[4] = a[4] + f | 0; a[5] = a[5] + g | 0; a[6] = a[6] + j | 0; a[7] = a[7] + l | 0 }, _doFinalize: function () { var d = this._data, b = d.words, a = 8 * this._nDataBytes, c = 8 * d.sigBytes; b[c >>> 5] |= 128 << 24 - c % 32; b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296); b[(c + 64 >>> 9 << 4) + 15] = a; d.sigBytes = 4 * b.length; this._process(); return this._hash }, clone: function () { var b = j.clone.call(this); b._hash = this._hash.clone(); return b } }); g.SHA256 = j._createHelper(h); g.HmacSHA256 = j._createHmacHelper(h) })(Math);
-(function(){var c=CryptoJS,k=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=k.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;d<c;d++)h[d]^=1549556828,j[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
-(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function () { var c = CryptoJS, k = c.enc.Utf8; c.algo.HMAC = c.lib.Base.extend({ init: function (a, b) { a = this._hasher = new a.init; "string" == typeof b && (b = k.parse(b)); var c = a.blockSize, e = 4 * c; b.sigBytes > e && (b = a.finalize(b)); b.clamp(); for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h = f.words, j = g.words, d = 0; d < c; d++) h[d] ^= 1549556828, j[d] ^= 909522486; f.sigBytes = g.sigBytes = e; this.reset() }, reset: function () { var a = this._hasher; a.reset(); a.update(this._iKey) }, update: function (a) { this._hasher.update(a); return this }, finalize: function (a) { var b = this._hasher; a = b.finalize(a); b.reset(); return b.finalize(this._oKey.clone().concat(a)) } }) })();
+(function () { var h = CryptoJS, j = h.lib.WordArray; h.enc.Base64 = { stringify: function (b) { var e = b.words, f = b.sigBytes, c = this._map; b.clamp(); b = []; for (var a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63)); if (e = c.charAt(64)) for (; b.length % 4;) b.push(e); return b.join("") }, parse: function (b) { var e = b.length, f = this._map, c = f.charAt(64); c && (c = b.indexOf(c), -1 != c && (e = c)); for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4); c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4); a++ } return j.create(c, a) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } })();
+
+hawk.crypto.internals = CryptoJS;
+
+
+// Export if used as a module
+
+if (typeof module !== 'undefined' && module.exports) {
+    module.exports = hawk;
+}
+
+// $lab:coverage:on$
index 1002a9d5171d1d1d83cadd35f81702a87d4231a6..7fdd48412aa76eef898720f378534e29efec1462 100755 (executable)
@@ -60,7 +60,7 @@ exports.header = function (uri, method, options) {
 
     // Application time
 
-    var timestamp = options.timestamp || Math.floor((Utils.now() + (options.localtimeOffsetMsec || 0)) / 1000)
+    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
 
     // Validate credentials
 
@@ -105,7 +105,7 @@ exports.header = function (uri, method, options) {
     // Calculate payload hash
 
     if (!artifacts.hash &&
-        options.hasOwnProperty('payload')) {
+        (options.payload || options.payload === '')) {
 
         artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
     }
@@ -119,7 +119,7 @@ exports.header = function (uri, method, options) {
                  '", ts="' + artifacts.ts +
                  '", nonce="' + artifacts.nonce +
                  (artifacts.hash ? '", hash="' + artifacts.hash : '') +
-                 (hasExt ? '", ext="' + Utils.escapeHeaderAttribute(artifacts.ext) : '') +
+                 (hasExt ? '", ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) : '') +
                  '", mac="' + mac + '"';
 
     if (artifacts.app) {
@@ -137,7 +137,7 @@ exports.header = function (uri, method, options) {
 
 /*
     res:        node's response object
-    artifacts:  object recieved from header().artifacts
+    artifacts:  object received from header().artifacts
     options: {
         payload:    optional payload received
         required:   specifies if a Server-Authorization header is required. Defaults to 'false'
@@ -189,7 +189,9 @@ exports.authenticate = function (res, credentials, artifacts, options) {
         return false;
     }
 
-    if (!options.hasOwnProperty('payload')) {
+    if (!options.payload &&
+        options.payload !== '') {
+
         return true;
     }
 
@@ -204,10 +206,6 @@ exports.authenticate = function (res, credentials, artifacts, options) {
 
 // Generate a bewit value for a given URI
 
-/*
- * credentials is an object with the following keys: 'id, 'key', 'algorithm'.
- * options is an object with the following optional keys: 'ext', 'localtimeOffsetMsec'
- */
 /*
     uri: 'http://example.com/resource?a=b' or object from Url.parse()
     options: {
@@ -245,7 +243,7 @@ exports.getBewit = function (uri, options) {
 
     // Application time
 
-    var now = Utils.now() + (options.localtimeOffsetMsec || 0);
+    var now = Utils.now(options.localtimeOffsetMsec);
 
     // Validate credentials
 
@@ -284,7 +282,7 @@ exports.getBewit = function (uri, options) {
     // Construct bewit: id\exp\mac\ext
 
     var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext;
-    return Utils.base64urlEncode(bewit);
+    return Hoek.base64urlEncode(bewit);
 };
 
 
@@ -326,7 +324,7 @@ exports.message = function (host, port, message, options) {
 
     // Application time
 
-    var timestamp = options.timestamp || Math.floor((Utils.now() + (options.localtimeOffsetMsec || 0)) / 1000)
+    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
 
     // Validate credentials
 
index 9825c7d88f790f897e34b5371d426b82e9669e01..d3c8244a9210a4a6734394a4b8e68c7fbda56595 100755 (executable)
@@ -54,11 +54,19 @@ exports.calculateMac = function (type, credentials, options) {
 
 exports.generateNormalizedString = function (type, options) {
 
+    var resource = options.resource || '';
+    if (resource &&
+        resource[0] !== '/') {
+
+        var url = Url.parse(resource, false);
+        resource = url.path;                        // Includes query
+    }
+
     var normalized = 'hawk.' + exports.headerVersion + '.' + type + '\n' +
                      options.ts + '\n' +
                      options.nonce + '\n' +
                      (options.method || '').toUpperCase() + '\n' +
-                     (options.resource || '') + '\n' +
+                     resource + '\n' +
                      options.host.toLowerCase() + '\n' +
                      options.port + '\n' +
                      (options.hash || '') + '\n';
@@ -112,7 +120,7 @@ exports.calculateTsMac = function (ts, credentials) {
 
 exports.timestampMessage = function (credentials, localtimeOffsetMsec) {
 
-    var now = Math.floor((Utils.now() + (localtimeOffsetMsec || 0)) / 1000);
+    var now = Utils.nowSecs(localtimeOffsetMsec);
     var tsm = exports.calculateTsMac(now, credentials);
     return { ts: now, tsm: tsm };
 };
index 59464ed024b1a6360b6e31a9007362760ca4f04b..a803930311d4db9d082fa5ecc7c0283458777fd1 100755 (executable)
@@ -84,7 +84,7 @@ var internals = {};
 
 exports.authenticate = function (req, credentialsFunc, options, callback) {
 
-    callback = Utils.nextTick(callback);
+    callback = Hoek.nextTick(callback);
     
     // Default options
 
@@ -93,7 +93,7 @@ exports.authenticate = function (req, credentialsFunc, options, callback) {
 
     // Application time
 
-    var now = Utils.now() + (options.localtimeOffsetMsec || 0);                 // Measure now before any other processing
+    var now = Utils.now(options.localtimeOffsetMsec);                           // Measure now before any other processing
 
     // Convert node Http request object to a request configuration object
 
@@ -167,8 +167,8 @@ exports.authenticate = function (req, credentialsFunc, options, callback) {
 
         // Check payload hash
 
-        if (options.payload !== null &&
-            options.payload !== undefined) {       // '' is valid
+        if (options.payload ||
+            options.payload === '') {
 
             if (!attributes.hash) {
                 return callback(Boom.unauthorized('Missing required payload hash', 'Hawk'), credentials, artifacts);
@@ -219,6 +219,19 @@ exports.authenticatePayload = function (payload, credentials, artifacts, content
 };
 
 
+// Authenticate payload hash - used when payload cannot be provided during authenticate()
+
+/*
+    calculatedHash: the payload hash calculated using Crypto.calculatePayloadHash()
+    artifacts:      from authenticate callback
+*/
+
+exports.authenticatePayloadHash = function (calculatedHash, artifacts) {
+
+    return Cryptiles.fixedTimeComparison(calculatedHash, artifacts.hash);
+};
+
+
 // Generate a Server-Authorization header for a given response
 
 /*
@@ -267,7 +280,7 @@ exports.header = function (credentials, artifacts, options) {
     // Calculate payload hash
 
     if (!artifacts.hash &&
-        options.hasOwnProperty('payload')) {
+        (options.payload || options.payload === '')) {
 
         artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
     }
@@ -283,7 +296,7 @@ exports.header = function (credentials, artifacts, options) {
         artifacts.ext !== undefined &&
         artifacts.ext !== '') {                       // Other falsey values allowed
 
-        header += ', ext="' + Utils.escapeHeaderAttribute(artifacts.ext) + '"';
+        header += ', ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) + '"';
     }
 
     return header;
@@ -297,11 +310,11 @@ exports.header = function (credentials, artifacts, options) {
 
 exports.authenticateBewit = function (req, credentialsFunc, options, callback) {
 
-    callback = Utils.nextTick(callback);
+    callback = Hoek.nextTick(callback);
 
     // Application time
 
-    var now = Utils.now() + (options.localtimeOffsetMsec || 0);
+    var now = Utils.now(options.localtimeOffsetMsec);
 
     // Convert node Http request object to a request configuration object
 
@@ -335,12 +348,12 @@ exports.authenticateBewit = function (req, credentialsFunc, options, callback) {
     // No other authentication
 
     if (request.authorization) {
-        return callback(Boom.badRequest('Multiple authentications', 'Hawk'));
+        return callback(Boom.badRequest('Multiple authentications'));
     }
 
     // Parse bewit
 
-    var bewitString = Utils.base64urlDecode(resource[3]);
+    var bewitString = Hoek.base64urlDecode(resource[3]);
     if (bewitString instanceof Error) {
         return callback(Boom.badRequest('Invalid bewit encoding'));
     }
@@ -348,9 +361,7 @@ exports.authenticateBewit = function (req, credentialsFunc, options, callback) {
     // Bewit format: id\exp\mac\ext ('\' is used because it is a reserved header attribute character)
 
     var bewitParts = bewitString.split('\\');
-    if (!bewitParts ||
-        bewitParts.length !== 4) {
-
+    if (bewitParts.length !== 4) {
         return callback(Boom.badRequest('Invalid bewit structure'));
     }
 
@@ -433,7 +444,7 @@ exports.authenticateBewit = function (req, credentialsFunc, options, callback) {
 
 exports.authenticateMessage = function (host, port, message, authorization, credentialsFunc, options, callback) {
 
-    callback = Utils.nextTick(callback);
+    callback = Hoek.nextTick(callback);
     
     // Default options
 
@@ -442,7 +453,7 @@ exports.authenticateMessage = function (host, port, message, authorization, cred
 
     // Application time
 
-    var now = Utils.now() + (options.localtimeOffsetMsec || 0);                 // Measure now before any other processing
+    var now = Utils.now(options.localtimeOffsetMsec);                       // Measure now before any other processing
 
     // Validate authorization
     
index c8938fe82914a2ec0d1e1554d2019c2c492ef278..de74606f33468dc41852295645f1da4e77658aa2 100755 (executable)
@@ -1,6 +1,5 @@
 // Load modules
 
-var Hoek = require('hoek');
 var Sntp = require('sntp');
 var Boom = require('boom');
 
@@ -10,30 +9,18 @@ var Boom = require('boom');
 var internals = {};
 
 
-// Import Hoek Utilities
-
-internals.import = function () {
-
-    for (var i in Hoek) {
-        if (Hoek.hasOwnProperty(i)) {
-            exports[i] = Hoek[i];
-        }
-    }
-};
-
-internals.import();
-
-
-// Hawk version
-
 exports.version = function () {
 
-    return exports.loadPackage(__dirname + '/..').version;
+    return require('../package.json').version;
 };
 
 
 // Extract host and port from request
 
+//                                            $1                            $2
+internals.hostHeaderRegex = /^(?:(?:\r\n)?\s)*((?:[^:]+)|(?:\[[^\]]+\]))(?::(\d+))?(?:(?:\r\n)?\s)*$/;              // (IPv4, hostname)|(IPv6)
+
+
 exports.parseHost = function (req, hostHeaderName) {
 
     hostHeaderName = (hostHeaderName ? hostHeaderName.toLowerCase() : 'host');
@@ -42,20 +29,8 @@ exports.parseHost = function (req, hostHeaderName) {
         return null;
     }
 
-    var hostHeaderRegex;
-    if (hostHeader[0] === '[') {
-        hostHeaderRegex = /^(?:(?:\r\n)?\s)*(\[[^\]]+\])(?::(\d+))?(?:(?:\r\n)?\s)*$/;      // IPv6
-    }
-    else {
-        hostHeaderRegex = /^(?:(?:\r\n)?\s)*([^:]+)(?::(\d+))?(?:(?:\r\n)?\s)*$/;           // IPv4, hostname
-    }
-    
-    var hostParts = hostHeader.match(hostHeaderRegex);
-
-    if (!hostParts ||
-        hostParts.length !== 3 ||
-        !hostParts[1]) {
-
+    var hostParts = hostHeader.match(internals.hostHeaderRegex);
+    if (!hostParts) {
         return null;
     }
 
@@ -108,9 +83,15 @@ exports.parseRequest = function (req, options) {
 };
 
 
-exports.now = function () {
+exports.now = function (localtimeOffsetMsec) {
+
+    return Sntp.now() + (localtimeOffsetMsec || 0);
+};
+
+
+exports.nowSecs = function (localtimeOffsetMsec) {
 
-    return Sntp.now();
+    return Math.floor(exports.now(localtimeOffsetMsec) / 1000);
 };
 
 
diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md b/deps/npm/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..8928361
--- /dev/null
@@ -0,0 +1 @@
+Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md).
index 911b97ee67b8fdb06abed7f4febba46b7452d956..394688939d321d27d2e787a86ea4d17263348a37 100755 (executable)
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2013, Walmart.
+Copyright (c) 2012-2014, Walmart and other contributors.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -8,17 +8,21 @@ modification, are permitted provided that the following conditions are met:
     * 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.
-    * Neither the name of Walmart nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
+    * The names of any contributors may not be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 WALMART BE LIABLE FOR ANY
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND 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.
+
+                                  *   *   *
+
+The complete list of contributors can be found at: https://github.com/hapijs/boom/graphs/contributors
\ No newline at end of file
index 884ec6db159e9b72a99602b668b2e28fcb890949..07a7f67126922cc4b862c90f7ffb8d3d5d60d029 100755 (executable)
@@ -1,11 +1,9 @@
 test:
-       @node node_modules/lab/bin/lab
-test-cov: 
-       @node node_modules/lab/bin/lab -r threshold -t 100
+       @node node_modules/lab/bin/lab -a code
+test-cov:
+       @node node_modules/lab/bin/lab -a code -t 100
 test-cov-html:
-       @node node_modules/lab/bin/lab -r html -o coverage.html
-complexity:
-       @node node_modules/complexity-report/src/cli.js -o complexity.md -f markdown lib
+       @node node_modules/lab/bin/lab -a code -r html -o coverage.html
 
-.PHONY: test test-cov test-cov-html complexity
+.PHONY: test test-cov test-cov-html
 
index 1970b1c4251c3cd97c7c9bd8c0967d1777c9e233..c6ada264aad9a310ab7685f208cfd0f1bea9f8fd 100755 (executable)
@@ -1,6 +1,575 @@
-<a href="https://github.com/spumko"><img src="https://raw.github.com/spumko/spumko/master/images/from.png" align="right" /></a>
-![boom Logo](https://raw.github.com/spumko/boom/master/images/boom.png)
+![boom Logo](https://raw.github.com/hapijs/boom/master/images/boom.png)
 
 HTTP-friendly error objects
 
-[![Build Status](https://secure.travis-ci.org/spumko/boom.png)](http://travis-ci.org/spumko/boom)
+[![Build Status](https://secure.travis-ci.org/hapijs/boom.png)](http://travis-ci.org/hapijs/boom)
+
+Lead Maintainer: [Adam Bretz](https://github.com/arb)
+
+**boom** provides a set of utilities for returning HTTP errors. Each utility returns a `Boom` error response
+object (instance of `Error`) which includes the following properties:
+- `isBoom` - if `true`, indicates this is a `Boom` object instance.
+- `message` - the error message.
+- `output` - the formatted response. Can be directly manipulated after object construction to return a custom
+  error response. Allowed root keys:
+    - `statusCode` - the HTTP status code (typically 4xx or 5xx).
+    - `headers` - an object containing any HTTP headers where each key is a header name and value is the header content.
+    - `payload` - the formatted object used as the response payload (stringified). Can be directly manipulated but any
+      changes will be lost
+      if `reformat()` is called. Any content allowed and by default includes the following content:
+        - `statusCode` - the HTTP status code, derived from `error.output.statusCode`.
+        - `error` - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived from `statusCode`.
+        - `message` - the error message derived from `error.message`.
+- inherited `Error` properties.
+
+The `Boom` object also supports the following method:
+- `reformat()` - rebuilds `error.output` using the other object properties.
+
+## Helper Methods
+
+### `wrap(error, [statusCode], [message])`
+
+Decorates an error with the **boom** properties where:
+- `error` - the error object to wrap. If `error` is already a **boom** object, returns back the same object.
+- `statusCode` - optional HTTP status code. Defaults to `500`.
+- `message` - optional message string. If the error already has a message, it adds the message as a prefix.
+  Defaults to no message.
+
+```js
+var error = new Error('Unexpected input');
+Boom.wrap(error, 400);
+```
+
+### `create(statusCode, [message], [data])`
+
+Generates an `Error` object with the **boom** decorations where:
+- `statusCode` - an HTTP error code number. Must be greater or equal 400.
+- `message` - optional message string.
+- `data` - additional error data set to `error.data` property.
+
+```js
+var error = Boom.create(400, 'Bad request', { timestamp: Date.now() });
+```
+
+## HTTP 4xx Errors
+
+### `Boom.badRequest([message], [data])`
+
+Returns a 400 Bad Request error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.badRequest('invalid query');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 400,
+    "error": "Bad Request",
+    "message": "invalid query"
+}
+```
+
+### `Boom.unauthorized([message], [scheme], [attributes])`
+
+Returns a 401 Unauthorized error where:
+- `message` - optional message.
+- `scheme` can be one of the following:
+  - an authentication scheme name
+  - an array of string values. These values will be separated by ', ' and set to the 'WWW-Authenticate' header.
+- `attributes` - an object of values to use while setting the 'WWW-Authenticate' header. This value is only used when `schema` is a string, otherwise it is ignored. Every key/value pair will be included in the 'WWW-Authenticate' in the format of 'key="value"'. `null` and `undefined` will be replaced with an empty string. If `attributes` is set, `message` will be used as the 'error' segment of the 'WWW-Authenticate' header. If `message` is unset, the 'error' segment of the header will not be present and `isMissing` will be true on the error object.
+
+If either `scheme` or `attributes` are set, the resultant `Boom` object will have the 'WWW-Authenticate' header set for the response.
+
+```js
+Boom.unauthorized('invalid password');
+```
+
+Generates the following response:
+
+```json
+"payload": {
+    "statusCode": 401,
+    "error": "Unauthorized",
+    "message": "invalid password"
+},
+"headers" {}
+```
+
+```js
+Boom.unauthorized('invalid password', 'sample');
+```
+
+Generates the following response:
+
+```json
+"payload": {
+    "statusCode": 401,
+    "error": "Unauthorized",
+    "message": "invalid password"
+},
+"headers" {
+  "WWW-Authenticate": "sample error=\"invalid password\""
+}
+```
+
+```js
+Boom.unauthorized('invalid password', 'sample', { ttl: 0, cache: null, foo: 'bar' });
+```
+
+Generates the following response:
+
+```json
+"payload": {
+    "statusCode": 401,
+    "error": "Unauthorized",
+    "message": "invalid password"
+},
+"headers" {
+  "WWW-Authenticate": "sample ttl=\"0\", cache=\"\", foo=\"bar\", error=\"invalid password\""
+}
+```
+
+### `Boom.forbidden([message], [data])`
+
+Returns a 403 Forbidden error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.forbidden('try again some time');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 403,
+    "error": "Forbidden",
+    "message": "try again some time"
+}
+```
+
+### `Boom.notFound([message], [data])`
+
+Returns a 404 Not Found error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.notFound('missing');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 404,
+    "error": "Not Found",
+    "message": "missing"
+}
+```
+
+### `Boom.methodNotAllowed([message], [data])`
+
+Returns a 405 Method Not Allowed error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.methodNotAllowed('that method is not allowed');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 405,
+    "error": "Method Not Allowed",
+    "message": "that method is not allowed"
+}
+```
+
+### `Boom.notAcceptable([message], [data])`
+
+Returns a 406 Not Acceptable error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.notAcceptable('unacceptable');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 406,
+    "error": "Not Acceptable",
+    "message": "unacceptable"
+}
+```
+
+### `Boom.proxyAuthRequired([message], [data])`
+
+Returns a 407 Proxy Authentication Required error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.proxyAuthRequired('auth missing');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 407,
+    "error": "Proxy Authentication Required",
+    "message": "auth missing"
+}
+```
+
+### `Boom.clientTimeout([message], [data])`
+
+Returns a 408 Request Time-out error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.clientTimeout('timed out');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 408,
+    "error": "Request Time-out",
+    "message": "timed out"
+}
+```
+
+### `Boom.conflict([message], [data])`
+
+Returns a 409 Conflict error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.conflict('there was a conflict');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 409,
+    "error": "Conflict",
+    "message": "there was a conflict"
+}
+```
+
+### `Boom.resourceGone([message], [data])`
+
+Returns a 410 Gone error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.resourceGone('it is gone');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 410,
+    "error": "Gone",
+    "message": "it is gone"
+}
+```
+
+### `Boom.lengthRequired([message], [data])`
+
+Returns a 411 Length Required error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.lengthRequired('length needed');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 411,
+    "error": "Length Required",
+    "message": "length needed"
+}
+```
+
+### `Boom.preconditionFailed([message], [data])`
+
+Returns a 412 Precondition Failed error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.preconditionFailed();
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 412,
+    "error": "Precondition Failed"
+}
+```
+
+### `Boom.entityTooLarge([message], [data])`
+
+Returns a 413 Request Entity Too Large error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.entityTooLarge('too big');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 413,
+    "error": "Request Entity Too Large",
+    "message": "too big"
+}
+```
+
+### `Boom.uriTooLong([message], [data])`
+
+Returns a 414 Request-URI Too Large error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.uriTooLong('uri is too long');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 414,
+    "error": "Request-URI Too Large",
+    "message": "uri is too long"
+}
+```
+
+### `Boom.unsupportedMediaType([message], [data])`
+
+Returns a 415 Unsupported Media Type error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.unsupportedMediaType('that media is not supported');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 415,
+    "error": "Unsupported Media Type",
+    "message": "that media is not supported"
+}
+```
+
+### `Boom.rangeNotSatisfiable([message], [data])`
+
+Returns a 416 Requested Range Not Satisfiable error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.rangeNotSatisfiable();
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 416,
+    "error": "Requested Range Not Satisfiable"
+}
+```
+
+### `Boom.expectationFailed([message], [data])`
+
+Returns a 417 Expectation Failed error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.expectationFailed('expected this to work');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 417,
+    "error": "Expectation Failed",
+    "message": "expected this to work"
+}
+```
+
+### `Boom.badData([message], [data])`
+
+Returns a 422 Unprocessable Entity error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.badData('your data is bad and you should feel bad');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 422,
+    "error": "Unprocessable Entity",
+    "message": "your data is bad and you should feel bad"
+}
+```
+
+### `Boom.tooManyRequests([message], [data])`
+
+Returns a 422 Too Many Requests error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.tooManyRequests('you have exceeded your request limit');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 429,
+    "error": "Too Many Requests",
+    "message": "you have exceeded your request limit"
+}
+```
+
+## HTTP 5xx Errors
+
+All 500 errors hide your message from the end user. Your message is recorded in the server log.
+
+### `Boom.notImplemented([message], [data])`
+
+Returns a 501 Not Implemented error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.notImplemented('method not implemented');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 501,
+    "error": "Not Implemented",
+    "message": "method not implemented"
+}
+```
+
+### `Boom.badGateway([message], [data])`
+
+Returns a 502 Bad Gateway error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.badGateway('that is a bad gateway');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 502,
+    "error": "Bad Gateway",
+    "message": "that is a bad gateway"
+}
+```
+
+### `Boom.serverTimeout([message], [data])`
+
+Returns a 503 Service Unavailable error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.serverTimeout('unavailable');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 503,
+    "error": "Service Unavailable",
+    "message": "unavailable"
+}
+```
+
+### `Boom.gatewayTimeout([message], [data])`
+
+Returns a 504 Gateway Time-out error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.gatewayTimeout();
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 504,
+    "error": "Gateway Time-out"
+}
+```
+
+### `Boom.badImplementation([message], [data])`
+
+Returns a 500 Internal Server Error error where:
+- `message` - optional message.
+- `data` - optional additional error data.
+
+```js
+Boom.badImplementation('terrible implementation');
+```
+
+Generates the following response payload:
+
+```json
+{
+    "statusCode": 500,
+    "error": "Internal Server Error",
+    "message": "An internal server error occurred"
+}
+```
index 0bbeed95091050f07e4bacf837e6575f92397a36..e791a5d0378156b8daf547ec0212e9e02cde4a26 100755 (executable)
@@ -1,7 +1,6 @@
 // Load modules
 
 var Http = require('http');
-var NodeUtil = require('util');
 var Hoek = require('hoek');
 
 
@@ -10,86 +9,88 @@ var Hoek = require('hoek');
 var internals = {};
 
 
-exports = module.exports = internals.Boom = function (/* (new Error) or (code, message) */) {
+exports.wrap = function (error, statusCode, message) {
 
-    var self = this;
+    Hoek.assert(error instanceof Error, 'Cannot wrap non-Error object');
+    return (error.isBoom ? error : internals.initialize(error, statusCode || 500, message));
+};
 
-    Hoek.assert(this.constructor === internals.Boom, 'Error must be instantiated using new');
 
-    Error.call(this);
-    this.isBoom = true;
+exports.create = function (statusCode, message, data) {
 
-    this.response = {
-        code: 0,
-        payload: {},
-        headers: {}
-        // type: 'content-type'
-    };
+    var error = new Error(message ? message : undefined);       // Avoids settings null message
+    error.data = data || null;
+    internals.initialize(error, statusCode);
+    return error;
+};
 
-    if (arguments[0] instanceof Error) {
 
-        // Error
+internals.initialize = function (error, statusCode, message) {
 
-        var error = arguments[0];
+    Hoek.assert(!isNaN(parseFloat(statusCode)) && isFinite(statusCode) && statusCode >= 400, 'First argument must be a number (400+):', statusCode);
 
-        this.data = error;
-        this.response.code = error.code || 500;
-        if (error.message) {
-            this.message = error.message;
-        }
+    error.isBoom = true;
+
+    if (!error.hasOwnProperty('data')) {
+        error.data = null;
     }
-    else {
 
-        // code, message
+    error.output = {
+        statusCode: statusCode,
+        payload: {},
+        headers: {}
+    };
 
-        var code = arguments[0];
-        var message = arguments[1];
+    error.reformat = internals.reformat;
+    error.reformat();
 
-        Hoek.assert(!isNaN(parseFloat(code)) && isFinite(code) && code >= 400, 'First argument must be a number (400+)');
+    if (!message &&
+        !error.message) {
 
-        this.response.code = code;
-        if (message) {
-            this.message = message;
-        }
+        message = error.output.payload.error;
     }
 
-    // Response format
-
-    this.reformat();
+    if (message) {
+        error.message = (message + (error.message ? ': ' + error.message : ''));
+    }
 
-    return this;
+    return error;
 };
 
-NodeUtil.inherits(internals.Boom, Error);
 
+internals.reformat = function () {
 
-internals.Boom.prototype.reformat = function () {
+    this.output.payload.statusCode = this.output.statusCode;
+    this.output.payload.error = Http.STATUS_CODES[this.output.statusCode] || 'Unknown';
 
-    this.response.payload.code = this.response.code;
-    this.response.payload.error = Http.STATUS_CODES[this.response.code] || 'Unknown';
-    if (this.message) {
-        this.response.payload.message = Hoek.escapeHtml(this.message);         // Prevent XSS from error message
+    if (this.output.statusCode === 500) {
+        this.output.payload.message = 'An internal server error occurred';              // Hide actual error from user
+    }
+    else if (this.message) {
+        this.output.payload.message = this.message;
     }
 };
 
 
-// Utilities
+// 4xx Client Errors
 
-internals.Boom.badRequest = function (message) {
+exports.badRequest = function (message, data) {
 
-    return new internals.Boom(400, message);
+    return exports.create(400, message, data);
 };
 
 
-internals.Boom.unauthorized = function (message, scheme, attributes) {          // Or function (message, wwwAuthenticate[])
+exports.unauthorized = function (message, scheme, attributes) {          // Or function (message, wwwAuthenticate[])
 
-    var err = new internals.Boom(401, message);
+    var err = exports.create(401, message);
 
     if (!scheme) {
         return err;
     }
 
     var wwwAuthenticate = '';
+    var i = 0;
+    var il = 0;
 
     if (typeof scheme === 'string') {
 
@@ -98,7 +99,7 @@ internals.Boom.unauthorized = function (message, scheme, attributes) {
         wwwAuthenticate = scheme;
         if (attributes) {
             var names = Object.keys(attributes);
-            for (var i = 0, il = names.length; i < il; ++i) {
+            for (i = 0, il = names.length; i < il; ++i) {
                 if (i) {
                     wwwAuthenticate += ',';
                 }
@@ -128,7 +129,7 @@ internals.Boom.unauthorized = function (message, scheme, attributes) {
         // function (message, wwwAuthenticate[])
 
         var wwwArray = scheme;
-        for (var i = 0, il = wwwArray.length; i < il; ++i) {
+        for (i = 0, il = wwwArray.length; i < il; ++i) {
             if (i) {
                 wwwAuthenticate += ', ';
             }
@@ -137,71 +138,154 @@ internals.Boom.unauthorized = function (message, scheme, attributes) {
         }
     }
 
-    err.response.headers['WWW-Authenticate'] = wwwAuthenticate;
+    err.output.headers['WWW-Authenticate'] = wwwAuthenticate;
 
     return err;
 };
 
 
-internals.Boom.clientTimeout = function (message) {
+exports.forbidden = function (message, data) {
 
-    return new internals.Boom(408, message);
+    return exports.create(403, message, data);
 };
 
 
-internals.Boom.serverTimeout = function (message) {
+exports.notFound = function (message, data) {
 
-    return new internals.Boom(503, message);
+    return exports.create(404, message, data);
 };
 
 
-internals.Boom.forbidden = function (message) {
+exports.methodNotAllowed = function (message, data) {
 
-    return new internals.Boom(403, message);
+    return exports.create(405, message, data);
 };
 
 
-internals.Boom.notFound = function (message) {
+exports.notAcceptable = function (message, data) {
 
-    return new internals.Boom(404, message);
+    return exports.create(406, message, data);
 };
 
 
-internals.Boom.internal = function (message, data) {
+exports.proxyAuthRequired = function (message, data) {
 
-    var err = new internals.Boom(500, message);
+    return exports.create(407, message, data);
+};
 
-    if (data && data.stack) {
-        err.trace = data.stack.split('\n');
-        err.outterTrace = Hoek.displayStack(1);
-    }
-    else {
-        err.trace = Hoek.displayStack(1);
+
+exports.clientTimeout = function (message, data) {
+
+    return exports.create(408, message, data);
+};
+
+
+exports.conflict = function (message, data) {
+
+    return exports.create(409, message, data);
+};
+
+
+exports.resourceGone = function (message, data) {
+
+    return exports.create(410, message, data);
+};
+
+
+exports.lengthRequired = function (message, data) {
+
+    return exports.create(411, message, data);
+};
+
+
+exports.preconditionFailed = function (message, data) {
+
+    return exports.create(412, message, data);
+};
+
+
+exports.entityTooLarge = function (message, data) {
+
+    return exports.create(413, message, data);
+};
+
+
+exports.uriTooLong = function (message, data) {
+
+    return exports.create(414, message, data);
+};
+
+
+exports.unsupportedMediaType = function (message, data) {
+
+    return exports.create(415, message, data);
+};
+
+
+exports.rangeNotSatisfiable = function (message, data) {
+
+    return exports.create(416, message, data);
+};
+
+
+exports.expectationFailed = function (message, data) {
+
+    return exports.create(417, message, data);
+};
+
+exports.badData = function (message, data) {
+
+    return exports.create(422, message, data);
+};
+
+
+exports.tooManyRequests = function (message, data) {
+
+    return exports.create(429, message, data);
+};
+
+
+// 5xx Server Errors
+
+exports.internal = function (message, data, statusCode) {
+
+    var error = (data instanceof Error ? exports.wrap(data, statusCode, message) : exports.create(statusCode || 500, message));
+
+    if (data instanceof Error === false) {
+        error.data = data;
     }
 
-    err.data = data;
-    err.response.payload.message = 'An internal server error occurred';                     // Hide actual error from user
+    return error;
+};
 
-    return err;
+
+exports.notImplemented = function (message, data) {
+
+    return exports.internal(message, data, 501);
 };
 
 
-internals.Boom.passThrough = function (code, payload, contentType, headers) {
+exports.badGateway = function (message, data) {
 
-    var err = new internals.Boom(500, 'Pass-through');                                      // 500 code is only used to initialize
+    return exports.internal(message, data, 502);
+};
 
-    err.data = {
-        code: code,
-        payload: payload,
-        type: contentType
-    };
 
-    err.response.code = code;
-    err.response.type = contentType;
-    err.response.headers = headers;
-    err.response.payload = payload;
+exports.serverTimeout = function (message, data) {
 
-    return err;
+    return exports.internal(message, data, 503);
+};
+
+
+exports.gatewayTimeout = function (message, data) {
+
+    return exports.internal(message, data, 504);
 };
 
 
+exports.badImplementation = function (message, data) {
+
+    var err = exports.internal(message, data, 500);
+    err.isDeveloperError = true;
+    return err;
+};
index c7875b4cbb21bb9d08093f856a9209ed83bab0cb..c5f765de26200d589997bbfa91a450123d5a4b84 100755 (executable)
@@ -1,16 +1,10 @@
 {
   "name": "boom",
   "description": "HTTP-friendly error objects",
-  "version": "0.4.2",
-  "author": {
-    "name": "Eran Hammer",
-    "email": "eran@hueniverse.com",
-    "url": "http://hueniverse.com"
-  },
-  "contributors": [],
+  "version": "2.6.1",
   "repository": {
     "type": "git",
-    "url": "git://github.com/spumko/boom"
+    "url": "git://github.com/hapijs/boom"
   },
   "main": "index",
   "keywords": [
     "node": ">=0.8.0"
   },
   "dependencies": {
-    "hoek": "0.9.x"
+    "hoek": "2.x.x"
   },
   "devDependencies": {
-    "lab": "0.1.x",
-    "complexity-report": "0.x.x"
+    "code": "1.x.x",
+    "lab": "5.x.x"
   },
   "scripts": {
     "test": "make test-cov"
   "licenses": [
     {
       "type": "BSD",
-      "url": "http://github.com/spumko/boom/raw/master/LICENSE"
+      "url": "http://github.com/hapijs/boom/raw/master/LICENSE"
     }
   ],
-  "_id": "boom@0.4.2",
-  "dist": {
-    "shasum": "7a636e9ded4efcefb19cef4947a3c67dfaee911b",
-    "tarball": "http://registry.npmjs.org/boom/-/boom-0.4.2.tgz"
+  "gitHead": "860d6f8b0db89b263418b8575c65560482cbd1ba",
+  "bugs": {
+    "url": "https://github.com/hapijs/boom/issues"
   },
-  "_from": "boom@>=0.4.0 <0.5.0",
-  "_npmVersion": "1.2.18",
+  "homepage": "https://github.com/hapijs/boom",
+  "_id": "boom@2.6.1",
+  "_shasum": "4dc8ef9b6dfad9c43bbbfbe71fa4c21419f22753",
+  "_from": "boom@>=2.0.0 <3.0.0",
+  "_npmVersion": "1.4.28",
   "_npmUser": {
     "name": "hueniverse",
     "email": "eran@hueniverse.com"
     {
       "name": "hueniverse",
       "email": "eran@hueniverse.com"
+    },
+    {
+      "name": "wyatt",
+      "email": "wpreul@gmail.com"
+    },
+    {
+      "name": "arb",
+      "email": "arbretz@gmail.com"
     }
   ],
-  "directories": {},
-  "_shasum": "7a636e9ded4efcefb19cef4947a3c67dfaee911b",
-  "_resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
-  "bugs": {
-    "url": "https://github.com/spumko/boom/issues"
+  "dist": {
+    "shasum": "4dc8ef9b6dfad9c43bbbfbe71fa4c21419f22753",
+    "tarball": "http://registry.npmjs.org/boom/-/boom-2.6.1.tgz"
   },
-  "readme": "ERROR: No README data found!",
-  "homepage": "https://github.com/spumko/boom"
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/boom/-/boom-2.6.1.tgz",
+  "readme": "ERROR: No README data found!"
 }
index a20c1c345a5bd9f4ec8fd574ae925adc6bbde7d4..68ae4172c9d5448835ecb895c23af67e37d8ea8f 100755 (executable)
@@ -1,7 +1,9 @@
 // Load modules
 
-var Lab = require('lab');
+var Util = require('util');
+var Code = require('code');
 var Boom = require('../lib');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -11,235 +13,580 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.describe;
+var it = lab.it;
+var expect = Code.expect;
+
+
+it('returns the same object when already boom', function (done) {
+
+    var error = Boom.badRequest();
+    var wrapped = Boom.wrap(error);
+    expect(error).to.equal(wrapped);
+    done();
+});
 
+it('returns an error with info when constructed using another error', function (done) {
+
+    var error = new Error('ka-boom');
+    error.xyz = 123;
+    var err = Boom.wrap(error);
+    expect(err.xyz).to.equal(123);
+    expect(err.message).to.equal('ka-boom');
+    expect(err.output).to.deep.equal({
+        statusCode: 500,
+        payload: {
+            statusCode: 500,
+            error: 'Internal Server Error',
+            message: 'An internal server error occurred'
+        },
+        headers: {}
+    });
+    expect(err.data).to.equal(null);
+    done();
+});
 
-describe('Boom', function () {
+it('does not override data when constructed using another error', function (done) {
+
+    var error = new Error('ka-boom');
+    error.data = { useful: 'data' };
+    var err = Boom.wrap(error);
+    expect(err.data).to.equal(error.data);
+    done();
+});
 
-    it('returns an error with info when constructed using another error', function (done) {
+it('sets new message when none exists', function (done) {
 
-        var error = new Error('ka-boom');
-        error.xyz = 123;
-        var err = new Boom(error);
-        expect(err.data.xyz).to.equal(123);
-        expect(err.message).to.equal('ka-boom');
-        expect(err.response).to.deep.equal({
-            code: 500,
-            payload: {
-                code: 500,
-                error: 'Internal Server Error',
-                message: 'ka-boom'
-            },
-            headers: {}
-        });
+    var error = new Error();
+    var wrapped = Boom.wrap(error, 400, 'something bad');
+    expect(wrapped.message).to.equal('something bad');
+    done();
+});
+
+it('throws when statusCode is not a number', function (done) {
+
+    expect(function () {
+
+        Boom.create('x');
+    }).to.throw('First argument must be a number (400+): x');
+    done();
+});
+
+it('throws when statusCode is not finite', function (done) {
+
+    expect(function () {
+
+        Boom.create(1 / 0);
+    }).to.throw('First argument must be a number (400+): null');
+    done();
+});
+
+it('sets error code to unknown', function (done) {
+
+    var err = Boom.create(999);
+    expect(err.output.payload.error).to.equal('Unknown');
+    done();
+});
+
+describe('create()', function () {
+
+    it('does not sets null message', function (done) {
+
+        var error = Boom.unauthorized(null);
+        expect(error.output.payload.message).to.not.exist();
         done();
     });
 
-    describe('#isBoom', function () {
+    it('sets message and data', function (done) {
 
-        it('returns true for Boom object', function (done) {
+        var error = Boom.badRequest('Missing data', { type: 'user' });
+        expect(error.data.type).to.equal('user');
+        expect(error.output.payload.message).to.equal('Missing data');
+        done();
+    });
+});
 
-            expect(Boom.badRequest().isBoom).to.equal(true);
-            done();
-        });
+describe('isBoom()', function () {
 
-        it('returns false for Error object', function (done) {
+    it('returns true for Boom object', function (done) {
 
-            expect(new Error().isBoom).to.not.exist;
-            done();
-        });
+        expect(Boom.badRequest().isBoom).to.equal(true);
+        done();
     });
 
-    describe('#badRequest', function () {
+    it('returns false for Error object', function (done) {
 
-        it('returns a 400 error code', function (done) {
+        expect((new Error()).isBoom).to.not.exist();
+        done();
+    });
+});
 
-            expect(Boom.badRequest().response.code).to.equal(400);
-            done();
-        });
+describe('badRequest()', function () {
 
-        it('sets the message with the passed in message', function (done) {
+    it('returns a 400 error statusCode', function (done) {
 
-            expect(Boom.badRequest('my message').message).to.equal('my message');
-            done();
-        });
+        expect(Boom.badRequest().output.statusCode).to.equal(400);
+        done();
     });
 
-    describe('#unauthorized', function () {
+    it('sets the message with the passed in message', function (done) {
 
-        it('returns a 401 error code', function (done) {
+        expect(Boom.badRequest('my message').message).to.equal('my message');
+        done();
+    });
 
-            var err = Boom.unauthorized();
-            expect(err.response.code).to.equal(401);
-            expect(err.response.headers).to.deep.equal({});
-            done();
-        });
+    it('sets the message to HTTP status if none provided', function (done) {
 
-        it('sets the message with the passed in message', function (done) {
+        expect(Boom.badRequest().message).to.equal('Bad Request');
+        done();
+    });
+});
 
-            expect(Boom.unauthorized('my message').message).to.equal('my message');
-            done();
-        });
+describe('unauthorized()', function () {
 
-        it('returns a WWW-Authenticate header when passed a scheme', function (done) {
+    it('returns a 401 error statusCode', function (done) {
 
-            var err = Boom.unauthorized('boom', 'Test');
-            expect(err.response.code).to.equal(401);
-            expect(err.response.headers['WWW-Authenticate']).to.equal('Test error="boom"');
-            done();
-        });
+        var err = Boom.unauthorized();
+        expect(err.output.statusCode).to.equal(401);
+        expect(err.output.headers).to.deep.equal({});
+        done();
+    });
 
-        it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) {
+    it('sets the message with the passed in message', function (done) {
 
-            var err = Boom.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 });
-            expect(err.response.code).to.equal(401);
-            expect(err.response.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"');
-            done();
-        });
+        expect(Boom.unauthorized('my message').message).to.equal('my message');
+        done();
+    });
 
-        it('sets the isMissing flag when error message is empty', function (done) {
+    it('returns a WWW-Authenticate header when passed a scheme', function (done) {
 
-            var err = Boom.unauthorized('', 'Basic');
-            expect(err.isMissing).to.equal(true);
-            done();
-        });
+        var err = Boom.unauthorized('boom', 'Test');
+        expect(err.output.statusCode).to.equal(401);
+        expect(err.output.headers['WWW-Authenticate']).to.equal('Test error="boom"');
+        done();
+    });
 
-        it('does not set the isMissing flag when error message is not empty', function (done) {
+    it('returns a WWW-Authenticate header set to the schema array value', function (done) {
 
-            var err = Boom.unauthorized('message', 'Basic');
-            expect(err.isMissing).to.equal(undefined);
-            done();
-        });
+        var err = Boom.unauthorized(null, ['Test','one','two']);
+        expect(err.output.statusCode).to.equal(401);
+        expect(err.output.headers['WWW-Authenticate']).to.equal('Test, one, two');
+        done();
+    });
 
-        it('sets a WWW-Authenticate when passed as an array', function (done) {
+    it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) {
 
-            var err = Boom.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']);
-            expect(err.response.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"');
-            done();
-        });
+        var err = Boom.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 });
+        expect(err.output.statusCode).to.equal(401);
+        expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"');
+        done();
     });
 
-    describe('#clientTimeout', function () {
+    it('returns a WWW-Authenticate header when passed attributes, missing error', function (done) {
 
-        it('returns a 408 error code', function (done) {
+        var err = Boom.unauthorized(null, 'Test', { a: 1, b: 'something', c: null, d: 0 });
+        expect(err.output.statusCode).to.equal(401);
+        expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0"');
+        expect(err.isMissing).to.equal(true);
+        done();
+    });
 
-            expect(Boom.clientTimeout().response.code).to.equal(408);
-            done();
-        });
+    it('sets the isMissing flag when error message is empty', function (done) {
 
-        it('sets the message with the passed in message', function (done) {
+        var err = Boom.unauthorized('', 'Basic');
+        expect(err.isMissing).to.equal(true);
+        done();
+    });
 
-            expect(Boom.clientTimeout('my message').message).to.equal('my message');
-            done();
-        });
+    it('does not set the isMissing flag when error message is not empty', function (done) {
+
+        var err = Boom.unauthorized('message', 'Basic');
+        expect(err.isMissing).to.equal(undefined);
+        done();
     });
 
-    describe('#serverTimeout', function () {
+    it('sets a WWW-Authenticate when passed as an array', function (done) {
 
-        it('returns a 503 error code', function (done) {
+        var err = Boom.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']);
+        expect(err.output.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"');
+        done();
+    });
+});
 
-            expect(Boom.serverTimeout().response.code).to.equal(503);
-            done();
-        });
 
-        it('sets the message with the passed in message', function (done) {
+describe('methodNotAllowed()', function () {
 
-            expect(Boom.serverTimeout('my message').message).to.equal('my message');
-            done();
-        });
+    it('returns a 405 error statusCode', function (done) {
+
+        expect(Boom.methodNotAllowed().output.statusCode).to.equal(405);
+        done();
     });
 
-    describe('#forbidden', function () {
+    it('sets the message with the passed in message', function (done) {
 
-        it('returns a 403 error code', function (done) {
+        expect(Boom.methodNotAllowed('my message').message).to.equal('my message');
+        done();
+    });
+});
 
-            expect(Boom.forbidden().response.code).to.equal(403);
-            done();
-        });
 
-        it('sets the message with the passed in message', function (done) {
+describe('notAcceptable()', function () {
 
-            expect(Boom.forbidden('my message').message).to.equal('my message');
-            done();
-        });
+    it('returns a 406 error statusCode', function (done) {
+
+        expect(Boom.notAcceptable().output.statusCode).to.equal(406);
+        done();
     });
 
-    describe('#notFound', function () {
+    it('sets the message with the passed in message', function (done) {
 
-        it('returns a 404 error code', function (done) {
+        expect(Boom.notAcceptable('my message').message).to.equal('my message');
+        done();
+    });
+});
 
-            expect(Boom.notFound().response.code).to.equal(404);
-            done();
-        });
 
-        it('sets the message with the passed in message', function (done) {
+describe('proxyAuthRequired()', function () {
 
-            expect(Boom.notFound('my message').message).to.equal('my message');
-            done();
-        });
+    it('returns a 407 error statusCode', function (done) {
+
+        expect(Boom.proxyAuthRequired().output.statusCode).to.equal(407);
+        done();
     });
 
-    describe('#internal', function () {
+    it('sets the message with the passed in message', function (done) {
 
-        it('returns a 500 error code', function (done) {
+        expect(Boom.proxyAuthRequired('my message').message).to.equal('my message');
+        done();
+    });
+});
 
-            expect(Boom.internal().response.code).to.equal(500);
-            done();
-        });
 
-        it('sets the message with the passed in message', function (done) {
+describe('clientTimeout()', function () {
 
-            var err = Boom.internal('my message');
-            expect(err.message).to.equal('my message');
-            expect(err.response.payload.message).to.equal('An internal server error occurred');
-            done();
-        });
+    it('returns a 408 error statusCode', function (done) {
 
-        it('passes data on the callback if its passed in', function (done) {
+        expect(Boom.clientTimeout().output.statusCode).to.equal(408);
+        done();
+    });
 
-            expect(Boom.internal('my message', { my: 'data' }).data.my).to.equal('data');
-            done();
-        });
+    it('sets the message with the passed in message', function (done) {
 
-        it('uses passed in stack if its available', function (done) {
+        expect(Boom.clientTimeout('my message').message).to.equal('my message');
+        done();
+    });
+});
 
-            var error = new Error();
-            error.stack = 'my stack line\nmy second stack line';
-            expect(Boom.internal('my message', error).trace[0]).to.equal('my stack line');
-            done();
-        });
+
+describe('conflict()', function () {
+
+    it('returns a 409 error statusCode', function (done) {
+
+        expect(Boom.conflict().output.statusCode).to.equal(409);
+        done();
     });
 
-    describe('#passThrough', function () {
+    it('sets the message with the passed in message', function (done) {
 
-        it('returns a pass-through error', function (done) {
+        expect(Boom.conflict('my message').message).to.equal('my message');
+        done();
+    });
+});
 
-            var err = Boom.passThrough(499, { a: 1 }, 'application/text', { 'X-Test': 'Boom' });
-            expect(err.response.code).to.equal(499);
-            expect(err.message).to.equal('Pass-through');
-            expect(err.response).to.deep.equal({
-                code: 499,
-                payload: { a: 1 },
-                headers: { 'X-Test': 'Boom' },
-                type: 'application/text'
-            });
-            done();
-        });
+
+describe('resourceGone()', function () {
+
+    it('returns a 410 error statusCode', function (done) {
+
+        expect(Boom.resourceGone().output.statusCode).to.equal(410);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.resourceGone('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('lengthRequired()', function () {
+
+    it('returns a 411 error statusCode', function (done) {
+
+        expect(Boom.lengthRequired().output.statusCode).to.equal(411);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.lengthRequired('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('preconditionFailed()', function () {
+
+    it('returns a 412 error statusCode', function (done) {
+
+        expect(Boom.preconditionFailed().output.statusCode).to.equal(412);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.preconditionFailed('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('entityTooLarge()', function () {
+
+    it('returns a 413 error statusCode', function (done) {
+
+        expect(Boom.entityTooLarge().output.statusCode).to.equal(413);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.entityTooLarge('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('uriTooLong()', function () {
+
+    it('returns a 414 error statusCode', function (done) {
+
+        expect(Boom.uriTooLong().output.statusCode).to.equal(414);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.uriTooLong('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('unsupportedMediaType()', function () {
+
+    it('returns a 415 error statusCode', function (done) {
+
+        expect(Boom.unsupportedMediaType().output.statusCode).to.equal(415);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.unsupportedMediaType('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('rangeNotSatisfiable()', function () {
+
+    it('returns a 416 error statusCode', function (done) {
+
+        expect(Boom.rangeNotSatisfiable().output.statusCode).to.equal(416);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.rangeNotSatisfiable('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('expectationFailed()', function () {
+
+    it('returns a 417 error statusCode', function (done) {
+
+        expect(Boom.expectationFailed().output.statusCode).to.equal(417);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.expectationFailed('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('badData()', function () {
+
+    it('returns a 422 error statusCode', function (done) {
+
+        expect(Boom.badData().output.statusCode).to.equal(422);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.badData('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('tooManyRequests()', function () {
+
+    it('returns a 429 error statusCode', function (done) {
+
+        expect(Boom.tooManyRequests().output.statusCode).to.equal(429);
+        done();
+    });
+
+    it('sets the message with the passed-in message', function (done) {
+
+        expect(Boom.tooManyRequests('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+describe('serverTimeout()', function () {
+
+    it('returns a 503 error statusCode', function (done) {
+
+        expect(Boom.serverTimeout().output.statusCode).to.equal(503);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.serverTimeout('my message').message).to.equal('my message');
+        done();
     });
+});
+
+describe('forbidden()', function () {
+
+    it('returns a 403 error statusCode', function (done) {
 
-    describe('#reformat', function () {
+        expect(Boom.forbidden().output.statusCode).to.equal(403);
+        done();
+    });
 
-        it('encodes any HTML markup in the response payload', function (done) {
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.forbidden('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+describe('notFound()', function () {
+
+    it('returns a 404 error statusCode', function (done) {
+
+        expect(Boom.notFound().output.statusCode).to.equal(404);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.notFound('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+describe('internal()', function () {
+
+    it('returns a 500 error statusCode', function (done) {
+
+        expect(Boom.internal().output.statusCode).to.equal(500);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        var err = Boom.internal('my message');
+        expect(err.message).to.equal('my message');
+        expect(err.output.payload.message).to.equal('An internal server error occurred');
+        done();
+    });
+
+    it('passes data on the callback if its passed in', function (done) {
+
+        expect(Boom.internal('my message', { my: 'data' }).data.my).to.equal('data');
+        done();
+    });
 
-            var boom = new Boom(new Error('<script>alert(1)</script>'));
-            expect(boom.response.payload.message).to.not.contain('<script>');
+    it('returns an error with composite message', function (done) {
+
+        try {
+            JSON.parse('{');
+        }
+        catch (err) {
+            var boom = Boom.internal('Someting bad', err);
+            expect(boom.message).to.equal('Someting bad: Unexpected end of input');
             done();
-        });
+        }
+    });
+});
+
+describe('notImplemented()', function () {
+
+    it('returns a 501 error statusCode', function (done) {
+
+        expect(Boom.notImplemented().output.statusCode).to.equal(501);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.notImplemented('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+
+describe('badGateway()', function () {
+
+    it('returns a 502 error statusCode', function (done) {
+
+        expect(Boom.badGateway().output.statusCode).to.equal(502);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.badGateway('my message').message).to.equal('my message');
+        done();
+    });
+});
+
+describe('gatewayTimeout()', function () {
+
+    it('returns a 504 error statusCode', function (done) {
+
+        expect(Boom.gatewayTimeout().output.statusCode).to.equal(504);
+        done();
+    });
+
+    it('sets the message with the passed in message', function (done) {
+
+        expect(Boom.gatewayTimeout('my message').message).to.equal('my message');
+        done();
     });
 });
 
+describe('badImplementation()', function () {
 
+    it('returns a 500 error statusCode', function (done) {
+
+        var err = Boom.badImplementation();
+        expect(err.output.statusCode).to.equal(500);
+        expect(err.isDeveloperError).to.equal(true);
+        done();
+    });
+});
index b3bb51763052d2523f4d9fa6148084ea19d95a67..b0939eabe34d2defcf4061394f2d22475f0c36af 100644 (file)
@@ -1,18 +1,17 @@
-.idea\r
-*.iml\r
-npm-debug.log\r
-dump.rdb\r
-node_modules\r
-results.tap\r
-results.xml\r
-npm-shrinkwrap.json\r
-config.json\r
-.DS_Store\r
-*/.DS_Store\r
-*/*/.DS_Store\r
-._*\r
-*/._*\r
-*/*/._*\r
-coverage.*\r
-lib-cov\r
-\r
+.idea
+*.iml
+npm-debug.log
+dump.rdb
+node_modules
+results.tap
+results.xml
+npm-shrinkwrap.json
+config.json
+.DS_Store
+*/.DS_Store
+*/*/.DS_Store
+._*
+*/._*
+*/*/._*
+coverage.*
+lib-cov
index 40ca59eeebdd3a6b57da226c32e3feba45a267f9..77795c6a9b47df7362037a006600e179a68e1960 100755 (executable)
@@ -1,5 +1,4 @@
-language: node_js\r
-\r
-node_js:\r
-  - 0.10\r
-\r
+language: node_js
+
+node_js:
+  - 0.10
index e699a7bdbaa168de34896b86992937ca92ba26e6..cda44736af05da7b3ed74cf6b3b172f8bd357d11 100755 (executable)
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2013, Eran Hammer.
+Copyright (c) 2014, Eran Hammer and other contributors.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -8,17 +8,21 @@ modification, are permitted provided that the following conditions are met:
     * 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.
-    * Neither the name of Eran Hammer nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
+    * The names of any contributors may not be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 ERAN HAMMER BE LIABLE FOR ANY
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND 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.
+
+                                  *   *   *
+
+The complete list of contributors can be found at: https://github.com/hueniverse/cryptiles/graphs/contributors
index 9e7138c2a6f532afb40d02c50c1e056345ae0756..3a89298fbd036f675a0537f6590135dd3138d4da 100755 (executable)
@@ -1,11 +1,9 @@
 test:
-       @./node_modules/.bin/lab
+       node node_modules/lab/bin/lab
 test-cov: 
-       @./node_modules/.bin/lab -r threshold -t 100
+       node node_modules/lab/bin/lab -t 100
 test-cov-html:
-       @./node_modules/.bin/lab -r html -o coverage.html
-complexity:
-       @./node_modules/.bin/cr -o complexity.md -f markdown lib
+       node node_modules/lab/bin/lab -r html -o coverage.html
 
-.PHONY: test test-cov test-cov-html complexity
+.PHONY: test test-cov test-cov-html
 
index 6a900a4918029d64affb508a1806533d334219b3..be943f8ec84a9616b54cee21f99bcbca2ffb8f44 100644 (file)
@@ -3,4 +3,12 @@ cryptiles
 
 General purpose crypto utilities
 
-[![Build Status](https://secure.travis-ci.org/hueniverse/cryptiles.png)](http://travis-ci.org/hueniverse/cryptiles)
+[![Build Status](https://secure.travis-ci.org/hapijs/cryptiles.png)](http://travis-ci.org/hapijs/cryptiles)
+
+## Methods
+
+### `randomString(<Number> size)`
+Returns a cryptographically strong pseudo-random data string. Takes a size argument for the length of the string.
+
+### `fixedTimeComparison(<String> a, <String> b)`
+Compare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match). Returns `true` if the strings match, `false` if they differ.
index dcf2bc38ffd9d358921f440cb08664bcb099c659..f385870ee68e3a17f8cfc99f08131482d1c9dfea 100755 (executable)
@@ -59,7 +59,7 @@ exports.fixedTimeComparison = function (a, b) {
     for (var i = 0, il = a.length; i < il; ++i) {
         var ac = a.charCodeAt(i);
         var bc = b.charCodeAt(i);
-        mismatch += (ac === bc ? 0 : 1);
+        mismatch |= (ac ^ bc);
     }
 
     return (mismatch === 0);
index 1248613351a3458f7f0bb5d0f92d87ed999ea782..18fee925f175973e8b4aec63796ddb1036f2e5ac 100755 (executable)
@@ -1,16 +1,16 @@
 {
   "name": "cryptiles",
   "description": "General purpose crypto utilities",
-  "version": "0.2.2",
+  "version": "2.0.4",
   "author": {
     "name": "Eran Hammer",
-    "email": "eran@hueniverse.com",
+    "email": "eran@hammer.io",
     "url": "http://hueniverse.com"
   },
   "contributors": [],
   "repository": {
     "type": "git",
-    "url": "git://github.com/hueniverse/cryptiles"
+    "url": "git://github.com/hapijs/cryptiles"
   },
   "main": "index",
   "keywords": [
     "node": ">=0.8.0"
   },
   "dependencies": {
-    "boom": "0.4.x"
+    "boom": "2.x.x"
   },
   "devDependencies": {
-    "lab": "0.1.x",
-    "complexity-report": "0.x.x"
+    "lab": "4.x.x"
   },
   "scripts": {
     "test": "make test-cov"
   "licenses": [
     {
       "type": "BSD",
-      "url": "http://github.com/hueniverse/cryptiles/raw/master/LICENSE"
+      "url": "http://github.com/hapijs/cryptiles/raw/master/LICENSE"
     }
   ],
+  "gitHead": "944263dbb628b9b3da542d35600d587f861eeaf0",
   "bugs": {
-    "url": "https://github.com/hueniverse/cryptiles/issues"
+    "url": "https://github.com/hapijs/cryptiles/issues"
   },
-  "_id": "cryptiles@0.2.2",
-  "dist": {
-    "shasum": "ed91ff1f17ad13d3748288594f8a48a0d26f325c",
-    "tarball": "http://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz"
-  },
-  "_from": "cryptiles@>=0.2.0 <0.3.0",
-  "_npmVersion": "1.2.24",
+  "homepage": "https://github.com/hapijs/cryptiles",
+  "_id": "cryptiles@2.0.4",
+  "_shasum": "09ea1775b9e1c7de7e60a99d42ab6f08ce1a1285",
+  "_from": "cryptiles@>=2.0.0 <3.0.0",
+  "_npmVersion": "1.4.23",
   "_npmUser": {
     "name": "hueniverse",
     "email": "eran@hueniverse.com"
       "email": "eran@hueniverse.com"
     }
   ],
+  "dist": {
+    "shasum": "09ea1775b9e1c7de7e60a99d42ab6f08ce1a1285",
+    "tarball": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz"
+  },
   "directories": {},
-  "_shasum": "ed91ff1f17ad13d3748288594f8a48a0d26f325c",
-  "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
-  "readme": "ERROR: No README data found!",
-  "homepage": "https://github.com/hueniverse/cryptiles"
+  "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz",
+  "readme": "ERROR: No README data found!"
 }
index 58aaa70b3108db3e85c83ab136799284d176bdc4..3340141a2c60eda69397a4ebb136d776167b42ad 100755 (executable)
@@ -11,11 +11,12 @@ var internals = {};
 
 // Test shortcuts
 
+var lab = exports.lab = Lab.script();
+var before = lab.before;
+var after = lab.after;
+var describe = lab.experiment;
+var it = lab.test;
 var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
 
 
 describe('Cryptiles', function () {
@@ -95,6 +96,12 @@ describe('Cryptiles', function () {
             expect(Cryptiles.fixedTimeComparison('x', null)).to.equal(false);
             done();
         });
+
+        it('should return false when not a string (left)', function (done) {
+
+            expect(Cryptiles.fixedTimeComparison(null, 'x')).to.equal(false);
+            done();
+        });
     });
 });
 
index 9966e5e637c5938feb39df15efcb86619e05f8f1..7e1574dc5c3c81d41c152e95b3c538613e69f19f 100644 (file)
@@ -1,18 +1,18 @@
-.idea\r
-*.iml\r
-npm-debug.log\r
-dump.rdb\r
-node_modules\r
-results.tap\r
-results.xml\r
-npm-shrinkwrap.json\r
-config.json\r
-.DS_Store\r
-*/.DS_Store\r
-*/*/.DS_Store\r
-._*\r
-*/._*\r
-*/*/._*\r
-coverage.*\r
-lib-cov\r
-complexity.md\r
+.idea
+*.iml
+npm-debug.log
+dump.rdb
+node_modules
+results.tap
+results.xml
+npm-shrinkwrap.json
+config.json
+.DS_Store
+*/.DS_Store
+*/*/.DS_Store
+._*
+*/._*
+*/*/._*
+coverage.*
+lib-cov
+complexity.md
index 40ca59eeebdd3a6b57da226c32e3feba45a267f9..77795c6a9b47df7362037a006600e179a68e1960 100755 (executable)
@@ -1,5 +1,4 @@
-language: node_js\r
-\r
-node_js:\r
-  - 0.10\r
-\r
+language: node_js
+
+node_js:
+  - 0.10
diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md b/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..8928361
--- /dev/null
@@ -0,0 +1 @@
+Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md).
index 394adcff2ed5b83d8b0e91f81a3153b6d5b4c922..5530904255022c91f7bc5e09b0aa3dc0307d451d 100755 (executable)
@@ -1,33 +1,31 @@
-Copyright (c) 2011-2013, Walmart.\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are met:\r
-    * Redistributions of source code must retain the above copyright\r
-      notice, this list of conditions and the following disclaimer.\r
-    * Redistributions in binary form must reproduce the above copyright\r
-      notice, this list of conditions and the following disclaimer in the\r
-      documentation and/or other materials provided with the distribution.\r
-    * Neither the name of Walmart nor the\r
-      names of its contributors may be used to endorse or promote products\r
-      derived from this software without specific prior written permission.\r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL WALMART BE LIABLE FOR ANY\r
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-\r
-                                  *   *   *\r
-\r
-\r
-Portions of this project were initially based on Postmile, Copyright (c) 2011, Yahoo Inc.\r
-Postmile is published at https://github.com/yahoo/postmile and its licensing terms are\r
-published at https://github.com/yahoo/postmile/blob/master/LICENSE.\r
-\r
+Copyright (c) 2011-2014, Walmart and other contributors.
+Copyright (c) 2011, Yahoo Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * 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.
+    * The names of any contributors may not be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDERS AND 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.
+
+                                  *   *   *
+
+The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors
+Portions of this project were initially based on the Yahoo! Inc. Postmile project,
+published at https://github.com/yahoo/postmile.
index e605d6c049d83bf59240a5f9cc27269ac56ae0d5..83aaf0c0c635d867fa599e0c59677592055c9b01 100755 (executable)
@@ -1,10 +1,8 @@
-test:\r
-       @node node_modules/lab/bin/lab\r
-test-cov: \r
-       @node node_modules/lab/bin/lab -r threshold -t 100\r
-test-cov-html:\r
-       @node node_modules/lab/bin/lab -r html -o coverage.html\r
-complexity:\r
-       @node node_modules/complexity-report/src/cli.js -o complexity.md -f markdown lib\r
-\r
-.PHONY: test test-cov test-cov-html complexity\r
+test:
+       @node node_modules/lab/bin/lab -a code
+test-cov:
+       @node node_modules/lab/bin/lab -a code -t 100 -L
+test-cov-html:
+       @node node_modules/lab/bin/lab -a code -r html -o coverage.html
+
+.PHONY: test test-cov test-cov-html
index ac64e2fda1fcf0a13249b2bc38000beac83d619d..61f4478a770ad3639980325e18ee6fcf9a171edb 100755 (executable)
-<a href="https://github.com/spumko"><img src="https://raw.github.com/spumko/spumko/master/images/from.png" align="right" /></a>\r
-![hoek Logo](https://raw.github.com/spumko/hoek/master/images/hoek.png)\r
-\r
-General purpose node utilities\r
-\r
-[![Build Status](https://secure.travis-ci.org/spumko/hoek.png)](http://travis-ci.org/spumko/hoek)\r
-\r
-# Table of Contents\r
-\r
-* [Introduction](#introduction "Introduction")\r
-* [Object](#object "Object")\r
-  * [clone](#cloneobj "clone")\r
-  * [merge](#mergetarget-source-isnulloverride-ismergearrays "merge")\r
-  * [applyToDefaults](#applytodefaultsdefaults-options "applyToDefaults")\r
-  * [unique](#uniquearray-key "unique")\r
-  * [mapToObject](#maptoobjectarray-key "mapToObject")\r
-  * [intersect](#intersectarray1-array2 "intersect")\r
-  * [matchKeys](#matchkeysobj-keys "matchKeys")\r
-  * [flatten](#flattenarray-target "flatten")\r
-  * [removeKeys](#removekeysobject-keys "removeKeys")\r
-  * [reach](#reachobj-chain "reach")\r
-  * [inheritAsync](#inheritasyncself-obj-keys "inheritAsync")\r
-  * [rename](#renameobj-from-to "rename")\r
-* [Timer](#timer "Timer")\r
-* [Binary Encoding/Decoding](#binary "Binary Encoding/Decoding")\r
-  * [base64urlEncode](#binary64urlEncodevalue "binary64urlEncode")\r
-  * [base64urlDecode](#binary64urlDecodevalue "binary64urlDecode")\r
-* [Escaping Characters](#escaped "Escaping Characters")\r
-  * [escapeHtml](#escapeHtmlstring "escapeHtml")\r
-  * [escapeHeaderAttribute](#escapeHeaderAttributeattribute "escapeHeaderAttribute")\r
-  * [escapeRegex](#escapeRegexstring "escapeRegex")\r
-* [Errors](#errors "Errors")\r
-  * [assert](#assertmessage "assert")\r
-  * [abort](#abortmessage "abort")\r
-  * [displayStack](#displayStackslice "displayStack")\r
-  * [callStack](#callStackslice "callStack")\r
-  * [toss](#tosscondition "toss")\r
-* [Load files](#load-files "Load Files")\r
-  * [loadPackage](#loadPackagedir "loadpackage")\r
-  * [loadDirModules](#loadDirModulespath-excludefiles-target "loaddirmodules")\r
-\r
-\r
-\r
-# Introduction\r
-\r
-The *Hoek* general purpose node utilities library is used to aid in a variety of manners. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more. \r
-\r
-For example, to use Hoek to set configuration with default options:\r
-```javascript\r
-var Hoek = require('hoek');\r
-\r
-var default = {url : "www.github.com", port : "8000", debug : true}\r
-\r
-var config = Hoek.applyToDefaults(default, {port : "3000", admin : true});\r
-\r
-// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }\r
-```\r
-\r
-Under each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the var Hoek = require('hoek') is omitted for brevity.\r
-\r
-## Object\r
-\r
-Hoek provides several helpful methods for objects and arrays.\r
-\r
-### clone(obj)\r
-\r
-This method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects). \r
-\r
-```javascript\r
-\r
-var nestedObj = {\r
-        w: /^something$/ig,\r
-        x: {\r
-            a: [1, 2, 3],\r
-            b: 123456,\r
-            c: new Date()\r
-        },\r
-        y: 'y',\r
-        z: new Date()\r
-    };\r
-\r
-var copy = Hoek.clone(nestedObj);\r
-\r
-copy.x.b = 100;\r
-\r
-console.log(copy.y)        // results in 'y'\r
-console.log(nestedObj.x.b) // results in 123456\r
-console.log(copy.x.b)      // results in 100\r
-```\r
-\r
-### merge(target, source, isNullOverride, isMergeArrays)\r
-isNullOverride, isMergeArrays default to true\r
-\r
-Merge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r
-\r
-\r
-```javascript\r
-\r
-var target = {a: 1, b : 2}\r
-var source = {a: 0, c: 5}\r
-var source2 = {a: null, c: 5}\r
-\r
-var targetArray = [1, 2, 3];\r
-var sourceArray = [4, 5];\r
-\r
-var newTarget = Hoek.merge(target, source);     // results in {a: 0, b: 2, c: 5}\r
-newTarget = Hoek.merge(target, source2);        // results in {a: null, b: 2, c: 5}\r
-newTarget = Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}\r
-\r
-newTarget = Hoek.merge(targetArray, sourceArray)              // results in [1, 2, 3, 4, 5]\r
-newTarget = Hoek.merge(targetArray, sourceArray, true, false) // results in [4, 5]\r
-\r
-\r
-\r
-\r
-```\r
-\r
-### applyToDefaults(defaults, options)\r
-\r
-Apply options to a copy of the defaults\r
-\r
-```javascript\r
-\r
-var defaults = {host: "localhost", port: 8000};\r
-var options = {port: 8080};\r
-\r
-var config = Hoek.applyToDefaults(defaults, options); // results in {host: "localhost", port: 8080};\r
-\r
-\r
-```\r
-\r
-### unique(array, key)\r
-\r
-Remove duplicate items from Array\r
-\r
-```javascript\r
-\r
-var array = [1, 2, 2, 3, 3, 4, 5, 6];\r
-\r
-var newArray = Hoek.unique(array); // results in [1,2,3,4,5,6];\r
-\r
-array = [{id: 1}, {id: 1}, {id: 2}];\r
-\r
-newArray = Hoek.unique(array, "id") // results in [{id: 1}, {id: 2}]\r
-\r
-```\r
-\r
-### mapToObject(array, key)\r
-\r
-Convert an Array into an Object\r
-\r
-```javascript\r
-\r
-var array = [1,2,3];\r
-var newObject = Hoek.mapToObject(array); // results in [{"1": true}, {"2": true}, {"3": true}]\r
-\r
-array = [{id: 1}, {id: 2}];\r
-newObject = Hoek.mapToObject(array, "id") // results in [{"id": 1}, {"id": 2}]\r
-\r
-```\r
-### intersect(array1, array2)\r
-\r
-Find the common unique items in two arrays\r
-\r
-```javascript\r
-\r
-var array1 = [1, 2, 3];\r
-var array2 = [1, 4, 5];\r
-\r
-var newArray = Hoek.intersect(array1, array2) // results in [1]\r
-\r
-```\r
-\r
-### matchKeys(obj, keys) \r
-\r
-Find which keys are present\r
-\r
-```javascript\r
-\r
-var obj = {a: 1, b: 2, c: 3};\r
-var keys = ["a", "e"];\r
-\r
-Hoek.matchKeys(obj, keys) // returns ["a"]\r
-\r
-```\r
-\r
-### flatten(array, target)\r
-\r
-Flatten an array\r
-\r
-```javascript\r
-\r
-var array = [1, 2, 3];\r
-var target = [4, 5]; \r
-\r
-var flattenedArray = Hoek.flatten(array, target) // results in [4, 5, 1, 2, 3];\r
-\r
-```\r
-\r
-### removeKeys(object, keys)\r
-\r
-Remove keys\r
-\r
-```javascript\r
-\r
-var object = {a: 1, b: 2, c: 3, d: 4};\r
-\r
-var keys = ["a", "b"];\r
-\r
-Hoek.removeKeys(object, keys) // object is now {c: 3, d: 4}\r
-\r
-```\r
-\r
-### reach(obj, chain)\r
-\r
-Converts an object key chain string to reference\r
-\r
-```javascript\r
-\r
-var chain = 'a.b.c';\r
-var obj = {a : {b : { c : 1}}};\r
-\r
-Hoek.reach(obj, chain) // returns 1\r
-\r
-```\r
-\r
-### inheritAsync(self, obj, keys) \r
-\r
-Inherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r
-\r
-```javascript\r
-\r
-var targetFunc = function () { };\r
-\r
-var proto = {\r
-                a: function () {\r
-                    return 'a!';\r
-                },\r
-                b: function () {\r
-                    return 'b!';\r
-                },\r
-                c: function () {\r
-                    throw new Error('c!');\r
-                }\r
-            };\r
-\r
-var keys = ['a', 'c'];\r
-\r
-Hoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r
-\r
-var target = new targetFunc();\r
-\r
-target.a(function(err, result){console.log(result)}         // returns 'a!'       \r
-\r
-target.c(function(err, result){console.log(result)}         // returns undefined\r
-\r
-target.b(function(err, result){console.log(result)}         // gives error: Object [object Object] has no method 'b'\r
-\r
-```\r
-\r
-### rename(obj, from, to)\r
-\r
-Rename a key of an object\r
-\r
-```javascript\r
-\r
-var obj = {a : 1, b : 2};\r
-\r
-Hoek.rename(obj, "a", "c");     // obj is now {c : 1, b : 2}\r
-\r
-```\r
-\r
-\r
-# Timer\r
-\r
-A Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.\r
-\r
-```javascript\r
-\r
-\r
-example : \r
-\r
-\r
-var timerObj = new Hoek.Timer();\r
-console.log("Time is now: " + timerObj.ts)\r
-console.log("Elapsed time from initialization: " + timerObj.elapsed() + 'milliseconds')\r
-\r
-```\r
-\r
-# Binary Encoding/Decoding\r
-\r
-### base64urlEncode(value)\r
-\r
-Encodes value in Base64 or URL encoding\r
-\r
-### base64urlDecode(value)\r
-\r
-Decodes data in Base64 or URL encoding.\r
-# Escaping Characters\r
-\r
-Hoek provides convenient methods for escaping html characters. The escaped characters are as followed:\r
-\r
-```javascript\r
-\r
-internals.htmlEscaped = {\r
-    '&': '&amp;',\r
-    '<': '&lt;',\r
-    '>': '&gt;',\r
-    '"': '&quot;',\r
-    "'": '&#x27;',\r
-    '`': '&#x60;'\r
-};\r
-\r
-```\r
-\r
-### escapeHtml(string)\r
-\r
-```javascript\r
-\r
-var string = '<html> hey </html>';\r
-var escapedString = Hoek.escapeHtml(string); // returns &lt;html&gt; hey &lt;/html&gt;\r
-\r
-```\r
-\r
-### escapeHeaderAttribute(attribute)\r
-\r
-Escape attribute value for use in HTTP header\r
-\r
-```javascript\r
-\r
-var a = Hoek.escapeHeaderAttribute('I said "go w\\o me"');  //returns I said \"go w\\o me\"\r
-\r
-\r
-```\r
-\r
-\r
-### escapeRegex(string)\r
-\r
-Escape string for Regex construction\r
-\r
-```javascript\r
-\r
-var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');  // returns 4\^f\$s\.4\*5\+\-_\?%\=#\!\:@\|~\\\/`"\(>\)\[<\]d\{\}s\,\r
-\r
-\r
-\r
-```\r
-\r
-# Errors\r
-\r
-### assert(message)\r
-\r
-```javascript\r
-\r
-var a = 1, b =2;\r
-\r
-Hoek.assert(a === b, 'a should equal b');  // ABORT: a should equal b\r
-\r
-```\r
-\r
-### abort(message)\r
-\r
-First checks if process.env.NODE_ENV === 'test', and if so, throws error message. Otherwise,\r
-displays most recent stack and then exits process.\r
-\r
-\r
-\r
-### displayStack(slice)\r
-\r
-Displays the trace stack\r
-\r
-```javascript\r
-\r
-var stack = Hoek.displayStack();\r
-console.log(stack) // returns something like:\r
-\r
-[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',\r
-  'Module._compile (module.js:449:26)',\r
-  'Module._extensions..js (module.js:467:10)',\r
-  'Module.load (module.js:356:32)',\r
-  'Module._load (module.js:312:12)',\r
-  'Module.runMain (module.js:492:10)',\r
-  'startup.processNextTick.process._tickCallback (node.js:244:9)' ]\r
-\r
-```\r
-\r
-### callStack(slice)\r
-\r
-Returns a trace stack array.\r
-\r
-```javascript\r
-\r
-var stack = Hoek.callStack();\r
-console.log(stack)  // returns something like:\r
-\r
-[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],\r
-  [ 'module.js', 449, 26, 'Module._compile', false ],\r
-  [ 'module.js', 467, 10, 'Module._extensions..js', false ],\r
-  [ 'module.js', 356, 32, 'Module.load', false ],\r
-  [ 'module.js', 312, 12, 'Module._load', false ],\r
-  [ 'module.js', 492, 10, 'Module.runMain', false ],\r
-  [ 'node.js',\r
-    244,\r
-    9,\r
-    'startup.processNextTick.process._tickCallback',\r
-    false ] ]\r
-\r
-\r
-```\r
-\r
-### toss(condition)\r
-\r
-toss(condition /*, [message], callback */)\r
-\r
-Return an error as first argument of a callback\r
-\r
-\r
-# Load Files\r
-\r
-### loadPackage(dir)\r
-\r
-Load and parse package.json process root or given directory\r
-\r
-```javascript\r
-\r
-var pack = Hoek.loadPackage();  // pack.name === 'hoek'\r
-\r
-```\r
-\r
-### loadDirModules(path, excludeFiles, target) \r
-\r
-Loads modules from a given path; option to exclude files (array).\r
-\r
-\r
-\r
-\r
+![hoek Logo](https://raw.github.com/hapijs/hoek/master/images/hoek.png)
+
+Utility methods for the hapi ecosystem. This module is not intended to solve every problem for everyone, but rather as a central place to store hapi-specific methods. If you're looking for a general purpose utility module, check out [lodash](https://github.com/lodash/lodash) or [underscore](https://github.com/jashkenas/underscore).
+
+[![Build Status](https://secure.travis-ci.org/hapijs/hoek.png)](http://travis-ci.org/hapijs/hoek)
+
+Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf)
+
+# Table of Contents
+
+* [Introduction](#introduction "Introduction")
+* [Object](#object "Object")
+  * [clone](#cloneobj "clone")
+  * [cloneWithShallow](#clonewithshallowobj-keys "cloneWithShallow")
+  * [merge](#mergetarget-source-isnulloverride-ismergearrays "merge")
+  * [applyToDefaults](#applytodefaultsdefaults-options "applyToDefaults")
+  * [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys "applyToDefaultsWithShallow")
+  * [deepEqual](#deepequala-b "deepEqual")
+  * [unique](#uniquearray-key "unique")
+  * [mapToObject](#maptoobjectarray-key "mapToObject")
+  * [intersect](#intersectarray1-array2 "intersect")
+  * [contain](#containref-values-options "contain")
+  * [flatten](#flattenarray-target "flatten")
+  * [reach](#reachobj-chain-options "reach")
+  * [transform](#transformobj-transform-options "transform")
+  * [shallow](#shallowobj "shallow")
+  * [stringify](#stringifyobj "stringify")
+* [Timer](#timer "Timer")
+* [Bench](#bench "Bench")
+* [Binary Encoding/Decoding](#binary-encodingdecoding "Binary Encoding/Decoding")
+  * [base64urlEncode](#base64urlencodevalue "binary64urlEncode")
+  * [base64urlDecode](#base64urldecodevalue "binary64urlDecode")
+* [Escaping Characters](#escaping-characters "Escaping Characters")
+  * [escapeHtml](#escapehtmlstring "escapeHtml")
+  * [escapeHeaderAttribute](#escapeheaderattributeattribute "escapeHeaderAttribute")
+  * [escapeRegex](#escaperegexstring "escapeRegex")
+* [Errors](#errors "Errors")
+  * [assert](#assertcondition-message "assert")
+  * [abort](#abortmessage "abort")
+  * [displayStack](#displaystackslice "displayStack")
+  * [callStack](#callstackslice "callStack")
+* [Function](#function "Function")
+  * [nextTick](#nexttickfn "nextTick")
+  * [once](#oncefn "once")
+  * [ignore](#ignore "ignore")
+* [Miscellaneous](#miscellaneous "Miscellaneous")
+  * [uniqueFilename](#uniquefilename "uniqueFilename")
+  * [isInteger](#isInteger "isInteger")
+
+
+
+# Introduction
+
+The *Hoek* library contains some common functions used within the hapi ecosystem. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more.
+
+For example, to use Hoek to set configuration with default options:
+```javascript
+var Hoek = require('hoek');
+
+var default = {url : "www.github.com", port : "8000", debug : true};
+
+var config = Hoek.applyToDefaults(default, {port : "3000", admin : true});
+
+// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }
+```
+
+Under each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the `var Hoek = require('hoek');` is omitted for brevity.
+
+## Object
+
+Hoek provides several helpful methods for objects and arrays.
+
+### clone(obj)
+
+This method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects).
+
+```javascript
+
+var nestedObj = {
+        w: /^something$/ig,
+        x: {
+            a: [1, 2, 3],
+            b: 123456,
+            c: new Date()
+        },
+        y: 'y',
+        z: new Date()
+    };
+
+var copy = Hoek.clone(nestedObj);
+
+copy.x.b = 100;
+
+console.log(copy.y);        // results in 'y'
+console.log(nestedObj.x.b); // results in 123456
+console.log(copy.x.b);      // results in 100
+```
+
+### cloneWithShallow(obj, keys)
+keys is an array of key names to shallow copy
+
+This method is also used to clone an object or array, however any keys listed in the `keys` array are shallow copied while those not listed are deep copied.
+
+```javascript
+
+var nestedObj = {
+        w: /^something$/ig,
+        x: {
+            a: [1, 2, 3],
+            b: 123456,
+            c: new Date()
+        },
+        y: 'y',
+        z: new Date()
+    };
+
+var copy = Hoek.cloneWithShallow(nestedObj, ['x']);
+
+copy.x.b = 100;
+
+console.log(copy.y);        // results in 'y'
+console.log(nestedObj.x.b); // results in 100
+console.log(copy.x.b);      // results in 100
+```
+
+### merge(target, source, isNullOverride, isMergeArrays)
+isNullOverride, isMergeArrays default to true
+
+Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied.
+Merge is destructive where the target is modified. For non destructive merge, use `applyToDefaults`.
+
+
+```javascript
+
+var target = {a: 1, b : 2};
+var source = {a: 0, c: 5};
+var source2 = {a: null, c: 5};
+
+Hoek.merge(target, source);         // results in {a: 0, b: 2, c: 5}
+Hoek.merge(target, source2);        // results in {a: null, b: 2, c: 5}
+Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}
+
+var targetArray = [1, 2, 3];
+var sourceArray = [4, 5];
+
+Hoek.merge(targetArray, sourceArray);              // results in [1, 2, 3, 4, 5]
+Hoek.merge(targetArray, sourceArray, true, false); // results in [4, 5]
+```
+
+### applyToDefaults(defaults, options)
+
+Apply options to a copy of the defaults
+
+```javascript
+
+var defaults = { host: "localhost", port: 8000 };
+var options = { port: 8080 };
+
+var config = Hoek.applyToDefaults(defaults, options); // results in { host: "localhost", port: 8080 }
+```
+
+### applyToDefaultsWithShallow(defaults, options, keys)
+keys is an array of key names to shallow copy
+
+Apply options to a copy of the defaults. Keys specified in the last parameter are shallow copied from options instead of merged.
+
+```javascript
+
+var defaults = {
+        server: {
+            host: "localhost",
+            port: 8000
+        },
+        name: 'example'
+    };
+
+var options = { server: { port: 8080 } };
+
+var config = Hoek.applyToDefaults(defaults, options); // results in { server: { port: 8080 }, name: 'example' }
+```
+
+### deepEqual(b, a)
+
+Performs a deep comparison of the two values including support for circular dependencies, prototype, and properties.
+
+```javascript
+Hoek.deepEqual({ a: [1, 2], b: 'string', c: { d: true } }, { a: [1, 2], b: 'string', c: { d: true } });
+```
+
+### unique(array, key)
+
+Remove duplicate items from Array
+
+```javascript
+
+var array = [1, 2, 2, 3, 3, 4, 5, 6];
+
+var newArray = Hoek.unique(array);    // results in [1,2,3,4,5,6]
+
+array = [{id: 1}, {id: 1}, {id: 2}];
+
+newArray = Hoek.unique(array, "id");  // results in [{id: 1}, {id: 2}]
+```
+
+### mapToObject(array, key)
+
+Convert an Array into an Object
+
+```javascript
+
+var array = [1,2,3];
+var newObject = Hoek.mapToObject(array);   // results in [{"1": true}, {"2": true}, {"3": true}]
+
+array = [{id: 1}, {id: 2}];
+newObject = Hoek.mapToObject(array, "id"); // results in [{"id": 1}, {"id": 2}]
+```
+
+### intersect(array1, array2)
+
+Find the common unique items in two arrays
+
+```javascript
+
+var array1 = [1, 2, 3];
+var array2 = [1, 4, 5];
+
+var newArray = Hoek.intersect(array1, array2); // results in [1]
+```
+
+### contain(ref, values, [options])
+
+Tests if the reference value contains the provided values where:
+- `ref` - the reference string, array, or object.
+- `values` - a single or array of values to find within the `ref` value. If `ref` is an object, `values` can be a key name,
+  an array of key names, or an object with key-value pairs to compare.
+- `options` - an optional object with the following optional settings:
+    - `deep` - if `true`, performed a deep comparison of the values.
+    - `once` - if `true`, allows only one occurrence of each value.
+    - `only` - if `true`, does not allow values not explicitly listed.
+    - `part` - if `true`, allows partial match of the values (at least one must always match).
+
+Note: comparing a string to overlapping values will result in failed comparison (e.g. `contain('abc', ['ab', 'bc'])`).
+Also, if an object key's value does not match the provided value, `false` is returned even when `part` is specified.
+
+```javascript
+Hoek.contain('aaa', 'a', { only: true });                                                      // true
+Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true });                          // true
+Hoek.contain([1, 2, 2], [1, 2], { once: true });                                       // false
+Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true }); // true
+```
+
+### flatten(array, [target])
+
+Flatten an array
+
+```javascript
+
+var array = [1, [2, 3]];
+
+var flattenedArray = Hoek.flatten(array); // results in [1, 2, 3]
+
+array = [1, [2, 3]];
+target = [4, [5]];
+
+flattenedArray = Hoek.flatten(array, target); // results in [4, [5], 1, 2, 3]
+```
+
+### reach(obj, chain, [options])
+
+Converts an object key chain string to reference
+
+- `options` - optional settings
+    - `separator` - string to split chain path on, defaults to '.'
+    - `default` - value to return if the path or value is not present, default is `undefined`
+    - `strict` - if `true`, will throw an error on missing member, default is `false`
+    - `functions` - if `true` allow traversing functions for properties. `false` will throw an error if a function is part of the chain.
+
+A chain including negative numbers will work like negative indices on an
+array.
+
+```javascript
+
+var chain = 'a.b.c';
+var obj = {a : {b : { c : 1}}};
+
+Hoek.reach(obj, chain); // returns 1
+
+var chain = 'a.b.-1';
+var obj = {a : {b : [2,3,6]}};
+
+Hoek.reach(obj, chain); // returns 6
+```
+
+### transform(obj, transform, [options])
+
+Transforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options.
+
+```javascript
+var source = {
+    address: {
+        one: '123 main street',
+        two: 'PO Box 1234'
+    },
+    title: 'Warehouse',
+    state: 'CA'
+};
+
+var result = Hoek.transform(source, {
+    'person.address.lineOne': 'address.one',
+    'person.address.lineTwo': 'address.two',
+    'title': 'title',
+    'person.address.region': 'state'
+});
+// Results in
+// {
+//     person: {
+//         address: {
+//             lineOne: '123 main street',
+//             lineTwo: 'PO Box 1234',
+//             region: 'CA'
+//         }
+//     },
+//     title: 'Warehouse'
+// }
+```
+
+### shallow(obj)
+
+Performs a shallow copy by copying the references of all the top level children where:
+- `obj` - the object to be copied.
+
+```javascript
+var shallow = Hoek.shallow({ a: { b: 1 } });
+```
+
+### stringify(obj)
+
+Converts an object to string using the built-in `JSON.stringify()` method with the difference that any errors are caught
+and reported back in the form of the returned string. Used as a shortcut for displaying information to the console (e.g. in
+error message) without the need to worry about invalid conversion.
+
+```javascript
+var a = {};
+a.b = a;
+Hoek.stringify(a);             // Returns '[Cannot display object: Converting circular structure to JSON]'
+```
+
+# Timer
+
+A Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.
+
+```javascript
+
+var timerObj = new Hoek.Timer();
+console.log("Time is now: " + timerObj.ts);
+console.log("Elapsed time from initialization: " + timerObj.elapsed() + 'milliseconds');
+```
+
+
+# Bench
+
+Same as Timer with the exception that `ts` stores the internal node clock which is not related to `Date.now()` and cannot be used to display
+human-readable timestamps. More accurate for benchmarking or internal timers.
+
+# Binary Encoding/Decoding
+
+### base64urlEncode(value)
+
+Encodes value in Base64 or URL encoding
+
+### base64urlDecode(value)
+
+Decodes data in Base64 or URL encoding.
+# Escaping Characters
+
+Hoek provides convenient methods for escaping html characters. The escaped characters are as followed:
+
+```javascript
+
+internals.htmlEscaped = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+};
+```
+
+### escapeHtml(string)
+
+```javascript
+
+var string = '<html> hey </html>';
+var escapedString = Hoek.escapeHtml(string); // returns &lt;html&gt; hey &lt;/html&gt;
+```
+
+### escapeHeaderAttribute(attribute)
+
+Escape attribute value for use in HTTP header
+
+```javascript
+
+var a = Hoek.escapeHeaderAttribute('I said "go w\\o me"');  //returns I said \"go w\\o me\"
+```
+
+
+### escapeRegex(string)
+
+Escape string for Regex construction
+
+```javascript
+
+var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');  // returns 4\^f\$s\.4\*5\+\-_\?%\=#\!\:@\|~\\\/`"\(>\)\[<\]d\{\}s\,
+```
+
+# Errors
+
+### assert(condition, message)
+
+```javascript
+
+var a = 1, b = 2;
+
+Hoek.assert(a === b, 'a should equal b');  // Throws 'a should equal b'
+```
+
+Note that you may also pass an already created Error object as the second parameter, and `assert` will throw that object.
+
+```javascript
+
+var a = 1, b = 2;
+
+Hoek.assert(a === b, new Error('a should equal b')); // Throws the given error object
+```
+
+### abort(message)
+
+First checks if `process.env.NODE_ENV === 'test'`, and if so, throws error message. Otherwise,
+displays most recent stack and then exits process.
+
+
+
+### displayStack(slice)
+
+Displays the trace stack
+
+```javascript
+
+var stack = Hoek.displayStack();
+console.log(stack); // returns something like:
+
+[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
+  'Module._compile (module.js:449:26)',
+  'Module._extensions..js (module.js:467:10)',
+  'Module.load (module.js:356:32)',
+  'Module._load (module.js:312:12)',
+  'Module.runMain (module.js:492:10)',
+  'startup.processNextTick.process._tickCallback (node.js:244:9)' ]
+```
+
+### callStack(slice)
+
+Returns a trace stack array.
+
+```javascript
+
+var stack = Hoek.callStack();
+console.log(stack);  // returns something like:
+
+[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
+  [ 'module.js', 449, 26, 'Module._compile', false ],
+  [ 'module.js', 467, 10, 'Module._extensions..js', false ],
+  [ 'module.js', 356, 32, 'Module.load', false ],
+  [ 'module.js', 312, 12, 'Module._load', false ],
+  [ 'module.js', 492, 10, 'Module.runMain', false ],
+  [ 'node.js',
+    244,
+    9,
+    'startup.processNextTick.process._tickCallback',
+    false ] ]
+```
+
+## Function
+
+### nextTick(fn)
+
+Returns a new function that wraps `fn` in `process.nextTick`.
+
+```javascript
+
+var myFn = function () {
+    console.log('Do this later');
+};
+
+var nextFn = Hoek.nextTick(myFn);
+
+nextFn();
+console.log('Do this first');
+
+// Results in:
+//
+// Do this first
+// Do this later
+```
+
+### once(fn)
+
+Returns a new function that can be run multiple times, but makes sure `fn` is only run once.
+
+```javascript
+
+var myFn = function () {
+    console.log('Ran myFn');
+};
+
+var onceFn = Hoek.once(myFn);
+onceFn(); // results in "Ran myFn"
+onceFn(); // results in undefined
+```
+
+### ignore
+
+A simple no-op function. It does nothing at all.
+
+## Miscellaneous
+
+### uniqueFilename(path, extension)
+`path` to prepend with the randomly generated file name. `extension` is the optional file extension, defaults to `''`.
+
+Returns a randomly generated file name at the specified `path`. The result is a fully resolved path to a file.
+
+```javascript
+var result = Hoek.uniqueFilename('./test/modules', 'txt'); // results in "full/path/test/modules/{random}.txt"
+```
+
+### isInteger(value)
+
+Check `value` to see if it is an integer.  Returns true/false.
+
+```javascript
+var result = Hoek.isInteger('23')
+```
index 4cc88b35877b9345761466cf2c4115d76094498c..bb0a047c4f60c530ad82ed938de5f9ef1fc936f6 100755 (executable)
@@ -1 +1 @@
-module.exports = require('./lib');
\ No newline at end of file
+module.exports = require('./lib');
index 666b3dc82067873f361bada91d8fb4f5fb5ec426..9ecde6666b1263339b563df9a9ce177ba83600c6 100755 (executable)
-// Declare internals\r
-\r
-var internals = {};\r
-\r
-\r
-exports.escapeJavaScript = function (input) {\r
-\r
-    if (!input) {\r
-        return '';\r
-    }\r
-\r
-    var escaped = '';\r
-\r
-    for (var i = 0, il = input.length; i < il; ++i) {\r
-\r
-        var charCode = input.charCodeAt(i);\r
-\r
-        if (internals.isSafe(charCode)) {\r
-            escaped += input[i];\r
-        }\r
-        else {\r
-            escaped += internals.escapeJavaScriptChar(charCode);\r
-        }\r
-    }\r
-\r
-    return escaped;\r
-};\r
-\r
-\r
-exports.escapeHtml = function (input) {\r
-\r
-    if (!input) {\r
-        return '';\r
-    }\r
-\r
-    var escaped = '';\r
-\r
-    for (var i = 0, il = input.length; i < il; ++i) {\r
-\r
-        var charCode = input.charCodeAt(i);\r
-\r
-        if (internals.isSafe(charCode)) {\r
-            escaped += input[i];\r
-        }\r
-        else {\r
-            escaped += internals.escapeHtmlChar(charCode);\r
-        }\r
-    }\r
-\r
-    return escaped;\r
-};\r
-\r
-\r
-internals.escapeJavaScriptChar = function (charCode) {\r
-\r
-    if (charCode >= 256) {\r
-        return '\\u' + internals.padLeft('' + charCode, 4);\r
-    }\r
-\r
-    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');\r
-    return '\\x' + internals.padLeft(hexValue, 2);\r
-};\r
-\r
-\r
-internals.escapeHtmlChar = function (charCode) {\r
-\r
-    var namedEscape = internals.namedHtml[charCode];\r
-    if (typeof namedEscape !== 'undefined') {\r
-        return namedEscape;\r
-    }\r
-\r
-    if (charCode >= 256) {\r
-        return '&#' + charCode + ';';\r
-    }\r
-\r
-    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');\r
-    return '&#x' + internals.padLeft(hexValue, 2) + ';';\r
-};\r
-\r
-\r
-internals.padLeft = function (str, len) {\r
-\r
-    while (str.length < len) {\r
-        str = '0' + str;\r
-    }\r
-\r
-    return str;\r
-};\r
-\r
-\r
-internals.isSafe = function (charCode) {\r
-\r
-    return (typeof internals.safeCharCodes[charCode] !== 'undefined');\r
-};\r
-\r
-\r
-internals.namedHtml = {\r
-    '38': '&amp;',\r
-    '60': '&lt;',\r
-    '62': '&gt;',\r
-    '34': '&quot;',\r
-    '160': '&nbsp;',\r
-    '162': '&cent;',\r
-    '163': '&pound;',\r
-    '164': '&curren;',\r
-    '169': '&copy;',\r
-    '174': '&reg;'\r
-};\r
-\r
-\r
-internals.safeCharCodes = (function () {\r
-\r
-    var safe = {};\r
-\r
-    for (var i = 32; i < 123; ++i) {\r
-\r
-        if ((i >= 97 && i <= 122) ||         // a-z\r
-            (i >= 65 && i <= 90) ||          // A-Z\r
-            (i >= 48 && i <= 57) ||          // 0-9\r
-            i === 32 ||                      // space\r
-            i === 46 ||                      // .\r
-            i === 44 ||                      // ,\r
-            i === 45 ||                      // -\r
-            i === 58 ||                      // :\r
-            i === 95) {                      // _\r
-\r
-            safe[i] = null;\r
-        }\r
-    }\r
-\r
-    return safe;\r
-}());
\ No newline at end of file
+// Declare internals
+
+var internals = {};
+
+
+exports.escapeJavaScript = function (input) {
+
+    if (!input) {
+        return '';
+    }
+
+    var escaped = '';
+
+    for (var i = 0, il = input.length; i < il; ++i) {
+
+        var charCode = input.charCodeAt(i);
+
+        if (internals.isSafe(charCode)) {
+            escaped += input[i];
+        }
+        else {
+            escaped += internals.escapeJavaScriptChar(charCode);
+        }
+    }
+
+    return escaped;
+};
+
+
+exports.escapeHtml = function (input) {
+
+    if (!input) {
+        return '';
+    }
+
+    var escaped = '';
+
+    for (var i = 0, il = input.length; i < il; ++i) {
+
+        var charCode = input.charCodeAt(i);
+
+        if (internals.isSafe(charCode)) {
+            escaped += input[i];
+        }
+        else {
+            escaped += internals.escapeHtmlChar(charCode);
+        }
+    }
+
+    return escaped;
+};
+
+
+internals.escapeJavaScriptChar = function (charCode) {
+
+    if (charCode >= 256) {
+        return '\\u' + internals.padLeft('' + charCode, 4);
+    }
+
+    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');
+    return '\\x' + internals.padLeft(hexValue, 2);
+};
+
+
+internals.escapeHtmlChar = function (charCode) {
+
+    var namedEscape = internals.namedHtml[charCode];
+    if (typeof namedEscape !== 'undefined') {
+        return namedEscape;
+    }
+
+    if (charCode >= 256) {
+        return '&#' + charCode + ';';
+    }
+
+    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');
+    return '&#x' + internals.padLeft(hexValue, 2) + ';';
+};
+
+
+internals.padLeft = function (str, len) {
+
+    while (str.length < len) {
+        str = '0' + str;
+    }
+
+    return str;
+};
+
+
+internals.isSafe = function (charCode) {
+
+    return (typeof internals.safeCharCodes[charCode] !== 'undefined');
+};
+
+
+internals.namedHtml = {
+    '38': '&amp;',
+    '60': '&lt;',
+    '62': '&gt;',
+    '34': '&quot;',
+    '160': '&nbsp;',
+    '162': '&cent;',
+    '163': '&pound;',
+    '164': '&curren;',
+    '169': '&copy;',
+    '174': '&reg;'
+};
+
+
+internals.safeCharCodes = (function () {
+
+    var safe = {};
+
+    for (var i = 32; i < 123; ++i) {
+
+        if ((i >= 97) ||                    // a-z
+            (i >= 65 && i <= 90) ||         // A-Z
+            (i >= 48 && i <= 57) ||         // 0-9
+            i === 32 ||                     // space
+            i === 46 ||                     // .
+            i === 44 ||                     // ,
+            i === 45 ||                     // -
+            i === 58 ||                     // :
+            i === 95) {                     // _
+
+            safe[i] = null;
+        }
+    }
+
+    return safe;
+}());
index 806260d25eb0eec5e0bdfaab30f426d25a578b7e..9afabcddb309827ed06b76c1317225a72722a5d2 100755 (executable)
-// Load modules\r
-\r
-var Fs = require('fs');\r
-var Escape = require('./escape');\r
-\r
-\r
-// Declare internals\r
-\r
-var internals = {};\r
-\r
-\r
-// Clone object or array\r
-\r
-exports.clone = function (obj, seen) {\r
-\r
-    if (typeof obj !== 'object' ||\r
-        obj === null) {\r
-\r
-        return obj;\r
-    }\r
-\r
-    seen = seen || { orig: [], copy: [] };\r
-\r
-    var lookup = seen.orig.indexOf(obj);\r
-    if (lookup !== -1) {\r
-        return seen.copy[lookup];\r
-    }\r
-\r
-    var newObj = (obj instanceof Array) ? [] : {};\r
-\r
-    seen.orig.push(obj);\r
-    seen.copy.push(newObj);\r
-\r
-    for (var i in obj) {\r
-        if (obj.hasOwnProperty(i)) {\r
-            if (obj[i] instanceof Buffer) {\r
-                newObj[i] = new Buffer(obj[i]);\r
-            }\r
-            else if (obj[i] instanceof Date) {\r
-                newObj[i] = new Date(obj[i].getTime());\r
-            }\r
-            else if (obj[i] instanceof RegExp) {\r
-                var flags = '' + (obj[i].global ? 'g' : '') + (obj[i].ignoreCase ? 'i' : '') + (obj[i].multiline ? 'm' : '');\r
-                newObj[i] = new RegExp(obj[i].source, flags);\r
-            }\r
-            else {\r
-                newObj[i] = exports.clone(obj[i], seen);\r
-            }\r
-        }\r
-    }\r
-\r
-    return newObj;\r
-};\r
-\r
-\r
-// Merge all the properties of source into target, source wins in conflic, and by default null and undefined from source are applied\r
-\r
-exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) {\r
-\r
-    exports.assert(target && typeof target == 'object', 'Invalid target value: must be an object');\r
-    exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object');\r
-\r
-    if (!source) {\r
-        return target;\r
-    }\r
-\r
-    if (source instanceof Array) {\r
-        exports.assert(target instanceof Array, 'Cannot merge array onto an object');\r
-        if (isMergeArrays === false) {                                                  // isMergeArrays defaults to true\r
-            target.length = 0;                                                          // Must not change target assignment\r
-        }\r
-\r
-        for (var i = 0, il = source.length; i < il; ++i) {\r
-            target.push(source[i]);\r
-        }\r
-\r
-        return target;\r
-    }\r
-\r
-    var keys = Object.keys(source);\r
-    for (var k = 0, kl = keys.length; k < kl; ++k) {\r
-        var key = keys[k];\r
-        var value = source[key];\r
-        if (value &&\r
-            typeof value === 'object') {\r
-\r
-            if (!target[key] ||\r
-                typeof target[key] !== 'object') {\r
-\r
-                target[key] = exports.clone(value);\r
-            }\r
-            else {\r
-                exports.merge(target[key], source[key], isNullOverride, isMergeArrays);\r
-            }\r
-        }\r
-        else {\r
-            if (value !== null && value !== undefined) {            // Explicit to preserve empty strings\r
-                target[key] = value;\r
-            }\r
-            else if (isNullOverride !== false) {                    // Defaults to true\r
-                target[key] = value;\r
-            }\r
-        }\r
-    }\r
-\r
-    return target;\r
-};\r
-\r
-\r
-// Apply options to a copy of the defaults\r
-\r
-exports.applyToDefaults = function (defaults, options) {\r
-\r
-    exports.assert(defaults && typeof defaults == 'object', 'Invalid defaults value: must be an object');\r
-    exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');\r
-\r
-    if (!options) {                                                 // If no options, return null\r
-        return null;\r
-    }\r
-\r
-    var copy = exports.clone(defaults);\r
-\r
-    if (options === true) {                                         // If options is set to true, use defaults\r
-        return copy;\r
-    }\r
-\r
-    return exports.merge(copy, options, false, false);\r
-};\r
-\r
-\r
-// Remove duplicate items from array\r
-\r
-exports.unique = function (array, key) {\r
-\r
-    var index = {};\r
-    var result = [];\r
-\r
-    for (var i = 0, il = array.length; i < il; ++i) {\r
-        var id = (key ? array[i][key] : array[i]);\r
-        if (index[id] !== true) {\r
-\r
-            result.push(array[i]);\r
-            index[id] = true;\r
-        }\r
-    }\r
-\r
-    return result;\r
-};\r
-\r
-\r
-// Convert array into object\r
-\r
-exports.mapToObject = function (array, key) {\r
-\r
-    if (!array) {\r
-        return null;\r
-    }\r
-\r
-    var obj = {};\r
-    for (var i = 0, il = array.length; i < il; ++i) {\r
-        if (key) {\r
-            if (array[i][key]) {\r
-                obj[array[i][key]] = true;\r
-            }\r
-        }\r
-        else {\r
-            obj[array[i]] = true;\r
-        }\r
-    }\r
-\r
-    return obj;\r
-};\r
-\r
-\r
-// Find the common unique items in two arrays\r
-\r
-exports.intersect = function (array1, array2, justFirst) {\r
-\r
-    if (!array1 || !array2) {\r
-        return [];\r
-    }\r
-\r
-    var common = [];\r
-    var hash = (array1 instanceof Array ? exports.mapToObject(array1) : array1);\r
-    var found = {};\r
-    for (var i = 0, il = array2.length; i < il; ++i) {\r
-        if (hash[array2[i]] && !found[array2[i]]) {\r
-            if (justFirst) {\r
-                return array2[i];\r
-            }\r
-\r
-            common.push(array2[i]);\r
-            found[array2[i]] = true;\r
-        }\r
-    }\r
-\r
-    return (justFirst ? null : common);\r
-};\r
-\r
-\r
-// Find which keys are present\r
-\r
-exports.matchKeys = function (obj, keys) {\r
-\r
-    var matched = [];\r
-    for (var i = 0, il = keys.length; i < il; ++i) {\r
-        if (obj.hasOwnProperty(keys[i])) {\r
-            matched.push(keys[i]);\r
-        }\r
-    }\r
-    return matched;\r
-};\r
-\r
-\r
-// Flatten array\r
-\r
-exports.flatten = function (array, target) {\r
-\r
-    var result = target || [];\r
-\r
-    for (var i = 0, il = array.length; i < il; ++i) {\r
-        if (Array.isArray(array[i])) {\r
-            exports.flatten(array[i], result);\r
-        }\r
-        else {\r
-            result.push(array[i]);\r
-        }\r
-    }\r
-\r
-    return result;\r
-};\r
-\r
-\r
-// Remove keys\r
-\r
-exports.removeKeys = function (object, keys) {\r
-\r
-    for (var i = 0, il = keys.length; i < il; i++) {\r
-        delete object[keys[i]];\r
-    }\r
-};\r
-\r
-\r
-// Convert an object key chain string ('a.b.c') to reference (object[a][b][c])\r
-\r
-exports.reach = function (obj, chain) {\r
-\r
-    var path = chain.split('.');\r
-    var ref = obj;\r
-    for (var i = 0, il = path.length; i < il; ++i) {\r
-        if (ref) {\r
-            ref = ref[path[i]];\r
-        }\r
-    }\r
-\r
-    return ref;\r
-};\r
-\r
-\r
-// Inherits a selected set of methods from an object, wrapping functions in asynchronous syntax and catching errors\r
-\r
-exports.inheritAsync = function (self, obj, keys) {\r
-\r
-    keys = keys || null;\r
-\r
-    for (var i in obj) {\r
-        if (obj.hasOwnProperty(i)) {\r
-            if (keys instanceof Array &&\r
-                keys.indexOf(i) < 0) {\r
-\r
-                continue;\r
-            }\r
-\r
-            self.prototype[i] = (function (fn) {\r
-\r
-                return function (next) {\r
-\r
-                    var result = null;\r
-                    try {\r
-                        result = fn();\r
-                    }\r
-                    catch (err) {\r
-                        return next(err);\r
-                    }\r
-\r
-                    return next(null, result);\r
-                };\r
-            })(obj[i]);\r
-        }\r
-    }\r
-};\r
-\r
-\r
-exports.formatStack = function (stack) {\r
-\r
-    var trace = [];\r
-    for (var i = 0, il = stack.length; i < il; ++i) {\r
-        var item = stack[i];\r
-        trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]);\r
-    }\r
-\r
-    return trace;\r
-};\r
-\r
-\r
-exports.formatTrace = function (trace) {\r
-\r
-    var display = [];\r
-\r
-    for (var i = 0, il = trace.length; i < il; ++i) {\r
-        var row = trace[i];\r
-        display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')');\r
-    }\r
-\r
-    return display;\r
-};\r
-\r
-\r
-exports.callStack = function (slice) {\r
-\r
-    // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi\r
-\r
-    var v8 = Error.prepareStackTrace;\r
-    Error.prepareStackTrace = function (err, stack) {\r
-\r
-        return stack;\r
-    };\r
-\r
-    var capture = {};\r
-    Error.captureStackTrace(capture, arguments.callee);\r
-    var stack = capture.stack;\r
-\r
-    Error.prepareStackTrace = v8;\r
-\r
-    var trace = exports.formatStack(stack);\r
-\r
-    if (slice) {\r
-        return trace.slice(slice);\r
-    }\r
-\r
-    return trace;\r
-};\r
-\r
-\r
-exports.displayStack = function (slice) {\r
-\r
-    var trace = exports.callStack(slice === undefined ? 1 : slice + 1);\r
-\r
-    return exports.formatTrace(trace);\r
-};\r
-\r
-\r
-exports.abortThrow = false;\r
-\r
-\r
-exports.abort = function (message, hideStack) {\r
-\r
-    if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) {\r
-        throw new Error(message || 'Unknown error');\r
-    }\r
-\r
-    var stack = '';\r
-    if (!hideStack) {\r
-        stack = exports.displayStack(1).join('\n\t');\r
-    }\r
-    console.log('ABORT: ' + message + '\n\t' + stack);\r
-    process.exit(1);\r
-};\r
-\r
-\r
-exports.assert = function (condition /*, msg1, msg2, msg3 */) {\r
-\r
-    if (condition) {\r
-        return;\r
-    }\r
-\r
-    var msgs = Array.prototype.slice.call(arguments, 1);\r
-    msgs = msgs.map(function (msg) {\r
-\r
-        return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : JSON.stringify(msg);\r
-    });\r
-    throw new Error(msgs.join(' ') || 'Unknown error');\r
-};\r
-\r
-\r
-exports.loadDirModules = function (path, excludeFiles, target) {      // target(filename, name, capName)\r
-\r
-    var exclude = {};\r
-    for (var i = 0, il = excludeFiles.length; i < il; ++i) {\r
-        exclude[excludeFiles[i] + '.js'] = true;\r
-    }\r
-\r
-    var files = Fs.readdirSync(path);\r
-    for (i = 0, il = files.length; i < il; ++i) {\r
-        var filename = files[i];\r
-        if (/\.js$/.test(filename) &&\r
-            !exclude[filename]) {\r
-\r
-            var name = filename.substr(0, filename.lastIndexOf('.'));\r
-            var capName = name.charAt(0).toUpperCase() + name.substr(1).toLowerCase();\r
-\r
-            if (typeof target !== 'function') {\r
-                target[capName] = require(path + '/' + name);\r
-            }\r
-            else {\r
-                target(path + '/' + name, name, capName);\r
-            }\r
-        }\r
-    }\r
-};\r
-\r
-\r
-exports.rename = function (obj, from, to) {\r
-\r
-    obj[to] = obj[from];\r
-    delete obj[from];\r
-};\r
-\r
-\r
-exports.Timer = function () {\r
-\r
-    this.reset();\r
-};\r
-\r
-\r
-exports.Timer.prototype.reset = function () {\r
-\r
-    this.ts = Date.now();\r
-};\r
-\r
-\r
-exports.Timer.prototype.elapsed = function () {\r
-\r
-    return Date.now() - this.ts;\r
-};\r
-\r
-\r
-// Load and parse package.json process root or given directory\r
-\r
-exports.loadPackage = function (dir) {\r
-\r
-    var result = {};\r
-    var filepath = (dir || process.env.PWD) + '/package.json';\r
-    if (Fs.existsSync(filepath)) {\r
-        try {\r
-            result = JSON.parse(Fs.readFileSync(filepath));\r
-        }\r
-        catch (e) { }\r
-    }\r
-\r
-    return result;\r
-};\r
-\r
-\r
-// Escape string for Regex construction\r
-\r
-exports.escapeRegex = function (string) {\r
-\r
-    // Escape ^$.*+-?=!:|\/()[]{},\r
-    return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&');\r
-};\r
-\r
-\r
-// Return an error as first argument of a callback\r
-\r
-exports.toss = function (condition /*, [message], next */) {\r
-\r
-    var message = (arguments.length === 3 ? arguments[1] : '');\r
-    var next = (arguments.length === 3 ? arguments[2] : arguments[1]);\r
-\r
-    var err = (message instanceof Error ? message : (message ? new Error(message) : (condition instanceof Error ? condition : new Error())));\r
-\r
-    if (condition instanceof Error ||\r
-        !condition) {\r
-\r
-        return next(err);\r
-    }\r
-};\r
-\r
-\r
-// Base64url (RFC 4648) encode\r
-\r
-exports.base64urlEncode = function (value) {\r
-\r
-    return (new Buffer(value, 'binary')).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');\r
-};\r
-\r
-\r
-// Base64url (RFC 4648) decode\r
-\r
-exports.base64urlDecode = function (encoded) {\r
-\r
-    if (encoded &&\r
-        !encoded.match(/^[\w\-]*$/)) {\r
-\r
-        return new Error('Invalid character');\r
-    }\r
-\r
-    try {\r
-        return (new Buffer(encoded.replace(/-/g, '+').replace(/:/g, '/'), 'base64')).toString('binary');\r
-    }\r
-    catch (err) {\r
-        return err;\r
-    }\r
-};\r
-\r
-\r
-// Escape attribute value for use in HTTP header\r
-\r
-exports.escapeHeaderAttribute = function (attribute) {\r
-\r
-    // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, "\r
-\r
-    exports.assert(attribute.match(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/), 'Bad attribute value (' + attribute + ')');\r
-\r
-    return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');                             // Escape quotes and slash\r
-};\r
-\r
-\r
-exports.escapeHtml = function (string) {\r
-\r
-    return Escape.escapeHtml(string);\r
-};\r
-\r
-\r
-exports.escapeJavaScript = function (string) {\r
-\r
-    return Escape.escapeJavaScript(string);\r
-};\r
-\r
-\r
-/*\r
-var event = {\r
-    timestamp: now.getTime(),\r
-    tags: ['tag'],\r
-    data: { some: 'data' }\r
-};\r
-*/\r
-\r
-exports.consoleFunc = console.log;\r
-\r
-exports.printEvent = function (event) {\r
-\r
-    var pad = function (value) {\r
-\r
-        return (value < 10 ? '0' : '') + value;\r
-    };\r
-\r
-    var now = new Date(event.timestamp);\r
-    var timestring = (now.getYear() - 100).toString() +\r
-        pad(now.getMonth() + 1) +\r
-        pad(now.getDate()) +\r
-        '/' +\r
-        pad(now.getHours()) +\r
-        pad(now.getMinutes()) +\r
-        pad(now.getSeconds()) +\r
-        '.' +\r
-        now.getMilliseconds();\r
-\r
-    var data = event.data;\r
-    if (typeof event.data !== 'string') {\r
-        try {\r
-            data = JSON.stringify(event.data);\r
-        }\r
-        catch (e) {\r
-            data = 'JSON Error: ' + e.message;\r
-        }\r
-    }\r
-\r
-    var output = timestring + ', ' + event.tags[0] + ', ' + data;\r
-    exports.consoleFunc(output);\r
-};\r
-\r
-\r
-exports.nextTick = function (callback) {\r
-\r
-    return function () {\r
-\r
-        var args = arguments;\r
-        process.nextTick(function () {\r
-\r
-            callback.apply(null, args);\r
-        });\r
-    };\r
-};\r
+// Load modules
+
+var Crypto = require('crypto');
+var Path = require('path');
+var Util = require('util');
+var Escape = require('./escape');
+
+
+// Declare internals
+
+var internals = {};
+
+
+// Clone object or array
+
+exports.clone = function (obj, seen) {
+
+    if (typeof obj !== 'object' ||
+        obj === null) {
+
+        return obj;
+    }
+
+    seen = seen || { orig: [], copy: [] };
+
+    var lookup = seen.orig.indexOf(obj);
+    if (lookup !== -1) {
+        return seen.copy[lookup];
+    }
+
+    var newObj;
+    var cloneDeep = false;
+
+    if (!Array.isArray(obj)) {
+        if (Buffer.isBuffer(obj)) {
+            newObj = new Buffer(obj);
+        }
+        else if (obj instanceof Date) {
+            newObj = new Date(obj.getTime());
+        }
+        else if (obj instanceof RegExp) {
+            newObj = new RegExp(obj);
+        }
+        else {
+            var proto = Object.getPrototypeOf(obj);
+            if (!proto || proto.isImmutable) {
+                newObj = obj;
+            }
+            else {
+                newObj = Object.create(proto);
+                cloneDeep = true;
+            }
+        }
+    }
+    else {
+        newObj = [];
+        cloneDeep = true;
+    }
+
+    seen.orig.push(obj);
+    seen.copy.push(newObj);
+
+    if (cloneDeep) {
+        for (var i in obj) {
+            if (obj.hasOwnProperty(i)) {
+                var descriptor = Object.getOwnPropertyDescriptor(obj, i);
+                if (descriptor.get ||
+                    descriptor.set) {
+
+                    Object.defineProperty(newObj, i, descriptor);
+                }
+                else {
+                    newObj[i] = exports.clone(obj[i], seen);
+                }
+            }
+        }
+    }
+
+    return newObj;
+};
+
+
+// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied
+
+exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) {
+
+    exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object');
+    exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object');
+
+    if (!source) {
+        return target;
+    }
+
+    if (Array.isArray(source)) {
+        exports.assert(Array.isArray(target), 'Cannot merge array onto an object');
+        if (isMergeArrays === false) {                                                  // isMergeArrays defaults to true
+            target.length = 0;                                                          // Must not change target assignment
+        }
+
+        for (var i = 0, il = source.length; i < il; ++i) {
+            target.push(exports.clone(source[i]));
+        }
+
+        return target;
+    }
+
+    var keys = Object.keys(source);
+    for (var k = 0, kl = keys.length; k < kl; ++k) {
+        var key = keys[k];
+        var value = source[key];
+        if (value &&
+            typeof value === 'object') {
+
+            if (!target[key] ||
+                typeof target[key] !== 'object' ||
+                (Array.isArray(target[key]) ^ Array.isArray(value)) ||
+                value instanceof Date ||
+                Buffer.isBuffer(value) ||
+                value instanceof RegExp) {
+
+                target[key] = exports.clone(value);
+            }
+            else {
+                exports.merge(target[key], value, isNullOverride, isMergeArrays);
+            }
+        }
+        else {
+            if (value !== null &&
+                value !== undefined) {                              // Explicit to preserve empty strings
+
+                target[key] = value;
+            }
+            else if (isNullOverride !== false) {                    // Defaults to true
+                target[key] = value;
+            }
+        }
+    }
+
+    return target;
+};
+
+
+// Apply options to a copy of the defaults
+
+exports.applyToDefaults = function (defaults, options) {
+
+    exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
+    exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');
+
+    if (!options) {                                                 // If no options, return null
+        return null;
+    }
+
+    var copy = exports.clone(defaults);
+
+    if (options === true) {                                         // If options is set to true, use defaults
+        return copy;
+    }
+
+    return exports.merge(copy, options, false, false);
+};
+
+
+// Clone an object except for the listed keys which are shallow copied
+
+exports.cloneWithShallow = function (source, keys) {
+
+    if (!source ||
+        typeof source !== 'object') {
+
+        return source;
+    }
+
+    var storage = internals.store(source, keys);    // Move shallow copy items to storage
+    var copy = exports.clone(source);               // Deep copy the rest
+    internals.restore(copy, source, storage);       // Shallow copy the stored items and restore
+    return copy;
+};
+
+
+internals.store = function (source, keys) {
+
+    var storage = {};
+    for (var i = 0, il = keys.length; i < il; ++i) {
+        var key = keys[i];
+        var value = exports.reach(source, key);
+        if (value !== undefined) {
+            storage[key] = value;
+            internals.reachSet(source, key, undefined);
+        }
+    }
+
+    return storage;
+};
+
+
+internals.restore = function (copy, source, storage) {
+
+    var keys = Object.keys(storage);
+    for (var i = 0, il = keys.length; i < il; ++i) {
+        var key = keys[i];
+        internals.reachSet(copy, key, storage[key]);
+        internals.reachSet(source, key, storage[key]);
+    }
+};
+
+
+internals.reachSet = function (obj, key, value) {
+
+    var path = key.split('.');
+    var ref = obj;
+    for (var i = 0, il = path.length; i < il; ++i) {
+        var segment = path[i];
+        if (i + 1 === il) {
+            ref[segment] = value;
+        }
+
+        ref = ref[segment];
+    }
+};
+
+
+// Apply options to defaults except for the listed keys which are shallow copied from option without merging
+
+exports.applyToDefaultsWithShallow = function (defaults, options, keys) {
+
+    exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
+    exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');
+    exports.assert(keys && Array.isArray(keys), 'Invalid keys');
+
+    if (!options) {                                                 // If no options, return null
+        return null;
+    }
+
+    var copy = exports.cloneWithShallow(defaults, keys);
+
+    if (options === true) {                                         // If options is set to true, use defaults
+        return copy;
+    }
+
+    var storage = internals.store(options, keys);   // Move shallow copy items to storage
+    exports.merge(copy, options, false, false);     // Deep copy the rest
+    internals.restore(copy, options, storage);      // Shallow copy the stored items and restore
+    return copy;
+};
+
+
+// Deep object or array comparison
+
+exports.deepEqual = function (obj, ref, seen) {
+
+    var type = typeof obj;
+    if (type !== typeof ref) {
+        return false;
+    }
+
+    if (type !== 'object' ||
+        obj === null ||
+        ref === null) {
+
+        if (obj === ref) {                                                      // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql
+            return obj !== 0 || 1 / obj === 1 / ref;        // -0 / +0
+        }
+
+        return obj !== obj && ref !== ref;                  // NaN
+    }
+
+    seen = seen || [];
+    if (seen.indexOf(obj) !== -1) {
+        return true;                            // If previous comparison failed, it would have stopped execution
+    }
+
+    seen.push(obj);
+
+    if (Array.isArray(obj)) {
+        if (!Array.isArray(ref)) {
+            return false;
+        }
+
+        if (obj.length !== ref.length) {
+            return false;
+        }
+
+        for (var i = 0, il = obj.length; i < il; ++i) {
+            if (!exports.deepEqual(obj[i], ref[i])) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    if (Buffer.isBuffer(obj)) {
+        if (!Buffer.isBuffer(ref)) {
+            return false;
+        }
+
+        if (obj.length !== ref.length) {
+            return false;
+        }
+
+        for (var j = 0, jl = obj.length; j < jl; ++j) {
+            if (obj[j] !== ref[j]) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    if (obj instanceof Date) {
+        return (ref instanceof Date && obj.getTime() === ref.getTime());
+    }
+
+    if (obj instanceof RegExp) {
+        return (ref instanceof RegExp && obj.toString() === ref.toString());
+    }
+
+    if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) {
+        return false;
+    }
+
+    var keys = Object.keys(obj);
+    for (var k = 0, kl = keys.length; k < kl; ++k) {
+        var key = keys[k];
+        var descriptor = Object.getOwnPropertyDescriptor(obj, key);
+        if (descriptor.get) {
+            if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), seen)) {
+                return false;
+            }
+        }
+        else if (!exports.deepEqual(obj[key], ref[key], seen)) {
+            return false;
+        }
+    }
+
+    return true;
+};
+
+
+// Remove duplicate items from array
+
+exports.unique = function (array, key) {
+
+    var index = {};
+    var result = [];
+
+    for (var i = 0, il = array.length; i < il; ++i) {
+        var id = (key ? array[i][key] : array[i]);
+        if (index[id] !== true) {
+
+            result.push(array[i]);
+            index[id] = true;
+        }
+    }
+
+    return result;
+};
+
+
+// Convert array into object
+
+exports.mapToObject = function (array, key) {
+
+    if (!array) {
+        return null;
+    }
+
+    var obj = {};
+    for (var i = 0, il = array.length; i < il; ++i) {
+        if (key) {
+            if (array[i][key]) {
+                obj[array[i][key]] = true;
+            }
+        }
+        else {
+            obj[array[i]] = true;
+        }
+    }
+
+    return obj;
+};
+
+
+// Find the common unique items in two arrays
+
+exports.intersect = function (array1, array2, justFirst) {
+
+    if (!array1 || !array2) {
+        return [];
+    }
+
+    var common = [];
+    var hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1);
+    var found = {};
+    for (var i = 0, il = array2.length; i < il; ++i) {
+        if (hash[array2[i]] && !found[array2[i]]) {
+            if (justFirst) {
+                return array2[i];
+            }
+
+            common.push(array2[i]);
+            found[array2[i]] = true;
+        }
+    }
+
+    return (justFirst ? null : common);
+};
+
+
+// Test if the reference contains the values
+
+exports.contain = function (ref, values, options) {
+
+    /*
+        string -> string(s)
+        array -> item(s)
+        object -> key(s)
+        object -> object (key:value)
+    */
+
+    var valuePairs = null;
+    if (typeof ref === 'object' &&
+        typeof values === 'object' &&
+        !Array.isArray(ref) &&
+        !Array.isArray(values)) {
+
+        valuePairs = values;
+        values = Object.keys(values);
+    }
+    else {
+        values = [].concat(values);
+    }
+
+    options = options || {};            // deep, once, only, part
+
+    exports.assert(arguments.length >= 2, 'Insufficient arguments');
+    exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object');
+    exports.assert(values.length, 'Values array cannot be empty');
+
+    var compare = options.deep ? exports.deepEqual : function (a, b) { return a === b; };
+
+    var misses = false;
+    var matches = new Array(values.length);
+    for (var i = 0, il = matches.length; i < il; ++i) {
+        matches[i] = 0;
+    }
+
+    if (typeof ref === 'string') {
+        var pattern = '(';
+        for (i = 0, il = values.length; i < il; ++i) {
+            var value = values[i];
+            exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value');
+            pattern += (i ? '|' : '') + exports.escapeRegex(value);
+        }
+
+        var regex = new RegExp(pattern + ')', 'g');
+        var leftovers = ref.replace(regex, function ($0, $1) {
+
+            var index = values.indexOf($1);
+            ++matches[index];
+            return '';          // Remove from string
+        });
+
+        misses = !!leftovers;
+    }
+    else if (Array.isArray(ref)) {
+        for (i = 0, il = ref.length; i < il; ++i) {
+            for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) {
+                matched = compare(ref[i], values[j]) && j;
+            }
+
+            if (matched !== false) {
+                ++matches[matched];
+            }
+            else {
+                misses = true;
+            }
+        }
+    }
+    else {
+        var keys = Object.keys(ref);
+        for (i = 0, il = keys.length; i < il; ++i) {
+            var key = keys[i];
+            var pos = values.indexOf(key);
+            if (pos !== -1) {
+                if (valuePairs &&
+                    !compare(ref[key], valuePairs[key])) {
+
+                    return false;
+                }
+
+                ++matches[pos];
+            }
+            else {
+                misses = true;
+            }
+        }
+    }
+
+    var result = false;
+    for (i = 0, il = matches.length; i < il; ++i) {
+        result = result || !!matches[i];
+        if ((options.once && matches[i] > 1) ||
+            (!options.part && !matches[i])) {
+
+            return false;
+        }
+    }
+
+    if (options.only &&
+        misses) {
+
+        return false;
+    }
+
+    return result;
+};
+
+
+// Flatten array
+
+exports.flatten = function (array, target) {
+
+    var result = target || [];
+
+    for (var i = 0, il = array.length; i < il; ++i) {
+        if (Array.isArray(array[i])) {
+            exports.flatten(array[i], result);
+        }
+        else {
+            result.push(array[i]);
+        }
+    }
+
+    return result;
+};
+
+
+// Convert an object key chain string ('a.b.c') to reference (object[a][b][c])
+
+exports.reach = function (obj, chain, options) {
+
+    options = options || {};
+    if (typeof options === 'string') {
+        options = { separator: options };
+    }
+
+    var path = chain.split(options.separator || '.');
+    var ref = obj;
+    for (var i = 0, il = path.length; i < il; ++i) {
+        var key = path[i];
+        if (key[0] === '-' && Array.isArray(ref)) {
+            key = key.slice(1, key.length);
+            key = ref.length - key;
+        }
+
+        if (!ref ||
+            !ref.hasOwnProperty(key) ||
+            (typeof ref !== 'object' && options.functions === false)) {         // Only object and function can have properties
+
+            exports.assert(!options.strict || i + 1 === il, 'Missing segment', key, 'in reach path ', chain);
+            exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain);
+            ref = options.default;
+            break;
+        }
+
+        ref = ref[key];
+    }
+
+    return ref;
+};
+
+
+exports.formatStack = function (stack) {
+
+    var trace = [];
+    for (var i = 0, il = stack.length; i < il; ++i) {
+        var item = stack[i];
+        trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]);
+    }
+
+    return trace;
+};
+
+
+exports.formatTrace = function (trace) {
+
+    var display = [];
+
+    for (var i = 0, il = trace.length; i < il; ++i) {
+        var row = trace[i];
+        display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')');
+    }
+
+    return display;
+};
+
+
+exports.callStack = function (slice) {
+
+    // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
+
+    var v8 = Error.prepareStackTrace;
+    Error.prepareStackTrace = function (err, stack) {
+
+        return stack;
+    };
+
+    var capture = {};
+    Error.captureStackTrace(capture, arguments.callee);     /*eslint no-caller:0 */
+    var stack = capture.stack;
+
+    Error.prepareStackTrace = v8;
+
+    var trace = exports.formatStack(stack);
+
+    if (slice) {
+        return trace.slice(slice);
+    }
+
+    return trace;
+};
+
+
+exports.displayStack = function (slice) {
+
+    var trace = exports.callStack(slice === undefined ? 1 : slice + 1);
+
+    return exports.formatTrace(trace);
+};
+
+
+exports.abortThrow = false;
+
+
+exports.abort = function (message, hideStack) {
+
+    if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) {
+        throw new Error(message || 'Unknown error');
+    }
+
+    var stack = '';
+    if (!hideStack) {
+        stack = exports.displayStack(1).join('\n\t');
+    }
+    console.log('ABORT: ' + message + '\n\t' + stack);
+    process.exit(1);
+};
+
+
+exports.assert = function (condition /*, msg1, msg2, msg3 */) {
+
+    if (condition) {
+        return;
+    }
+
+    if (arguments.length === 2 && arguments[1] instanceof Error) {
+        throw arguments[1];
+    }
+
+    var msgs = [];
+    for (var i = 1, il = arguments.length; i < il; ++i) {
+        if (arguments[i] !== '') {
+            msgs.push(arguments[i]);            // Avoids Array.slice arguments leak, allowing for V8 optimizations
+        }
+    }
+
+    msgs = msgs.map(function (msg) {
+
+        return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg);
+    });
+    throw new Error(msgs.join(' ') || 'Unknown error');
+};
+
+
+exports.Timer = function () {
+
+    this.ts = 0;
+    this.reset();
+};
+
+
+exports.Timer.prototype.reset = function () {
+
+    this.ts = Date.now();
+};
+
+
+exports.Timer.prototype.elapsed = function () {
+
+    return Date.now() - this.ts;
+};
+
+
+exports.Bench = function () {
+
+    this.ts = 0;
+    this.reset();
+};
+
+
+exports.Bench.prototype.reset = function () {
+
+    this.ts = exports.Bench.now();
+};
+
+
+exports.Bench.prototype.elapsed = function () {
+
+    return exports.Bench.now() - this.ts;
+};
+
+
+exports.Bench.now = function () {
+
+    var ts = process.hrtime();
+    return (ts[0] * 1e3) + (ts[1] / 1e6);
+};
+
+
+// Escape string for Regex construction
+
+exports.escapeRegex = function (string) {
+
+    // Escape ^$.*+-?=!:|\/()[]{},
+    return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&');
+};
+
+
+// Base64url (RFC 4648) encode
+
+exports.base64urlEncode = function (value, encoding) {
+
+    var buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary'));
+    return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
+};
+
+
+// Base64url (RFC 4648) decode
+
+exports.base64urlDecode = function (value, encoding) {
+
+    if (value &&
+        !/^[\w\-]*$/.test(value)) {
+
+        return new Error('Invalid character');
+    }
+
+    try {
+        var buf = new Buffer(value, 'base64');
+        return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary'));
+    }
+    catch (err) {
+        return err;
+    }
+};
+
+
+// Escape attribute value for use in HTTP header
+
+exports.escapeHeaderAttribute = function (attribute) {
+
+    // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, "
+
+    exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')');
+
+    return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');                             // Escape quotes and slash
+};
+
+
+exports.escapeHtml = function (string) {
+
+    return Escape.escapeHtml(string);
+};
+
+
+exports.escapeJavaScript = function (string) {
+
+    return Escape.escapeJavaScript(string);
+};
+
+
+exports.nextTick = function (callback) {
+
+    return function () {
+
+        var args = arguments;
+        process.nextTick(function () {
+
+            callback.apply(null, args);
+        });
+    };
+};
+
+
+exports.once = function (method) {
+
+    if (method._hoekOnce) {
+        return method;
+    }
+
+    var once = false;
+    var wrapped = function () {
+
+        if (!once) {
+            once = true;
+            method.apply(null, arguments);
+        }
+    };
+
+    wrapped._hoekOnce = true;
+
+    return wrapped;
+};
+
+
+exports.isAbsolutePath = function (path, platform) {
+
+    if (!path) {
+        return false;
+    }
+
+    if (Path.isAbsolute) {                      // node >= 0.11
+        return Path.isAbsolute(path);
+    }
+
+    platform = platform || process.platform;
+
+    // Unix
+
+    if (platform !== 'win32') {
+        return path[0] === '/';
+    }
+
+    // Windows
+
+    return !!/^(?:[a-zA-Z]:[\\\/])|(?:[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/])/.test(path);        // C:\ or \\something\something
+};
+
+
+exports.isInteger = function (value) {
+
+    return (typeof value === 'number' &&
+            parseFloat(value) === parseInt(value, 10) &&
+            !isNaN(value));
+};
+
+
+exports.ignore = function () { };
+
+
+exports.inherits = Util.inherits;
+
+
+exports.format = Util.format;
+
+
+exports.transform = function (source, transform, options) {
+
+    exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source object: must be null, undefined, or an object');
+
+    var result = {};
+    var keys = Object.keys(transform);
+
+    for (var k = 0, kl = keys.length; k < kl; ++k) {
+        var key = keys[k];
+        var path = key.split('.');
+        var sourcePath = transform[key];
+
+        exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings');
+
+        var segment;
+        var res = result;
+
+        while (path.length > 1) {
+            segment = path.shift();
+            if (!res[segment]) {
+                res[segment] = {};
+            }
+            res = res[segment];
+        }
+        segment = path.shift();
+        res[segment] = exports.reach(source, sourcePath, options);
+    }
+
+    return result;
+};
+
+
+exports.uniqueFilename = function (path, extension) {
+
+    if (extension) {
+        extension = extension[0] !== '.' ? '.' + extension : extension;
+    }
+    else {
+        extension = '';
+    }
+
+    path = Path.resolve(path);
+    var name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension;
+    return Path.join(path, name);
+};
+
+
+exports.stringify = function () {
+
+    try {
+        return JSON.stringify.apply(null, arguments);
+    }
+    catch (err) {
+        return '[Cannot display object: ' + err.message + ']';
+    }
+};
+
+
+exports.shallow = function (source) {
+
+    var target = {};
+    var keys = Object.keys(source);
+    for (var i = 0, il = keys.length; i < il; ++i) {
+        var key = keys[i];
+        target[key] = source[key];
+    }
+
+    return target;
+};
old mode 100755 (executable)
new mode 100644 (file)
index 789de2a..53b174e
@@ -1,21 +1,10 @@
 {
   "name": "hoek",
   "description": "General purpose node utilities",
-  "version": "0.9.1",
-  "author": {
-    "name": "Eran Hammer",
-    "email": "eran@hueniverse.com",
-    "url": "http://hueniverse.com"
-  },
-  "contributors": [
-    {
-      "name": "Van Nguyen",
-      "email": "the.gol.effect@gmail.com"
-    }
-  ],
+  "version": "2.11.0",
   "repository": {
     "type": "git",
-    "url": "git://github.com/spumko/hoek"
+    "url": "git://github.com/hapijs/hoek"
   },
   "main": "index",
   "keywords": [
@@ -26,8 +15,8 @@
   },
   "dependencies": {},
   "devDependencies": {
-    "lab": "0.1.x",
-    "complexity-report": "0.x.x"
+    "code": "1.x.x",
+    "lab": "5.x.x"
   },
   "scripts": {
     "test": "make test-cov"
   "licenses": [
     {
       "type": "BSD",
-      "url": "http://github.com/spumko/hoek/raw/master/LICENSE"
+      "url": "http://github.com/hapijs/hoek/raw/master/LICENSE"
     }
   ],
-  "_id": "hoek@0.9.1",
-  "dist": {
-    "shasum": "3d322462badf07716ea7eb85baf88079cddce505",
-    "tarball": "http://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz"
+  "gitHead": "6f034aa12206f2ab740a9ea6ca64a4d5c7b7dfba",
+  "bugs": {
+    "url": "https://github.com/hapijs/hoek/issues"
   },
-  "_from": "hoek@>=0.9.0 <0.10.0",
-  "_npmVersion": "1.2.18",
+  "homepage": "https://github.com/hapijs/hoek",
+  "_id": "hoek@2.11.0",
+  "_shasum": "e588ec66a6b405b0e7140308720e1e1cd4f035b7",
+  "_from": "hoek@>=2.0.0 <3.0.0",
+  "_npmVersion": "2.1.9",
+  "_nodeVersion": "0.10.32",
   "_npmUser": {
-    "name": "hueniverse",
-    "email": "eran@hueniverse.com"
+    "name": "nlf",
+    "email": "quitlahok@gmail.com"
   },
   "maintainers": [
     {
       "email": "eran@hueniverse.com"
     },
     {
-      "name": "thegoleffect",
-      "email": "thegoleffect@gmail.com"
+      "name": "wyatt",
+      "email": "wpreul@gmail.com"
+    },
+    {
+      "name": "nlf",
+      "email": "quitlahok@gmail.com"
     }
   ],
-  "directories": {},
-  "_shasum": "3d322462badf07716ea7eb85baf88079cddce505",
-  "_resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
-  "bugs": {
-    "url": "https://github.com/spumko/hoek/issues"
+  "dist": {
+    "shasum": "e588ec66a6b405b0e7140308720e1e1cd4f035b7",
+    "tarball": "http://registry.npmjs.org/hoek/-/hoek-2.11.0.tgz"
   },
-  "readme": "ERROR: No README data found!",
-  "homepage": "https://github.com/spumko/hoek"
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.11.0.tgz",
+  "readme": "ERROR: No README data found!"
 }
old mode 100644 (file)
new mode 100755 (executable)
index 4dddd77..a5d048f
@@ -1,86 +1,88 @@
-// Load modules\r
-\r
-var Lab = require('lab');\r
-var Hoek = require('../lib');\r
-\r
-\r
-// Declare internals\r
-\r
-var internals = {};\r
-\r
-\r
-// Test shortcuts\r
-\r
-var expect = Lab.expect;\r
-var before = Lab.before;\r
-var after = Lab.after;\r
-var describe = Lab.experiment;\r
-var it = Lab.test;\r
-\r
-\r
-describe('Hoek', function () {\r
-\r
-    describe('#escapeJavaScript', function () {\r
-\r
-        it('encodes / characters', function (done) {\r
-\r
-            var encoded = Hoek.escapeJavaScript('<script>alert(1)</script>');\r
-            expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e');\r
-            done();\r
-        });\r
-\r
-        it('encodes \' characters', function (done) {\r
-\r
-            var encoded = Hoek.escapeJavaScript('something(\'param\')');\r
-            expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29');\r
-            done();\r
-        });\r
-\r
-        it('encodes large unicode characters with the correct padding', function (done) {\r
-\r
-            var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000));\r
-            expect(encoded).to.equal('\\u0500\\u1000');\r
-            done();\r
-        });\r
-\r
-        it('doesn\'t throw an exception when passed null', function (done) {\r
-\r
-            var encoded = Hoek.escapeJavaScript(null);\r
-            expect(encoded).to.equal('');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#escapeHtml', function () {\r
-\r
-        it('encodes / characters', function (done) {\r
-\r
-            var encoded = Hoek.escapeHtml('<script>alert(1)</script>');\r
-            expect(encoded).to.equal('&lt;script&gt;alert&#x28;1&#x29;&lt;&#x2f;script&gt;');\r
-            done();\r
-        });\r
-\r
-        it('encodes < and > as named characters', function (done) {\r
-\r
-            var encoded = Hoek.escapeHtml('<script><>');\r
-            expect(encoded).to.equal('&lt;script&gt;&lt;&gt;');\r
-            done();\r
-        });\r
-\r
-        it('encodes large unicode characters', function (done) {\r
-\r
-            var encoded = Hoek.escapeHtml(String.fromCharCode(500) + String.fromCharCode(1000));\r
-            expect(encoded).to.equal('&#500;&#1000;');\r
-            done();\r
-        });\r
-\r
-        it('doesn\'t throw an exception when passed null', function (done) {\r
-\r
-            var encoded = Hoek.escapeHtml(null);\r
-            expect(encoded).to.equal('');\r
-            done();\r
-        });\r
-    });\r
-});\r
-\r
-\r
+// Load modules
+
+var Code = require('code');
+var Hoek = require('../lib');
+var Lab = require('lab');
+
+
+// Declare internals
+
+var internals = {};
+
+
+// Test shortcuts
+
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
+
+
+describe('escapeJavaScript()', function () {
+
+    it('encodes / characters', function (done) {
+
+        var encoded = Hoek.escapeJavaScript('<script>alert(1)</script>');
+        expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e');
+        done();
+    });
+
+    it('encodes \' characters', function (done) {
+
+        var encoded = Hoek.escapeJavaScript('something(\'param\')');
+        expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29');
+        done();
+    });
+
+    it('encodes large unicode characters with the correct padding', function (done) {
+
+        var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000));
+        expect(encoded).to.equal('\\u0500\\u1000');
+        done();
+    });
+
+    it('doesn\'t throw an exception when passed null', function (done) {
+
+        var encoded = Hoek.escapeJavaScript(null);
+        expect(encoded).to.equal('');
+        done();
+    });
+});
+
+describe('escapeHtml()', function () {
+
+    it('encodes / characters', function (done) {
+
+        var encoded = Hoek.escapeHtml('<script>alert(1)</script>');
+        expect(encoded).to.equal('&lt;script&gt;alert&#x28;1&#x29;&lt;&#x2f;script&gt;');
+        done();
+    });
+
+    it('encodes < and > as named characters', function (done) {
+
+        var encoded = Hoek.escapeHtml('<script><>');
+        expect(encoded).to.equal('&lt;script&gt;&lt;&gt;');
+        done();
+    });
+
+    it('encodes large unicode characters', function (done) {
+
+        var encoded = Hoek.escapeHtml(String.fromCharCode(500) + String.fromCharCode(1000));
+        expect(encoded).to.equal('&#500;&#1000;');
+        done();
+    });
+
+    it('doesn\'t throw an exception when passed null', function (done) {
+
+        var encoded = Hoek.escapeHtml(null);
+        expect(encoded).to.equal('');
+        done();
+    });
+
+    it('encodes {} characters', function (done) {
+
+        var encoded = Hoek.escapeHtml('{}');
+        expect(encoded).to.equal('&#x7b;&#x7d;');
+        done();
+    });
+});
index c40e3ad9a4a9355abf94597edd399311bd9fed09..aad04356d53fe658a187416891a21c18ddcf66ac 100755 (executable)
-// Load modules\r
-\r
-var Lab = require('lab');\r
-var Hoek = require('../lib');\r
-\r
-\r
-// Declare internals\r
-\r
-var internals = {};\r
-\r
-\r
-// Test shortcuts\r
-\r
-var expect = Lab.expect;\r
-var before = Lab.before;\r
-var after = Lab.after;\r
-var describe = Lab.experiment;\r
-var it = Lab.test;\r
-\r
-\r
-describe('Hoek', function () {\r
-\r
-    var nestedObj = {\r
-        v: [7,8,9],\r
-        w: /^something$/igm,\r
-        x: {\r
-            a: [1, 2, 3],\r
-            b: 123456,\r
-            c: new Date(),\r
-            d: /hi/igm,\r
-            e: /hello/\r
-        },\r
-        y: 'y',\r
-        z: new Date()\r
-    };\r
-\r
-    var dupsArray = [nestedObj, { z: 'z' }, nestedObj];\r
-    var reducedDupsArray = [nestedObj, { z: 'z' }];\r
-\r
-    describe('#clone', function () {\r
-\r
-        it('should clone a nested object', function (done) {\r
-\r
-            var a = nestedObj;\r
-            var b = Hoek.clone(a);\r
-\r
-            expect(a).to.deep.equal(b);\r
-            expect(a.z.getTime()).to.equal(b.z.getTime());\r
-            done();\r
-        });\r
-\r
-        it('should clone a null object', function (done) {\r
-\r
-            var b = Hoek.clone(null);\r
-\r
-            expect(b).to.equal(null);\r
-            done();\r
-        });\r
-\r
-        it('should not convert undefined properties to null', function (done) {\r
-\r
-            var obj = { something: undefined };\r
-            var b = Hoek.clone(obj);\r
-\r
-            expect(typeof b.something).to.equal('undefined');\r
-            done();\r
-        });\r
-\r
-        it('should not throw on circular reference', function (done) {\r
-\r
-            var a = {};\r
-            a.x = a;\r
-\r
-            var test = (function () {\r
-\r
-                var b = Hoek.clone(a);\r
-            });\r
-\r
-            expect(test).to.not.throw();\r
-            done();\r
-        });\r
-\r
-        it('should properly clone circular reference', function (done) {\r
-\r
-            var x = {\r
-                'z': new Date()\r
-            };\r
-            x.y = x;\r
-\r
-            var b = Hoek.clone(x);\r
-            expect(Object.keys(b.y)).to.deep.equal(Object.keys(x))\r
-            expect(b.z).to.not.equal(x.z);\r
-            expect(b.y).to.not.equal(x.y);\r
-            expect(b.y.z).to.not.equal(x.y.z);\r
-            expect(b.y).to.equal(b);\r
-            expect(b.y.y.y.y).to.equal(b);\r
-            done();\r
-        });\r
-\r
-        it('should properly clone deeply nested object', function (done) {\r
-\r
-            var a = {\r
-                x: {\r
-                    y: {\r
-                        a: [1, 2, 3],\r
-                        b: 123456,\r
-                        c: new Date(),\r
-                        d: /hi/igm,\r
-                        e: /hello/\r
-                    },\r
-                }\r
-            };\r
-\r
-            var b = Hoek.clone(a);\r
-\r
-            expect(a).to.deep.equal(b);\r
-            expect(a.x.y.c.getTime()).to.equal(b.x.y.c.getTime());\r
-            done();\r
-        });\r
-\r
-        it('should properly clone arrays', function (done) {\r
-\r
-            var a = [1,2,3];\r
-\r
-            var b = Hoek.clone(a);\r
-\r
-            expect(a).to.deep.equal(b);\r
-            done();\r
-        });\r
-\r
-        it('should perform actual copy for shallow keys (no pass by reference)', function (done) {\r
-\r
-            var x = Hoek.clone(nestedObj);\r
-            var y = Hoek.clone(nestedObj);\r
-\r
-            // Date\r
-            expect(x.z).to.not.equal(nestedObj.z);\r
-            expect(x.z).to.not.equal(y.z);\r
-\r
-            // Regex\r
-            expect(x.w).to.not.equal(nestedObj.w);\r
-            expect(x.w).to.not.equal(y.w);\r
-\r
-            // Array\r
-            expect(x.v).to.not.equal(nestedObj.v);\r
-            expect(x.v).to.not.equal(y.v);\r
-\r
-            // Immutable(s)\r
-            x.y = 5;\r
-            expect(x.y).to.not.equal(nestedObj.y);\r
-            expect(x.y).to.not.equal(y.y);\r
-\r
-            done();\r
-        });\r
-\r
-        it('should perform actual copy for deep keys (no pass by reference)', function (done) {\r
-\r
-            var x = Hoek.clone(nestedObj);\r
-            var y = Hoek.clone(nestedObj);\r
-\r
-            expect(x.x.c).to.not.equal(nestedObj.x.c);\r
-            expect(x.x.c).to.not.equal(y.x.c);\r
-\r
-            expect(x.x.c.getTime()).to.equal(nestedObj.x.c.getTime());\r
-            expect(x.x.c.getTime()).to.equal(y.x.c.getTime());\r
-            done();\r
-        });\r
-\r
-        it('copies functions with properties', function (done) {\r
-\r
-            var a = {\r
-                x: function () { return 1; },\r
-                y: {}\r
-            };\r
-            a.x.z = 'string in function';\r
-            a.x.v = function () { return 2; };\r
-            a.y.u = a.x;\r
-\r
-            var b = Hoek.clone(a);\r
-            expect(b.x()).to.equal(1);\r
-            expect(b.x.v()).to.equal(2);\r
-            expect(b.y.u).to.equal(b.x);\r
-            expect(b.x.z).to.equal('string in function');\r
-            done();\r
-        });\r
-\r
-        it('should copy a buffer', function(done){\r
-            var tls = {\r
-                key: new Buffer([1,2,3,4,5]),\r
-                cert: new Buffer([1,2,3,4,5,6,10])\r
-            }\r
-\r
-            copiedTls = Hoek.clone(tls);\r
-            expect(Buffer.isBuffer(copiedTls.key)).to.equal(true);\r
-            expect(JSON.stringify(copiedTls.key)).to.equal(JSON.stringify(tls.key))\r
-            expect(Buffer.isBuffer(copiedTls.cert)).to.equal(true);\r
-            expect(JSON.stringify(copiedTls.cert)).to.equal(JSON.stringify(tls.cert))\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#merge', function () {\r
-\r
-        it('does not throw if source is null', function (done) {\r
-\r
-            var a = {};\r
-            var b = null;\r
-            var c = null;\r
-\r
-            expect(function () {\r
-\r
-                c = Hoek.merge(a, b);\r
-            }).to.not.throw();\r
-\r
-            expect(c).to.equal(a);\r
-            done();\r
-        });\r
-\r
-        it('does not throw if source is undefined', function (done) {\r
-\r
-            var a = {};\r
-            var b = undefined;\r
-            var c = null;\r
-\r
-            expect(function () {\r
-\r
-                c = Hoek.merge(a, b);\r
-            }).to.not.throw();\r
-\r
-            expect(c).to.equal(a);\r
-            done();\r
-        });\r
-\r
-        it('throws if source is not an object', function (done) {\r
-\r
-            expect(function () {\r
-\r
-                var a = {};\r
-                var b = 0;\r
-\r
-                Hoek.merge(a, b);\r
-            }).to.throw('Invalid source value: must be null, undefined, or an object');\r
-            done();\r
-        });\r
-\r
-        it('throws if target is not an object', function (done) {\r
-\r
-            expect(function () {\r
-\r
-                var a = 0;\r
-                var b = {};\r
-\r
-                Hoek.merge(a, b);\r
-            }).to.throw('Invalid target value: must be an object');\r
-            done();\r
-        });\r
-\r
-        it('throws if target is not an array and source is', function (done) {\r
-\r
-            expect(function () {\r
-\r
-                var a = {};\r
-                var b = [1, 2];\r
-\r
-                Hoek.merge(a, b);\r
-            }).to.throw('Cannot merge array onto an object');\r
-            done();\r
-        });\r
-\r
-        it('returns the same object when merging arrays', function (done) {\r
-\r
-            var a = [];\r
-            var b = [1, 2];\r
-\r
-            expect(Hoek.merge(a, b)).to.equal(a);\r
-            done();\r
-        });\r
-\r
-        it('should combine an empty object with a non-empty object', function (done) {\r
-\r
-            var a = {};\r
-            var b = nestedObj;\r
-\r
-            var c = Hoek.merge(a, b);\r
-            expect(a).to.deep.equal(b);\r
-            expect(c).to.deep.equal(b);\r
-            done();\r
-        });\r
-\r
-        it('should override values in target', function (done) {\r
-\r
-            var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };\r
-            var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };\r
-\r
-            var c = Hoek.merge(a, b);\r
-            expect(c.x).to.equal(null);\r
-            expect(c.y).to.equal(2);\r
-            expect(c.z).to.equal(4);\r
-            expect(c.v).to.equal(0);\r
-            expect(c.m).to.equal('123');\r
-            expect(c.t).to.deep.equal({ u: 6 });\r
-            done();\r
-        });\r
-\r
-        it('should override values in target (flip)', function (done) {\r
-\r
-            var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };\r
-            var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };\r
-\r
-            var d = Hoek.merge(b, a);\r
-            expect(d.x).to.equal(1);\r
-            expect(d.y).to.equal(2);\r
-            expect(d.z).to.equal(3);\r
-            expect(d.v).to.equal(5);\r
-            expect(d.m).to.equal('abc');\r
-            expect(d.t).to.deep.equal('test');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#applyToDefaults', function () {\r
-\r
-        var defaults = {\r
-            a: 1,\r
-            b: 2,\r
-            c: {\r
-                d: 3,\r
-                e: [5, 6]\r
-            },\r
-            f: 6,\r
-            g: 'test'\r
-        };\r
-\r
-        it('should return null if options is false', function (done) {\r
-\r
-            var result = Hoek.applyToDefaults(defaults, false);\r
-            expect(result).to.equal(null);\r
-            done();\r
-        });\r
-\r
-        it('should return a copy of defaults if options is true', function (done) {\r
-\r
-            var result = Hoek.applyToDefaults(defaults, true);\r
-            expect(result).to.deep.equal(result);\r
-            done();\r
-        });\r
-\r
-        it('should apply object to defaults', function (done) {\r
-\r
-            var obj = {\r
-                a: null,\r
-                c: {\r
-                    e: [4]\r
-                },\r
-                f: 0,\r
-                g: {\r
-                    h: 5\r
-                }\r
-            };\r
-\r
-            var result = Hoek.applyToDefaults(defaults, obj);\r
-            expect(result.c.e).to.deep.equal([4]);\r
-            expect(result.a).to.equal(1);\r
-            expect(result.b).to.equal(2);\r
-            expect(result.f).to.equal(0);\r
-            expect(result.g).to.deep.equal({ h: 5 });\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#unique', function () {\r
-\r
-        it('should ensure uniqueness within array of objects based on subkey', function (done) {\r
-\r
-            var a = Hoek.unique(dupsArray, 'x');\r
-            expect(a).to.deep.equal(reducedDupsArray);\r
-            done();\r
-        });\r
-\r
-        it('removes duplicated without key', function (done) {\r
-\r
-            expect(Hoek.unique([1, 2, 3, 4, 2, 1, 5])).to.deep.equal([1, 2, 3, 4, 5]);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#mapToObject', function () {\r
-\r
-        it('should return null on null array', function (done) {\r
-\r
-            var a = Hoek.mapToObject(null);\r
-            expect(a).to.equal(null);\r
-            done();\r
-        });\r
-\r
-        it('should convert basic array to existential object', function (done) {\r
-\r
-            var keys = [1, 2, 3, 4];\r
-            var a = Hoek.mapToObject(keys);\r
-            for (var i in keys) {\r
-                expect(a[keys[i]]).to.equal(true);\r
-            }\r
-            done();\r
-        });\r
-\r
-        it('should convert array of objects to existential object', function (done) {\r
-\r
-            var keys = [{ x: 1 }, { x: 2 }, { x: 3 }];\r
-            var subkey = 'x';\r
-            var a = Hoek.mapToObject(keys, subkey);\r
-            for (var i in keys) {\r
-                expect(a[keys[i][subkey]]).to.equal(true);\r
-            }\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#intersect', function () {\r
-\r
-        it('should return the common objects of two arrays', function (done) {\r
-\r
-            var array1 = [1, 2, 3, 4, 4, 5, 5];\r
-            var array2 = [5, 4, 5, 6, 7];\r
-            var common = Hoek.intersect(array1, array2);\r
-            expect(common.length).to.equal(2);\r
-            done();\r
-        });\r
-\r
-        it('should return just the first common object of two arrays', function (done) {\r
-\r
-            var array1 = [1, 2, 3, 4, 4, 5, 5];\r
-            var array2 = [5, 4, 5, 6, 7];\r
-            var common = Hoek.intersect(array1, array2, true);\r
-            expect(common).to.equal(5);\r
-            done();\r
-        });\r
-\r
-        it('should return an empty array if either input is null', function (done) {\r
-\r
-            expect(Hoek.intersect([1], null).length).to.equal(0);\r
-            expect(Hoek.intersect(null, [1]).length).to.equal(0);\r
-            done();\r
-        });\r
-\r
-        it('should return the common objects of object and array', function (done) {\r
-\r
-            var array1 = [1, 2, 3, 4, 4, 5, 5];\r
-            var array2 = [5, 4, 5, 6, 7];\r
-            var common = Hoek.intersect(Hoek.mapToObject(array1), array2);\r
-            expect(common.length).to.equal(2);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#matchKeys', function () {\r
-\r
-        it('should match the existing object keys', function (done) {\r
-\r
-            var obj = {\r
-                a: 1,\r
-                b: 2,\r
-                c: 3,\r
-                d: null\r
-            };\r
-\r
-            expect(Hoek.matchKeys(obj, ['b', 'c', 'd', 'e'])).to.deep.equal(['b', 'c', 'd']);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#flatten', function () {\r
-\r
-        it('should return a flat array', function (done) {\r
-\r
-            var result = Hoek.flatten([1, 2, [3, 4, [5, 6], [7], 8], [9], [10, [11, 12]], 13]);\r
-            expect(result.length).to.equal(13);\r
-            expect(result).to.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#removeKeys', function () {\r
-\r
-        var objWithHiddenKeys = {\r
-            location: {\r
-                name: 'San Bruno'\r
-            },\r
-            company: {\r
-                name: '@WalmartLabs'\r
-            }\r
-        };\r
-\r
-        it('should delete params with definition\'s hide set to true', function (done) {\r
-\r
-            var a = Hoek.removeKeys(objWithHiddenKeys, ['location']);\r
-            expect(objWithHiddenKeys.location).to.not.exist;\r
-            expect(objWithHiddenKeys.company).to.exist;\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#reach', function () {\r
-\r
-        var obj = {\r
-            a: {\r
-                b: {\r
-                    c: {\r
-                        d: 1,\r
-                        e: 2\r
-                    },\r
-                    f: 'hello'\r
-                },\r
-                g: {\r
-                    h: 3\r
-                }\r
-            },\r
-            i: function () { }\r
-        };\r
-\r
-        it('returns a valid member', function (done) {\r
-\r
-            expect(Hoek.reach(obj, 'a.b.c.d')).to.equal(1);\r
-            done();\r
-        });\r
-\r
-        it('returns null on null object', function (done) {\r
-\r
-            expect(Hoek.reach(null, 'a.b.c.d')).to.not.exist;\r
-            done();\r
-        });\r
-\r
-        it('returns null on missing member', function (done) {\r
-\r
-            expect(Hoek.reach(obj, 'a.b.c.d.x')).to.not.exist;\r
-            done();\r
-        });\r
-\r
-        it('returns null on invalid member', function (done) {\r
-\r
-            expect(Hoek.reach(obj, 'a.b.c.d-.x')).to.not.exist;\r
-            done();\r
-        });\r
-\r
-        it('returns function member', function (done) {\r
-\r
-            expect(typeof Hoek.reach(obj, 'i')).to.equal('function');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#inheritAsync', function () {\r
-\r
-        it('should inherit selected methods and wrap in async call', function (done) {\r
-\r
-            var proto = {\r
-                a: function () {\r
-                    return 'a!';\r
-                },\r
-                b: function () {\r
-                    return 'b!';\r
-                },\r
-                c: function () {\r
-                    throw new Error('c!');\r
-                }\r
-            };\r
-\r
-            var targetFunc = function () { };\r
-            targetFunc.prototype.c = function () {\r
-\r
-                return 'oops';\r
-            };\r
-\r
-            Hoek.inheritAsync(targetFunc, proto, ['a', 'c']);\r
-            var target = new targetFunc();\r
-\r
-            expect(typeof target.a).to.equal('function');\r
-            expect(typeof target.c).to.equal('function');\r
-            expect(target.b).to.not.exist;\r
-\r
-            target.a(function (err, result) {\r
-\r
-                expect(err).to.not.exist;\r
-                expect(result).to.equal('a!');\r
-\r
-                target.c(function (err, result) {\r
-\r
-                    expect(result).to.not.exist;\r
-                    expect(err.message).to.equal('c!');\r
-                    done();\r
-                });\r
-            });\r
-        });\r
-    });\r
-\r
-    describe('#callStack', function () {\r
-\r
-        it('should return the full call stack', function (done) {\r
-\r
-            var stack = Hoek.callStack();\r
-            expect(stack[0][0]).to.contain('index.js');\r
-            expect(stack[0][2]).to.equal(30);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#displayStack ', function () {\r
-\r
-        it('should return the full call stack for display', function (done) {\r
-\r
-            var stack = Hoek.displayStack();\r
-            expect(stack[0]).to.contain('test/index.js:');\r
-            done();\r
-        });\r
-\r
-        it('should include constructor functions correctly', function (done) {\r
-\r
-            var Something = function (next) {\r
-\r
-                next();\r
-            };\r
-\r
-            var something = new Something(function () {\r
-\r
-                var stack = Hoek.displayStack();\r
-                expect(stack[1]).to.contain('new Something');\r
-                done();\r
-            });\r
-        });\r
-    });\r
-\r
-    describe('#abort', function () {\r
-\r
-        it('should exit process when not in test mode', function (done) {\r
-\r
-            var env = process.env.NODE_ENV;\r
-            var write = process.stdout.write;\r
-            var exit = process.exit;\r
-\r
-            process.env.NODE_ENV = 'nottatest';\r
-            process.stdout.write = function () { };\r
-            process.exit = function (state) {\r
-\r
-                process.exit = exit;\r
-                process.env.NODE_ENV = env;\r
-                process.stdout.write = write;\r
-\r
-                expect(state).to.equal(1);\r
-                done();\r
-            };\r
-\r
-            Hoek.abort('Boom');\r
-        });\r
-\r
-        it('should throw when not in test mode and abortThrow is true', function (done) {\r
-\r
-            var env = process.env.NODE_ENV;\r
-            process.env.NODE_ENV = 'nottatest';\r
-            Hoek.abortThrow = true;\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.abort('my error message');\r
-            };\r
-\r
-            expect(fn).to.throw('my error message');\r
-            Hoek.abortThrow = false;\r
-            process.env.NODE_ENV = env;\r
-\r
-            done();\r
-        });\r
-\r
-\r
-        it('should respect hideStack argument', function (done) {\r
-\r
-            var env = process.env.NODE_ENV;\r
-            var write = process.stdout.write;\r
-            var exit = process.exit;\r
-            var output = '';\r
-\r
-            process.exit = function () { };\r
-            process.env.NODE_ENV = '';\r
-            process.stdout.write = function (message) {\r
-\r
-                output = message;\r
-            };\r
-\r
-            Hoek.abort('my error message', true);\r
-\r
-            process.env.NODE_ENV = env;\r
-            process.stdout.write = write;\r
-            process.exit = exit;\r
-\r
-            expect(output).to.equal('ABORT: my error message\n\t\n');\r
-\r
-            done();\r
-        });\r
-\r
-        it('should default to showing stack', function (done) {\r
-\r
-            var env = process.env.NODE_ENV;\r
-            var write = process.stdout.write;\r
-            var exit = process.exit;\r
-            var output = '';\r
-\r
-            process.exit = function () { };\r
-            process.env.NODE_ENV = '';\r
-            process.stdout.write = function (message) {\r
-\r
-                output = message;\r
-            };\r
-\r
-            Hoek.abort('my error message');\r
-\r
-            process.env.NODE_ENV = env;\r
-            process.stdout.write = write;\r
-            process.exit = exit;\r
-\r
-            expect(output).to.contain('index.js');\r
-\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#assert', function () {\r
-\r
-        it('should throw an Error when using assert in a test', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.assert(false, 'my error message');\r
-            };\r
-\r
-            expect(fn).to.throw('my error message');\r
-            done();\r
-        });\r
-\r
-        it('should throw an Error when using assert in a test with no message', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.assert(false);\r
-            };\r
-\r
-            expect(fn).to.throw('Unknown error');\r
-            done();\r
-        });\r
-\r
-        it('should throw an Error when using assert in a test with multipart message', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.assert(false, 'This', 'is', 'my message');\r
-            };\r
-\r
-            expect(fn).to.throw('This is my message');\r
-            done();\r
-        });\r
-\r
-        it('should throw an Error when using assert in a test with object message', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.assert(false, 'This', 'is', { spinal: 'tap' });\r
-            };\r
-\r
-            expect(fn).to.throw('This is {"spinal":"tap"}');\r
-            done();\r
-        });\r
-\r
-        it('should throw an Error when using assert in a test with error object message', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.assert(false, new Error('This is spinal tap'));\r
-            };\r
-\r
-            expect(fn).to.throw('This is spinal tap');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#loadDirModules', function () {\r
-\r
-        it('should load modules from directory', function (done) {\r
-\r
-            var target = {};\r
-            Hoek.loadDirModules(__dirname + '/modules', ['test2'], target);\r
-            expect(target.Test1.x).to.equal(1);\r
-            expect(target.Test2).to.not.exist;\r
-            expect(target.Test3.z).to.equal(3);\r
-            done();\r
-        });\r
-\r
-        it('should list modules from directory into function', function (done) {\r
-\r
-            var target = {};\r
-            Hoek.loadDirModules(__dirname + '/modules', ['test2'], function (path, name, capName) {\r
-\r
-                target[name] = capName;\r
-            });\r
-\r
-            expect(target.test1).to.equal('Test1');\r
-            expect(target.test2).to.not.exist;\r
-            expect(target.test3).to.equal('Test3');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#rename', function () {\r
-\r
-        it('should rename object key', function (done) {\r
-\r
-            var a = { b: 'c' };\r
-            Hoek.rename(a, 'b', 'x');\r
-            expect(a.b).to.not.exist;\r
-            expect(a.x).to.equal('c');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('Timer', function () {\r
-\r
-        it('should return time elapsed', function (done) {\r
-\r
-            var timer = new Hoek.Timer();\r
-            setTimeout(function () {\r
-\r
-                expect(timer.elapsed()).to.be.above(9);\r
-                done();\r
-            }, 12);\r
-        });\r
-    });\r
-\r
-    describe('#loadPackage', function () {\r
-\r
-        it('should', function (done) {\r
-\r
-            var pack = Hoek.loadPackage();\r
-            expect(pack.name).to.equal('hoek');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#escapeRegex', function () {\r
-\r
-        it('should escape all special regular expression characters', function (done) {\r
-\r
-            var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');\r
-            expect(a).to.equal('4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`"\\(>\\)\\[<\\]d\\{\\}s\\,');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#toss', function () {\r
-\r
-        it('should call callback with new error', function (done) {\r
-\r
-            var callback = function (err) {\r
-\r
-                expect(err).to.exist;\r
-                expect(err.message).to.equal('bug');\r
-                done();\r
-            };\r
-\r
-            Hoek.toss(true, 'feature', callback);\r
-            Hoek.toss(false, 'bug', callback);\r
-        });\r
-\r
-        it('should call callback with new error and no message', function (done) {\r
-\r
-            Hoek.toss(false, function (err) {\r
-\r
-                expect(err).to.exist;\r
-                expect(err.message).to.equal('');\r
-                done();\r
-            });\r
-        });\r
-\r
-        it('should call callback with error condition', function (done) {\r
-\r
-            Hoek.toss(new Error('boom'), function (err) {\r
-\r
-                expect(err).to.exist;\r
-                expect(err.message).to.equal('boom');\r
-                done();\r
-            });\r
-        });\r
-\r
-        it('should call callback with new error using message with error condition', function (done) {\r
-\r
-            Hoek.toss(new Error('ka'), 'boom', function (err) {\r
-\r
-                expect(err).to.exist;\r
-                expect(err.message).to.equal('boom');\r
-                done();\r
-            });\r
-        });\r
-\r
-        it('should call callback with new error using passed error with error condition', function (done) {\r
-\r
-            Hoek.toss(new Error('ka'), new Error('boom'), function (err) {\r
-\r
-                expect(err).to.exist;\r
-                expect(err.message).to.equal('boom');\r
-                done();\r
-            });\r
-        });\r
-    });\r
-\r
-    describe('Base64Url', function () {\r
-\r
-        var base64str = 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn-AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy8_T19vf4-fr7_P3-_w';\r
-        var str = unescape('%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF');\r
-\r
-        describe('#base64urlEncode', function () {\r
-\r
-            it('should base64 URL-safe a string', function (done) {\r
-\r
-                expect(Hoek.base64urlEncode(str)).to.equal(base64str);\r
-                done();\r
-            });\r
-        });\r
-\r
-        describe('#base64urlDecode', function () {\r
-\r
-            it('should un-base64 URL-safe a string', function (done) {\r
-\r
-                expect(Hoek.base64urlDecode(base64str)).to.equal(str);\r
-                done();\r
-            });\r
-\r
-            it('should return error on undefined input', function (done) {\r
-\r
-                expect(Hoek.base64urlDecode().message).to.exist;\r
-                done();\r
-            });\r
-\r
-            it('should return error on invalid input', function (done) {\r
-\r
-                expect(Hoek.base64urlDecode('*').message).to.exist;\r
-                done();\r
-            });\r
-        });\r
-    });\r
-\r
-    describe('#escapeHeaderAttribute', function () {\r
-\r
-        it('should not alter ascii values', function (done) {\r
-\r
-            var a = Hoek.escapeHeaderAttribute('My Value');\r
-            expect(a).to.equal('My Value');\r
-            done();\r
-        });\r
-\r
-        it('should escape all special HTTP header attribute characters', function (done) {\r
-\r
-            var a = Hoek.escapeHeaderAttribute('I said go!!!#"' + String.fromCharCode(92));\r
-            expect(a).to.equal('I said go!!!#\\"\\\\');\r
-            done();\r
-        });\r
-\r
-        it('should throw on large unicode characters', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.escapeHeaderAttribute('this is a test' + String.fromCharCode(500) + String.fromCharCode(300));\r
-            };\r
-\r
-            expect(fn).to.throw(Error);\r
-            done();\r
-        });\r
-\r
-        it('should throw on CRLF to prevent response splitting', function (done) {\r
-\r
-            var fn = function () {\r
-\r
-                Hoek.escapeHeaderAttribute('this is a test\r\n');\r
-            };\r
-\r
-            expect(fn).to.throw(Error);\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#escapeHtml', function () {\r
-\r
-        it('should escape all special HTML characters', function (done) {\r
-\r
-            var a = Hoek.escapeHtml('&<>"\'`');\r
-            expect(a).to.equal('&amp;&lt;&gt;&quot;&#x27;&#x60;');\r
-            done();\r
-        });\r
-\r
-        it('should return empty string on falsy input', function (done) {\r
-\r
-            var a = Hoek.escapeHtml('');\r
-            expect(a).to.equal('');\r
-            done();\r
-        });\r
-\r
-        it('should return unchanged string on no reserved input', function (done) {\r
-\r
-            var a = Hoek.escapeHtml('abc');\r
-            expect(a).to.equal('abc');\r
-            done();\r
-        });\r
-    });\r
-\r
-    describe('#printEvent', function () {\r
-\r
-        it('outputs event as string', function (done) {\r
-\r
-            var event = {\r
-                timestamp: (new Date(2013, 1, 1, 6, 30, 45, 123)).getTime(),\r
-                tags: ['a', 'b', 'c'],\r
-                data: { some: 'data' }\r
-            };\r
-\r
-            Hoek.consoleFunc = function (string) {\r
-\r
-                Hoek.consoleFunc = console.log;\r
-                expect(string).to.equal('130201/063045.123, a, {"some":"data"}');\r
-                done();\r
-            };\r
-\r
-            Hoek.printEvent(event);\r
-        });\r
-\r
-        it('outputs JSON error', function (done) {\r
-\r
-            var event = {\r
-                timestamp: (new Date(2013, 1, 1, 6, 30, 45, 123)).getTime(),\r
-                tags: ['a', 'b', 'c'],\r
-                data: { some: 'data' }\r
-            };\r
-\r
-            event.data.a = event.data;\r
-\r
-            Hoek.consoleFunc = function (string) {\r
-\r
-                Hoek.consoleFunc = console.log;\r
-                expect(string).to.equal('130201/063045.123, a, JSON Error: Converting circular structure to JSON');\r
-                done();\r
-            };\r
-\r
-            Hoek.printEvent(event);\r
-        });\r
-    });\r
-\r
-    describe('#nextTick', function () {\r
-\r
-        it('calls the provided callback on nextTick', function (done) {\r
-\r
-            var a = 0;\r
-\r
-            var inc = function (step, next) {\r
-\r
-                a += step;\r
-                next();\r
-            };\r
-\r
-            var ticked = Hoek.nextTick(inc);\r
-\r
-            ticked(5, function () {\r
-\r
-                expect(a).to.equal(6);\r
-                done();\r
-            });\r
-\r
-            expect(a).to.equal(0);\r
-            inc(1, function () {\r
-\r
-                expect(a).to.equal(1);\r
-            });\r
-        });\r
-    });\r
-});\r
-\r
+// Load modules
+
+var Fs = require('fs');
+var Path = require('path');
+var Code = require('code');
+var Hoek = require('../lib');
+var Lab = require('lab');
+
+
+// Declare internals
+
+var internals = {};
+
+
+// Test shortcuts
+
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
+
+
+var nestedObj = {
+    v: [7, 8, 9],
+    w: /^something$/igm,
+    x: {
+        a: [1, 2, 3],
+        b: 123456,
+        c: new Date(),
+        d: /hi/igm,
+        e: /hello/
+    },
+    y: 'y',
+    z: new Date(1378775452757)
+};
+
+var dupsArray = [nestedObj, { z: 'z' }, nestedObj];
+var reducedDupsArray = [nestedObj, { z: 'z' }];
+
+describe('clone()', function () {
+
+    it('clones a nested object', function (done) {
+
+        var a = nestedObj;
+        var b = Hoek.clone(a);
+
+        expect(a).to.deep.equal(b);
+        expect(a.z.getTime()).to.equal(b.z.getTime());
+        done();
+    });
+
+    it('clones a null object', function (done) {
+
+        var b = Hoek.clone(null);
+
+        expect(b).to.equal(null);
+        done();
+    });
+
+    it('should not convert undefined properties to null', function (done) {
+
+        var obj = { something: undefined };
+        var b = Hoek.clone(obj);
+
+        expect(typeof b.something).to.equal('undefined');
+        done();
+    });
+
+    it('should not throw on circular reference', function (done) {
+
+        var a = {};
+        a.x = a;
+
+        var test = function () {
+
+            var b = Hoek.clone(a);
+        };
+
+        expect(test).to.not.throw();
+        done();
+    });
+
+    it('clones circular reference', function (done) {
+
+        var x = {
+            'z': new Date()
+        };
+        x.y = x;
+
+        var b = Hoek.clone(x);
+        expect(Object.keys(b.y)).to.deep.equal(Object.keys(x));
+        expect(b.z).to.not.equal(x.z);
+        expect(b.y).to.not.equal(x.y);
+        expect(b.y.z).to.not.equal(x.y.z);
+        expect(b.y).to.equal(b);
+        expect(b.y.y.y.y).to.equal(b);
+        done();
+    });
+
+    it('clones an object with a null prototype', function (done) {
+
+        var obj = Object.create(null);
+        var b = Hoek.clone(obj);
+
+        expect(b).to.deep.equal(obj);
+        done();
+    });
+
+    it('clones deeply nested object', function (done) {
+
+        var a = {
+            x: {
+                y: {
+                    a: [1, 2, 3],
+                    b: 123456,
+                    c: new Date(),
+                    d: /hi/igm,
+                    e: /hello/
+                }
+            }
+        };
+
+        var b = Hoek.clone(a);
+
+        expect(a).to.deep.equal(b);
+        expect(a.x.y.c.getTime()).to.equal(b.x.y.c.getTime());
+        done();
+    });
+
+    it('clones arrays', function (done) {
+
+        var a = [1, 2, 3];
+
+        var b = Hoek.clone(a);
+
+        expect(a).to.deep.equal(b);
+        done();
+    });
+
+    it('performs actual copy for shallow keys (no pass by reference)', function (done) {
+
+        var x = Hoek.clone(nestedObj);
+        var y = Hoek.clone(nestedObj);
+
+        // Date
+        expect(x.z).to.not.equal(nestedObj.z);
+        expect(x.z).to.not.equal(y.z);
+
+        // Regex
+        expect(x.w).to.not.equal(nestedObj.w);
+        expect(x.w).to.not.equal(y.w);
+
+        // Array
+        expect(x.v).to.not.equal(nestedObj.v);
+        expect(x.v).to.not.equal(y.v);
+
+        // Immutable(s)
+        x.y = 5;
+        expect(x.y).to.not.equal(nestedObj.y);
+        expect(x.y).to.not.equal(y.y);
+
+        done();
+    });
+
+    it('performs actual copy for deep keys (no pass by reference)', function (done) {
+
+        var x = Hoek.clone(nestedObj);
+        var y = Hoek.clone(nestedObj);
+
+        expect(x.x.c).to.not.equal(nestedObj.x.c);
+        expect(x.x.c).to.not.equal(y.x.c);
+
+        expect(x.x.c.getTime()).to.equal(nestedObj.x.c.getTime());
+        expect(x.x.c.getTime()).to.equal(y.x.c.getTime());
+        done();
+    });
+
+    it('copies functions with properties', function (done) {
+
+        var a = {
+            x: function () { return 1; },
+            y: {}
+        };
+        a.x.z = 'string in function';
+        a.x.v = function () { return 2; };
+        a.y.u = a.x;
+
+        var b = Hoek.clone(a);
+        expect(b.x()).to.equal(1);
+        expect(b.x.v()).to.equal(2);
+        expect(b.y.u).to.equal(b.x);
+        expect(b.x.z).to.equal('string in function');
+        done();
+    });
+
+    it('should copy a buffer', function (done) {
+        var tls = {
+            key: new Buffer([1, 2, 3, 4, 5]),
+            cert: new Buffer([1, 2, 3, 4, 5, 6, 10])
+        };
+
+        var copiedTls = Hoek.clone(tls);
+        expect(Buffer.isBuffer(copiedTls.key)).to.equal(true);
+        expect(JSON.stringify(copiedTls.key)).to.equal(JSON.stringify(tls.key));
+        expect(Buffer.isBuffer(copiedTls.cert)).to.equal(true);
+        expect(JSON.stringify(copiedTls.cert)).to.equal(JSON.stringify(tls.cert));
+        done();
+    });
+
+    it('clones an object with a prototype', function (done) {
+
+        var Obj = function () {
+
+            this.a = 5;
+        };
+
+        Obj.prototype.b = function () { return 'c'; };
+
+        var a = new Obj();
+        var b = Hoek.clone(a);
+
+        expect(b.a).to.equal(5);
+        expect(b.b()).to.equal('c');
+        expect(a).to.deep.equal(b);
+        done();
+    });
+
+    it('reuses cloned Date object', function (done) {
+
+        var obj = {
+            a: new Date()
+        };
+
+        obj.b = obj.a;
+
+        var copy = Hoek.clone(obj);
+        expect(copy.a).to.equal(copy.b);
+        done();
+    });
+
+    it('shallow copies an object with a prototype and isImmutable flag', function (done) {
+
+        var Obj = function () {
+
+            this.value = 5;
+        };
+
+        Obj.prototype.b = function () { return 'c'; };
+        Obj.prototype.isImmutable = true;
+
+        var obj = {
+            a: new Obj()
+        };
+
+        var copy = Hoek.clone(obj);
+
+        expect(obj.a.value).to.equal(5);
+        expect(copy.a.value).to.equal(5);
+        expect(copy.a.b()).to.equal('c');
+        expect(obj.a).to.equal(copy.a);
+        done();
+    });
+
+    it('clones an object with property getter without executing it', function (done) {
+
+        var obj = {};
+        var value = 1;
+        var execCount = 0;
+
+        Object.defineProperty(obj, 'test', {
+            enumerable: true,
+            configurable: true,
+            get: function () {
+
+                ++execCount;
+                return value;
+            }
+        });
+
+        var copy = Hoek.clone(obj);
+        expect(execCount).to.equal(0);
+        expect(copy.test).to.equal(1);
+        expect(execCount).to.equal(1);
+        done();
+    });
+
+    it('clones an object with property getter and setter', function (done) {
+
+        var obj = {
+            _test: 0
+        };
+
+        Object.defineProperty(obj, 'test', {
+            enumerable: true,
+            configurable: true,
+            get: function () {
+
+                return this._test;
+            },
+            set: function (value) {
+
+                this._test = value - 1;
+            }
+        });
+
+        var copy = Hoek.clone(obj);
+        expect(copy.test).to.equal(0);
+        copy.test = 5;
+        expect(copy.test).to.equal(4);
+        done();
+    });
+
+    it('clones an object with only property setter', function (done) {
+
+        var obj = {
+            _test: 0
+        };
+
+        Object.defineProperty(obj, 'test', {
+            enumerable: true,
+            configurable: true,
+            set: function (value) {
+
+                this._test = value - 1;
+            }
+        });
+
+        var copy = Hoek.clone(obj);
+        expect(copy._test).to.equal(0);
+        copy.test = 5;
+        expect(copy._test).to.equal(4);
+        done();
+    });
+});
+
+describe('merge()', function () {
+
+    it('deep copies source items', function (done) {
+
+        var target = {
+            b: 3,
+            d: []
+        };
+
+        var source = {
+            c: {
+                d: 1
+            },
+            d: [{ e: 1 }]
+        };
+
+        Hoek.merge(target, source);
+        expect(target.c).to.not.equal(source.c);
+        expect(target.c).to.deep.equal(source.c);
+        expect(target.d).to.not.equal(source.d);
+        expect(target.d[0]).to.not.equal(source.d[0]);
+        expect(target.d).to.deep.equal(source.d);
+        done();
+    });
+
+    it('merges array over an object', function (done) {
+
+        var a = {
+            x: ['n', 'm']
+        };
+
+        var b = {
+            x: {
+                n: '1',
+                m: '2'
+            }
+        };
+
+        Hoek.merge(b, a);
+        expect(a.x[0]).to.equal('n');
+        expect(a.x.n).to.not.exist();
+        done();
+    });
+
+    it('merges object over an array', function (done) {
+
+        var a = {
+            x: ['n', 'm']
+        };
+
+        var b = {
+            x: {
+                n: '1',
+                m: '2'
+            }
+        };
+
+        Hoek.merge(a, b);
+        expect(a.x.n).to.equal('1');
+        expect(a.x[0]).to.not.exist();
+        done();
+    });
+
+    it('does not throw if source is null', function (done) {
+
+        var a = {};
+        var b = null;
+        var c = null;
+
+        expect(function () {
+
+            c = Hoek.merge(a, b);
+        }).to.not.throw();
+
+        expect(c).to.equal(a);
+        done();
+    });
+
+    it('does not throw if source is undefined', function (done) {
+
+        var a = {};
+        var b;
+        var c = null;
+
+        expect(function () {
+
+            c = Hoek.merge(a, b);
+        }).to.not.throw();
+
+        expect(c).to.equal(a);
+        done();
+    });
+
+    it('throws if source is not an object', function (done) {
+
+        expect(function () {
+
+            var a = {};
+            var b = 0;
+
+            Hoek.merge(a, b);
+        }).to.throw('Invalid source value: must be null, undefined, or an object');
+        done();
+    });
+
+    it('throws if target is not an object', function (done) {
+
+        expect(function () {
+
+            var a = 0;
+            var b = {};
+
+            Hoek.merge(a, b);
+        }).to.throw('Invalid target value: must be an object');
+        done();
+    });
+
+    it('throws if target is not an array and source is', function (done) {
+
+        expect(function () {
+
+            var a = {};
+            var b = [1, 2];
+
+            Hoek.merge(a, b);
+        }).to.throw('Cannot merge array onto an object');
+        done();
+    });
+
+    it('returns the same object when merging arrays', function (done) {
+
+        var a = [];
+        var b = [1, 2];
+
+        expect(Hoek.merge(a, b)).to.equal(a);
+        done();
+    });
+
+    it('combines an empty object with a non-empty object', function (done) {
+
+        var a = {};
+        var b = nestedObj;
+
+        var c = Hoek.merge(a, b);
+        expect(a).to.deep.equal(b);
+        expect(c).to.deep.equal(b);
+        done();
+    });
+
+    it('overrides values in target', function (done) {
+
+        var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
+        var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
+
+        var c = Hoek.merge(a, b);
+        expect(c.x).to.equal(null);
+        expect(c.y).to.equal(2);
+        expect(c.z).to.equal(4);
+        expect(c.v).to.equal(0);
+        expect(c.m).to.equal('123');
+        expect(c.t).to.deep.equal({ u: 6 });
+        done();
+    });
+
+    it('overrides values in target (flip)', function (done) {
+
+        var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
+        var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
+
+        var d = Hoek.merge(b, a);
+        expect(d.x).to.equal(1);
+        expect(d.y).to.equal(2);
+        expect(d.z).to.equal(3);
+        expect(d.v).to.equal(5);
+        expect(d.m).to.equal('abc');
+        expect(d.t).to.deep.equal('test');
+        done();
+    });
+
+    it('retains Date properties', function (done) {
+
+        var a = { x: new Date(1378776452757) };
+
+        var b = Hoek.merge({}, a);
+        expect(a.x.getTime()).to.equal(b.x.getTime());
+        done();
+    });
+
+    it('retains Date properties when merging keys', function (done) {
+
+        var a = { x: new Date(1378776452757) };
+
+        var b = Hoek.merge({ x: {} }, a);
+        expect(a.x.getTime()).to.equal(b.x.getTime());
+        done();
+    });
+
+    it('overrides Buffer', function (done) {
+
+        var a = { x: new Buffer('abc') };
+
+        var b = Hoek.merge({ x: {} }, a);
+        expect(a.x.toString()).to.equal('abc');
+        done();
+    });
+});
+
+describe('applyToDefaults()', function () {
+
+    var defaults = {
+        a: 1,
+        b: 2,
+        c: {
+            d: 3,
+            e: [5, 6]
+        },
+        f: 6,
+        g: 'test'
+    };
+
+    it('throws when target is null', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaults(null, {});
+        }).to.throw('Invalid defaults value: must be an object');
+        done();
+    });
+
+    it('returns null if options is false', function (done) {
+
+        var result = Hoek.applyToDefaults(defaults, false);
+        expect(result).to.equal(null);
+        done();
+    });
+
+    it('returns null if options is null', function (done) {
+
+        var result = Hoek.applyToDefaults(defaults, null);
+        expect(result).to.equal(null);
+        done();
+    });
+
+    it('returns null if options is undefined', function (done) {
+
+        var result = Hoek.applyToDefaults(defaults, undefined);
+        expect(result).to.equal(null);
+        done();
+    });
+
+    it('returns a copy of defaults if options is true', function (done) {
+
+        var result = Hoek.applyToDefaults(defaults, true);
+        expect(result).to.deep.equal(defaults);
+        done();
+    });
+
+    it('applies object to defaults', function (done) {
+
+        var obj = {
+            a: null,
+            c: {
+                e: [4]
+            },
+            f: 0,
+            g: {
+                h: 5
+            }
+        };
+
+        var result = Hoek.applyToDefaults(defaults, obj);
+        expect(result.c.e).to.deep.equal([4]);
+        expect(result.a).to.equal(1);
+        expect(result.b).to.equal(2);
+        expect(result.f).to.equal(0);
+        expect(result.g).to.deep.equal({ h: 5 });
+        done();
+    });
+});
+
+describe('cloneWithShallow()', function () {
+
+    it('deep clones except for listed keys', function (done) {
+
+        var source = {
+            a: {
+                b: 5
+            },
+            c: {
+                d: 6
+            }
+        };
+
+        var copy = Hoek.cloneWithShallow(source, ['c']);
+        expect(copy).to.deep.equal(source);
+        expect(copy).to.not.equal(source);
+        expect(copy.a).to.not.equal(source.a);
+        expect(copy.b).to.equal(source.b);
+        done();
+    });
+
+    it('returns immutable value', function (done) {
+
+        expect(Hoek.cloneWithShallow(5)).to.equal(5);
+        done();
+    });
+
+    it('returns null value', function (done) {
+
+        expect(Hoek.cloneWithShallow(null)).to.equal(null);
+        done();
+    });
+
+    it('returns undefined value', function (done) {
+
+        expect(Hoek.cloneWithShallow(undefined)).to.equal(undefined);
+        done();
+    });
+
+    it('deep clones except for listed keys (including missing keys)', function (done) {
+
+        var source = {
+            a: {
+                b: 5
+            },
+            c: {
+                d: 6
+            }
+        };
+
+        var copy = Hoek.cloneWithShallow(source, ['c', 'v']);
+        expect(copy).to.deep.equal(source);
+        expect(copy).to.not.equal(source);
+        expect(copy.a).to.not.equal(source.a);
+        expect(copy.b).to.equal(source.b);
+        done();
+    });
+});
+
+describe('applyToDefaultsWithShallow()', function () {
+
+    it('shallow copies the listed keys from options without merging', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5,
+                e: 3
+            },
+            c: {
+                d: 7,
+                g: 1
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                d: 6,
+                f: 7
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['a']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { d: 6, g: 1, f: 7 } });
+        expect(merged.a).to.equal(options.a);
+        expect(merged.a).to.not.equal(defaults.a);
+        expect(merged.c).to.not.equal(options.c);
+        expect(merged.c).to.not.equal(defaults.c);
+        done();
+    });
+
+    it('shallow copies the nested keys (override)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5
+            },
+            c: {
+                d: 7,
+                g: 1
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                d: 6,
+                g: {
+                    h: 8
+                }
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { d: 6, g: { h: 8 } } });
+        expect(merged.c.g).to.equal(options.c.g);
+        done();
+    });
+
+    it('shallow copies the nested keys (missing)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                g: {
+                    h: 8
+                }
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
+        expect(merged.c.g).to.equal(options.c.g);
+        done();
+    });
+
+    it('shallow copies the nested keys (override)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5
+            },
+            c: {
+                g: {
+                    d: 7
+                }
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                g: {
+                    h: 8
+                }
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
+        expect(merged.c.g).to.equal(options.c.g);
+        done();
+    });
+
+    it('shallow copies the nested keys (deeper)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                g: {
+                    r: {
+                        h: 8
+                    }
+                }
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g.r']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
+        expect(merged.c.g.r).to.equal(options.c.g.r);
+        done();
+    });
+
+    it('shallow copies the nested keys (not present)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 5
+            }
+        };
+
+        var options = {
+            a: {
+                b: 4
+            },
+            c: {
+                g: {
+                    r: {
+                        h: 8
+                    }
+                }
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['x.y']);
+        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
+        done();
+    });
+
+    it('shallow copies the listed keys in the defaults', function (done) {
+
+        var defaults = {
+            a: {
+                b: 1
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, {}, ['a']);
+        expect(merged.a).to.equal(defaults.a);
+        done();
+    });
+
+    it('shallow copies the listed keys in the defaults (true)', function (done) {
+
+        var defaults = {
+            a: {
+                b: 1
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, true, ['a']);
+        expect(merged.a).to.equal(defaults.a);
+        done();
+    });
+
+    it('returns null on false', function (done) {
+
+        var defaults = {
+            a: {
+                b: 1
+            }
+        };
+
+        var merged = Hoek.applyToDefaultsWithShallow(defaults, false, ['a']);
+        expect(merged).to.equal(null);
+        done();
+    });
+
+    it('throws on missing defaults', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaultsWithShallow(null, {}, ['a']);
+        }).to.throw('Invalid defaults value: must be an object');
+        done();
+    });
+
+    it('throws on invalid defaults', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaultsWithShallow('abc', {}, ['a']);
+        }).to.throw('Invalid defaults value: must be an object');
+        done();
+    });
+
+    it('throws on invalid options', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaultsWithShallow({}, 'abc', ['a']);
+        }).to.throw('Invalid options value: must be true, falsy or an object');
+        done();
+    });
+
+    it('throws on missing keys', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaultsWithShallow({}, true);
+        }).to.throw('Invalid keys');
+        done();
+    });
+
+    it('throws on invalid keys', function (done) {
+
+        expect(function () {
+
+            Hoek.applyToDefaultsWithShallow({}, true, 'a');
+        }).to.throw('Invalid keys');
+        done();
+    });
+});
+
+describe('deepEqual()', function () {
+
+    it('compares simple values', function (done) {
+
+        expect(Hoek.deepEqual('x', 'x')).to.be.true();
+        expect(Hoek.deepEqual('x', 'y')).to.be.false();
+        expect(Hoek.deepEqual('x1', 'x')).to.be.false();
+        expect(Hoek.deepEqual(-0, +0)).to.be.false();
+        expect(Hoek.deepEqual(-0, -0)).to.be.true();
+        expect(Hoek.deepEqual(+0, +0)).to.be.true();
+        expect(Hoek.deepEqual(+0, -0)).to.be.false();
+        expect(Hoek.deepEqual(1, 1)).to.be.true();
+        expect(Hoek.deepEqual(0, 0)).to.be.true();
+        expect(Hoek.deepEqual(-1, 1)).to.be.false();
+        expect(Hoek.deepEqual(NaN, 0)).to.be.false();
+        expect(Hoek.deepEqual(NaN, NaN)).to.be.true();
+        done();
+    });
+
+    it('compares different types', function (done) {
+
+        expect(Hoek.deepEqual([], 5)).to.be.false();
+        expect(Hoek.deepEqual(5, [])).to.be.false();
+        expect(Hoek.deepEqual({}, null)).to.be.false();
+        expect(Hoek.deepEqual(null, {})).to.be.false();
+        expect(Hoek.deepEqual('abc', {})).to.be.false();
+        expect(Hoek.deepEqual({}, 'abc')).to.be.false();
+        done();
+    });
+
+    it('compares empty structures', function (done) {
+
+        expect(Hoek.deepEqual([], [])).to.be.true();
+        expect(Hoek.deepEqual({}, {})).to.be.true();
+        expect(Hoek.deepEqual([], {})).to.be.false();
+        done();
+    });
+
+    it('compares empty arguments object', function (done) {
+
+        var compare = function () {
+
+            expect(Hoek.deepEqual([], arguments)).to.be.false();
+        };
+
+        compare();
+        done();
+    });
+
+    it('compares empty arguments objects', function (done) {
+
+        var compare = function () {
+
+            var arg1 = arguments;
+
+            var inner = function () {
+
+                expect(Hoek.deepEqual(arg1, arguments)).to.be.true();
+            };
+
+            inner();
+        };
+
+        compare();
+        done();
+    });
+
+    it('compares dates', function (done) {
+
+        expect(Hoek.deepEqual(new Date(), new Date())).to.be.true();
+        expect(Hoek.deepEqual(new Date(100), new Date(101))).to.be.false();
+        expect(Hoek.deepEqual(new Date(), {})).to.be.false();
+        done();
+    });
+
+    it('compares regular expressions', function (done) {
+
+        expect(Hoek.deepEqual(/\s/, new RegExp('\\\s'))).to.be.true();
+        expect(Hoek.deepEqual(/\s/g, /\s/g)).to.be.true();
+        expect(Hoek.deepEqual(/a/, {})).to.be.false();
+        expect(Hoek.deepEqual(/\s/g, /\s/i)).to.be.false();
+        expect(Hoek.deepEqual(/a/g, /b/g)).to.be.false();
+        done();
+    });
+
+    it('compares arrays', function (done) {
+
+        expect(Hoek.deepEqual([[1]], [[1]])).to.be.true();
+        expect(Hoek.deepEqual([1, 2, 3], [1, 2, 3])).to.be.true();
+        expect(Hoek.deepEqual([1, 2, 3], [1, 3, 2])).to.be.false();
+        expect(Hoek.deepEqual([1, 2, 3], [1, 2])).to.be.false();
+        expect(Hoek.deepEqual([1], [1])).to.be.true();
+        done();
+    });
+
+    it('compares buffers', function (done) {
+
+        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2, 3]))).to.be.true();
+        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 3, 2]))).to.be.false();
+        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2]))).to.be.false();
+        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), {})).to.be.false();
+        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), [1, 2, 3])).to.be.false();
+        done();
+    });
+
+    it('compares objects', function (done) {
+
+        expect(Hoek.deepEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).to.be.true();
+        expect(Hoek.deepEqual({ foo: 'bar' }, { foo: 'baz' })).to.be.false();
+        expect(Hoek.deepEqual({ foo: { bar: 'foo' } }, { foo: { bar: 'baz' } })).to.be.false();
+        done();
+    });
+
+    it('handles circular dependency', function (done) {
+
+        var a = {};
+        a.x = a;
+
+        var b = Hoek.clone(a);
+        expect(Hoek.deepEqual(a, b)).to.be.true();
+        done();
+    });
+
+    it('compares an object with property getter without executing it', function (done) {
+
+        var obj = {};
+        var value = 1;
+        var execCount = 0;
+
+        Object.defineProperty(obj, 'test', {
+            enumerable: true,
+            configurable: true,
+            get: function () {
+
+                ++execCount;
+                return value;
+            }
+        });
+
+        var copy = Hoek.clone(obj);
+        expect(Hoek.deepEqual(obj, copy)).to.be.true();
+        expect(execCount).to.equal(0);
+        expect(copy.test).to.equal(1);
+        expect(execCount).to.equal(1);
+        done();
+    });
+
+    it('compares objects with property getters', function (done) {
+
+        var obj = {};
+        Object.defineProperty(obj, 'test', {
+            enumerable: true,
+            configurable: true,
+            get: function () { return 1; }
+        });
+
+        var ref = {};
+        Object.defineProperty(ref, 'test', {
+            enumerable: true,
+            configurable: true,
+            get: function () { return 2; }
+        });
+
+        expect(Hoek.deepEqual(obj, ref)).to.be.false();
+        done();
+    });
+
+    it('compares object prototypes', function (done) {
+
+        var Obj = function () {
+
+            this.a = 5;
+        };
+
+        Obj.prototype.b = function () { return this.a; };
+
+        var Ref = function () {
+
+            this.a = 5;
+        };
+
+        Ref.prototype.b = function () { return this.a; };
+
+        expect(Hoek.deepEqual(new Obj(), new Ref())).to.be.false();
+        expect(Hoek.deepEqual(new Obj(), new Obj())).to.be.true();
+        expect(Hoek.deepEqual(new Ref(), new Ref())).to.be.true();
+        done();
+    });
+
+    it('compares plain objects', function (done) {
+
+        var a = Object.create(null);
+        var b = Object.create(null);
+
+        a.b = 'c';
+        b.b = 'c';
+
+        expect(Hoek.deepEqual(a, b)).to.be.true();
+        expect(Hoek.deepEqual(a, { b: 'c' })).to.be.false();
+        done();
+    });
+});
+
+describe('unique()', function () {
+
+    it('ensures uniqueness within array of objects based on subkey', function (done) {
+
+        var a = Hoek.unique(dupsArray, 'x');
+        expect(a).to.deep.equal(reducedDupsArray);
+        done();
+    });
+
+    it('removes duplicated without key', function (done) {
+
+        expect(Hoek.unique([1, 2, 3, 4, 2, 1, 5])).to.deep.equal([1, 2, 3, 4, 5]);
+        done();
+    });
+});
+
+describe('mapToObject()', function () {
+
+    it('returns null on null array', function (done) {
+
+        var a = Hoek.mapToObject(null);
+        expect(a).to.equal(null);
+        done();
+    });
+
+    it('converts basic array to existential object', function (done) {
+
+        var keys = [1, 2, 3, 4];
+        var a = Hoek.mapToObject(keys);
+        for (var i in keys) {
+            expect(a[keys[i]]).to.equal(true);
+        }
+        done();
+    });
+
+    it('converts array of objects to existential object', function (done) {
+
+        var keys = [{ x: 1 }, { x: 2 }, { x: 3 }, { y: 4 }];
+        var subkey = 'x';
+        var a = Hoek.mapToObject(keys, subkey);
+        expect(a).to.deep.equal({ 1: true, 2: true, 3: true });
+        done();
+    });
+});
+
+describe('intersect()', function () {
+
+    it('returns the common objects of two arrays', function (done) {
+
+        var array1 = [1, 2, 3, 4, 4, 5, 5];
+        var array2 = [5, 4, 5, 6, 7];
+        var common = Hoek.intersect(array1, array2);
+        expect(common.length).to.equal(2);
+        done();
+    });
+
+    it('returns just the first common object of two arrays', function (done) {
+
+        var array1 = [1, 2, 3, 4, 4, 5, 5];
+        var array2 = [5, 4, 5, 6, 7];
+        var common = Hoek.intersect(array1, array2, true);
+        expect(common).to.equal(5);
+        done();
+    });
+
+    it('returns null when no common and returning just the first common object of two arrays', function (done) {
+
+        var array1 = [1, 2, 3, 4, 4, 5, 5];
+        var array2 = [6, 7];
+        var common = Hoek.intersect(array1, array2, true);
+        expect(common).to.equal(null);
+        done();
+    });
+
+    it('returns an empty array if either input is null', function (done) {
+
+        expect(Hoek.intersect([1], null).length).to.equal(0);
+        expect(Hoek.intersect(null, [1]).length).to.equal(0);
+        done();
+    });
+
+    it('returns the common objects of object and array', function (done) {
+
+        var array1 = [1, 2, 3, 4, 4, 5, 5];
+        var array2 = [5, 4, 5, 6, 7];
+        var common = Hoek.intersect(Hoek.mapToObject(array1), array2);
+        expect(common.length).to.equal(2);
+        done();
+    });
+});
+
+describe('contain()', function () {
+
+    it('tests strings', function (done) {
+
+        expect(Hoek.contain('abc', 'ab')).to.be.true();
+        expect(Hoek.contain('abc', 'abc', { only: true })).to.be.true();
+        expect(Hoek.contain('aaa', 'a', { only: true })).to.be.true();
+        expect(Hoek.contain('abc', 'b', { once: true })).to.be.true();
+        expect(Hoek.contain('abc', ['a', 'c'])).to.be.true();
+        expect(Hoek.contain('abc', ['a', 'd'], { part: true })).to.be.true();
+
+        expect(Hoek.contain('abc', 'ac')).to.be.false();
+        expect(Hoek.contain('abcd', 'abc', { only: true })).to.be.false();
+        expect(Hoek.contain('aab', 'a', { only: true })).to.be.false();
+        expect(Hoek.contain('abb', 'b', { once: true })).to.be.false();
+        expect(Hoek.contain('abc', ['a', 'd'])).to.be.false();
+        expect(Hoek.contain('abc', ['ab', 'bc'])).to.be.false();                      // Overlapping values not supported
+        done();
+    });
+
+    it('tests arrays', function (done) {
+
+        expect(Hoek.contain([1, 2, 3], 1)).to.be.true();
+        expect(Hoek.contain([{ a: 1 }], { a: 1 }, { deep: true })).to.be.true();
+        expect(Hoek.contain([1, 2, 3], [1, 2])).to.be.true();
+        expect(Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true })).to.be.true();
+        expect(Hoek.contain([1, 1, 2], [1, 2], { only: true })).to.be.true();
+        expect(Hoek.contain([1, 2], [1, 2], { once: true })).to.be.true();
+        expect(Hoek.contain([1, 2, 3], [1, 4], { part: true })).to.be.true();
+        expect(Hoek.contain([[1], [2]], [[1]], { deep: true })).to.be.true();
+
+        expect(Hoek.contain([1, 2, 3], 4)).to.be.false();
+        expect(Hoek.contain([{ a: 1 }], { a: 2 }, { deep: true })).to.be.false();
+        expect(Hoek.contain([{ a: 1 }], { a: 1 })).to.be.false();
+        expect(Hoek.contain([1, 2, 3], [4, 5])).to.be.false();
+        expect(Hoek.contain([[3], [2]], [[1]])).to.be.false();
+        expect(Hoek.contain([[1], [2]], [[1]])).to.be.false();
+        expect(Hoek.contain([{ a: 1 }], [{ a: 2 }], { deep: true })).to.be.false();
+        expect(Hoek.contain([1, 3, 2], [1, 2], { only: true })).to.be.false();
+        expect(Hoek.contain([1, 2, 2], [1, 2], { once: true })).to.be.false();
+        expect(Hoek.contain([0, 2, 3], [1, 4], { part: true })).to.be.false();
+        done();
+    });
+
+    it('tests objects', function (done) {
+
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'a')).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'c'])).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'b', 'c'], { only: true })).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1 })).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, c: 3 })).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true })).to.be.true();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 }, { only: true })).to.be.true();
+        expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] }, { deep: true })).to.be.true();
+
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'd')).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'd'])).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3, d: 4 }, ['a', 'b', 'c'], { only: true })).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 2 })).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 2, b: 2 }, { part: true })).to.be.false();             // part does not ignore bad value
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 3 })).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 })).to.be.false();
+        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }, { only: true })).to.be.false();
+        expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] })).to.be.false();
+        done();
+    });
+});
+
+describe('flatten()', function () {
+
+    it('returns a flat array', function (done) {
+
+        var result = Hoek.flatten([1, 2, [3, 4, [5, 6], [7], 8], [9], [10, [11, 12]], 13]);
+        expect(result.length).to.equal(13);
+        expect(result).to.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
+        done();
+    });
+});
+
+describe('reach()', function () {
+
+    var obj = {
+        a: {
+            b: {
+                c: {
+                    d: 1,
+                    e: 2
+                },
+                f: 'hello'
+            },
+            g: {
+                h: 3
+            }
+        },
+        i: function () { },
+        j: null,
+        k: [4, 8, 9, 1]
+    };
+
+    obj.i.x = 5;
+
+    it('returns first value of array', function (done) {
+
+        expect(Hoek.reach(obj, 'k.0')).to.equal(4);
+        done();
+    });
+
+    it('returns last value of array using negative index', function (done) {
+
+        expect(Hoek.reach(obj, 'k.-2')).to.equal(9);
+        done();
+    });
+
+    it('returns a valid member', function (done) {
+
+        expect(Hoek.reach(obj, 'a.b.c.d')).to.equal(1);
+        done();
+    });
+
+    it('returns a valid member with separator override', function (done) {
+
+        expect(Hoek.reach(obj, 'a/b/c/d', '/')).to.equal(1);
+        done();
+    });
+
+    it('returns undefined on null object', function (done) {
+
+        expect(Hoek.reach(null, 'a.b.c.d')).to.equal(undefined);
+        done();
+    });
+
+    it('returns undefined on missing object member', function (done) {
+
+        expect(Hoek.reach(obj, 'a.b.c.d.x')).to.equal(undefined);
+        done();
+    });
+
+    it('returns undefined on missing function member', function (done) {
+
+        expect(Hoek.reach(obj, 'i.y', { functions: true })).to.equal(undefined);
+        done();
+    });
+
+    it('throws on missing member in strict mode', function (done) {
+
+        expect(function () {
+
+            Hoek.reach(obj, 'a.b.c.o.x', { strict: true });
+        }).to.throw('Missing segment o in reach path  a.b.c.o.x');
+
+        done();
+    });
+
+    it('returns undefined on invalid member', function (done) {
+
+        expect(Hoek.reach(obj, 'a.b.c.d-.x')).to.equal(undefined);
+        done();
+    });
+
+    it('returns function member', function (done) {
+
+        expect(typeof Hoek.reach(obj, 'i')).to.equal('function');
+        done();
+    });
+
+    it('returns function property', function (done) {
+
+        expect(Hoek.reach(obj, 'i.x')).to.equal(5);
+        done();
+    });
+
+    it('returns null', function (done) {
+
+        expect(Hoek.reach(obj, 'j')).to.equal(null);
+        done();
+    });
+
+    it('throws on function property when functions not allowed', function (done) {
+
+        expect(function () {
+
+            Hoek.reach(obj, 'i.x', { functions: false });
+        }).to.throw('Invalid segment x in reach path  i.x');
+
+        done();
+    });
+
+    it('will return a default value if property is not found', function (done) {
+
+        expect(Hoek.reach(obj, 'a.b.q', { default: 'defaultValue' })).to.equal('defaultValue');
+        done();
+    });
+
+    it('will return a default value if path is not found', function (done) {
+
+        expect(Hoek.reach(obj, 'q', { default: 'defaultValue' })).to.equal('defaultValue');
+        done();
+    });
+
+    it('allows a falsey value to be used as the default value', function (done) {
+
+        expect(Hoek.reach(obj, 'q', { default: '' })).to.equal('');
+        done();
+    });
+});
+
+describe('callStack()', function () {
+
+    it('returns the full call stack', function (done) {
+
+        var stack = Hoek.callStack();
+        expect(stack[0][0]).to.contain('index.js');
+        expect(stack[0][2]).to.equal(26);
+        done();
+    });
+});
+
+describe('displayStack ()', function () {
+
+    it('returns the full call stack for display', function (done) {
+
+        var stack = Hoek.displayStack();
+        expect(stack[0]).to.contain(Path.normalize('/test/index.js') + ':');
+        done();
+    });
+
+    it('includes constructor functions correctly', function (done) {
+
+        var Something = function (next) {
+
+            next();
+        };
+
+        var something = new Something(function () {
+
+            var stack = Hoek.displayStack();
+            expect(stack[1]).to.contain('new Something');
+            done();
+        });
+    });
+});
+
+describe('abort()', function () {
+
+    it('exits process when not in test mode', function (done) {
+
+        var env = process.env.NODE_ENV;
+        var write = process.stdout.write;
+        var exit = process.exit;
+
+        process.env.NODE_ENV = 'nottatest';
+        process.stdout.write = function () { };
+        process.exit = function (state) {
+
+            process.exit = exit;
+            process.env.NODE_ENV = env;
+            process.stdout.write = write;
+
+            expect(state).to.equal(1);
+            done();
+        };
+
+        Hoek.abort('Boom');
+    });
+
+    it('throws when not in test mode and abortThrow is true', function (done) {
+
+        var env = process.env.NODE_ENV;
+        process.env.NODE_ENV = 'nottatest';
+        Hoek.abortThrow = true;
+
+        var fn = function () {
+
+            Hoek.abort('my error message');
+        };
+
+        expect(fn).to.throw('my error message');
+        Hoek.abortThrow = false;
+        process.env.NODE_ENV = env;
+
+        done();
+    });
+
+    it('respects hideStack argument', function (done) {
+
+        var env = process.env.NODE_ENV;
+        var write = process.stdout.write;
+        var exit = process.exit;
+        var output = '';
+
+        process.exit = function () { };
+        process.env.NODE_ENV = '';
+        process.stdout.write = function (message) {
+
+            output = message;
+        };
+
+        Hoek.abort('my error message', true);
+
+        process.env.NODE_ENV = env;
+        process.stdout.write = write;
+        process.exit = exit;
+
+        expect(output).to.equal('ABORT: my error message\n\t\n');
+
+        done();
+    });
+
+    it('throws in test mode', function (done) {
+
+        var env = process.env.NODE_ENV;
+        process.env.NODE_ENV = 'test';
+
+        expect(function () {
+
+            Hoek.abort('my error message', true);
+        }).to.throw('my error message');
+
+        process.env.NODE_ENV = env;
+        done();
+    });
+
+    it('throws in test mode with default message', function (done) {
+
+        var env = process.env.NODE_ENV;
+        process.env.NODE_ENV = 'test';
+
+        expect(function () {
+
+            Hoek.abort('', true);
+        }).to.throw('Unknown error');
+
+        process.env.NODE_ENV = env;
+        done();
+    });
+
+    it('defaults to showing stack', function (done) {
+
+        var env = process.env.NODE_ENV;
+        var write = process.stdout.write;
+        var exit = process.exit;
+        var output = '';
+
+        process.exit = function () { };
+        process.env.NODE_ENV = '';
+        process.stdout.write = function (message) {
+
+            output = message;
+        };
+
+        Hoek.abort('my error message');
+
+        process.env.NODE_ENV = env;
+        process.stdout.write = write;
+        process.exit = exit;
+
+        expect(output).to.contain('index.js');
+
+        done();
+    });
+});
+
+describe('assert()', function () {
+
+    it('throws an Error when using assert in a test', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, 'my error message');
+        };
+
+        expect(fn).to.throw('my error message');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with no message', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false);
+        };
+
+        expect(fn).to.throw('Unknown error');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with multipart message', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, 'This', 'is', 'my message');
+        };
+
+        expect(fn).to.throw('This is my message');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with multipart message (empty)', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, 'This', 'is', '', 'my message');
+        };
+
+        expect(fn).to.throw('This is my message');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with object message', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, 'This', 'is', { spinal: 'tap' });
+        };
+
+        expect(fn).to.throw('This is {"spinal":"tap"}');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with multipart string and error messages', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, 'This', 'is', new Error('spinal'), new Error('tap'));
+        };
+
+        expect(fn).to.throw('This is spinal tap');
+        done();
+    });
+
+    it('throws an Error when using assert in a test with error object message', function (done) {
+
+        var fn = function () {
+
+            Hoek.assert(false, new Error('This is spinal tap'));
+        };
+
+        expect(fn).to.throw('This is spinal tap');
+        done();
+    });
+
+    it('throws the same Error that is passed to it if there is only one error passed', function (done) {
+        var error = new Error('ruh roh');
+        var error2 = new Error('ruh roh');
+
+        var fn = function () {
+
+            Hoek.assert(false, error);
+        };
+
+        try {
+            fn();
+        } catch (err) {
+            expect(error).to.equal(error);  // should be the same reference
+            expect(error).to.not.equal(error2); // error with the same message should not match
+        }
+
+        done();
+    });
+});
+
+describe('Timer', function () {
+
+    it('returns time elapsed', function (done) {
+
+        var timer = new Hoek.Timer();
+        setTimeout(function () {
+
+            expect(timer.elapsed()).to.be.above(9);
+            done();
+        }, 12);
+    });
+});
+
+describe('Bench', function () {
+
+    it('returns time elapsed', function (done) {
+
+        var timer = new Hoek.Bench();
+        setTimeout(function () {
+
+            expect(timer.elapsed()).to.be.above(9);
+            done();
+        }, 12);
+    });
+});
+
+describe('escapeRegex()', function () {
+
+    it('escapes all special regular expression characters', function (done) {
+
+        var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');
+        expect(a).to.equal('4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`"\\(>\\)\\[<\\]d\\{\\}s\\,');
+        done();
+    });
+});
+
+describe('Base64Url', function () {
+
+    var base64str = 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn-AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy8_T19vf4-fr7_P3-_w';
+    var str = unescape('%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF');
+
+    describe('base64urlEncode()', function () {
+
+        it('should base64 URL-safe a string', function (done) {
+
+            expect(Hoek.base64urlEncode(str)).to.equal(base64str);
+            done();
+        });
+
+        it('encodes a buffer', function (done) {
+
+            expect(Hoek.base64urlEncode(new Buffer(str, 'binary'))).to.equal(base64str);
+            done();
+        });
+
+        it('should base64 URL-safe a hex string', function (done) {
+
+            var buffer = new Buffer(str, 'binary');
+            expect(Hoek.base64urlEncode(buffer.toString('hex'), 'hex')).to.equal(base64str);
+            done();
+        });
+
+        it('works on larger input strings', function (done) {
+
+            var input = Fs.readFileSync(Path.join(__dirname, 'index.js')).toString();
+            var encoded = Hoek.base64urlEncode(input);
+
+            expect(encoded).to.not.contain('+');
+            expect(encoded).to.not.contain('/');
+
+            var decoded = Hoek.base64urlDecode(encoded);
+
+            expect(decoded).to.equal(input);
+            done();
+        });
+    });
+
+    describe('base64urlDecode()', function () {
+
+        it('should un-base64 URL-safe a string', function (done) {
+
+            expect(Hoek.base64urlDecode(base64str)).to.equal(str);
+            done();
+        });
+
+        it('should un-base64 URL-safe a string into hex', function (done) {
+
+            expect(Hoek.base64urlDecode(base64str, 'hex')).to.equal(new Buffer(str, 'binary').toString('hex'));
+            done();
+        });
+
+        it('should un-base64 URL-safe a string and return a buffer', function (done) {
+
+            var buf = Hoek.base64urlDecode(base64str, 'buffer');
+            expect(buf instanceof Buffer).to.equal(true);
+            expect(buf.toString('binary')).to.equal(str);
+            done();
+        });
+
+        it('returns error on undefined input', function (done) {
+
+            expect(Hoek.base64urlDecode().message).to.exist();
+            done();
+        });
+
+        it('returns error on invalid input', function (done) {
+
+            expect(Hoek.base64urlDecode('*').message).to.exist();
+            done();
+        });
+    });
+});
+
+describe('escapeHeaderAttribute()', function () {
+
+    it('should not alter ascii values', function (done) {
+
+        var a = Hoek.escapeHeaderAttribute('My Value');
+        expect(a).to.equal('My Value');
+        done();
+    });
+
+    it('escapes all special HTTP header attribute characters', function (done) {
+
+        var a = Hoek.escapeHeaderAttribute('I said go!!!#"' + String.fromCharCode(92));
+        expect(a).to.equal('I said go!!!#\\"\\\\');
+        done();
+    });
+
+    it('throws on large unicode characters', function (done) {
+
+        var fn = function () {
+
+            Hoek.escapeHeaderAttribute('this is a test' + String.fromCharCode(500) + String.fromCharCode(300));
+        };
+
+        expect(fn).to.throw(Error);
+        done();
+    });
+
+    it('throws on CRLF to prevent response splitting', function (done) {
+
+        var fn = function () {
+
+            Hoek.escapeHeaderAttribute('this is a test\r\n');
+        };
+
+        expect(fn).to.throw(Error);
+        done();
+    });
+});
+
+describe('escapeHtml()', function () {
+
+    it('escapes all special HTML characters', function (done) {
+
+        var a = Hoek.escapeHtml('&<>"\'`');
+        expect(a).to.equal('&amp;&lt;&gt;&quot;&#x27;&#x60;');
+        done();
+    });
+
+    it('returns empty string on falsy input', function (done) {
+
+        var a = Hoek.escapeHtml('');
+        expect(a).to.equal('');
+        done();
+    });
+
+    it('returns unchanged string on no reserved input', function (done) {
+
+        var a = Hoek.escapeHtml('abc');
+        expect(a).to.equal('abc');
+        done();
+    });
+});
+
+describe('nextTick()', function () {
+
+    it('calls the provided callback on nextTick', function (done) {
+
+        var a = 0;
+
+        var inc = function (step, next) {
+
+            a += step;
+            next();
+        };
+
+        var ticked = Hoek.nextTick(inc);
+
+        ticked(5, function () {
+
+            expect(a).to.equal(6);
+            done();
+        });
+
+        expect(a).to.equal(0);
+        inc(1, function () {
+
+            expect(a).to.equal(1);
+        });
+    });
+});
+
+describe('once()', function () {
+
+    it('allows function to only execute once', function (done) {
+
+        var gen = 0;
+        var add = function (x) {
+
+            gen += x;
+        };
+
+        add(5);
+        expect(gen).to.equal(5);
+        add = Hoek.once(add);
+        add(5);
+        expect(gen).to.equal(10);
+        add(5);
+        expect(gen).to.equal(10);
+        done();
+    });
+
+    it('double once wraps one time', function (done) {
+
+        var method = function () { };
+        method = Hoek.once(method);
+        method.x = 1;
+        method = Hoek.once(method);
+        expect(method.x).to.equal(1);
+        done();
+    });
+});
+
+describe('isAbsoltePath()', function () {
+
+    it('identifies if path is absolute on Unix without node support', { parallel: false }, function (done) {
+
+        var orig = Path.isAbsolute;
+        Path.isAbsolute = undefined;
+
+        expect(Hoek.isAbsolutePath('')).to.equal(false);
+        expect(Hoek.isAbsolutePath('a')).to.equal(false);
+        expect(Hoek.isAbsolutePath('./a')).to.equal(false);
+        expect(Hoek.isAbsolutePath('/a')).to.equal(true);
+        expect(Hoek.isAbsolutePath('/')).to.equal(true);
+
+        Path.isAbsolute = orig;
+
+        done();
+    });
+
+    it('identifies if path is absolute with fake node support', { parallel: false }, function (done) {
+
+        var orig = Path.isAbsolute;
+        Path.isAbsolute = function (path) { return path[0] === '/'; };
+
+        expect(Hoek.isAbsolutePath('', 'linux')).to.equal(false);
+        expect(Hoek.isAbsolutePath('a', 'linux')).to.equal(false);
+        expect(Hoek.isAbsolutePath('./a', 'linux')).to.equal(false);
+        expect(Hoek.isAbsolutePath('/a', 'linux')).to.equal(true);
+        expect(Hoek.isAbsolutePath('/', 'linux')).to.equal(true);
+
+        Path.isAbsolute = orig;
+
+        done();
+    });
+
+    it('identifies if path is absolute on Windows without node support', { parallel: false }, function (done) {
+
+        var orig = Path.isAbsolute;
+        Path.isAbsolute = undefined;
+
+        expect(Hoek.isAbsolutePath('//server/file', 'win32')).to.equal(true);
+        expect(Hoek.isAbsolutePath('//server/file', 'win32')).to.equal(true);
+        expect(Hoek.isAbsolutePath('\\\\server\\file', 'win32')).to.equal(true);
+        expect(Hoek.isAbsolutePath('C:/Users/', 'win32')).to.equal(true);
+        expect(Hoek.isAbsolutePath('C:\\Users\\', 'win32')).to.equal(true);
+        expect(Hoek.isAbsolutePath('C:cwd/another', 'win32')).to.equal(false);
+        expect(Hoek.isAbsolutePath('C:cwd\\another', 'win32')).to.equal(false);
+        expect(Hoek.isAbsolutePath('directory/directory', 'win32')).to.equal(false);
+        expect(Hoek.isAbsolutePath('directory\\directory', 'win32')).to.equal(false);
+
+        Path.isAbsolute = orig;
+
+        done();
+    });
+});
+
+describe('isInteger()', function () {
+
+    it('validates integers', function (done) {
+
+        expect(Hoek.isInteger(0)).to.equal(true);
+        expect(Hoek.isInteger(1)).to.equal(true);
+        expect(Hoek.isInteger(1394035612500)).to.equal(true);
+        expect(Hoek.isInteger('0')).to.equal(false);
+        expect(Hoek.isInteger(1.0)).to.equal(true);
+        expect(Hoek.isInteger(1.1)).to.equal(false);
+        done();
+    });
+});
+
+describe('ignore()', function () {
+
+    it('exists', function (done) {
+
+        expect(Hoek.ignore).to.exist();
+        expect(typeof Hoek.ignore).to.equal('function');
+        done();
+    });
+});
+
+describe('inherits()', function () {
+
+    it('exists', function (done) {
+
+        expect(Hoek.inherits).to.exist();
+        expect(typeof Hoek.inherits).to.equal('function');
+        done();
+    });
+});
+
+describe('format()', function () {
+
+    it('exists', function (done) {
+
+        expect(Hoek.format).to.exist();
+        expect(typeof Hoek.format).to.equal('function');
+        done();
+    });
+
+    it('is a reference to Util.format', function (done) {
+
+        expect(Hoek.format('hello %s', 'world')).to.equal('hello world');
+        done();
+    });
+});
+
+describe('transform()', function () {
+
+    var source = {
+        address: {
+            one: '123 main street',
+            two: 'PO Box 1234'
+        },
+        zip: {
+            code: 3321232,
+            province: null
+        },
+        title: 'Warehouse',
+        state: 'CA'
+    };
+
+    it('transforms an object based on the input object', function (done) {
+
+        var result = Hoek.transform(source, {
+            'person.address.lineOne': 'address.one',
+            'person.address.lineTwo': 'address.two',
+            'title': 'title',
+            'person.address.region': 'state',
+            'person.address.zip': 'zip.code',
+            'person.address.location': 'zip.province'
+        });
+
+        expect(result).to.deep.equal({
+            person: {
+                address: {
+                    lineOne: '123 main street',
+                    lineTwo: 'PO Box 1234',
+                    region: 'CA',
+                    zip: 3321232,
+                    location: null
+                }
+            },
+            title: 'Warehouse'
+        });
+
+        done();
+    });
+
+    it('uses the reach options passed into it', function (done) {
+
+        var schema = {
+            'person.address.lineOne': 'address-one',
+            'person.address.lineTwo': 'address-two',
+            'title': 'title',
+            'person.address.region': 'state',
+            'person.prefix': 'person-title',
+            'person.zip': 'zip-code'
+        };
+        var options = {
+            separator: '-',
+            default: 'unknown'
+        };
+        var result = Hoek.transform(source, schema, options);
+
+        expect(result).to.deep.equal({
+            person: {
+                address: {
+                    lineOne: '123 main street',
+                    lineTwo: 'PO Box 1234',
+                    region: 'CA'
+                },
+                prefix: 'unknown',
+                zip: 3321232
+            },
+            title: 'Warehouse'
+        });
+
+        done();
+    });
+
+    it('works to create shallow objects', function (done) {
+
+        var result = Hoek.transform(source, {
+            lineOne: 'address.one',
+            lineTwo: 'address.two',
+            title: 'title',
+            region: 'state',
+            province: 'zip.province'
+        });
+
+        expect(result).to.deep.equal({
+            lineOne: '123 main street',
+            lineTwo: 'PO Box 1234',
+            title: 'Warehouse',
+            region: 'CA',
+            province: null
+        });
+
+        done();
+    });
+
+    it('only allows strings in the map', function (done) {
+
+        expect(function () {
+            var result = Hoek.transform(source, {
+                lineOne: {}
+            });
+        }).to.throw('All mappings must be "." delineated strings');
+
+        done();
+    });
+
+    it('throws an error on invalid arguments', function (done) {
+
+        expect(function () {
+
+            var result = Hoek.transform(NaN, {});
+        }).to.throw('Invalid source object: must be null, undefined, or an object');
+
+        done();
+    });
+
+    it('is safe to pass null', function (done) {
+
+        var result = Hoek.transform(null, {});
+        expect(result).to.deep.equal({});
+
+        done();
+    });
+
+    it('is safe to pass undefined', function (done) {
+
+        var result = Hoek.transform(undefined, {});
+        expect(result).to.deep.equal({});
+
+        done();
+    });
+});
+
+describe('uniqueFilename()', function () {
+
+    it('generates a random file path', function (done) {
+
+        var result = Hoek.uniqueFilename('./test/modules');
+
+        expect(result).to.exist();
+        expect(result).to.be.a.string();
+        expect(result).to.contain('test/modules');
+        done();
+    });
+
+    it('is random enough to use in fast loops', function (done) {
+
+        var results = [];
+
+        for (var i = 0; i < 10; ++i) {
+            results[i] = Hoek.uniqueFilename('./test/modules');
+        }
+
+        var filter = results.filter(function (item, index, array) {
+
+            return array.indexOf(item) === index;
+        });
+
+        expect(filter.length).to.equal(10);
+        expect(results.length).to.equal(10);
+        done();
+
+    });
+
+    it('combines the random elements with a supplied character', function (done) {
+
+        var result = Hoek.uniqueFilename('./test', 'txt');
+
+        expect(result).to.contain('test/');
+        expect(result).to.contain('.txt');
+
+        done();
+    });
+
+    it('accepts extensions with a "." in it', function (done) {
+
+        var result = Hoek.uniqueFilename('./test', '.mp3');
+
+        expect(result).to.contain('test/');
+        expect(result).to.contain('.mp3');
+
+        done();
+    });
+});
+
+describe('stringify()', function (done) {
+
+    it('converts object to string', function (done) {
+
+        var obj = { a: 1 };
+        expect(Hoek.stringify(obj)).to.equal('{"a":1}');
+        done();
+    });
+
+    it('returns error in result string', function (done) {
+
+        var obj = { a: 1 };
+        obj.b = obj;
+        expect(Hoek.stringify(obj)).to.equal('[Cannot display object: Converting circular structure to JSON]');
+        done();
+    });
+});
+
+describe('shallow()', function (done) {
+
+    it('shallow copies an object', function (done) {
+
+        var obj = {
+            a: 5,
+            b: {
+                c: 6
+            }
+        };
+
+        var shallow = Hoek.shallow(obj);
+        expect(shallow).to.not.equal(obj);
+        expect(shallow).to.deep.equal(obj);
+        expect(shallow.b).to.equal(obj.b);
+        done();
+    });
+});
diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt b/deps/npm/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt
new file mode 100644 (file)
index 0000000..e69de29
index e699a7bdbaa168de34896b86992937ca92ba26e6..b0d877439ead0d0b8422a4ebe75038e75b638938 100755 (executable)
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2013, Eran Hammer.
+Copyright (c) 2012-2014, Eran Hammer and other contributors.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -8,17 +8,21 @@ modification, are permitted provided that the following conditions are met:
     * 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.
-    * Neither the name of Eran Hammer nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
+    * The names of any contributors may not be used to endorse or promote
+      products derived from this software without specific prior written
+      permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 ERAN HAMMER BE LIABLE FOR ANY
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND 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.
+
+                                  *   *   *
+
+The complete list of contributors can be found at: https://github.com/hueniverse/sntp/graphs/contributors
index 9e7138c2a6f532afb40d02c50c1e056345ae0756..417fd93708605f0a88b4cf36f0eab46d9eb653ca 100755 (executable)
@@ -1,11 +1,9 @@
 test:
-       @./node_modules/.bin/lab
+       @node node_modules/lab/bin/lab
 test-cov: 
-       @./node_modules/.bin/lab -r threshold -t 100
+       @node node_modules/lab/bin/lab -t 100 -m 3000
 test-cov-html:
-       @./node_modules/.bin/lab -r html -o coverage.html
-complexity:
-       @./node_modules/.bin/cr -o complexity.md -f markdown lib
+       @node node_modules/lab/bin/lab -r html -o coverage.html
 
-.PHONY: test test-cov test-cov-html complexity
+.PHONY: test test-cov test-cov-html
 
index e492cd9386eb2501c565053f2deb2335245bd076..e91718b4ff5503185a23d419bca0062d7b60d20f 100755 (executable)
@@ -29,7 +29,6 @@ exports.time = function (options, callback) {
 
     // Ensure callback is only called once
 
-    var isFinished = false;
     var finish = function (err, result) {
 
         if (timeoutId) {
@@ -37,14 +36,14 @@ exports.time = function (options, callback) {
             timeoutId = 0;
         }
 
-        if (!isFinished) {
-            isFinished = true;
-            socket.removeAllListeners();
-            socket.close();
-            return callback(err, result);
-        }
+        socket.removeAllListeners();
+        socket.once('error', internals.ignore);
+        socket.close();
+        return callback(err, result);
     };
 
+    finish = Hoek.once(finish);
+
     // Create UDP socket
 
     var socket = Dgram.createSocket('udp4');
@@ -99,7 +98,7 @@ exports.time = function (options, callback) {
 
         Dns.reverse(message.referenceId, function (err, domains) {
 
-            if (!err) {
+            if (/* $lab:coverage:off$ */ !err /* $lab:coverage:on$ */) {
                 message.referenceHost = domains[0];
             }
 
@@ -318,7 +317,7 @@ exports.offset = function (options, callback) {
         now < internals.last.expires) {
 
         process.nextTick(function () {
-                
+
             callback(null, internals.last.offset);
         });
 
@@ -359,10 +358,10 @@ exports.start = function (options, callback) {
 
     if (internals.now.intervalId) {
         process.nextTick(function () {
-            
+
             callback();
         });
-        
+
         return;
     }
 
@@ -407,3 +406,7 @@ exports.now = function () {
     return now + internals.last.offset;
 };
 
+
+internals.ignore = function () {
+
+};
index 0656c84e19864a4702dde82405503e699ccbd619..45356c8c7a7751a7bf4a8139fb8ef29025ddca2c 100755 (executable)
@@ -1,10 +1,10 @@
 {
   "name": "sntp",
   "description": "SNTP Client",
-  "version": "0.2.4",
+  "version": "1.0.9",
   "author": {
     "name": "Eran Hammer",
-    "email": "eran@hueniverse.com",
+    "email": "eran@hammer.io",
     "url": "http://hueniverse.com"
   },
   "contributors": [],
     "node": ">=0.8.0"
   },
   "dependencies": {
-    "hoek": "0.9.x"
+    "hoek": "2.x.x"
   },
   "devDependencies": {
-    "lab": "0.1.x",
-    "complexity-report": "0.x.x"
+    "lab": "4.x.x"
   },
   "scripts": {
     "test": "make test-cov"
       "url": "http://github.com/hueniverse/sntp/raw/master/LICENSE"
     }
   ],
-  "_id": "sntp@0.2.4",
-  "dist": {
-    "shasum": "fb885f18b0f3aad189f824862536bceeec750900",
-    "tarball": "http://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz"
+  "gitHead": "ee2e35284f684609990681734d39010cd356d7da",
+  "bugs": {
+    "url": "https://github.com/hueniverse/sntp/issues"
   },
-  "_from": "sntp@>=0.2.0 <0.3.0",
-  "_npmVersion": "1.2.18",
+  "homepage": "https://github.com/hueniverse/sntp",
+  "_id": "sntp@1.0.9",
+  "_shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
+  "_from": "sntp@>=1.0.0 <2.0.0",
+  "_npmVersion": "1.4.23",
   "_npmUser": {
     "name": "hueniverse",
     "email": "eran@hueniverse.com"
       "email": "eran@hueniverse.com"
     }
   ],
-  "directories": {},
-  "_shasum": "fb885f18b0f3aad189f824862536bceeec750900",
-  "_resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz",
-  "bugs": {
-    "url": "https://github.com/hueniverse/sntp/issues"
+  "dist": {
+    "shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
+    "tarball": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
   },
-  "readme": "ERROR: No README data found!",
-  "homepage": "https://github.com/hueniverse/sntp"
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+  "readme": "ERROR: No README data found!"
 }
index 38a5534673eaa7f5248450434a8b0faf87f488c8..f1d1cdabf5bb6689b68846140ae438caa8c2a2ff 100755 (executable)
@@ -1,5 +1,6 @@
 // Load modules
 
+var Dns = require('dns');
 var Dgram = require('dgram');
 var Lab = require('lab');
 var Sntp = require('../lib');
@@ -12,11 +13,12 @@ var internals = {};
 
 // Test shortcuts
 
+var lab = exports.lab = Lab.script();
+var before = lab.before;
+var after = lab.after;
+var describe = lab.experiment;
+var it = lab.test;
 var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
 
 
 describe('SNTP', function () {
@@ -64,14 +66,14 @@ describe('SNTP', function () {
             });
         });
 
-        it('errors on error event', function (done) {
+        it('errors on error event', { parallel: false }, function (done) {
 
             var orig = Dgram.createSocket;
             Dgram.createSocket = function (type) {
 
                 Dgram.createSocket = orig;
                 var socket = Dgram.createSocket(type);
-                process.nextTick(function () { socket.emit('error', new Error('Fake')) });
+                setImmediate(function () { socket.emit('error', new Error('Fake')) });
                 return socket;
             };
 
@@ -84,13 +86,31 @@ describe('SNTP', function () {
             });
         });
 
+        it('errors on incorrect sent size', { parallel: false }, function (done) {
+
+            var orig = Dgram.Socket.prototype.send;
+            Dgram.Socket.prototype.send = function (buf, offset, length, port, address, callback) {
+
+                Dgram.Socket.prototype.send = orig;
+                return callback(null, 40);
+            };
+
+            Sntp.time(function (err, time) {
+
+                expect(err).to.exist;
+                expect(time).to.not.exist;
+                expect(err.message).to.equal('Could not send entire message');
+                done();
+            });
+        });
+
         it('times out on invalid host', function (done) {
 
             Sntp.time({ host: 'error', timeout: 10000 }, function (err, time) {
 
                 expect(err).to.exist;
                 expect(time).to.not.exist;
-                expect(err.message).to.equal('getaddrinfo ENOTFOUND');
+                expect(err.message).to.contain('getaddrinfo');
                 done();
             });
         });
@@ -162,6 +182,30 @@ describe('SNTP', function () {
             });
         });
 
+        it('fails on bad originateTimestamp', function (done) {
+
+            messup([[24, 0x83], [25, 0xaa], [26, 0x7e], [27, 0x80], [28, 0], [29, 0], [30, 0], [31, 0]]);
+
+            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
+
+                expect(err).to.exist;
+                expect(err.message).to.equal('Invalid server response');
+                done();
+            });
+        });
+
+        it('fails on bad receiveTimestamp', function (done) {
+
+            messup([[32, 0x83], [33, 0xaa], [34, 0x7e], [35, 0x80], [36, 0], [37, 0], [38, 0], [39, 0]]);
+
+            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
+
+                expect(err).to.exist;
+                expect(err.message).to.equal('Invalid server response');
+                done();
+            });
+        });
+
         it('fails on bad originate timestamp and alarm li', function (done) {
 
             messup([[0, (3 << 6) + (4 << 3) + (4 << 0)]]);
@@ -288,6 +332,38 @@ describe('SNTP', function () {
             });
         });
 
+        it('gets the new offset on different server', function (done) {
+
+            Sntp.offset(function (err, offset) {
+
+                expect(err).to.not.exist;
+                expect(offset).to.not.equal(0);
+                var offset1 = offset;
+                Sntp.offset({ host: 'nist1-sj.ustiming.org' }, function (err, offset) {
+
+                    expect(err).to.not.exist;
+                    expect(offset).to.not.equal(offset1);
+                    done();
+                });
+            });
+        });
+
+        it('gets the new offset on different server', function (done) {
+
+            Sntp.offset(function (err, offset) {
+
+                expect(err).to.not.exist;
+                expect(offset).to.not.equal(0);
+                var offset1 = offset;
+                Sntp.offset({ port: 123 }, function (err, offset) {
+
+                    expect(err).to.not.exist;
+                    expect(offset).to.not.equal(offset1);
+                    done();
+                });
+            });
+        });
+
         it('fails getting the current offset on invalid server', function (done) {
 
             Sntp.offset({ host: 'error' }, function (err, offset) {
index fadd7a97f02dab11aaa9a0a29d57520c7e70a9e6..4fe0064cae6eed28206561d4d789c0ae5edbc64e 100755 (executable)
@@ -1,10 +1,10 @@
 {
   "name": "hawk",
   "description": "HTTP Hawk Authentication Scheme",
-  "version": "1.1.1",
+  "version": "2.3.1",
   "author": {
     "name": "Eran Hammer",
-    "email": "eran@hueniverse.com",
+    "email": "eran@hammer.io",
     "url": "http://hueniverse.com"
   },
   "contributors": [],
   "engines": {
     "node": ">=0.8.0"
   },
+  "browser": "./lib/browser.js",
   "dependencies": {
-    "hoek": "0.9.x",
-    "boom": "0.4.x",
-    "cryptiles": "0.2.x",
-    "sntp": "0.2.x"
+    "hoek": "2.x.x",
+    "boom": "2.x.x",
+    "cryptiles": "2.x.x",
+    "sntp": "1.x.x"
   },
   "devDependencies": {
-    "lab": "0.1.x",
-    "complexity-report": "0.x.x",
-    "localStorage": "1.0.x"
+    "code": "1.x.x",
+    "lab": "5.x.x"
   },
   "scripts": {
     "test": "make test-cov"
       "url": "http://github.com/hueniverse/hawk/raw/master/LICENSE"
     }
   ],
+  "gitHead": "492632da51ecedd5f59ce96f081860ad24ce6532",
   "bugs": {
     "url": "https://github.com/hueniverse/hawk/issues"
   },
-  "_id": "hawk@1.1.1",
-  "dist": {
-    "shasum": "87cd491f9b46e4e2aeaca335416766885d2d1ed9",
-    "tarball": "http://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz"
-  },
-  "_from": "hawk@1.1.1",
-  "_npmVersion": "1.3.8",
+  "homepage": "https://github.com/hueniverse/hawk",
+  "_id": "hawk@2.3.1",
+  "_shasum": "1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f",
+  "_from": "hawk@>=2.3.0 <2.4.0",
+  "_npmVersion": "1.4.28",
   "_npmUser": {
     "name": "hueniverse",
     "email": "eran@hueniverse.com"
       "email": "eran@hueniverse.com"
     }
   ],
+  "dist": {
+    "shasum": "1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f",
+    "tarball": "http://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz"
+  },
   "directories": {},
-  "_shasum": "87cd491f9b46e4e2aeaca335416766885d2d1ed9",
-  "_resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
-  "readme": "ERROR: No README data found!",
-  "homepage": "https://github.com/hueniverse/hawk"
+  "_resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz",
+  "readme": "ERROR: No README data found!"
 }
index 5bcb910c12feb6728612075c1a92beb168b1e7e3..a45241389c594a126a22a7d8f6ec85d100286748 100755 (executable)
@@ -1,10 +1,11 @@
 // Load modules
 
-var Lab = require('lab');
-var Hoek = require('hoek');
+var Url = require('url');
+var Code = require('code');
 var Hawk = require('../lib');
+var Hoek = require('hoek');
+var Lab = require('lab');
 var Browser = require('../lib/browser');
-var LocalStorage = require('localStorage');
 
 
 // Declare internals
@@ -14,11 +15,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Browser', function () {
@@ -35,7 +35,205 @@ describe('Browser', function () {
         return callback(null, credentials);
     };
 
-    it('should generate a header then successfully parse it (configuration)', function (done) {
+    it('should generate a bewit then successfully authenticate it', function (done) {
+
+        var req = {
+            method: 'GET',
+            url: '/resource/4?a=1&b=2',
+            host: 'example.com',
+            port: 80
+        };
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials, ttlSec: 60 * 60 * 24 * 365 * 100, ext: 'some-app-data' });
+            req.url += '&bewit=' + bewit;
+
+            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
+
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                expect(attributes.ext).to.equal('some-app-data');
+                done();
+            });
+        });
+    });
+
+    it('should generate a bewit then successfully authenticate it (no ext)', function (done) {
+
+        var req = {
+            method: 'GET',
+            url: '/resource/4?a=1&b=2',
+            host: 'example.com',
+            port: 80
+        };
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials, ttlSec: 60 * 60 * 24 * 365 * 100 });
+            req.url += '&bewit=' + bewit;
+
+            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
+
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                done();
+            });
+        });
+    });
+
+    describe('#bewit', function () {
+
+        it('returns a valid bewit value', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');
+            done();
+        });
+
+        it('returns a valid bewit value (explicit HTTP port)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('http://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6');
+            done();
+        });
+
+        it('returns a valid bewit value (explicit HTTPS port)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com:8043/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcL2t4UjhwK0xSaTdvQTRnUXc3cWlxa3BiVHRKYkR4OEtRMC9HRUwvVytTUT1ceGFuZHlhbmR6');
+            done();
+        });
+
+        it('returns a valid bewit value (null ext)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c');
+            done();
+        });
+
+        it('errors on invalid options', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', 4);
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on missing uri', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid uri', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid credentials (id)', function (done) {
+
+            var credentials = {
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on missing credentials', function (done) {
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid credentials (key)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid algorithm', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'hmac-sha-0'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on missing options', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'hmac-sha-0'
+            };
+
+            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow');
+            expect(bewit).to.equal('');
+            done();
+        });
+    });
+
+    it('generates a header then successfully parse it (configuration)', function (done) {
 
         var req = {
             method: 'GET',
@@ -47,11 +245,11 @@ describe('Browser', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data' }).field;
-            expect(req.authorization).to.exist;
+            expect(req.authorization).to.exist();
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 done();
@@ -59,7 +257,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (node request)', function (done) {
+    it('generates a header then successfully parse it (node request)', function (done) {
 
         var req = {
             method: 'POST',
@@ -79,7 +277,7 @@ describe('Browser', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -95,7 +293,7 @@ describe('Browser', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Browser.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(true);
                 done();
@@ -103,7 +301,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (no server header options)', function (done) {
+    it('generates a header then successfully parse it (browserify)', function (done) {
 
         var req = {
             method: 'POST',
@@ -123,7 +321,75 @@ describe('Browser', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                expect(artifacts.ext).to.equal('some-app-data');
+                expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
+
+                var res = {
+                    headers: {
+                        'content-type': 'text/plain'
+                    },
+                    getHeader: function (header) {
+
+                        return res.headers[header.toLowerCase()];
+                    }
+                };
+
+                res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
+                expect(res.headers['server-authorization']).to.exist();
+
+                expect(Browser.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(true);
+                done();
+            });
+        });
+    });
+
+    it('generates a header then successfully parse it (time offset)', function (done) {
+
+        var req = {
+            method: 'GET',
+            url: '/resource/4?filter=a',
+            host: 'example.com',
+            port: 8080
+        };
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', localtimeOffsetMsec: 100000 }).field;
+            expect(req.authorization).to.exist();
+
+            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials, artifacts) {
+
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                expect(artifacts.ext).to.equal('some-app-data');
+                done();
+            });
+        });
+    });
+
+    it('generates a header then successfully parse it (no server header options)', function (done) {
+
+        var req = {
+            method: 'POST',
+            url: '/resource/4?filter=a',
+            headers: {
+                host: 'example.com:8080',
+                'content-type': 'text/plain;x=y'
+            }
+        };
+
+        var payload = 'some not so random text';
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
+            req.headers.authorization = reqHeader.field;
+
+            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
+
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -139,7 +405,7 @@ describe('Browser', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts);
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Browser.client.authenticate(res, credentials, artifacts)).to.equal(true);
                 done();
@@ -147,7 +413,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (no server header)', function (done) {
+    it('generates a header then successfully parse it (no server header)', function (done) {
 
         var req = {
             method: 'POST',
@@ -167,7 +433,7 @@ describe('Browser', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -188,7 +454,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header with stale ts and successfully authenticate on second call', function (done) {
+    it('generates a header with stale ts and successfully authenticate on second call', function (done) {
 
         var req = {
             method: 'GET',
@@ -202,16 +468,16 @@ describe('Browser', function () {
             Browser.utils.setNtpOffset(60 * 60 * 1000);
             var header = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data' });
             req.authorization = header.field;
-            expect(req.authorization).to.exist;
+            expect(req.authorization).to.exist();
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Stale timestamp');
 
                 var res = {
                     headers: {
-                        'www-authenticate': err.response.headers['WWW-Authenticate']
+                        'www-authenticate': err.output.headers['WWW-Authenticate']
                     },
                     getResponseHeader: function (header) {
 
@@ -224,11 +490,11 @@ describe('Browser', function () {
                 expect(Browser.utils.getNtpOffset()).to.equal(0);
 
                 req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data' }).field;
-                expect(req.authorization).to.exist;
+                expect(req.authorization).to.exist();
 
                 Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     expect(artifacts.ext).to.equal('some-app-data');
                     done();
@@ -237,7 +503,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header with stale ts and successfully authenticate on second call (manual localStorage)', function (done) {
+    it('generates a header with stale ts and successfully authenticate on second call (manual localStorage)', function (done) {
 
         var req = {
             method: 'GET',
@@ -247,21 +513,24 @@ describe('Browser', function () {
         };
 
         credentialsFunc('123456', function (err, credentials) {
-            Browser.utils.setStorage(LocalStorage)
+
+            var localStorage = new Browser.internals.LocalStorage();
+
+            Browser.utils.setStorage(localStorage)
 
             Browser.utils.setNtpOffset(60 * 60 * 1000);
             var header = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data' });
             req.authorization = header.field;
-            expect(req.authorization).to.exist;
+            expect(req.authorization).to.exist();
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Stale timestamp');
 
                 var res = {
                     headers: {
-                        'www-authenticate': err.response.headers['WWW-Authenticate']
+                        'www-authenticate': err.output.headers['WWW-Authenticate']
                     },
                     getResponseHeader: function (header) {
 
@@ -269,18 +538,18 @@ describe('Browser', function () {
                     }
                 };
 
-                expect(parseInt(LocalStorage.getItem('hawk_ntp_offset'))).to.equal(60 * 60 * 1000);
+                expect(parseInt(localStorage.getItem('hawk_ntp_offset'))).to.equal(60 * 60 * 1000);
                 expect(Browser.utils.getNtpOffset()).to.equal(60 * 60 * 1000);
                 expect(Browser.client.authenticate(res, credentials, header.artifacts)).to.equal(true);
                 expect(Browser.utils.getNtpOffset()).to.equal(0);
-                expect(parseInt(LocalStorage.getItem('hawk_ntp_offset'))).to.equal(0);
+                expect(parseInt(localStorage.getItem('hawk_ntp_offset'))).to.equal(0);
 
                 req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data' }).field;
-                expect(req.authorization).to.exist;
+                expect(req.authorization).to.exist();
 
                 Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     expect(artifacts.ext).to.equal('some-app-data');
                     done();
@@ -289,7 +558,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then fails to parse it (missing server header hash)', function (done) {
+    it('generates a header then fails to parse it (missing server header hash)', function (done) {
 
         var req = {
             method: 'POST',
@@ -309,7 +578,7 @@ describe('Browser', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -325,7 +594,7 @@ describe('Browser', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts);
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Browser.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(false);
                 done();
@@ -333,7 +602,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (with hash)', function (done) {
+    it('generates a header then successfully parse it (with hash)', function (done) {
 
         var req = {
             method: 'GET',
@@ -347,7 +616,7 @@ describe('Browser', function () {
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 done();
@@ -355,7 +624,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it then validate payload', function (done) {
+    it('generates a header then successfully parse it then validate payload', function (done) {
 
         var req = {
             method: 'GET',
@@ -369,17 +638,17 @@ describe('Browser', function () {
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload('hola!', credentials, artifacts)).to.be.true;
-                expect(Hawk.server.authenticatePayload('hello!', credentials, artifacts)).to.be.false;
+                expect(Hawk.server.authenticatePayload('hola!', credentials, artifacts)).to.be.true();
+                expect(Hawk.server.authenticatePayload('hello!', credentials, artifacts)).to.be.false();
                 done();
             });
         });
     });
 
-    it('should generate a header then successfully parse it (app)', function (done) {
+    it('generates a header then successfully parse it (app)', function (done) {
 
         var req = {
             method: 'GET',
@@ -393,7 +662,7 @@ describe('Browser', function () {
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', app: 'asd23ased' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(artifacts.app).to.equal('asd23ased');
@@ -402,7 +671,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (app, dlg)', function (done) {
+    it('generates a header then successfully parse it (app, dlg)', function (done) {
 
         var req = {
             method: 'GET',
@@ -416,7 +685,7 @@ describe('Browser', function () {
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', app: 'asd23ased', dlg: '23434szr3q4d' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(artifacts.app).to.equal('asd23ased');
@@ -426,7 +695,7 @@ describe('Browser', function () {
         });
     });
 
-    it('should generate a header then fail authentication due to bad hash', function (done) {
+    it('generates a header then fail authentication due to bad hash', function (done) {
 
         var req = {
             method: 'GET',
@@ -440,14 +709,14 @@ describe('Browser', function () {
             req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, { payload: 'byebye!' }, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Bad payload hash');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Bad payload hash');
                 done();
             });
         });
     });
 
-    it('should generate a header for one resource then fail to authenticate another', function (done) {
+    it('generates a header for one resource then fail to authenticate another', function (done) {
 
         var req = {
             method: 'GET',
@@ -463,8 +732,8 @@ describe('Browser', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
-                expect(credentials).to.exist;
+                expect(err).to.exist();
+                expect(credentials).to.exist();
                 done();
             });
         });
@@ -474,7 +743,7 @@ describe('Browser', function () {
 
         describe('#header', function () {
 
-            it('should return a valid authorization header (sha1)', function (done) {
+            it('returns a valid authorization header (sha1)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -487,7 +756,7 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should return a valid authorization header (sha256)', function (done) {
+            it('returns a valid authorization header (sha256)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -500,7 +769,20 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should return a valid authorization header (no ext)', function (done) {
+            it('returns a valid authorization header (empty payload)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var header = Browser.client.header('http://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: '' }).field;
+                expect(header).to.equal('Hawk id=\"123456\", ts=\"1353809207\", nonce=\"Ygvqdz\", hash=\"404ghL7K+hfyhByKKejFBRGgTjU=\", ext=\"Bazinga!\", mac=\"Bh1sj1DOfFRWOdi3ww52nLCJdBE=\"');
+                done();
+            });
+
+            it('returns a valid authorization header (no ext)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -513,26 +795,132 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should return an empty authorization header on missing options', function (done) {
+            it('returns a valid authorization header (null ext)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain', ext: null }).field;
+                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
+                done();
+            });
+
+            it('returns a valid authorization header (uri object)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var uri = Browser.utils.parseUri('https://example.net/somewhere/over/the/rainbow');
+                var header = Browser.client.header(uri, 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
+                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
+                done();
+            });
+
+            it('errors on missing options', function (done) {
+
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST');
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on empty uri', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header('', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on invalid uri', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header(4, 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on missing method', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', '', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on invalid method', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 5, { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on missing credentials', function (done) {
 
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST').field;
-                expect(header).to.equal('');
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credentials object');
                 done();
             });
 
-            it('should return an empty authorization header on invalid credentials', function (done) {
+            it('errors on invalid credentials (id)', function (done) {
 
                 var credentials = {
                     key: '2983d45yun89q',
                     algorithm: 'sha256'
                 };
 
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 }).field;
-                expect(header).to.equal('');
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credentials object');
+                done();
+            });
+
+            it('errors on invalid credentials (key)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    algorithm: 'sha256'
+                };
+
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credentials object');
                 done();
             });
 
-            it('should return an empty authorization header on invalid algorithm', function (done) {
+            it('errors on invalid algorithm', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -540,15 +928,64 @@ describe('Browser', function () {
                     algorithm: 'hmac-sha-0'
                 };
 
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 }).field;
-                expect(header).to.equal('');
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Unknown algorithm');
+                done();
+            });
+
+            it('uses a pre-calculated payload hash', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var options = { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' };
+                options.hash = Browser.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
+                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', options).field;
+                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", ext="Bazinga!", mac="q1CwFoSHzPZSkbIvl0oYlD+91rBUEvFk763nMjMndj8="');
                 done();
             });
         });
 
         describe('#authenticate', function () {
 
-            it('should return false on invalid header', function (done) {
+            it('skips tsm validation when missing ts', function (done) {
+
+                var res = {
+                    headers: {
+                        'www-authenticate': 'Hawk error="Stale timestamp"'
+                    },
+                    getResponseHeader: function (header) {
+
+                        return res.headers[header.toLowerCase()];
+                    }
+                };
+
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    ts: 1402135580,
+                    nonce: 'iBRB6t',
+                    method: 'GET',
+                    resource: '/resource/4?filter=a',
+                    host: 'example.com',
+                    port: '8080',
+                    ext: 'some-app-data'
+                };
+
+                expect(Browser.client.authenticate(res, credentials, artifacts)).to.equal(true);
+                done();
+            });
+
+            it('returns false on invalid header', function (done) {
 
                 var res = {
                     headers: {
@@ -564,7 +1001,7 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should return false on invalid mac', function (done) {
+            it('returns false on invalid mac', function (done) {
 
                 var res = {
                     headers: {
@@ -603,7 +1040,7 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should return true on ignoring hash', function (done) {
+            it('returns true on ignoring hash', function (done) {
 
                 var res = {
                     headers: {
@@ -642,7 +1079,7 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should fail on invalid WWW-Authenticate header format', function (done) {
+            it('errors on invalid WWW-Authenticate header format', function (done) {
 
                 var res = {
                     headers: {
@@ -658,7 +1095,7 @@ describe('Browser', function () {
                 done();
             });
 
-            it('should fail on invalid WWW-Authenticate header format', function (done) {
+            it('errors on invalid WWW-Authenticate header format', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -683,47 +1120,151 @@ describe('Browser', function () {
         });
 
         describe('#message', function () {
-            it('should generate an authorization then successfully parse it', function (done) {
+
+            it('generates an authorization then successfully parse it', function (done) {
 
                 credentialsFunc('123456', function (err, credentials) {
 
                     var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: credentials });
-                    expect(auth).to.exist;
+                    expect(auth).to.exist();
 
                     Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
 
-                        expect(err).to.not.exist;
+                        expect(err).to.not.exist();
                         expect(credentials.user).to.equal('steve');
                         done();
                     });
                 });
             });
 
-            it('should fail on missing host', function (done) {
+            it('generates an authorization using custom nonce/timestamp', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: credentials, nonce: 'abc123', timestamp: 1398536270957 });
+                    expect(auth).to.exist();
+                    expect(auth.nonce).to.equal('abc123');
+                    expect(auth.ts).to.equal(1398536270957);
+                    done();
+                });
+            });
+
+            it('errors on missing host', function (done) {
 
                 credentialsFunc('123456', function (err, credentials) {
 
                     var auth = Browser.client.message(null, 8080, 'some message', { credentials: credentials });
-                    expect(auth).to.not.exist;
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on invalid host', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message(5, 8080, 'some message', { credentials: credentials });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on missing port', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 0, 'some message', { credentials: credentials });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on invalid port', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 'a', 'some message', { credentials: credentials });
+                    expect(auth).to.not.exist();
                     done();
                 });
             });
 
-            it('should fail on missing credentials', function (done) {
+            it('errors on missing message', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 8080, undefined, { credentials: credentials });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on null message', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 8080, null, { credentials: credentials });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on invalid message', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Browser.client.message('example.com', 8080, 5, { credentials: credentials });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on missing credentials', function (done) {
 
                 var auth = Browser.client.message('example.com', 8080, 'some message', {});
-                expect(auth).to.not.exist;
+                expect(auth).to.not.exist();
                 done();
             });
 
-            it('should fail on invalid algorithm', function (done) {
+            it('errors on missing options', function (done) {
+
+                var auth = Browser.client.message('example.com', 8080, 'some message');
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on invalid credentials (id)', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var creds = Hoek.clone(credentials);
+                    delete creds.id;
+                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on invalid credentials (key)', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var creds = Hoek.clone(credentials);
+                    delete creds.key;
+                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
+                    expect(auth).to.not.exist();
+                    done();
+                });
+            });
+
+            it('errors on invalid algorithm', function (done) {
 
                 credentialsFunc('123456', function (err, credentials) {
 
                     var creds = Hoek.clone(credentials);
                     creds.algorithm = 'blah';
                     var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
-                    expect(auth).to.not.exist;
+                    expect(auth).to.not.exist();
                     done();
                 });
             });
@@ -731,7 +1272,7 @@ describe('Browser', function () {
 
         describe('#authenticateTimestamp', function (done) {
 
-            it('should validate a timestamp', function (done) {
+            it('validates a timestamp', function (done) {
 
                 credentialsFunc('123456', function (err, credentials) {
 
@@ -741,7 +1282,19 @@ describe('Browser', function () {
                 });
             });
 
-            it('should detect a bad timestamp', function (done) {
+            it('validates a timestamp without updating local time', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var offset = Browser.utils.getNtpOffset();
+                    var tsm = Hawk.crypto.timestampMessage(credentials, 10000);
+                    expect(Browser.client.authenticateTimestamp(tsm, credentials, false)).to.equal(true);
+                    expect(offset).to.equal(Browser.utils.getNtpOffset());
+                    done();
+                });
+            });
+
+            it('detects a bad timestamp', function (done) {
 
                 credentialsFunc('123456', function (err, credentials) {
 
@@ -754,64 +1307,147 @@ describe('Browser', function () {
         });
     });
 
-    describe('#parseAuthorizationHeader', function (done) {
+    describe('internals', function () {
+
+        describe('LocalStorage', function () {
+
+            it('goes through the full lifecycle', function (done) {
+
+                var storage = new Browser.internals.LocalStorage();
+                expect(storage.length).to.equal(0);
+                expect(storage.getItem('a')).to.equal(null);
+                storage.setItem('a', 5);
+                expect(storage.length).to.equal(1);
+                expect(storage.key()).to.equal('a');
+                expect(storage.key(0)).to.equal('a');
+                expect(storage.getItem('a')).to.equal('5');
+                storage.setItem('b', 'test');
+                expect(storage.key()).to.equal('a');
+                expect(storage.key(0)).to.equal('a');
+                expect(storage.key(1)).to.equal('b');
+                expect(storage.length).to.equal(2);
+                expect(storage.getItem('b')).to.equal('test');
+                storage.removeItem('a');
+                expect(storage.length).to.equal(1);
+                expect(storage.getItem('a')).to.equal(null);
+                expect(storage.getItem('b')).to.equal('test');
+                storage.clear();
+                expect(storage.length).to.equal(0);
+                expect(storage.getItem('a')).to.equal(null);
+                expect(storage.getItem('b')).to.equal(null);
+                done();
+            });
+        });
+    });
 
-        it('returns null on missing header', function (done) {
+    describe('utils', function () {
 
-            expect(Browser.utils.parseAuthorizationHeader()).to.equal(null);
-            done();
-        });
+        describe('#setStorage', function () {
 
-        it('returns null on bad header syntax (structure)', function (done) {
+            it('sets storage for the first time', function (done) {
 
-            expect(Browser.utils.parseAuthorizationHeader('Hawk')).to.equal(null);
-            done();
+                Browser.utils.storage = new Browser.internals.LocalStorage();        // Reset state
+
+                expect(Browser.utils.storage.getItem('hawk_ntp_offset')).to.not.exist();
+                Browser.utils.storage.setItem('test', '1');
+                Browser.utils.setStorage(new Browser.internals.LocalStorage());
+                expect(Browser.utils.storage.getItem('test')).to.not.exist();
+                Browser.utils.storage.setItem('test', '2');
+                expect(Browser.utils.storage.getItem('test')).to.equal('2');
+                done();
+            });
         });
 
-        it('returns null on bad header syntax (parts)', function (done) {
+        describe('#setNtpOffset', function (done) {
 
-            expect(Browser.utils.parseAuthorizationHeader(' ')).to.equal(null);
-            done();
-        });
+            it('catches localStorage errors', function (done) {
 
-        it('returns null on bad scheme name', function (done) {
+                var orig = Browser.utils.storage.setItem;
+                var error = console.error;
+                var count = 0;
+                console.error = function () { if (count++ === 2) { console.error = error; } };
+                Browser.utils.storage.setItem = function () {
 
-            expect(Browser.utils.parseAuthorizationHeader('Basic asdasd')).to.equal(null);
-            done();
-        });
+                    Browser.utils.storage.setItem = orig;
+                    throw new Error()
+                };
 
-        it('returns null on bad attribute value', function (done) {
+                expect(function () {
+                    Browser.utils.setNtpOffset(100);
+                }).not.to.throw();
 
-            expect(Browser.utils.parseAuthorizationHeader('Hawk test="\t"', ['test'])).to.equal(null);
-            done();
+                done();
+            });
         });
 
-        it('returns null on duplicated attribute', function (done) {
+        describe('#parseAuthorizationHeader', function (done) {
 
-            expect(Browser.utils.parseAuthorizationHeader('Hawk test="a", test="b"', ['test'])).to.equal(null);
-            done();
+            it('returns null on missing header', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader()).to.equal(null);
+                done();
+            });
+
+            it('returns null on bad header syntax (structure)', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader('Hawk')).to.equal(null);
+                done();
+            });
+
+            it('returns null on bad header syntax (parts)', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader(' ')).to.equal(null);
+                done();
+            });
+
+            it('returns null on bad scheme name', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader('Basic asdasd')).to.equal(null);
+                done();
+            });
+
+            it('returns null on bad attribute value', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader('Hawk test="\t"', ['test'])).to.equal(null);
+                done();
+            });
+
+            it('returns null on duplicated attribute', function (done) {
+
+                expect(Browser.utils.parseAuthorizationHeader('Hawk test="a", test="b"', ['test'])).to.equal(null);
+                done();
+            });
         });
-    });
 
-    describe('#setNtpOffset', function (done) {
+        describe('#parseUri', function () {
+
+            it('returns empty port when unknown scheme', function (done) {
 
-        it('catches localStorage errors', function (done) {
+                var uri = Browser.utils.parseUri('ftp://domain');
+                expect(uri.port).to.equal('');
+                done();
+            });
 
-            var orig = Browser.utils.storage.setItem;
-            var error = console.error;
-            var count = 0;
-            console.error = function () { if (count++ === 2) { console.error.error; } };
-            Browser.utils.storage.setItem = function () {
+            it('returns default port when missing', function (done) {
 
-                Browser.utils.storage.setItem = orig;
-                throw new Error()
-            };
+                var uri = Browser.utils.parseUri('http://');
+                expect(uri.port).to.equal('80');
+                done();
+            });
+        });
 
-            expect(function () {
-                Browser.utils.setNtpOffset(100);
-            }).not.to.throw();
+        var str = "https://www.google.ca/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=url";
+        var base64str = "aHR0cHM6Ly93d3cuZ29vZ2xlLmNhL3dlYmhwP3NvdXJjZWlkPWNocm9tZS1pbnN0YW50Jmlvbj0xJmVzcHY9MiZpZT1VVEYtOCNxPXVybA";
+
+        describe('#base64urlEncode', function () {
+
+            it('should base64 URL-safe decode a string', function (done) {
+
+                expect(Browser.utils.base64urlEncode(str)).to.equal(base64str);
+                done();
+            });
 
-            done();
         });
+
     });
 });
index bcc4222a0f2cb32253f9e5a12da02fb24f33ed6f..5983897b215b156252f3d6ddeb7c2ecf1d0dd20f 100755 (executable)
@@ -1,8 +1,9 @@
 // Load modules
 
 var Url = require('url');
-var Lab = require('lab');
+var Code = require('code');
 var Hawk = require('../lib');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -12,11 +13,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -25,7 +25,7 @@ describe('Hawk', function () {
 
         describe('#header', function () {
 
-            it('should return a valid authorization header (sha1)', function (done) {
+            it('returns a valid authorization header (sha1)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -38,7 +38,7 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should return a valid authorization header (sha256)', function (done) {
+            it('returns a valid authorization header (sha256)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -51,7 +51,7 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should return a valid authorization header (no ext)', function (done) {
+            it('returns a valid authorization header (no ext)', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -64,26 +64,122 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should return an empty authorization header on missing options', function (done) {
+            it('returns a valid authorization header (null ext)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain', ext: null }).field;
+                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
+                done();
+            });
+
+            it('returns a valid authorization header (empty payload)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: '', contentType: 'text/plain' }).field;
+                expect(header).to.equal('Hawk id=\"123456\", ts=\"1353809207\", nonce=\"Ygvqdz\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", mac=\"U5k16YEzn3UnBHKeBzsDXn067Gu3R4YaY6xOt9PYRZM=\"');
+                done();
+            });
+
+            it('returns a valid authorization header (pre hashed payload)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha256'
+                };
+
+                var options = { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' };
+                options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', options).field;
+                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
+                done();
+            });
+
+            it('errors on missing uri', function (done) {
+
+                var header = Hawk.client.header('', 'POST');
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on invalid uri', function (done) {
+
+                var header = Hawk.client.header(4, 'POST');
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on missing method', function (done) {
 
-                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST').field;
-                expect(header).to.equal('');
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', '');
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
                 done();
             });
 
-            it('should return an empty authorization header on invalid credentials', function (done) {
+            it('errors on invalid method', function (done) {
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 5);
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on missing options', function (done) {
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST');
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid argument type');
+                done();
+            });
+
+            it('errors on invalid credentials (id)', function (done) {
 
                 var credentials = {
                     key: '2983d45yun89q',
                     algorithm: 'sha256'
                 };
 
-                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 }).field;
-                expect(header).to.equal('');
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credential object');
+                done();
+            });
+
+            it('errors on missing credentials', function (done) {
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credential object');
+                done();
+            });
+
+            it('errors on invalid credentials', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    algorithm: 'sha256'
+                };
+
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Invalid credential object');
                 done();
             });
 
-            it('should return an empty authorization header on invalid algorithm', function (done) {
+            it('errors on invalid algorithm', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -91,15 +187,16 @@ describe('Hawk', function () {
                     algorithm: 'hmac-sha-0'
                 };
 
-                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 }).field;
-                expect(header).to.equal('');
+                var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 });
+                expect(header.field).to.equal('');
+                expect(header.err).to.equal('Unknown algorithm');
                 done();
             });
         });
 
         describe('#authenticate', function () {
 
-            it('should return false on invalid header', function (done) {
+            it('returns false on invalid header', function (done) {
 
                 var res = {
                     headers: {
@@ -111,7 +208,7 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should return false on invalid mac', function (done) {
+            it('returns false on invalid mac', function (done) {
 
                 var res = {
                     headers: {
@@ -146,7 +243,7 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should return true on ignoring hash', function (done) {
+            it('returns true on ignoring hash', function (done) {
 
                 var res = {
                     headers: {
@@ -181,14 +278,14 @@ describe('Hawk', function () {
                 done();
             });
 
-            it('should fail on invalid WWW-Authenticate header format', function (done) {
+            it('fails on invalid WWW-Authenticate header format', function (done) {
 
                 var header = 'Hawk ts="1362346425875", tsm="PhwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", x="Stale timestamp"';
                 expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(false);
                 done();
             });
 
-            it('should fail on invalid WWW-Authenticate header format', function (done) {
+            it('fails on invalid WWW-Authenticate header format', function (done) {
 
                 var credentials = {
                     id: '123456',
@@ -201,6 +298,146 @@ describe('Hawk', function () {
                 expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, credentials)).to.equal(false);
                 done();
             });
+
+            it('skips tsm validation when missing ts', function (done) {
+
+                var header = 'Hawk error="Stale timestamp"';
+                expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(true);
+                done();
+            });
+        });
+
+        describe('#message', function () {
+
+            it('generates authorization', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.exist();
+                expect(auth.ts).to.equal(1353809207);
+                expect(auth.nonce).to.equal('abc123');
+                done();
+            });
+
+            it('errors on invalid host', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message(5, 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on invalid port', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', '80', 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on missing host', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 0, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on null message', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, null, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on missing message', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, undefined, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on invalid message', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, 5, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on missing options', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, 'I am the boodyman');
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on invalid credentials (id)', function (done) {
+
+                var credentials = {
+                    key: '2983d45yun89q',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
+
+            it('errors on invalid credentials (key)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    algorithm: 'sha1'
+                };
+
+                var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
+                expect(auth).to.not.exist();
+                done();
+            });
         });
     });
 });
index b62c2177e3e7f824deb0b24c03f6ff77b61622b2..f2d3d45801cb800321384d09b1ea72b38e853d33 100755 (executable)
@@ -1,7 +1,8 @@
 // Load modules
 
-var Lab = require('lab');
+var Code = require('code');
 var Hawk = require('../lib');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -11,11 +12,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
index ba837388a5a8a81b36aaf13ad6e450eb1603cb0c..39f2c5b86000fc60fed6e6912f5c0f93f4e3788e 100755 (executable)
@@ -1,8 +1,9 @@
 // Load modules
 
 var Url = require('url');
-var Lab = require('lab');
+var Code = require('code');
 var Hawk = require('../lib');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -12,11 +13,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -33,7 +33,7 @@ describe('Hawk', function () {
         return callback(null, credentials);
     };
 
-    it('should generate a header then successfully parse it (configuration)', function (done) {
+    it('generates a header then successfully parse it (configuration)', function (done) {
 
         var req = {
             method: 'GET',
@@ -45,11 +45,11 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             req.authorization = Hawk.client.header(Url.parse('http://example.com:8080/resource/4?filter=a'), req.method, { credentials: credentials, ext: 'some-app-data' }).field;
-            expect(req.authorization).to.exist;
+            expect(req.authorization).to.exist();
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 done();
@@ -57,7 +57,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (node request)', function (done) {
+    it('generates a header then successfully parse it (node request)', function (done) {
 
         var req = {
             method: 'POST',
@@ -77,7 +77,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -89,7 +89,7 @@ describe('Hawk', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Hawk.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(true);
                 done();
@@ -97,7 +97,47 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (no server header options)', function (done) {
+    it('generates a header then successfully parse it (absolute request uri)', function (done) {
+
+        var req = {
+            method: 'POST',
+            url: 'http://example.com:8080/resource/4?filter=a',
+            headers: {
+                host: 'example.com:8080',
+                'content-type': 'text/plain;x=y'
+            }
+        };
+
+        var payload = 'some not so random text';
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            var reqHeader = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
+            req.headers.authorization = reqHeader.field;
+
+            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
+
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                expect(artifacts.ext).to.equal('some-app-data');
+                expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
+
+                var res = {
+                    headers: {
+                        'content-type': 'text/plain'
+                    }
+                };
+
+                res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
+                expect(res.headers['server-authorization']).to.exist();
+
+                expect(Hawk.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(true);
+                done();
+            });
+        });
+    });
+
+    it('generates a header then successfully parse it (no server header options)', function (done) {
 
         var req = {
             method: 'POST',
@@ -117,7 +157,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -129,7 +169,7 @@ describe('Hawk', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts);
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);
                 done();
@@ -137,7 +177,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then fails to parse it (missing server header hash)', function (done) {
+    it('generates a header then fails to parse it (missing server header hash)', function (done) {
 
         var req = {
             method: 'POST',
@@ -157,7 +197,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(Hawk.server.authenticatePayload(payload, credentials, artifacts, req.headers['content-type'])).to.equal(true);
@@ -169,7 +209,7 @@ describe('Hawk', function () {
                 };
 
                 res.headers['server-authorization'] = Hawk.server.header(credentials, artifacts);
-                expect(res.headers['server-authorization']).to.exist;
+                expect(res.headers['server-authorization']).to.exist();
 
                 expect(Hawk.client.authenticate(res, credentials, artifacts, { payload: 'some reply' })).to.equal(false);
                 done();
@@ -177,7 +217,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (with hash)', function (done) {
+    it('generates a header then successfully parse it (with hash)', function (done) {
 
         var req = {
             method: 'GET',
@@ -191,7 +231,7 @@ describe('Hawk', function () {
             req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 done();
@@ -199,7 +239,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then successfully parse it then validate payload', function (done) {
+    it('generates a header then successfully parse it then validate payload', function (done) {
 
         var req = {
             method: 'GET',
@@ -213,17 +253,39 @@ describe('Hawk', function () {
             req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
+                expect(credentials.user).to.equal('steve');
+                expect(artifacts.ext).to.equal('some-app-data');
+                expect(Hawk.server.authenticatePayload('hola!', credentials, artifacts)).to.be.true();
+                expect(Hawk.server.authenticatePayload('hello!', credentials, artifacts)).to.be.false();
+                done();
+            });
+        });
+    });
+
+    it('generates a header then successfully parses and validates payload', function (done) {
+
+        var req = {
+            method: 'GET',
+            url: '/resource/4?filter=a',
+            host: 'example.com',
+            port: 8080
+        };
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
+            Hawk.server.authenticate(req, credentialsFunc, { payload: 'hola!' }, function (err, credentials, artifacts) {
+
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload('hola!', credentials, artifacts)).to.be.true;
-                expect(Hawk.server.authenticatePayload('hello!', credentials, artifacts)).to.be.false;
                 done();
             });
         });
     });
 
-    it('should generate a header then successfully parse it (app)', function (done) {
+    it('generates a header then successfully parse it (app)', function (done) {
 
         var req = {
             method: 'GET',
@@ -237,7 +299,7 @@ describe('Hawk', function () {
             req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', app: 'asd23ased' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(artifacts.app).to.equal('asd23ased');
@@ -246,7 +308,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then successfully parse it (app, dlg)', function (done) {
+    it('generates a header then successfully parse it (app, dlg)', function (done) {
 
         var req = {
             method: 'GET',
@@ -260,7 +322,7 @@ describe('Hawk', function () {
             req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, ext: 'some-app-data', app: 'asd23ased', dlg: '23434szr3q4d' }).field;
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(artifacts.ext).to.equal('some-app-data');
                 expect(artifacts.app).to.equal('asd23ased');
@@ -270,7 +332,7 @@ describe('Hawk', function () {
         });
     });
 
-    it('should generate a header then fail authentication due to bad hash', function (done) {
+    it('generates a header then fail authentication due to bad hash', function (done) {
 
         var req = {
             method: 'GET',
@@ -284,14 +346,14 @@ describe('Hawk', function () {
             req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials, payload: 'hola!', ext: 'some-app-data' }).field;
             Hawk.server.authenticate(req, credentialsFunc, { payload: 'byebye!' }, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Bad payload hash');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Bad payload hash');
                 done();
             });
         });
     });
 
-    it('should generate a header for one resource then fail to authenticate another', function (done) {
+    it('generates a header for one resource then fail to authenticate another', function (done) {
 
         var req = {
             method: 'GET',
@@ -307,8 +369,8 @@ describe('Hawk', function () {
 
             Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                expect(err).to.exist;
-                expect(credentials).to.exist;
+                expect(err).to.exist();
+                expect(credentials).to.exist();
                 done();
             });
         });
index 04b91d4124c6e9c5412a024764da58f36fb240d2..b0494cc4561571d65ca3b400b87ae9cc5e81e141 100755 (executable)
@@ -1,9 +1,10 @@
 // Load modules
 
 var Url = require('url');
-var Lab = require('lab');
-var Hoek = require('hoek');
+var Code = require('code');
 var Hawk = require('../lib');
+var Hoek = require('hoek');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -13,11 +14,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -39,11 +39,11 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 done();
             });
@@ -55,11 +55,11 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Bad mac');
                 done();
             });
@@ -71,28 +71,43 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Stale timestamp');
                 done();
             });
         });
     });
 
+    it('overrides timestampSkewSec', function (done) {
+
+        credentialsFunc('123456', function (err, credentials) {
+
+            var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials, localtimeOffsetMsec: 100000 });
+            expect(auth).to.exist();
+
+            Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials) {
+
+                expect(err).to.not.exist();
+                done();
+            });
+        });
+    });
+
     it('should fail authorization on invalid authorization', function (done) {
 
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
             delete auth.id;
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Invalid authorization');
                 done();
             });
@@ -104,11 +119,11 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Bad message hash');
                 done();
             });
@@ -120,11 +135,11 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { nonceFunc: function (nonce, ts, callback) { callback (new Error('kaboom')); } }, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Invalid nonce');
                 done();
             });
@@ -136,7 +151,7 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             var errFunc = function (id, callback) {
 
@@ -145,7 +160,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('kablooey');
                 done();
             });
@@ -157,7 +172,7 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             var errFunc = function (id, callback) {
 
@@ -166,7 +181,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Unknown credentials');
                 done();
             });
@@ -178,7 +193,7 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             var errFunc = function (id, callback) {
 
@@ -187,7 +202,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Invalid credentials');
                 done();
             });
@@ -199,7 +214,7 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
-            expect(auth).to.exist;
+            expect(auth).to.exist();
 
             var errFunc = function (id, callback) {
 
@@ -208,7 +223,7 @@ describe('Hawk', function () {
 
             Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Unknown algorithm');
                 done();
             });
@@ -220,7 +235,7 @@ describe('Hawk', function () {
         credentialsFunc('123456', function (err, credentials) {
 
             var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials });
-            expect(auth).to.not.exist;
+            expect(auth).to.not.exist();
             done();
         });
     });
@@ -228,7 +243,7 @@ describe('Hawk', function () {
     it('should fail on missing credentials', function (done) {
 
         var auth = Hawk.client.message('example.com', 8080, 'some message', {});
-        expect(auth).to.not.exist;
+        expect(auth).to.not.exist();
         done();
     });
 
@@ -239,7 +254,7 @@ describe('Hawk', function () {
             var creds = Hoek.clone(credentials);
             creds.algorithm = 'blah';
             var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });
-            expect(auth).to.not.exist;
+            expect(auth).to.not.exist();
             done();
         });
     });
index f39e033d920ba733fd8f444606d8a531838604b4..60af19983294ed600a1878666e98dd94dec8b6cb 100755 (executable)
@@ -1,8 +1,9 @@
 // Load modules
 
-var Lab = require('lab');
-var Hoek = require('hoek');
+var Code = require('code');
 var Hawk = require('../lib');
+var Hoek = require('hoek');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -12,11 +13,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
index 3e92427a8dd701285db56db5ef37536fd8e6133b..00d7d085fe3d4e0da88a5d470d0963d792fb1ae7 100755 (executable)
@@ -1,8 +1,9 @@
 // Load modules
 
 var Url = require('url');
-var Lab = require('lab');
+var Code = require('code');
 var Hawk = require('../lib');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -12,11 +13,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -37,7 +37,7 @@ describe('Hawk', function () {
 
         describe('#authenticate', function () {
 
-            it('should parse a valid authentication header (sha1)', function (done) {
+            it('parses a valid authentication header (sha1)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -49,13 +49,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
             });
 
-            it('should parse a valid authentication header (sha256)', function (done) {
+            it('parses a valid authentication header (sha256)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -67,13 +67,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
             });
 
-            it('should parse a valid authentication header (host override)', function (done) {
+            it('parses a valid authentication header (host override)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -86,13 +86,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
             });
 
-            it('should parse a valid authentication header (host port override)', function (done) {
+            it('parses a valid authentication header (host port override)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -105,13 +105,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', port: 8080, localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
             });
 
-            it('should parse a valid authentication header (POST with payload)', function (done) {
+            it('parses a valid authentication header (POST with payload)', function (done) {
 
                 var req = {
                     method: 'POST',
@@ -123,13 +123,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1357926341000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
             });
 
-            it('should fail on missing hash', function (done) {
+            it('errors on missing hash', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -141,13 +141,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { payload: 'body', localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Missing required payload hash');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Missing required payload hash');
                     done();
                 });
             });
 
-            it('should fail on a stale timestamp', function (done) {
+            it('errors on a stale timestamp', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -159,9 +159,9 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Stale timestamp');
-                    var header = err.response.headers['WWW-Authenticate'];
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Stale timestamp');
+                    var header = err.output.headers['WWW-Authenticate'];
                     var ts = header.match(/^Hawk ts\=\"(\d+)\"\, tsm\=\"([^\"]+)\"\, error=\"Stale timestamp\"$/);
                     var now = Hawk.utils.now();
                     expect(parseInt(ts[1], 10) * 1000).to.be.within(now - 1000, now + 1000);
@@ -177,7 +177,7 @@ describe('Hawk', function () {
                 });
             });
 
-            it('should fail on a replay', function (done) {
+            it('errors on a replay', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -203,19 +203,19 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials, artifacts) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
 
                     Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials, artifacts) {
 
-                        expect(err).to.exist;
-                        expect(err.response.payload.message).to.equal('Invalid nonce');
+                        expect(err).to.exist();
+                        expect(err.output.payload.message).to.equal('Invalid nonce');
                         done();
                     });
                 });
             });
 
-            it('should fail on an invalid authentication header: wrong scheme', function (done) {
+            it('errors on an invalid authentication header: wrong scheme', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -227,13 +227,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.not.exist;
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.not.exist();
                     done();
                 });
             });
 
-            it('should fail on an invalid authentication header: no scheme', function (done) {
+            it('errors on an invalid authentication header: no scheme', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -245,13 +245,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid header syntax');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid header syntax');
                     done();
                 });
             });
 
-            it('should fail on an missing authorization header', function (done) {
+            it('errors on an missing authorization header', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -262,13 +262,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
+                    expect(err).to.exist();
                     expect(err.isMissing).to.equal(true);
                     done();
                 });
             });
 
-            it('should fail on an missing host header', function (done) {
+            it('errors on an missing host header', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -280,13 +280,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid Host header');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid Host header');
                     done();
                 });
             });
 
-            it('should fail on an missing authorization attribute (id)', function (done) {
+            it('errors on an missing authorization attribute (id)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -298,13 +298,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Missing attributes');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Missing attributes');
                     done();
                 });
             });
 
-            it('should fail on an missing authorization attribute (ts)', function (done) {
+            it('errors on an missing authorization attribute (ts)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -316,13 +316,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Missing attributes');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Missing attributes');
                     done();
                 });
             });
 
-            it('should fail on an missing authorization attribute (nonce)', function (done) {
+            it('errors on an missing authorization attribute (nonce)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -334,13 +334,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Missing attributes');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Missing attributes');
                     done();
                 });
             });
 
-            it('should fail on an missing authorization attribute (mac)', function (done) {
+            it('errors on an missing authorization attribute (mac)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -352,13 +352,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Missing attributes');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Missing attributes');
                     done();
                 });
             });
 
-            it('should fail on an unknown authorization attribute', function (done) {
+            it('errors on an unknown authorization attribute', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -370,13 +370,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Unknown attribute: x');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Unknown attribute: x');
                     done();
                 });
             });
 
-            it('should fail on an bad authorization header format', function (done) {
+            it('errors on an bad authorization header format', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -388,13 +388,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Bad header format');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Bad header format');
                     done();
                 });
             });
 
-            it('should fail on an bad authorization attribute value', function (done) {
+            it('errors on an bad authorization attribute value', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -406,13 +406,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Bad attribute value: id');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Bad attribute value: id');
                     done();
                 });
             });
 
-            it('should fail on an empty authorization attribute value', function (done) {
+            it('errors on an empty authorization attribute value', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -424,13 +424,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Bad attribute value: id');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Bad attribute value: id');
                     done();
                 });
             });
 
-            it('should fail on duplicated authorization attribute key', function (done) {
+            it('errors on duplicated authorization attribute key', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -442,13 +442,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Duplicate attribute: id');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Duplicate attribute: id');
                     done();
                 });
             });
 
-            it('should fail on an invalid authorization header format', function (done) {
+            it('errors on an invalid authorization header format', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -460,13 +460,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid header syntax');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid header syntax');
                     done();
                 });
             });
 
-            it('should fail on an bad host header (missing host)', function (done) {
+            it('errors on an bad host header (missing host)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -479,13 +479,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid Host header');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid Host header');
                     done();
                 });
             });
 
-            it('should fail on an bad host header (pad port)', function (done) {
+            it('errors on an bad host header (pad port)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -498,13 +498,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid Host header');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid Host header');
                     done();
                 });
             });
 
-            it('should fail on credentialsFunc error', function (done) {
+            it('errors on credentialsFunc error', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -521,13 +521,37 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
+                    expect(err).to.exist();
+                    expect(err.message).to.equal('Unknown user');
+                    done();
+                });
+            });
+
+            it('errors on credentialsFunc error (with credentials)', function (done) {
+
+                var req = {
+                    method: 'GET',
+                    url: '/resource/4?filter=a',
+                    host: 'example.com',
+                    port: 8080,
+                    authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
+                };
+
+                var credentialsFunc = function (id, callback) {
+
+                    return callback(new Error('Unknown user'), { some: 'value' });
+                };
+
+                Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
+
+                    expect(err).to.exist();
                     expect(err.message).to.equal('Unknown user');
+                    expect(credentials.some).to.equal('value');
                     done();
                 });
             });
 
-            it('should fail on missing credentials', function (done) {
+            it('errors on missing credentials', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -544,13 +568,13 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Unknown credentials');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Unknown credentials');
                     done();
                 });
             });
 
-            it('should fail on invalid credentials', function (done) {
+            it('errors on invalid credentials (id)', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -572,14 +596,43 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
+                    expect(err).to.exist();
                     expect(err.message).to.equal('Invalid credentials');
-                    expect(err.response.payload.message).to.equal('An internal server error occurred');
+                    expect(err.output.payload.message).to.equal('An internal server error occurred');
                     done();
                 });
             });
 
-            it('should fail on unknown credentials algorithm', function (done) {
+            it('errors on invalid credentials (key)', function (done) {
+
+                var req = {
+                    method: 'GET',
+                    url: '/resource/4?filter=a',
+                    host: 'example.com',
+                    port: 8080,
+                    authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
+                };
+
+                var credentialsFunc = function (id, callback) {
+
+                    var credentials = {
+                        id: '23434d3q4d5345d',
+                        user: 'steve'
+                    };
+
+                    return callback(null, credentials);
+                };
+
+                Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
+
+                    expect(err).to.exist();
+                    expect(err.message).to.equal('Invalid credentials');
+                    expect(err.output.payload.message).to.equal('An internal server error occurred');
+                    done();
+                });
+            });
+
+            it('errors on unknown credentials algorithm', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -602,14 +655,14 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
+                    expect(err).to.exist();
                     expect(err.message).to.equal('Unknown algorithm');
-                    expect(err.response.payload.message).to.equal('An internal server error occurred');
+                    expect(err.output.payload.message).to.equal('An internal server error occurred');
                     done();
                 });
             });
 
-            it('should fail on unknown bad mac', function (done) {
+            it('errors on unknown bad mac', function (done) {
 
                 var req = {
                     method: 'GET',
@@ -632,8 +685,8 @@ describe('Hawk', function () {
 
                 Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Bad mac');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Bad mac');
                     done();
                 });
             });
@@ -641,46 +694,292 @@ describe('Hawk', function () {
 
         describe('#header', function () {
 
-            it('should return an empty authorization header on missing options', function (done) {
+            it('generates header', function (done) {
 
-                var header = Hawk.server.header();
-                expect(header).to.equal('');
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
+                expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
+                done();
+            });
+
+            it('generates header (empty payload)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var header = Hawk.server.header(credentials, artifacts, { payload: '', contentType: 'text/plain', ext: 'response-specific' });
+                expect(header).to.equal('Hawk mac=\"i8/kUBDx0QF+PpCtW860kkV/fa9dbwEoe/FpGUXowf0=\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", ext=\"response-specific\"');
+                done();
+            });
+
+            it('generates header (pre calculated hash)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var options = { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' };
+                options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
+                var header = Hawk.server.header(credentials, artifacts, options);
+                expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
+                done();
+            });
+
+            it('generates header (null ext)', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: null });
+                expect(header).to.equal('Hawk mac=\"6PrybJTJs20jsgBw5eilXpcytD8kUbaIKNYXL+6g0ns=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\"');
                 done();
             });
 
-            it('should return an empty authorization header on missing credentials', function (done) {
+            it('errors on missing artifacts', function (done) {
 
-                var header = Hawk.server.header(null, {});
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
+                };
+
+                var header = Hawk.server.header(credentials, null, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
                 expect(header).to.equal('');
                 done();
             });
 
-            it('should return an empty authorization header on invalid credentials', function (done) {
+            it('errors on invalid artifacts', function (done) {
 
                 var credentials = {
-                    key: '2983d45yun89q'
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'sha256',
+                    user: 'steve'
                 };
 
-                var header = Hawk.server.header(credentials);
+                var header = Hawk.server.header(credentials, 5, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
                 expect(header).to.equal('');
                 done();
             });
 
-            it('should return an empty authorization header on invalid algorithm', function (done) {
+            it('errors on missing credentials', function (done) {
 
                 var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
                     id: '123456'
                 };
 
+                var header = Hawk.server.header(null, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
+                expect(header).to.equal('');
+                done();
+            });
+
+            it('errors on invalid credentials (key)', function (done) {
+
                 var credentials = {
-                    key: '2983d45yun89q',
-                    algorithm: 'hmac-sha-0'
+                    id: '123456',
+                    algorithm: 'sha256',
+                    user: 'steve'
                 };
 
-                var header = Hawk.server.header(credentials, artifacts);
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
                 expect(header).to.equal('');
                 done();
             });
+
+            it('errors on invalid algorithm', function (done) {
+
+                var credentials = {
+                    id: '123456',
+                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
+                    algorithm: 'x',
+                    user: 'steve'
+                };
+
+                var artifacts = {
+                    method: 'POST',
+                    host: 'example.com',
+                    port: '8080',
+                    resource: '/resource/4?filter=a',
+                    ts: '1398546787',
+                    nonce: 'xUwusx',
+                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
+                    ext: 'some-app-data',
+                    mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
+                    id: '123456'
+                };
+
+                var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
+                expect(header).to.equal('');
+                done();
+            });
+        });
+
+        describe('#authenticateMessage', function () {
+
+            it('errors on invalid authorization (ts)', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
+                    delete auth.ts;
+
+                    Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
+
+                        expect(err).to.exist();
+                        expect(err.message).to.equal('Invalid authorization');
+                        done();
+                    });
+                });
+            });
+
+            it('errors on invalid authorization (nonce)', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
+                    delete auth.nonce;
+
+                    Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
+
+                        expect(err).to.exist();
+                        expect(err.message).to.equal('Invalid authorization');
+                        done();
+                    });
+                });
+            });
+
+            it('errors on invalid authorization (hash)', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
+                    delete auth.hash;
+
+                    Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials) {
+
+                        expect(err).to.exist();
+                        expect(err.message).to.equal('Invalid authorization');
+                        done();
+                    });
+                });
+            });
+
+            it('errors with credentials', function (done) {
+
+                credentialsFunc('123456', function (err, credentials) {
+
+                    var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials });
+
+                    Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, function (id, callback) { callback(new Error('something'), { some: 'value' }); }, {}, function (err, credentials) {
+
+                        expect(err).to.exist();
+                        expect(err.message).to.equal('something');
+                        expect(credentials.some).to.equal('value');
+                        done();
+                    });
+                });
+            });
+        });
+
+        describe('#authenticatePayloadHash', function () {
+
+            it('checks payload hash', function (done) {
+
+                expect(Hawk.server.authenticatePayloadHash('abcdefg', { hash: 'abcdefg' })).to.equal(true);
+                expect(Hawk.server.authenticatePayloadHash('1234567', { hash: 'abcdefg' })).to.equal(false);
+                done();
+            });
         });
     });
 });
index 44ffd7fb08bcf20d493d03af32e8a5c70f71155b..b2173f5aa2747a62b32f78cce720a2c4d0ec2e5a 100755 (executable)
@@ -1,8 +1,11 @@
 // Load modules
 
 var Http = require('http');
-var Lab = require('lab');
+var Url = require('url');
+var Code = require('code');
 var Hawk = require('../lib');
+var Hoek = require('hoek');
+var Lab = require('lab');
 
 
 // Declare internals
@@ -12,11 +15,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -51,7 +53,7 @@ describe('Hawk', function () {
 
                 Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     expect(attributes.ext).to.equal('some-app-data');
                     done();
@@ -75,7 +77,7 @@ describe('Hawk', function () {
 
                 Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                    expect(err).to.not.exist;
+                    expect(err).to.not.exist();
                     expect(credentials.user).to.equal('steve');
                     done();
                 });
@@ -93,7 +95,7 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(attributes.ext).to.equal('some-app-data');
                 done();
@@ -111,7 +113,7 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(attributes.ext).to.equal('some-app-data');
                 done();
@@ -129,7 +131,7 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.not.exist;
+                expect(err).to.not.exist();
                 expect(credentials.user).to.equal('steve');
                 expect(attributes.ext).to.equal('some-app-data');
                 done();
@@ -148,8 +150,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Multiple authentications');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Multiple authentications');
                 done();
             });
         });
@@ -179,12 +181,12 @@ describe('Hawk', function () {
 
                 var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + ext;
 
-                req.url += '&bewit=' + Hawk.utils.base64urlEncode(bewit);
+                req.url += '&bewit=' + Hoek.base64urlEncode(bewit);
 
                 Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                    expect(err).to.exist;
-                    expect(err.response.payload.message).to.equal('Invalid method');
+                    expect(err).to.exist();
+                    expect(err.output.payload.message).to.equal('Invalid method');
                     done();
                 });
             });
@@ -202,8 +204,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Invalid Host header');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Invalid Host header');
                 done();
             });
         });
@@ -219,9 +221,9 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Empty bewit');
-                expect(err.isMissing).to.not.exist;
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Empty bewit');
+                expect(err.isMissing).to.not.exist();
                 done();
             });
         });
@@ -237,9 +239,9 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Invalid bewit encoding');
-                expect(err.isMissing).to.not.exist;
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Invalid bewit encoding');
+                expect(err.isMissing).to.not.exist();
                 done();
             });
         });
@@ -255,8 +257,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.not.exist;
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.not.exist();
                 expect(err.isMissing).to.equal(true);
                 done();
             });
@@ -273,8 +275,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Invalid bewit structure');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Invalid bewit structure');
                 done();
             });
         });
@@ -290,8 +292,25 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Missing bewit attributes');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Missing bewit attributes');
+                done();
+            });
+        });
+
+        it('should fail on missing bewit id attribute', function (done) {
+
+            var req = {
+                method: 'GET',
+                url: '/resource/4?bewit=XDQ1NTIxNDc2MjJcK0JFbFhQMXhuWjcvd1Nrbm1ldGhlZm5vUTNHVjZNSlFVRHk4NWpTZVJ4VT1cc29tZS1hcHAtZGF0YQ',
+                host: 'example.com',
+                port: 8080
+            };
+
+            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
+
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Missing bewit attributes');
                 done();
             });
         });
@@ -307,8 +326,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Access expired');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Access expired');
                 done();
             });
         });
@@ -324,8 +343,26 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, function (id, callback) { callback(Hawk.error.badRequest('Boom')); }, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Boom');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Boom');
+                done();
+            });
+        });
+
+        it('should fail on credentials function error with credentials', function (done) {
+
+            var req = {
+                method: 'GET',
+                url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
+                host: 'example.com',
+                port: 8080
+            };
+
+            Hawk.uri.authenticate(req, function (id, callback) { callback(Hawk.error.badRequest('Boom'), { some: 'value' }); }, {}, function (err, credentials, attributes) {
+
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Boom');
+                expect(credentials.some).to.equal('value');
                 done();
             });
         });
@@ -341,8 +378,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, function (id, callback) { callback(null, null); }, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Unknown credentials');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Unknown credentials');
                 done();
             });
         });
@@ -358,7 +395,7 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, function (id, callback) { callback(null, {}); }, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Invalid credentials');
                 done();
             });
@@ -375,7 +412,7 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, function (id, callback) { callback(null, { key: 'xxx', algorithm: 'xxx' }); }, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
+                expect(err).to.exist();
                 expect(err.message).to.equal('Unknown algorithm');
                 done();
             });
@@ -392,8 +429,8 @@ describe('Hawk', function () {
 
             Hawk.uri.authenticate(req, function (id, callback) { callback(null, { key: 'xxx', algorithm: 'sha256' }); }, {}, function (err, credentials, attributes) {
 
-                expect(err).to.exist;
-                expect(err.response.payload.message).to.equal('Bad mac');
+                expect(err).to.exist();
+                expect(err.output.payload.message).to.equal('Bad mac');
                 done();
             });
         });
@@ -401,7 +438,7 @@ describe('Hawk', function () {
 
     describe('#getBewit', function () {
 
-        it('should return a valid bewit value', function (done) {
+        it('returns a valid bewit value', function (done) {
 
             var credentials = {
                 id: '123456',
@@ -414,7 +451,85 @@ describe('Hawk', function () {
             done();
         });
 
-        it('should return an empty bewit on invalid credentials', function (done) {
+        it('returns a valid bewit value (explicit port)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit('https://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6');
+            done();
+        });
+
+        it('returns a valid bewit value (null ext)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c');
+            done();
+        });
+
+        it('returns a valid bewit value (parsed uri)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit(Url.parse('https://example.com/somewhere/over/the/rainbow'), { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');
+            done();
+        });
+
+        it('errors on invalid options', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', 4);
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on missing uri', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid uri', function (done) {
+
+            var credentials = {
+                id: '123456',
+                key: '2983d45yun89q',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid credentials (id)', function (done) {
 
             var credentials = {
                 key: '2983d45yun89q',
@@ -426,7 +541,26 @@ describe('Hawk', function () {
             done();
         });
 
-        it('should return an empty bewit on invalid algorithm', function (done) {
+        it('errors on missing credentials', function (done) {
+
+            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid credentials (key)', function (done) {
+
+            var credentials = {
+                id: '123456',
+                algorithm: 'sha256'
+            };
+
+            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
+            expect(bewit).to.equal('');
+            done();
+        });
+
+        it('errors on invalid algorithm', function (done) {
 
             var credentials = {
                 id: '123456',
@@ -439,7 +573,7 @@ describe('Hawk', function () {
             done();
         });
 
-        it('should return an empty bewit on missing options', function (done) {
+        it('errors on missing options', function (done) {
 
             var credentials = {
                 id: '123456',
index 0f5fef77547c1821ba2d49ffe4842b12388590cb..9ccda8be374cbcde07a50c3c740a561b12bdd809 100755 (executable)
@@ -1,7 +1,8 @@
 // Load modules
 
-var Lab = require('lab');
+var Code = require('code');
 var Hawk = require('../lib');
+var Lab = require('lab');
 var Package = require('../package.json');
 
 
@@ -12,11 +13,10 @@ var internals = {};
 
 // Test shortcuts
 
-var expect = Lab.expect;
-var before = Lab.before;
-var after = Lab.after;
-var describe = Lab.experiment;
-var it = Lab.test;
+var lab = exports.lab = Lab.script();
+var describe = lab.experiment;
+var it = lab.test;
+var expect = Code.expect;
 
 
 describe('Hawk', function () {
@@ -110,7 +110,7 @@ describe('Hawk', function () {
 
             it('returns a hawk 401', function (done) {
 
-                expect(Hawk.utils.unauthorized('kaboom').response.headers['WWW-Authenticate']).to.equal('Hawk error="kaboom"');
+                expect(Hawk.utils.unauthorized('kaboom').output.headers['WWW-Authenticate']).to.equal('Hawk error="kaboom"');
                 done();
             });
         });
index 0c7071492c6f04d0296f4d887a285c501656511f..de487d3236ac696e8df6a7d07f1c4a308d9cda76 100644 (file)
@@ -6,61 +6,65 @@ for Joyent's [HTTP Signature Scheme](http_signing.md).
 ## Usage
 
 Note the example below signs a request with the same key/cert used to start an
-HTTP server. This is almost certainly not what you actaully want, but is just
+HTTP server. This is almost certainly not what you actually want, but is just
 used to illustrate the API calls; you will need to provide your own key
 management in addition to this library.
 
 ### Client
 
-    var fs = require('fs');
-    var https = require('https');
-    var httpSignature = require('http-signature');
+```js
+var fs = require('fs');
+var https = require('https');
+var httpSignature = require('http-signature');
 
-    var key = fs.readFileSync('./key.pem', 'ascii');
+var key = fs.readFileSync('./key.pem', 'ascii');
 
-    var options = {
-      host: 'localhost',
-      port: 8443,
-      path: '/',
-      method: 'GET',
-      headers: {}
-    };
+var options = {
+  host: 'localhost',
+  port: 8443,
+  path: '/',
+  method: 'GET',
+  headers: {}
+};
 
-    // Adds a 'Date' header in, signs it, and adds the
-    // 'Authorization' header in.
-    var req = https.request(options, function(res) {
-      console.log(res.statusCode);
-    });
+// Adds a 'Date' header in, signs it, and adds the
+// 'Authorization' header in.
+var req = https.request(options, function(res) {
+  console.log(res.statusCode);
+});
 
 
-    httpSignature.sign(req, {
-      key: key,
-      keyId: './cert.pem'
-    });
+httpSignature.sign(req, {
+  key: key,
+  keyId: './cert.pem'
+});
 
-    req.end();
+req.end();
+```
 
 ### Server
 
-    var fs = require('fs');
-    var https = require('https');
-    var httpSignature = require('http-signature');
-
-    var options = {
-      key: fs.readFileSync('./key.pem'),
-      cert: fs.readFileSync('./cert.pem')
-    };
-
-    https.createServer(options, function (req, res) {
-      var rc = 200;
-      var parsed = httpSignature.parseRequest(req);
-      var pub = fs.readFileSync(parsed.keyId, 'ascii');
-      if (!httpSignature.verifySignature(parsed, pub))
-        rc = 401;
-
-      res.writeHead(rc);
-      res.end();
-    }).listen(8443);
+```js
+var fs = require('fs');
+var https = require('https');
+var httpSignature = require('http-signature');
+
+var options = {
+  key: fs.readFileSync('./key.pem'),
+  cert: fs.readFileSync('./cert.pem')
+};
+
+https.createServer(options, function (req, res) {
+  var rc = 200;
+  var parsed = httpSignature.parseRequest(req);
+  var pub = fs.readFileSync(parsed.keyId, 'ascii');
+  if (!httpSignature.verifySignature(parsed, pub))
+    rc = 401;
+
+  res.writeHead(rc);
+  res.end();
+}).listen(8443);
+```
 
 ## Installation
 
index ba7321da15e774ef7ed4aace5c375f6f4ba70b66..dd81ee5b59e08fdd0c4b775b69c8eb73ea42fb55 100644 (file)
@@ -17,7 +17,7 @@ This protocol is intended to provide a standard way for clients to sign HTTP
 requests.  RFC2617 (HTTP Authentication) defines Basic and Digest authentication
 mechanisms, and RFC5246 (TLS 1.2) defines client-auth, both of which are widely
 employed on the Internet today.  However, it is common place that the burdens of
-PKI prevent web service operators from deploying that methodoloy, and so many
+PKI prevent web service operators from deploying that methodology, and so many
 fall back to Basic authentication, which has poor security characteristics.
 
 Additionally, OAuth provides a fully-specified alternative for authorization
@@ -109,14 +109,14 @@ the values of each HTTP header specified by `headers` in the order they appear.
 
 1. If the header name is not `request-line` then append the lowercased header
    name followed with an ASCII colon `:` and an ASCII space ` `.
-2. If the header name is `request-line` then appened the HTTP request line,
+2. If the header name is `request-line` then append the HTTP request line,
    otherwise append the header value.
 3. If value is not the last value then append an ASCII newline `\n`. The string
    MUST NOT include a trailing ASCII newline.
 
 # Example Requests
 
-All requests refer to the following request (body ommitted):
+All requests refer to the following request (body omitted):
 
     POST /foo HTTP/1.1
     Host: example.org
@@ -182,7 +182,7 @@ Currently supported algorithm names are:
 Note the default parameterization of the `Signature` scheme is only safe if all
 requests are carried over a secure transport (i.e., TLS).  Sending the default
 scheme over a non-secure transport will leave the request vulnerable to
-spoofing, tampering, replay/repudiaton, and integrity violations (if using the
+spoofing, tampering, replay/repudiation, and integrity violations (if using the
 STRIDE threat-modeling methodology).
 
 ## Insecure Transports
@@ -195,7 +195,7 @@ against any tampering from clients.
 ## Nonces
 
 Nonces are out of scope for this document simply because many service providers
-fail to implement them correctly, or do not adopt security specfiications
+fail to implement them correctly, or do not adopt security specifications
 because of the infrastructure complexity.  Given the `header` parameterization,
 a service provider is fully enabled to add nonce semantics into this scheme by
 using something like an `x-request-nonce` header, and ensuring it is signed
@@ -234,12 +234,12 @@ will want to enforce, but service providers SHOULD at minimum include the
 The following test data uses the RSA (2048b) keys, which we will refer
 to as `keyId=Test` in the following samples:
 
-   -----BEGIN PUBLIC KEY-----
-   MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
-   6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
-   Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
-   oYi+1hqp1fIekaxsyQIDAQAB
-   -----END PUBLIC KEY-----
+    -----BEGIN PUBLIC KEY-----
+    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
+    6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
+    Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
+    oYi+1hqp1fIekaxsyQIDAQAB
+    -----END PUBLIC KEY-----
 
     -----BEGIN RSA PRIVATE KEY-----
     MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
@@ -276,7 +276,7 @@ The string to sign would be:
 
 The Authorization header would be:
 
-    Authorization: Signature keyId="Test",algorithm="rsa-sha256",signature="JldXnt8W9t643M2Sce10gqCh/+E7QIYLiI+bSjnFBGCti7s+mPPvOjVb72sbd1FjeOUwPTDpKbrQQORrm+xBYfAwCxF3LBSSzORvyJ5nRFCFxfJ3nlQD6Kdxhw8wrVZX5nSem4A/W3C8qH5uhFTRwF4ruRjh+ENHWuovPgO/HGQ="
+    Authorization: Signature keyId="Test",algorithm="rsa-sha256",signature="ATp0r26dbMIxOopqw0OfABDT7CKMIoENumuruOtarj8n/97Q3htHFYpH8yOSQk3Z5zh8UxUym6FYTb5+A0Nz3NRsXJibnYi7brE/4tx5But9kkFGzG+xpUmimN4c3TMN7OFH//+r8hBf7BT9/GmHDUVZT2JzWGLZES2xDOUuMtA="
 
 ### All Headers
 
@@ -292,5 +292,5 @@ inserted for readability):
 
 The Authorization header would be:
 
-    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="request-line host date content-type content-md5 content-length",signature="Gm7W/r+e90REDpWytALMrft4MqZxCmslOTOvwJX17ViEBA5E65QqvWI0vIH3l/vSsGiaMVmuUgzYsJLYMLcm5dGrv1+a+0fCoUdVKPZWHyImQEqpLkopVwqEH67LVECFBqFTAKlQgBn676zrfXQbb+b/VebAsNUtvQMe6cTjnDY="
+    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="request-line host date content-type content-md5 content-length",signature="H/AaTDkJvLELy4i1RujnKlS6dm8QWiJvEpn9cKRMi49kKF+mohZ15z1r+mF+XiKS5kOOscyS83olfBtsVhYjPg2Ei3/D9D4Mvb7bFm9IaLJgYTFFuQCghrKQQFPiqJN320emjHxFowpIm1BkstnEU7lktH/XdXVBo8a6Uteiztw="
 
index 3ac70b77f21d96d6b4a97e052cd9d4a16a9e924b..217a5ddeb8a1f8d729ea7b8479e7bb39bce5564b 100644 (file)
@@ -19,6 +19,7 @@ module.exports = {
 
   sshKeyToPEM: util.sshKeyToPEM,
   sshKeyFingerprint: util.fingerprint,
+  pemToRsaSSHKey: util.pemToRsaSSHKey,
 
   verify: verify.verifySignature,
   verifySignature: verify.verifySignature
index 8095f0d17903f202fcf31d4d230e7c174b80fbb4..3507f4dbfd150dbfab0c088a82af39384f316c2f 100644 (file)
@@ -146,7 +146,6 @@ module.exports = {
         }
         stringToSign += h + ': ' + value;
       } else {
-        value =
         stringToSign +=
           request.method + ' ' + request.path + ' HTTP/' + options.httpVersion;
       }
index 30bbf045d4bc87a08e49b1bcb6aa1b342d4debdf..e7d915e768704a4f385c84b838d0e0a617819c12 100644 (file)
@@ -243,7 +243,62 @@ module.exports = {
     }
 
     return fp;
-  }
-
+  },
 
+  /**
+  * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
+  *
+  * The reverse of the above function.
+  */
+  pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
+    assert.equal('string', typeof pem, 'typeof pem');
+
+    // chop off the BEGIN PUBLIC KEY and END PUBLIC KEY portion
+    var cleaned = pem.split('\n').slice(1, -2).join('');
+
+    var buf = new Buffer(cleaned, 'base64');
+
+    var der = new asn1.BerReader(buf);
+
+    der.readSequence();
+    der.readSequence();
+
+    var oid = der.readOID();
+    assert.equal(oid, '1.2.840.113549.1.1.1', 'pem not in RSA format');
+
+    // Null -- XXX this probably isn't good practice
+    der.readByte();
+    der.readByte();
+
+    // bit string sequence
+    der.readSequence(0x03);
+    der.readByte();
+    der.readSequence();
+
+    // modulus
+    assert.equal(der.peek(), asn1.Ber.Integer, 'modulus not an integer');
+    der._offset = der.readLength(der.offset + 1);
+    var modulus = der._buf.slice(der.offset, der.offset + der.length);
+    der._offset += der.length;
+
+    // exponent
+    assert.equal(der.peek(), asn1.Ber.Integer, 'exponent not an integer');
+    der._offset = der.readLength(der.offset + 1);
+    var exponent = der._buf.slice(der.offset, der.offset + der.length);
+    der._offset += der.length;
+
+    // now, make the key
+    var type = new Buffer('ssh-rsa');
+    var buffer = new Buffer(4 + type.length + 4 + modulus.length + 4 + exponent.length);
+    var i = 0;
+    buffer.writeUInt32BE(type.length, i);     i += 4;
+    type.copy(buffer, i);                     i += type.length;
+    buffer.writeUInt32BE(exponent.length, i); i += 4;
+    exponent.copy(buffer, i);                 i += exponent.length;
+    buffer.writeUInt32BE(modulus.length, i);  i += 4;
+    modulus.copy(buffer, i);                  i += modulus.length;
+
+    var s = type.toString() + ' ' + buffer.toString('base64') + ' ' + (comment || '');
+    return s;
+  }
 };
index abd8125afc2a222686074c1b58e7016fb535bc95..8c68193cd1ed8da593da74c8262dc88d90fefe7d 100644 (file)
     "pretest": "which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi",
     "test": "tap ./tst"
   },
-  "readme": "node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.\nCurrently BER encoding is supported; at some point I'll likely have to do DER.\n\n## Usage\n\nMostly, if you're *actually* needing to read and write ASN.1, you probably don't\nneed this readme to explain what and why.  If you have no idea what ASN.1 is,\nsee this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nThe source is pretty much self-explanatory, and has read/write methods for the\ncommon types out there.\n\n### Decoding\n\nThe following reads an ASN.1 sequence with a boolean.\n\n    var Ber = require('asn1').Ber;\n\n    var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));\n\n    reader.readSequence();\n    console.log('Sequence len: ' + reader.length);\n    if (reader.peek() === Ber.Boolean)\n      console.log(reader.readBoolean());\n\n### Encoding\n\nThe following generates the same payload as above.\n\n    var Ber = require('asn1').Ber;\n\n    var writer = new Ber.Writer();\n\n    writer.startSequence();\n    writer.writeBoolean(true);\n    writer.endSequence();\n\n    console.log(writer.buffer);\n\n## Installation\n\n    npm install asn1\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-asn1/issues>.\n",
-  "readmeFilename": "README.md",
-  "bugs": {
-    "url": "https://github.com/mcavage/node-asn1/issues"
+  "_npmUser": {
+    "name": "mcavage",
+    "email": "mcavage@gmail.com"
   },
-  "homepage": "https://github.com/mcavage/node-asn1",
   "_id": "asn1@0.1.11",
+  "_engineSupported": true,
+  "_npmVersion": "1.1.0-beta-4",
+  "_nodeVersion": "v0.6.6",
+  "_defaultsLoaded": true,
+  "dist": {
+    "shasum": "559be18376d08a4ec4dbe80877d27818639b2df7",
+    "tarball": "http://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
+  },
+  "maintainers": [
+    {
+      "name": "mcavage",
+      "email": "mcavage@gmail.com"
+    }
+  ],
+  "directories": {},
   "_shasum": "559be18376d08a4ec4dbe80877d27818639b2df7",
   "_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
-  "_from": "asn1@0.1.11"
+  "_from": "asn1@0.1.11",
+  "bugs": {
+    "url": "https://github.com/mcavage/node-asn1/issues"
+  },
+  "readme": "ERROR: No README data found!",
+  "homepage": "https://github.com/mcavage/node-asn1"
 }
index 70583f12d35a7d22845eba121fe709c0d79546ea..ff2ba02de8204521e05c0edd0603c6a49680130f 100644 (file)
@@ -9,6 +9,7 @@ var util = require('util');
 ///--- Globals
 
 var NDEBUG = process.env.NODE_NDEBUG || false;
+var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
 
 
 
@@ -53,6 +54,28 @@ function _assert(arg, type, name, stackFunc) {
 }
 
 
+function _instanceof(arg, type, name, stackFunc) {
+        if (!NDEBUG) {
+                name = name || type;
+                stackFunc = stackFunc || _instanceof.caller;
+
+                if (!(arg instanceof type)) {
+                        throw new assert.AssertionError({
+                                message: _(TYPE_REQUIRED, name, type.name),
+                                actual: _getClass(arg),
+                                expected: type.name,
+                                operator: 'instanceof',
+                                stackStartFunction: stackFunc
+                        });
+                }
+        }
+}
+
+function _getClass(object) {
+        return (Object.prototype.toString.call(object).slice(8, -1));
+};
+
+
 
 ///--- API
 
@@ -85,7 +108,7 @@ function bool(arg, name) {
 function buffer(arg, name) {
         if (!Buffer.isBuffer(arg)) {
                 throw new assert.AssertionError({
-                        message: _(TYPE_REQUIRED, name, type),
+                        message: _(TYPE_REQUIRED, name || '', 'Buffer'),
                         actual: typeof (arg),
                         expected: 'buffer',
                         operator: 'Buffer.isBuffer',
@@ -102,6 +125,15 @@ function func(arg, name) {
 
 function number(arg, name) {
         _assert(arg, 'number', name);
+        if (!NDEBUG && (isNaN(arg) || !isFinite(arg))) {
+                throw new assert.AssertionError({
+                        message: _(TYPE_REQUIRED, name, 'number'),
+                        actual: arg,
+                        expected: 'number',
+                        operator: 'isNaN',
+                        stackStartFunction: number
+                });
+        }
 }
 
 
@@ -111,15 +143,16 @@ function object(arg, name) {
 
 
 function stream(arg, name) {
-        if (!(arg instanceof Stream)) {
-                throw new assert.AssertionError({
-                        message: _(TYPE_REQUIRED, name, type),
-                        actual: typeof (arg),
-                        expected: 'Stream',
-                        operator: 'instanceof',
-                        stackStartFunction: buffer
-                });
-        }
+        _instanceof(arg, Stream, name);
+}
+
+
+function date(arg, name) {
+        _instanceof(arg, Date, name);
+}
+
+function regexp(arg, name) {
+        _instanceof(arg, RegExp, name);
 }
 
 
@@ -128,17 +161,33 @@ function string(arg, name) {
 }
 
 
+function uuid(arg, name) {
+        string(arg, name);
+        if (!NDEBUG && !UUID_REGEXP.test(arg)) {
+                throw new assert.AssertionError({
+                        message: _(TYPE_REQUIRED, name, 'uuid'),
+                        actual: 'string',
+                        expected: 'uuid',
+                        operator: 'test',
+                        stackStartFunction: uuid
+                });
+        }
+}
+
 
 ///--- Exports
 
 module.exports = {
         bool: bool,
         buffer: buffer,
+        date: date,
         func: func,
         number: number,
         object: object,
+        regexp: regexp,
         stream: stream,
-        string: string
+        string: string,
+        uuid: uuid
 };
 
 
index 99d9d48ab80cf08c4a5a1335487f9d84edb3d415..1b935b6b42421baa2e8e0a4af2619b98f808bc25 100644 (file)
@@ -5,19 +5,42 @@
   },
   "name": "assert-plus",
   "description": "Extra assertions on top of node's assert module",
-  "version": "0.1.2",
+  "version": "0.1.5",
   "main": "./assert.js",
-  "dependencies": {},
   "devDependencies": {},
   "optionalDependencies": {},
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mcavage/node-assert-plus.git"
+  },
   "engines": {
-    "node": ">=0.6"
+    "node": ">=0.8"
+  },
+  "bugs": {
+    "url": "https://github.com/mcavage/node-assert-plus/issues"
+  },
+  "dependencies": {},
+  "_id": "assert-plus@0.1.5",
+  "dist": {
+    "shasum": "ee74009413002d84cec7219c6ac811812e723160",
+    "tarball": "http://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz"
+  },
+  "_from": "assert-plus@>=0.1.5 <0.2.0",
+  "_npmVersion": "1.3.11",
+  "_npmUser": {
+    "name": "mcavage",
+    "email": "mcavage@gmail.com"
   },
-  "readme": "# node-assert-plus\n\nThis library is a super small wrapper over node's assert module that has two\nthings: (1) the ability to disable assertions with the environment variable\nNODE_NDEBUG, and (2) some API wrappers for argument testing.  Like\n`assert.string(myArg, 'myArg')`.  As a simple example, most of my code looks\nlike this:\n\n    var assert = require('assert-plus');\n\n    function fooAccount(options, callback) {\n\t    assert.object(options, 'options');\n\t\tassert.number(options.id, 'options.id);\n\t\tassert.bool(options.isManager, 'options.isManager');\n\t\tassert.string(options.name, 'options.name');\n\t\tassert.arrayOfString(options.email, 'options.email');\n\t\tassert.func(callback, 'callback');\n\n        // Do stuff\n\t\tcallback(null, {});\n    }\n\n# API\n\nAll methods that *aren't* part of node's core assert API are simply assumed to\ntake an argument, and then a string 'name' that's not a message; `AssertionError`\nwill be thrown if the assertion fails with a message like:\n\n    AssertionError: foo (string) is required\n\tat test (/home/mark/work/foo/foo.js:3:9)\n\tat Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)\n\tat Module._compile (module.js:446:26)\n\tat Object..js (module.js:464:10)\n\tat Module.load (module.js:353:31)\n\tat Function._load (module.js:311:12)\n\tat Array.0 (module.js:484:10)\n\tat EventEmitter._tickCallback (node.js:190:38)\n\nfrom:\n\n    function test(foo) {\n\t    assert.string(foo, 'foo');\n    }\n\nThere you go.  You can check that arrays are of a homogenous type with `Arrayof$Type`:\n\n    function test(foo) {\n\t    assert.arrayOfString(foo, 'foo');\n    }\n\nYou can assert IFF an argument is not `undefined` (i.e., an optional arg):\n\n    assert.optionalString(foo, 'foo');\n\nLastly, you can opt-out of assertion checking altogether by setting the\nenvironment variable `NODE_NDEBUG=1`.  This is pseudo-useful if you have\nlots of assertions, and don't want to pay `typeof ()` taxes to v8 in\nproduction.\n\nThe complete list of APIs is:\n\n* assert.bool\n* assert.buffer\n* assert.func\n* assert.number\n* assert.object\n* assert.string\n* assert.arrayOfBool\n* assert.arrayOfFunc\n* assert.arrayOfNumber\n* assert.arrayOfObject\n* assert.arrayOfString\n* assert.optionalBool\n* assert.optionalBuffer\n* assert.optionalFunc\n* assert.optionalNumber\n* assert.optionalObject\n* assert.optionalString\n* assert.optionalArrayOfBool\n* assert.optionalArrayOfFunc\n* assert.optionalArrayOfNumber\n* assert.optionalArrayOfObject\n* assert.optionalArrayOfString\n* assert.AssertionError\n* assert.fail\n* assert.ok\n* assert.equal\n* assert.notEqual\n* assert.deepEqual\n* assert.notDeepEqual\n* assert.strictEqual\n* assert.notStrictEqual\n* assert.throws\n* assert.doesNotThrow\n* assert.ifError\n\n# Installation\n\n    npm install assert-plus\n\n## License\n\nThe MIT License (MIT)\nCopyright (c) 2012 Mark Cavage\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-assert-plus/issues>.\n",
-  "readmeFilename": "README.md",
-  "_id": "assert-plus@0.1.2",
-  "_shasum": "d93ffdbb67ac5507779be316a7d65146417beef8",
-  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz",
-  "_from": "assert-plus@0.1.2",
+  "maintainers": [
+    {
+      "name": "mcavage",
+      "email": "mcavage@gmail.com"
+    }
+  ],
+  "directories": {},
+  "_shasum": "ee74009413002d84cec7219c6ac811812e723160",
+  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
+  "readme": "ERROR: No README data found!",
+  "homepage": "https://github.com/mcavage/node-assert-plus",
   "scripts": {}
 }
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/.npmignore b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/.npmignore
new file mode 100644 (file)
index 0000000..dc6d3b2
--- /dev/null
@@ -0,0 +1 @@
+tst/
index 078c03ca6b2152eaec5dccd8cece380ee5453448..426da9ef001e9e7ce05738a2e5783560a69ec42c 100644 (file)
@@ -4,7 +4,14 @@ in it. The commit message also has the corresponding github issue. i.e. CTYPE-42
 would be issue 42. Each issue can be found at:
 https://github.com/rmustacc/node-ctype/issues/%d.
 
-CTYPE v0.5.2
+v0.5.3
+CTYPE-50 Release 0.5.3
+Contributed by Nick Schonning:
+CTYPE-49 Add repository section to package.json
+Contributed by Jonathan Ong:
+CTYPE-48 Create .npmignore
+
+v0.5.2
 CTYPE-46 Release 0.5.2
 CTYPE-45 error in setEndian logic
 
index 5840d050c396f3fdfda351f46fa097d74ca31139..4e1d86768d915460a8984a4c07b11ac6e728c26d 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "ctype",
-  "version": "0.5.2",
+  "version": "0.5.3",
   "description": "read and write binary structures and data types",
   "homepage": "https://github.com/rmustacc/node-ctype",
   "author": {
     "node": ">= 0.4"
   },
   "main": "ctype.js",
-  "_id": "ctype@0.5.2",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/rmustacc/node-ctype.git"
+  },
+  "_id": "ctype@0.5.3",
   "dist": {
-    "shasum": "fe8091d468a373a0b0c9ff8bbfb3425c00973a1d",
-    "tarball": "http://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz"
+    "shasum": "82c18c2461f74114ef16c135224ad0b9144ca12f",
+    "tarball": "http://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz"
   },
   "_npmVersion": "1.1.59",
   "_npmUser": {
     }
   ],
   "directories": {},
-  "_shasum": "fe8091d468a373a0b0c9ff8bbfb3425c00973a1d",
-  "_resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz",
-  "_from": "ctype@0.5.2",
+  "_shasum": "82c18c2461f74114ef16c135224ad0b9144ca12f",
+  "_resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
+  "_from": "ctype@0.5.3",
+  "bugs": {
+    "url": "https://github.com/rmustacc/node-ctype/issues"
+  },
   "readme": "ERROR: No README data found!",
   "scripts": {}
 }
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json
deleted file mode 100644 (file)
index 29d7bd8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{ "metadata":
-       {
-               "ctf2json_version": "1.0",
-               "created_at": 1316563626,
-               "derived_from": "/lib/libc.so",
-               "ctf_version": 2,
-               "requested_types": [ "float" ]
-       },
-"data":
-       [
-               { "name": "float", "float": { "length": 4 } }
-       ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json
deleted file mode 100644 (file)
index f9773a1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{ "metadata":
-       {
-               "ctf2json_version": "1.0",
-               "created_at": 1316563631,
-               "derived_from": "/lib/libc.so",
-               "ctf_version": 2,
-               "requested_types": [ "int" ]
-       },
-"data":
-       [
-               { "name": "int", "integer": { "length": 4, "signed": true } }
-       ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json
deleted file mode 100644 (file)
index e0ee5e0..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-{ "metadata":
-       {
-               "ctf2json_version": "1.0",
-               "created_at": 1316563573,
-               "derived_from": "/lib/libc.so",
-               "ctf_version": 2,
-               "requested_types": [ "psinfo_t" ]
-       },
-"data":
-       [
-               { "name": "int", "integer": { "length": 4, "signed": true } },
-               { "name": "char", "integer": { "length": 1, "signed": true } },
-               { "name": "unsigned short", "integer": { "length": 2, "signed": false } },
-               { "name": "long", "integer": { "length": 4, "signed": true } },
-               { "name": "unsigned", "integer": { "length": 4, "signed": false } },
-               { "name": "size_t", "typedef": "unsigned" },
-               { "name": "unsigned long", "integer": { "length": 4, "signed": false } },
-               { "name": "time_t", "typedef": "long" },
-               { "name": "struct timespec", "struct": [
-                       { "name": "tv_sec", "type": "time_t" },
-                       { "name": "tv_nsec", "type": "long" }
-               ] },
-               { "name": "zoneid_t", "typedef": "long" },
-               { "name": "taskid_t", "typedef": "long" },
-               { "name": "dev_t", "typedef": "unsigned long" },
-               { "name": "uid_t", "typedef": "unsigned" },
-               { "name": "gid_t", "typedef": "unsigned" },
-               { "name": "timestruc_t", "typedef": "struct timespec" },
-               { "name": "short", "integer": { "length": 2, "signed": true } },
-               { "name": "projid_t", "typedef": "long" },
-               { "name": "ushort_t", "typedef": "unsigned short" },
-               { "name": "poolid_t", "typedef": "long" },
-               { "name": "uintptr_t", "typedef": "unsigned" },
-               { "name": "id_t", "typedef": "long" },
-               { "name": "pid_t", "typedef": "long" },
-               { "name": "processorid_t", "typedef": "int" },
-               { "name": "psetid_t", "typedef": "int" },
-               { "name": "struct lwpsinfo", "struct": [
-                       { "name": "pr_flag", "type": "int" },
-                       { "name": "pr_lwpid", "type": "id_t" },
-                       { "name": "pr_addr", "type": "uintptr_t" },
-                       { "name": "pr_wchan", "type": "uintptr_t" },
-                       { "name": "pr_stype", "type": "char" },
-                       { "name": "pr_state", "type": "char" },
-                       { "name": "pr_sname", "type": "char" },
-                       { "name": "pr_nice", "type": "char" },
-                       { "name": "pr_syscall", "type": "short" },
-                       { "name": "pr_oldpri", "type": "char" },
-                       { "name": "pr_cpu", "type": "char" },
-                       { "name": "pr_pri", "type": "int" },
-                       { "name": "pr_pctcpu", "type": "ushort_t" },
-                       { "name": "pr_pad", "type": "ushort_t" },
-                       { "name": "pr_start", "type": "timestruc_t" },
-                       { "name": "pr_time", "type": "timestruc_t" },
-                       { "name": "pr_clname", "type": "char [8]" },
-                       { "name": "pr_name", "type": "char [16]" },
-                       { "name": "pr_onpro", "type": "processorid_t" },
-                       { "name": "pr_bindpro", "type": "processorid_t" },
-                       { "name": "pr_bindpset", "type": "psetid_t" },
-                       { "name": "pr_lgrp", "type": "int" },
-                       { "name": "pr_filler", "type": "int [4]" }
-               ] },
-               { "name": "lwpsinfo_t", "typedef": "struct lwpsinfo" },
-               { "name": "struct psinfo", "struct": [
-                       { "name": "pr_flag", "type": "int" },
-                       { "name": "pr_nlwp", "type": "int" },
-                       { "name": "pr_pid", "type": "pid_t" },
-                       { "name": "pr_ppid", "type": "pid_t" },
-                       { "name": "pr_pgid", "type": "pid_t" },
-                       { "name": "pr_sid", "type": "pid_t" },
-                       { "name": "pr_uid", "type": "uid_t" },
-                       { "name": "pr_euid", "type": "uid_t" },
-                       { "name": "pr_gid", "type": "gid_t" },
-                       { "name": "pr_egid", "type": "gid_t" },
-                       { "name": "pr_addr", "type": "uintptr_t" },
-                       { "name": "pr_size", "type": "size_t" },
-                       { "name": "pr_rssize", "type": "size_t" },
-                       { "name": "pr_pad1", "type": "size_t" },
-                       { "name": "pr_ttydev", "type": "dev_t" },
-                       { "name": "pr_pctcpu", "type": "ushort_t" },
-                       { "name": "pr_pctmem", "type": "ushort_t" },
-                       { "name": "pr_start", "type": "timestruc_t" },
-                       { "name": "pr_time", "type": "timestruc_t" },
-                       { "name": "pr_ctime", "type": "timestruc_t" },
-                       { "name": "pr_fname", "type": "char [16]" },
-                       { "name": "pr_psargs", "type": "char [80]" },
-                       { "name": "pr_wstat", "type": "int" },
-                       { "name": "pr_argc", "type": "int" },
-                       { "name": "pr_argv", "type": "uintptr_t" },
-                       { "name": "pr_envp", "type": "uintptr_t" },
-                       { "name": "pr_dmodel", "type": "char" },
-                       { "name": "pr_pad2", "type": "char [3]" },
-                       { "name": "pr_taskid", "type": "taskid_t" },
-                       { "name": "pr_projid", "type": "projid_t" },
-                       { "name": "pr_nzomb", "type": "int" },
-                       { "name": "pr_poolid", "type": "poolid_t" },
-                       { "name": "pr_zoneid", "type": "zoneid_t" },
-                       { "name": "pr_contract", "type": "id_t" },
-                       { "name": "pr_filler", "type": "int [1]" },
-                       { "name": "pr_lwp", "type": "lwpsinfo_t" }
-               ] },
-               { "name": "psinfo_t", "typedef": "struct psinfo" }
-       ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json
deleted file mode 100644 (file)
index e0542ff..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{ "metadata":
-       {
-               "ctf2json_version": "1.0",
-               "created_at": 1316563648,
-               "derived_from": "/lib/libc.so",
-               "ctf_version": 2,
-               "requested_types": [ "timestruc_t" ]
-       },
-"data":
-       [
-               { "name": "long", "integer": { "length": 4, "signed": true } },
-               { "name": "time_t", "typedef": "long" },
-               { "name": "struct timespec", "struct": [
-                       { "name": "tv_sec", "type": "time_t" },
-                       { "name": "tv_nsec", "type": "long" }
-               ] },
-               { "name": "timestruc_t", "typedef": "struct timespec" }
-       ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js
deleted file mode 100644 (file)
index d6a52cb..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Test several conditions that should always cause us to throw.
- */
-var mod_assert = require('assert');
-var mod_ctype = require('../../ctype.js');
-
-var cases = [
-{ json: { }, msg: 'bad JSON - no metadata or data' },
-{ json: { metadata: {} }, msg: 'bad JSON - bad metadata section' },
-{ json: { metadata: { 'JSON version': [] } },
-    msg: 'bad JSON - bad JSON version' },
-{ json: { metadata: { 'JSON version': 2 } },
-    msg: 'bad JSON - bad JSON version' },
-{ json: { metadata: { 'JSON version': '100.20' } },
-    msg: 'bad JSON - bad JSON version' },
-{ json: { metadata: { 'JSON version': '1.0' } },
-    msg: 'missing data section' },
-{ json: { metadata: { 'JSON version': '1.0' }, data: 1 },
-    msg: 'invalid data section' },
-{ json: { metadata: { 'JSON version': '1.0' }, data: 1.1 },
-    msg: 'invalid data section' },
-{ json: { metadata: { 'JSON version': '1.0' }, data: '1.1' },
-    msg: 'invalid data section' },
-{ json: { metadata: { 'JSON version': '1.0' }, data: {} },
-    msg: 'invalid data section' }
-];
-
-function test()
-{
-       var ii;
-
-       for (ii = 0; ii < cases.length; ii++) {
-               mod_assert.throws(function () {
-                   mod_ctype.parseCTF(cases[ii].json);
-               }, Error, cases[ii].msg);
-       }
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js
deleted file mode 100644 (file)
index f214499..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-var mod_fs = require('fs');
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var data, parser;
-
-       data = JSON.parse(mod_fs.readFileSync('./float.json').toString());
-       parser = mod_ctype.parseCTF(data, { endian: 'big' });
-       mod_assert.deepEqual(parser.lstypes(), {});
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js
deleted file mode 100644 (file)
index 0ec0f76..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-var mod_fs = require('fs');
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var data, parser;
-
-       data = JSON.parse(mod_fs.readFileSync('./int.json').toString());
-       parser = mod_ctype.parseCTF(data, { endian: 'big' });
-       mod_assert.deepEqual(parser.lstypes(), { 'int': 'int32_t' });
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js
deleted file mode 100644 (file)
index ca1a544..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-var mod_fs = require('fs');
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-/*
- * This is too unwieldly to actually write out. Just make sure we can parse it
- * without errrors.
- */
-function test()
-{
-       var data;
-
-       data = JSON.parse(mod_fs.readFileSync('./psinfo.json').toString());
-       mod_ctype.parseCTF(data, { endian: 'big' });
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js
deleted file mode 100644 (file)
index c62f41f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-var mod_fs = require('fs');
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var data, parser;
-
-       data = JSON.parse(mod_fs.readFileSync('./struct.json').toString());
-       parser = mod_ctype.parseCTF(data, { endian: 'big' });
-       mod_assert.deepEqual(parser.lstypes(), { 'long': 'int32_t',
-           'time_t': 'long',
-           'timestruc_t': 'struct timespec',
-           'struct timespec': [ { 'tv_sec': { 'type': 'time_t' } },
-               { 'tv_nsec': { 'type': 'long' } } ] });
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js
deleted file mode 100644 (file)
index 9006cd1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-var mod_fs = require('fs');
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var data, parser;
-
-       data = JSON.parse(mod_fs.readFileSync('./typedef.json').toString());
-       parser = mod_ctype.parseCTF(data, { endian: 'big' });
-       mod_assert.deepEqual(parser.lstypes(), { 'bar_t': 'int',
-           'int': 'int32_t' });
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json
deleted file mode 100644 (file)
index 35ddb50..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{ "metadata":
-       {
-               "ctf2json_version": "1.0",
-               "created_at": 1316302348,
-               "derived_from": "/lib/libc.so",
-               "ctf_version": 2,
-               "requested_types": [ "bar_t" ]
-       },
-"data":
-       [
-               { "name": "int", "integer": { "length": 4, "signed": true } },
-               { "name": "bar_t", "typedef": "int" }
-       ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js
deleted file mode 100644 (file)
index 2c9504a..0000000
+++ /dev/null
@@ -1,767 +0,0 @@
-/*
- * Battery of tests to break our floating point implementation. Oh ho ho.
- *
- * There are a few useful ways to generate the expected output. The first is
- * just write a C program and write raw bytes out and inspect with xxd. Remember
- * to consider whether or not you're on a big endian or little endian machine.
- * Another useful site I found to help with some of this was:
- *
- * http://babbage.cs.qc.edu/IEEE-754/
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-function testfloat()
-{
-       var buffer = new Buffer(4);
-       /* Start off with some of the easy ones: +zero */
-       buffer[0] = 0;
-       buffer[1] = 0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-
-       ASSERT.equal(0, mod_ctype.rfloat(buffer, 'big', 0));
-       ASSERT.equal(0, mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Test -0 */
-       buffer[0] = 0x80;
-       ASSERT.equal(0, mod_ctype.rfloat(buffer, 'big', 0));
-       buffer[3] = buffer[0];
-       buffer[0] = 0;
-       ASSERT.equal(0, mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Catch +infin */
-       buffer[0] = 0x7f;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       ASSERT.equal(Number.POSITIVE_INFINITY,
-           mod_ctype.rfloat(buffer, 'big', 0));
-       buffer[3] = 0x7f;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(Number.POSITIVE_INFINITY,
-           mod_ctype.rfloat(buffer, 'litle', 0));
-
-       /* Catch -infin */
-       buffer[0] = 0xff;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       ASSERT.equal(Number.NEGATIVE_INFINITY,
-           mod_ctype.rfloat(buffer, 'big', 0));
-       buffer[3] = 0xff;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(Number.NEGATIVE_INFINITY,
-           mod_ctype.rfloat(buffer, 'litle', 0));
-
-       /* Catch NaN */
-
-       buffer[0] = 0x7f;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x23;
-       ASSERT.ok(isNaN(mod_ctype.rfloat(buffer, 'big', 0)));
-       buffer[3] = 0x7f;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x23;
-       ASSERT.ok(isNaN(mod_ctype.rfloat(buffer, 'little', 0)));
-
-       /* Catch -infin */
-       buffer[0] = 0xff;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x23;
-       ASSERT.ok(isNaN(mod_ctype.rfloat(buffer, 'big', 0)));
-       buffer[3] = 0xff;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x23;
-       ASSERT.ok(isNaN(mod_ctype.rfloat(buffer, 'little', 0)));
-
-       /* On to some basic tests */
-       /* 1.125 */
-       buffer[0] = 0x3f;
-       buffer[1] = 0x90;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       ASSERT.equal(1.125, mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x3f;
-       buffer[2] = 0x90;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(1.125, mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* ff34a2b0 -2.4010576103645774e+38 */
-       buffer[0] = 0xff;
-       buffer[1] = 0x34;
-       buffer[2] = 0xa2;
-       buffer[3] = 0xb0;
-       ASSERT.equal(-2.4010576103645774e+38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0xff;
-       buffer[2] = 0x34;
-       buffer[1] = 0xa2;
-       buffer[0] = 0xb0;
-       ASSERT.equal(-2.4010576103645774e+38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Denormalized tests */
-
-       /* 0003f89a +/- 3.6468792534053364e-40 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x03;
-       buffer[2] = 0xf8;
-       buffer[3] = 0x9a;
-       ASSERT.equal(3.6468792534053364e-40,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x00;
-       buffer[2] = 0x03;
-       buffer[1] = 0xf8;
-       buffer[0] = 0x9a;
-       ASSERT.equal(3.6468792534053364e-40,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x03;
-       buffer[2] = 0xf8;
-       buffer[3] = 0x9a;
-       ASSERT.equal(-3.6468792534053364e-40,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x80;
-       buffer[2] = 0x03;
-       buffer[1] = 0xf8;
-       buffer[0] = 0x9a;
-       ASSERT.equal(-3.6468792534053364e-40,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-
-       /* Maximum and minimum normalized and denormalized values */
-
-       /* Largest normalized number +/- 3.4028234663852886e+38 */
-
-       buffer[0] = 0x7f;
-       buffer[1] = 0x7f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       ASSERT.equal(3.4028234663852886e+38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x7f;
-       buffer[2] = 0x7f;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(3.4028234663852886e+38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       buffer[0] = 0xff;
-       buffer[1] = 0x7f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       ASSERT.equal(-3.4028234663852886e+38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0xff;
-       buffer[2] = 0x7f;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(-3.4028234663852886e+38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Smallest normalied number +/- 1.1754943508222875e-38 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       ASSERT.equal(1.1754943508222875e-38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x00;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(1.1754943508222875e-38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x80;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       ASSERT.equal(-1.1754943508222875e-38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x80;
-       buffer[2] = 0x80;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(-1.1754943508222875e-38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-
-       /* Smallest denormalized number 1.401298464324817e-45 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x00;
-       buffer[2] = 0x00;
-       buffer[3] = 0x01;
-       ASSERT.equal(1.401298464324817e-45,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x00;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x01;
-       ASSERT.equal(1.401298464324817e-45,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x00;
-       buffer[2] = 0x00;
-       buffer[3] = 0x01;
-       ASSERT.equal(-1.401298464324817e-45,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x80;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x01;
-       ASSERT.equal(-1.401298464324817e-45,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Largest denormalized value +/- 1.1754942106924411e-38 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x7f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       ASSERT.equal(1.1754942106924411e-38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x00;
-       buffer[2] = 0x7f;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(1.1754942106924411e-38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x7f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       ASSERT.equal(-1.1754942106924411e-38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-
-       buffer[3] = 0x80;
-       buffer[2] = 0x7f;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(-1.1754942106924411e-38,
-           mod_ctype.rfloat(buffer, 'little', 0));
-
-       /* Do some quick offset testing */
-       buffer = new Buffer(6);
-       buffer[0] = 0x7f;
-       buffer[1] = 0x4e;
-       buffer[2] = 0x8a;
-       buffer[3] = 0x79;
-       buffer[4] = 0xcd;
-       buffer[5] = 0x3f;
-
-       ASSERT.equal(2.745399582697325e+38,
-           mod_ctype.rfloat(buffer, 'big', 0));
-       ASSERT.equal(1161619072,
-           mod_ctype.rfloat(buffer, 'big', 1));
-       ASSERT.equal(-1.2027516403607578e-32,
-           mod_ctype.rfloat(buffer, 'big', 2));
-
-       ASSERT.equal(8.97661320504413e+34,
-           mod_ctype.rfloat(buffer, 'little', 0));
-       ASSERT.equal(-261661920,
-           mod_ctype.rfloat(buffer, 'little', 1));
-       ASSERT.equal(1.605271577835083,
-           mod_ctype.rfloat(buffer, 'little', 2));
-
-}
-
-function testdouble()
-{
-       var buffer = new Buffer(10);
-
-       /* Check 0 */
-       buffer[0] = 0;
-       buffer[1] = 0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(0,
-           mod_ctype.rdouble(buffer, 'big', 0));
-       ASSERT.equal(0,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(0,
-           mod_ctype.rdouble(buffer, 'big', 0));
-       buffer[7] = 0x80;
-       buffer[6] = 0;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 0;
-       ASSERT.equal(0,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Check NaN */
-       buffer[0] = 0x7f;
-       buffer[1] = 0xf0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 23;
-       ASSERT.ok(isNaN(mod_ctype.rdouble(buffer, 'big', 0)));
-
-       buffer[7] = 0x7f;
-       buffer[6] = 0xf0;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 23;
-       ASSERT.ok(isNaN(mod_ctype.rdouble(buffer, 'little', 0)));
-
-       buffer[0] = 0xff;
-       buffer[1] = 0xf0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 23;
-       ASSERT.ok(isNaN(mod_ctype.rdouble(buffer, 'big', 0)));
-
-       buffer[7] = 0xff;
-       buffer[6] = 0xf0;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 23;
-       ASSERT.ok(isNaN(mod_ctype.rdouble(buffer, 'little', 0)));
-
-       /* pos inf */
-       buffer[0] = 0x7f;
-       buffer[1] = 0xf0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(Number.POSITIVE_INFINITY,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x7f;
-       buffer[6] = 0xf0;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 0;
-       ASSERT.equal(Number.POSITIVE_INFINITY,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* neg inf */
-       buffer[0] = 0xff;
-       buffer[1] = 0xf0;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(Number.NEGATIVE_INFINITY,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0xff;
-       buffer[6] = 0xf0;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 0;
-       ASSERT.equal(Number.NEGATIVE_INFINITY,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Simple normalized values */
-
-       /* +/- 1.125 */
-       buffer[0] = 0x3f;
-       buffer[1] = 0xf2;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(1.125,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x3f;
-       buffer[6] = 0xf2;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 0;
-       ASSERT.equal(1.125,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0xbf;
-       buffer[1] = 0xf2;
-       buffer[2] = 0;
-       buffer[3] = 0;
-       buffer[4] = 0;
-       buffer[5] = 0;
-       buffer[6] = 0;
-       buffer[7] = 0;
-       ASSERT.equal(-1.125,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0xbf;
-       buffer[6] = 0xf2;
-       buffer[5] = 0;
-       buffer[4] = 0;
-       buffer[3] = 0;
-       buffer[2] = 0;
-       buffer[1] = 0;
-       buffer[0] = 0;
-       ASSERT.equal(-1.125,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* +/- 1.4397318913736026e+283 */
-       buffer[0] = 0x7a;
-       buffer[1] = 0xb8;
-       buffer[2] = 0xc9;
-       buffer[3] = 0x34;
-       buffer[4] = 0x72;
-       buffer[5] = 0x16;
-       buffer[6] = 0xf9;
-       buffer[7] = 0x0e;
-       ASSERT.equal(1.4397318913736026e+283,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x7a;
-       buffer[6] = 0xb8;
-       buffer[5] = 0xc9;
-       buffer[4] = 0x34;
-       buffer[3] = 0x72;
-       buffer[2] = 0x16;
-       buffer[1] = 0xf9;
-       buffer[0] = 0x0e;
-       ASSERT.equal(1.4397318913736026e+283,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0xfa;
-       buffer[1] = 0xb8;
-       buffer[2] = 0xc9;
-       buffer[3] = 0x34;
-       buffer[4] = 0x72;
-       buffer[5] = 0x16;
-       buffer[6] = 0xf9;
-       buffer[7] = 0x0e;
-       ASSERT.equal(-1.4397318913736026e+283,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0xfa;
-       buffer[6] = 0xb8;
-       buffer[5] = 0xc9;
-       buffer[4] = 0x34;
-       buffer[3] = 0x72;
-       buffer[2] = 0x16;
-       buffer[1] = 0xf9;
-       buffer[0] = 0x0e;
-       ASSERT.equal(-1.4397318913736026e+283,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Denormalized values */
-       /* +/- 8.82521232268344e-309 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x06;
-       buffer[2] = 0x58;
-       buffer[3] = 0x94;
-       buffer[4] = 0x13;
-       buffer[5] = 0x27;
-       buffer[6] = 0x8a;
-       buffer[7] = 0xcd;
-       ASSERT.equal(8.82521232268344e-309,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x00;
-       buffer[6] = 0x06;
-       buffer[5] = 0x58;
-       buffer[4] = 0x94;
-       buffer[3] = 0x13;
-       buffer[2] = 0x27;
-       buffer[1] = 0x8a;
-       buffer[0] = 0xcd;
-       ASSERT.equal(8.82521232268344e-309,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x06;
-       buffer[2] = 0x58;
-       buffer[3] = 0x94;
-       buffer[4] = 0x13;
-       buffer[5] = 0x27;
-       buffer[6] = 0x8a;
-       buffer[7] = 0xcd;
-       ASSERT.equal(-8.82521232268344e-309,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x80;
-       buffer[6] = 0x06;
-       buffer[5] = 0x58;
-       buffer[4] = 0x94;
-       buffer[3] = 0x13;
-       buffer[2] = 0x27;
-       buffer[1] = 0x8a;
-       buffer[0] = 0xcd;
-       ASSERT.equal(-8.82521232268344e-309,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Edge cases, maximum and minimum values */
-
-       /* Smallest denormalized value 5e-324 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x00;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       buffer[4] = 0x00;
-       buffer[5] = 0x00;
-       buffer[6] = 0x00;
-       buffer[7] = 0x01;
-       ASSERT.equal(5e-324,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x00;
-       buffer[6] = 0x00;
-       buffer[5] = 0x00;
-       buffer[4] = 0x00;
-       buffer[3] = 0x00;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x01;
-       ASSERT.equal(5e-324,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x00;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       buffer[4] = 0x00;
-       buffer[5] = 0x00;
-       buffer[6] = 0x00;
-       buffer[7] = 0x01;
-       ASSERT.equal(-5e-324,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x80;
-       buffer[6] = 0x00;
-       buffer[5] = 0x00;
-       buffer[4] = 0x00;
-       buffer[3] = 0x00;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x01;
-       ASSERT.equal(-5e-324,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Largest denormalized value 2.225073858507201e-308 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x0f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       buffer[4] = 0xff;
-       buffer[5] = 0xff;
-       buffer[6] = 0xff;
-       buffer[7] = 0xff;
-       ASSERT.equal(2.225073858507201e-308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x00;
-       buffer[6] = 0x0f;
-       buffer[5] = 0xff;
-       buffer[4] = 0xff;
-       buffer[3] = 0xff;
-       buffer[2] = 0xff;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(2.225073858507201e-308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x0f;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       buffer[4] = 0xff;
-       buffer[5] = 0xff;
-       buffer[6] = 0xff;
-       buffer[7] = 0xff;
-       ASSERT.equal(-2.225073858507201e-308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x80;
-       buffer[6] = 0x0f;
-       buffer[5] = 0xff;
-       buffer[4] = 0xff;
-       buffer[3] = 0xff;
-       buffer[2] = 0xff;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(-2.225073858507201e-308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Smallest normalized value 2.2250738585072014e-308 */
-       buffer[0] = 0x00;
-       buffer[1] = 0x10;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       buffer[4] = 0x00;
-       buffer[5] = 0x00;
-       buffer[6] = 0x00;
-       buffer[7] = 0x00;
-       ASSERT.equal(2.2250738585072014e-308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x00;
-       buffer[6] = 0x10;
-       buffer[5] = 0x00;
-       buffer[4] = 0x00;
-       buffer[3] = 0x00;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(2.2250738585072014e-308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0x80;
-       buffer[1] = 0x10;
-       buffer[2] = 0x00;
-       buffer[3] = 0x00;
-       buffer[4] = 0x00;
-       buffer[5] = 0x00;
-       buffer[6] = 0x00;
-       buffer[7] = 0x00;
-       ASSERT.equal(-2.2250738585072014e-308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x80;
-       buffer[6] = 0x10;
-       buffer[5] = 0x00;
-       buffer[4] = 0x00;
-       buffer[3] = 0x00;
-       buffer[2] = 0x00;
-       buffer[1] = 0x00;
-       buffer[0] = 0x00;
-       ASSERT.equal(-2.2250738585072014e-308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Largest normalized value 1.7976931348623157e+308 */
-       buffer[0] = 0x7f;
-       buffer[1] = 0xef;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       buffer[4] = 0xff;
-       buffer[5] = 0xff;
-       buffer[6] = 0xff;
-       buffer[7] = 0xff;
-       ASSERT.equal(1.7976931348623157e+308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0x7f;
-       buffer[6] = 0xef;
-       buffer[5] = 0xff;
-       buffer[4] = 0xff;
-       buffer[3] = 0xff;
-       buffer[2] = 0xff;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(1.7976931348623157e+308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       buffer[0] = 0xff;
-       buffer[1] = 0xef;
-       buffer[2] = 0xff;
-       buffer[3] = 0xff;
-       buffer[4] = 0xff;
-       buffer[5] = 0xff;
-       buffer[6] = 0xff;
-       buffer[7] = 0xff;
-       ASSERT.equal(-1.7976931348623157e+308,
-           mod_ctype.rdouble(buffer, 'big', 0));
-
-       buffer[7] = 0xff;
-       buffer[6] = 0xef;
-       buffer[5] = 0xff;
-       buffer[4] = 0xff;
-       buffer[3] = 0xff;
-       buffer[2] = 0xff;
-       buffer[1] = 0xff;
-       buffer[0] = 0xff;
-       ASSERT.equal(-1.7976931348623157e+308,
-           mod_ctype.rdouble(buffer, 'little', 0));
-
-       /* Try offsets */
-       buffer[0] = 0xde;
-       buffer[1] = 0xad;
-       buffer[2] = 0xbe;
-       buffer[3] = 0xef;
-       buffer[4] = 0xba;
-       buffer[5] = 0xdd;
-       buffer[6] = 0xca;
-       buffer[7] = 0xfe;
-       buffer[8] = 0x16;
-       buffer[9] = 0x79;
-
-       ASSERT.equal(-1.1885958404126936e+148,
-           mod_ctype.rdouble(buffer, 'big', 0));
-       ASSERT.equal(-2.4299184080448593e-88,
-           mod_ctype.rdouble(buffer, 'big', 1));
-       ASSERT.equal(-0.000015130017658081283,
-           mod_ctype.rdouble(buffer, 'big', 2));
-
-       ASSERT.equal(-5.757458694845505e+302,
-           mod_ctype.rdouble(buffer, 'little', 0));
-       ASSERT.equal(6.436459604192476e-198,
-           mod_ctype.rdouble(buffer, 'little', 1));
-       ASSERT.equal(1.9903745632417286e+275,
-           mod_ctype.rdouble(buffer, 'little', 2));
-}
-
-testfloat();
-testdouble();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js
deleted file mode 100644 (file)
index b5fd95c..0000000
+++ /dev/null
@@ -1,753 +0,0 @@
-/*
- * Another place to find bugs that may yet plague us. This time with writing out
- * floats to arrays. We are lazy and did basically just take the opposite of our
- * test code to read in values.
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-
-/*
- *     A useful thing to keep around for debugging
- *     console.log('buffer[0]: ' + buffer[0].toString(16));
- *     console.log('buffer[1]: ' + buffer[1].toString(16));
- *     console.log('buffer[2]: ' + buffer[2].toString(16));
- *     console.log('buffer[3]: ' + buffer[3].toString(16));
- *     console.log('buffer[4]: ' + buffer[4].toString(16));
- *     console.log('buffer[5]: ' + buffer[5].toString(16));
- *     console.log('buffer[6]: ' + buffer[6].toString(16));
- *     console.log('buffer[7]: ' + buffer[7].toString(16));
- */
-
-function testfloat()
-{
-       var buffer = new Buffer(4);
-       mod_ctype.wfloat(0, 'big', buffer, 0);
-       /* Start off with some of the easy ones: +zero */
-       ASSERT.equal(0, buffer[0]);
-       ASSERT.equal(0, buffer[1]);
-       ASSERT.equal(0, buffer[2]);
-       ASSERT.equal(0, buffer[3]);
-       mod_ctype.wfloat(0, 'little', buffer, 0);
-       ASSERT.equal(0, buffer[0]);
-       ASSERT.equal(0, buffer[1]);
-       ASSERT.equal(0, buffer[2]);
-       ASSERT.equal(0, buffer[3]);
-
-       /* Catch +infin */
-       mod_ctype.wfloat(Number.POSITIVE_INFINITY, 'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wfloat(Number.POSITIVE_INFINITY, 'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* Catch -infin */
-       mod_ctype.wfloat(Number.NEGATIVE_INFINITY, 'big', buffer, 0);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wfloat(Number.NEGATIVE_INFINITY, 'little', buffer, 0);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* Catch NaN */
-
-       /*
-        * NaN Is a litle weird in its requirements, so we're going to encode a
-        * bit of how we actually implement it into this test. Probably not the
-        * best, since technically the sign is a don't care and the mantissa
-        * needs to just be non-zero.
-        */
-       mod_ctype.wfloat(NaN, 'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x17, buffer[3]);
-       mod_ctype.wfloat(NaN, 'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x17, buffer[0]);
-
-       /* On to some basic tests */
-       /* 1.125 */
-       mod_ctype.wfloat(1.125, 'big', buffer, 0);
-       ASSERT.equal(0x3f, buffer[0]);
-       ASSERT.equal(0x90, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wfloat(1.125, 'little', buffer, 0);
-       ASSERT.equal(0x3f, buffer[3]);
-       ASSERT.equal(0x90, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       mod_ctype.wfloat(1.0000001192092896, 'big', buffer, 0);
-       ASSERT.equal(0x3f, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x01, buffer[3]);
-       mod_ctype.wfloat(1.0000001192092896, 'little', buffer, 0);
-       ASSERT.equal(0x3f, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       mod_ctype.wfloat(1.0000001192092896, 'big', buffer, 0);
-       ASSERT.equal(0x3f, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x01, buffer[3]);
-       mod_ctype.wfloat(1.0000001192092896, 'little', buffer, 0);
-       ASSERT.equal(0x3f, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       mod_ctype.wfloat(2.3283067140944524e-10, 'big', buffer, 0);
-       ASSERT.equal(0x2f, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x01, buffer[3]);
-       mod_ctype.wfloat(2.3283067140944524e-10, 'little', buffer, 0);
-       ASSERT.equal(0x2f, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       /* ff34a2b0 -2.4010576103645774e+38 */
-       mod_ctype.wfloat(-2.4010576103645774e+38,
-           'big', buffer, 0);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0x34, buffer[1]);
-       ASSERT.equal(0xa2, buffer[2]);
-       ASSERT.equal(0xb0, buffer[3]);
-       mod_ctype.wfloat(-2.4010576103645774e+38,
-           'little', buffer, 0);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0x34, buffer[2]);
-       ASSERT.equal(0xa2, buffer[1]);
-       ASSERT.equal(0xb0, buffer[0]);
-
-       /* Denormalized tests */
-
-       /* 0003f89a +/- 3.6468792534053364e-40 */
-       mod_ctype.wfloat(3.6468792534053364e-40,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x03, buffer[1]);
-       ASSERT.equal(0xf8, buffer[2]);
-       ASSERT.equal(0x9a, buffer[3]);
-       mod_ctype.wfloat(3.6468792534053364e-40,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x03, buffer[2]);
-       ASSERT.equal(0xf8, buffer[1]);
-       ASSERT.equal(0x9a, buffer[0]);
-
-       mod_ctype.wfloat(-3.6468792534053364e-40,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x03, buffer[1]);
-       ASSERT.equal(0xf8, buffer[2]);
-       ASSERT.equal(0x9a, buffer[3]);
-       mod_ctype.wfloat(-3.6468792534053364e-40,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[3]);
-       ASSERT.equal(0x03, buffer[2]);
-       ASSERT.equal(0xf8, buffer[1]);
-       ASSERT.equal(0x9a, buffer[0]);
-
-       /* Maximum and minimum normalized and denormalized values */
-
-       /* Largest normalized number +/- 3.4028234663852886e+38 */
-
-       mod_ctype.wfloat(3.4028234663852886e+38,
-           'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0x7f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       mod_ctype.wfloat(3.4028234663852886e+38,
-           'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[3]);
-       ASSERT.equal(0x7f, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       mod_ctype.wfloat(-3.4028234663852886e+38,
-           'big', buffer, 0);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0x7f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       mod_ctype.wfloat(-3.4028234663852886e+38,
-           'little', buffer, 0);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0x7f, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       /* Smallest normalied number +/- 1.1754943508222875e-38 */
-
-       mod_ctype.wfloat(1.1754943508222875e-38,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wfloat(1.1754943508222875e-38,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       mod_ctype.wfloat(-1.1754943508222875e-38,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x80, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wfloat(-1.1754943508222875e-38,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[3]);
-       ASSERT.equal(0x80, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* Smallest denormalized number 1.401298464324817e-45 */
-       mod_ctype.wfloat(1.401298464324817e-45,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x01, buffer[3]);
-       mod_ctype.wfloat(1.401298464324817e-45,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       mod_ctype.wfloat(-1.401298464324817e-45,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x01, buffer[3]);
-       mod_ctype.wfloat(-1.401298464324817e-45,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       /* Largest denormalized value +/- 1.1754942106924411e-38 */
-
-       mod_ctype.wfloat(1.1754942106924411e-38,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x7f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       mod_ctype.wfloat(1.1754942106924411e-38,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x7f, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       mod_ctype.wfloat(-1.1754942106924411e-38,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x7f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       mod_ctype.wfloat(-1.1754942106924411e-38,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[3]);
-       ASSERT.equal(0x7f, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       /* Do some quick offset testing */
-       buffer = new Buffer(6);
-       mod_ctype.wfloat(-1.2027516403607578e-32,
-           'big', buffer, 2);
-       ASSERT.equal(0x8a, buffer[2]);
-       ASSERT.equal(0x79, buffer[3]);
-       ASSERT.equal(0xcd, buffer[4]);
-       ASSERT.equal(0x3f, buffer[5]);
-
-       mod_ctype.wfloat(-1.2027516403607578e-32,
-           'little', buffer, 2);
-       ASSERT.equal(0x8a, buffer[5]);
-       ASSERT.equal(0x79, buffer[4]);
-       ASSERT.equal(0xcd, buffer[3]);
-       ASSERT.equal(0x3f, buffer[2]);
-
-}
-
-function testdouble()
-{
-       var buffer = new Buffer(10);
-
-       /* Check 0 */
-       mod_ctype.wdouble(0, 'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-       mod_ctype.wdouble(0, 'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[7]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* Check NaN */
-       /* Similar to floats we are only generating a subset of values */
-       mod_ctype.wdouble(NaN, 'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0xf0, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x17, buffer[7]);
-       mod_ctype.wdouble(NaN, 'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[7]);
-       ASSERT.equal(0xf0, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x17, buffer[0]);
-
-       /* pos inf */
-       mod_ctype.wdouble(Number.POSITIVE_INFINITY,
-           'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0xf0, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-       mod_ctype.wdouble(Number.POSITIVE_INFINITY,
-           'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[7]);
-       ASSERT.equal(0xf0, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* neg inf */
-       mod_ctype.wdouble(Number.NEGATIVE_INFINITY,
-           'big', buffer, 0);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0xf0, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-       mod_ctype.wdouble(Number.NEGATIVE_INFINITY,
-           'little', buffer, 0);
-       ASSERT.equal(0xff, buffer[7]);
-       ASSERT.equal(0xf0, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       /* Simple normalized values */
-
-       /* +/- 1.125 */
-       mod_ctype.wdouble(1.125,
-           'big', buffer, 0);
-       ASSERT.equal(0x3f, buffer[0]);
-       ASSERT.equal(0xf2, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-
-       mod_ctype.wdouble(1.125,
-           'little', buffer, 0);
-       ASSERT.equal(0x3f, buffer[7]);
-       ASSERT.equal(0xf2, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       mod_ctype.wdouble(-1.125,
-           'big', buffer, 0);
-       ASSERT.equal(0xbf, buffer[0]);
-       ASSERT.equal(0xf2, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-
-       mod_ctype.wdouble(-1.125,
-           'little', buffer, 0);
-       ASSERT.equal(0xbf, buffer[7]);
-       ASSERT.equal(0xf2, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-
-       /* +/- 1.4397318913736026e+283 */
-       mod_ctype.wdouble(1.4397318913736026e+283,
-           'big', buffer, 0);
-       ASSERT.equal(0x7a, buffer[0]);
-       ASSERT.equal(0xb8, buffer[1]);
-       ASSERT.equal(0xc9, buffer[2]);
-       ASSERT.equal(0x34, buffer[3]);
-       ASSERT.equal(0x72, buffer[4]);
-       ASSERT.equal(0x16, buffer[5]);
-       ASSERT.equal(0xf9, buffer[6]);
-       ASSERT.equal(0x0e, buffer[7]);
-
-       mod_ctype.wdouble(1.4397318913736026e+283,
-           'little', buffer, 0);
-       ASSERT.equal(0x7a, buffer[7]);
-       ASSERT.equal(0xb8, buffer[6]);
-       ASSERT.equal(0xc9, buffer[5]);
-       ASSERT.equal(0x34, buffer[4]);
-       ASSERT.equal(0x72, buffer[3]);
-       ASSERT.equal(0x16, buffer[2]);
-       ASSERT.equal(0xf9, buffer[1]);
-       ASSERT.equal(0x0e, buffer[0]);
-
-       mod_ctype.wdouble(-1.4397318913736026e+283,
-           'big', buffer, 0);
-       ASSERT.equal(0xfa, buffer[0]);
-       ASSERT.equal(0xb8, buffer[1]);
-       ASSERT.equal(0xc9, buffer[2]);
-       ASSERT.equal(0x34, buffer[3]);
-       ASSERT.equal(0x72, buffer[4]);
-       ASSERT.equal(0x16, buffer[5]);
-       ASSERT.equal(0xf9, buffer[6]);
-       ASSERT.equal(0x0e, buffer[7]);
-
-       mod_ctype.wdouble(-1.4397318913736026e+283,
-           'little', buffer, 0);
-       ASSERT.equal(0xfa, buffer[7]);
-       ASSERT.equal(0xb8, buffer[6]);
-       ASSERT.equal(0xc9, buffer[5]);
-       ASSERT.equal(0x34, buffer[4]);
-       ASSERT.equal(0x72, buffer[3]);
-       ASSERT.equal(0x16, buffer[2]);
-       ASSERT.equal(0xf9, buffer[1]);
-       ASSERT.equal(0x0e, buffer[0]);
-
-       /* Denormalized values */
-       /* +/- 8.82521232268344e-309 */
-       mod_ctype.wdouble(8.82521232268344e-309,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x06, buffer[1]);
-       ASSERT.equal(0x58, buffer[2]);
-       ASSERT.equal(0x94, buffer[3]);
-       ASSERT.equal(0x13, buffer[4]);
-       ASSERT.equal(0x27, buffer[5]);
-       ASSERT.equal(0x8a, buffer[6]);
-       ASSERT.equal(0xcd, buffer[7]);
-
-       mod_ctype.wdouble(8.82521232268344e-309,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[7]);
-       ASSERT.equal(0x06, buffer[6]);
-       ASSERT.equal(0x58, buffer[5]);
-       ASSERT.equal(0x94, buffer[4]);
-       ASSERT.equal(0x13, buffer[3]);
-       ASSERT.equal(0x27, buffer[2]);
-       ASSERT.equal(0x8a, buffer[1]);
-       ASSERT.equal(0xcd, buffer[0]);
-
-       mod_ctype.wdouble(-8.82521232268344e-309,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x06, buffer[1]);
-       ASSERT.equal(0x58, buffer[2]);
-       ASSERT.equal(0x94, buffer[3]);
-       ASSERT.equal(0x13, buffer[4]);
-       ASSERT.equal(0x27, buffer[5]);
-       ASSERT.equal(0x8a, buffer[6]);
-       ASSERT.equal(0xcd, buffer[7]);
-
-       mod_ctype.wdouble(-8.82521232268344e-309,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[7]);
-       ASSERT.equal(0x06, buffer[6]);
-       ASSERT.equal(0x58, buffer[5]);
-       ASSERT.equal(0x94, buffer[4]);
-       ASSERT.equal(0x13, buffer[3]);
-       ASSERT.equal(0x27, buffer[2]);
-       ASSERT.equal(0x8a, buffer[1]);
-       ASSERT.equal(0xcd, buffer[0]);
-
-
-       /* Edge cases, maximum and minimum values */
-
-       /* Smallest denormalized value 5e-324 */
-       mod_ctype.wdouble(5e-324,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x01, buffer[7]);
-
-       mod_ctype.wdouble(5e-324,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[7]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-       mod_ctype.wdouble(-5e-324,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x01, buffer[7]);
-
-       mod_ctype.wdouble(-5e-324,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[7]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x01, buffer[0]);
-
-
-
-       /* Largest denormalized value 2.225073858507201e-308 */
-       mod_ctype.wdouble(2.225073858507201e-308,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x0f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xff, buffer[7]);
-
-       mod_ctype.wdouble(2.225073858507201e-308,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[7]);
-       ASSERT.equal(0x0f, buffer[6]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       mod_ctype.wdouble(-2.225073858507201e-308,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x0f, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xff, buffer[7]);
-
-       mod_ctype.wdouble(-2.225073858507201e-308,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[7]);
-       ASSERT.equal(0x0f, buffer[6]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-
-       /* Smallest normalized value 2.2250738585072014e-308 */
-       mod_ctype.wdouble(2.2250738585072014e-308,
-           'big', buffer, 0);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x10, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-
-       mod_ctype.wdouble(2.2250738585072014e-308,
-           'little', buffer, 0);
-       ASSERT.equal(0x00, buffer[7]);
-       ASSERT.equal(0x10, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-       mod_ctype.wdouble(-2.2250738585072014e-308,
-           'big', buffer, 0);
-       ASSERT.equal(0x80, buffer[0]);
-       ASSERT.equal(0x10, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-
-       mod_ctype.wdouble(-2.2250738585072014e-308,
-           'little', buffer, 0);
-       ASSERT.equal(0x80, buffer[7]);
-       ASSERT.equal(0x10, buffer[6]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[4]);
-       ASSERT.equal(0x00, buffer[3]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[0]);
-
-
-       /* Largest normalized value 1.7976931348623157e+308 */
-       mod_ctype.wdouble(1.7976931348623157e+308,
-           'big', buffer, 0);
-       ASSERT.equal(0x7f, buffer[0]);
-       ASSERT.equal(0xef, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xff, buffer[7]);
-
-       mod_ctype.wdouble(1.7976931348623157e+308,
-           'little', buffer, 0);
-       ASSERT.equal(0x7f, buffer[7]);
-       ASSERT.equal(0xef, buffer[6]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-       mod_ctype.wdouble(-1.7976931348623157e+308,
-           'big', buffer, 0);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0xef, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xff, buffer[7]);
-
-       mod_ctype.wdouble(-1.7976931348623157e+308,
-           'little', buffer, 0);
-       ASSERT.equal(0xff, buffer[7]);
-       ASSERT.equal(0xef, buffer[6]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[4]);
-       ASSERT.equal(0xff, buffer[3]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[0]);
-
-
-       /* Try offsets */
-       buffer[0] = 0xde;
-       buffer[1] = 0xad;
-       buffer[2] = 0xbe;
-       buffer[3] = 0xef;
-       buffer[4] = 0xba;
-       buffer[5] = 0xdd;
-       buffer[6] = 0xca;
-       buffer[7] = 0xfe;
-       buffer[8] = 0x16;
-       buffer[9] = 0x79;
-
-       mod_ctype.wdouble(-0.000015130017658081283,
-           'big', buffer, 2);
-       ASSERT.equal(0xbe, buffer[2]);
-       ASSERT.equal(0xef, buffer[3]);
-       ASSERT.equal(0xba, buffer[4]);
-       ASSERT.equal(0xdd, buffer[5]);
-       ASSERT.equal(0xca, buffer[6]);
-       ASSERT.equal(0xfe, buffer[7]);
-       ASSERT.equal(0x16, buffer[8]);
-       ASSERT.equal(0x79, buffer[9]);
-
-       mod_ctype.wdouble(-0.000015130017658081283,
-           'little', buffer, 2);
-       ASSERT.equal(0xbe, buffer[9]);
-       ASSERT.equal(0xef, buffer[8]);
-       ASSERT.equal(0xba, buffer[7]);
-       ASSERT.equal(0xdd, buffer[6]);
-       ASSERT.equal(0xca, buffer[5]);
-       ASSERT.equal(0xfe, buffer[4]);
-       ASSERT.equal(0x16, buffer[3]);
-       ASSERT.equal(0x79, buffer[2]);
-}
-
-testfloat();
-testdouble();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js
deleted file mode 100644 (file)
index 1ffdac0..0000000
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * Test our ability to read and write signed 64-bit integers.
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-function testRead()
-{
-       var res, data;
-       data = new Buffer(10);
-
-       data[0] = 0x32;
-       data[1] = 0x65;
-       data[2] = 0x42;
-       data[3] = 0x56;
-       data[4] = 0x23;
-       data[5] = 0xff;
-       data[6] = 0xff;
-       data[7] = 0xff;
-       data[8] = 0x89;
-       data[9] = 0x11;
-       res = mod_ctype.rsint64(data, 'big', 0);
-       ASSERT.equal(0x32654256, res[0]);
-       ASSERT.equal(0x23ffffff, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 1);
-       ASSERT.equal(0x65425623, res[0]);
-       ASSERT.equal(0xffffff89, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 2);
-       ASSERT.equal(0x425623ff, res[0]);
-       ASSERT.equal(0xffff8911, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 0);
-       ASSERT.equal(-0x000000dc, res[0]);
-       ASSERT.equal(-0xa9bd9ace, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 1);
-       ASSERT.equal(-0x76000000, res[0]);
-       ASSERT.equal(-0xdca9bd9b, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 2);
-       ASSERT.equal(0x1189ffff, res[0]);
-       ASSERT.equal(0xff235642, res[1]);
-
-       data.fill(0x00);
-       res = mod_ctype.rsint64(data, 'big', 0);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 1);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 2);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 0);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 1);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 2);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(0x00000000, res[1]);
-
-       data.fill(0xff);
-       res = mod_ctype.rsint64(data, 'big', 0);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 1);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-       res = mod_ctype.rsint64(data, 'big', 2);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 0);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 1);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-       res = mod_ctype.rsint64(data, 'little', 2);
-       ASSERT.equal(0x00000000, res[0]);
-       ASSERT.equal(-1, res[1]);
-
-       data[0] = 0x80;
-       data[1] = 0x00;
-       data[2] = 0x00;
-       data[3] = 0x00;
-       data[4] = 0x00;
-       data[5] = 0x00;
-       data[6] = 0x00;
-       data[7] = 0x00;
-       res = mod_ctype.rsint64(data, 'big', 0);
-       ASSERT.equal(-0x80000000, res[0]);
-       ASSERT.equal(0, res[1]);
-
-
-       data[7] = 0x80;
-       data[6] = 0x00;
-       data[5] = 0x00;
-       data[4] = 0x00;
-       data[3] = 0x00;
-       data[2] = 0x00;
-       data[1] = 0x00;
-       data[0] = 0x00;
-       res = mod_ctype.rsint64(data, 'little', 0);
-       ASSERT.equal(-0x80000000, res[0]);
-       ASSERT.equal(0, res[1]);
-
-       data[0] = 0x80;
-       data[1] = 0x00;
-       data[2] = 0x00;
-       data[3] = 0x00;
-       data[4] = 0x00;
-       data[5] = 0x00;
-       data[6] = 0x00;
-       data[7] = 0x01;
-       res = mod_ctype.rsint64(data, 'big', 0);
-       ASSERT.equal(-0x7fffffff, res[0]);
-       ASSERT.equal(-0xffffffff, res[1]);
-
-
-}
-
-function testWriteZero()
-{
-       var data, buf;
-       buf = new Buffer(10);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0, buf[9]);
-
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wsint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0, buf[9]);
-}
-
-/*
- * Also include tests that are going to force us to go into a negative value and
- * insure that it's written correctly.
- */
-function testWrite()
-{
-       var data, buf;
-
-       buf = new Buffer(10);
-       data = [ 0x234456, 0x87 ];
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0x00, buf[0]);
-       ASSERT.equal(0x23, buf[1]);
-       ASSERT.equal(0x44, buf[2]);
-       ASSERT.equal(0x56, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x87, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x23, buf[2]);
-       ASSERT.equal(0x44, buf[3]);
-       ASSERT.equal(0x56, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x87, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x23, buf[3]);
-       ASSERT.equal(0x44, buf[4]);
-       ASSERT.equal(0x56, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x87, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0x87, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x56, buf[4]);
-       ASSERT.equal(0x44, buf[5]);
-       ASSERT.equal(0x23, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x87, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x56, buf[5]);
-       ASSERT.equal(0x44, buf[6]);
-       ASSERT.equal(0x23, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0x87, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x56, buf[6]);
-       ASSERT.equal(0x44, buf[7]);
-       ASSERT.equal(0x23, buf[8]);
-       ASSERT.equal(0x00, buf[9]);
-
-       data = [0x3421, 0x34abcdba];
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0x00, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x34, buf[2]);
-       ASSERT.equal(0x21, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0xab, buf[5]);
-       ASSERT.equal(0xcd, buf[6]);
-       ASSERT.equal(0xba, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x34, buf[3]);
-       ASSERT.equal(0x21, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0xab, buf[6]);
-       ASSERT.equal(0xcd, buf[7]);
-       ASSERT.equal(0xba, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0x21, buf[5]);
-       ASSERT.equal(0x34, buf[6]);
-       ASSERT.equal(0xab, buf[7]);
-       ASSERT.equal(0xcd, buf[8]);
-       ASSERT.equal(0xba, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0xba, buf[0]);
-       ASSERT.equal(0xcd, buf[1]);
-       ASSERT.equal(0xab, buf[2]);
-       ASSERT.equal(0x34, buf[3]);
-       ASSERT.equal(0x21, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0xba, buf[1]);
-       ASSERT.equal(0xcd, buf[2]);
-       ASSERT.equal(0xab, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0x21, buf[5]);
-       ASSERT.equal(0x34, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0xba, buf[2]);
-       ASSERT.equal(0xcd, buf[3]);
-       ASSERT.equal(0xab, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0x21, buf[6]);
-       ASSERT.equal(0x34, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x00, buf[9]);
-
-
-       data = [ -0x80000000, 0 ];
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0x80, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0x00, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x80, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       data = [ -0x7fffffff, -0xffffffff ];
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0x80, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x01, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0x01, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x80, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       data = [ 0x0, -0x1];
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'big', buf, 0);
-       ASSERT.equal(0xff, buf[0]);
-       ASSERT.equal(0xff, buf[1]);
-       ASSERT.equal(0xff, buf[2]);
-       ASSERT.equal(0xff, buf[3]);
-       ASSERT.equal(0xff, buf[4]);
-       ASSERT.equal(0xff, buf[5]);
-       ASSERT.equal(0xff, buf[6]);
-       ASSERT.equal(0xff, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wsint64(data, 'little', buf, 0);
-       ASSERT.equal(0xff, buf[0]);
-       ASSERT.equal(0xff, buf[1]);
-       ASSERT.equal(0xff, buf[2]);
-       ASSERT.equal(0xff, buf[3]);
-       ASSERT.equal(0xff, buf[4]);
-       ASSERT.equal(0xff, buf[5]);
-       ASSERT.equal(0xff, buf[6]);
-       ASSERT.equal(0xff, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-}
-
-/*
- * Make sure we catch invalid writes.
- */
-function testWriteInvalid()
-{
-       var data, buf;
-
-       /* Buffer too small */
-       buf = new Buffer(4);
-       data = [ 0, 0];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 0);
-       }, Error, 'buffer too small');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 0);
-       }, Error, 'buffer too small');
-
-       /* Beyond the end of the buffer */
-       buf = new Buffer(12);
-       data = [ 0, 0];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 11);
-       }, Error, 'write beyond end of buffer');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 11);
-       }, Error, 'write beyond end of buffer');
-
-       /* Write fractional values */
-       buf = new Buffer(12);
-       data = [ 3.33, 0 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 0, 3.3 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ -3.33, 0 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 0, -3.3 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 3.33, 2.42 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 3.33, -2.42 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ -3.33, -2.42 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ -3.33, 2.42 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       /* Signs don't match */
-       buf = new Buffer(12);
-       data = [ 0x800000, -0x32 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ -0x800000, 0x32 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       /* Write values that are too large */
-       buf = new Buffer(12);
-       data = [ 0x80000000, 0 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0x7fffffff, 0x100000000 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0x00, 0x800000000 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0xffffffffff, 0xffffff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0x23, 0xffffff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ -0x80000000, -0xfff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ -0x80000004, -0xfff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wsint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-}
-
-
-testRead();
-testWrite();
-testWriteZero();
-testWriteInvalid();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js
deleted file mode 100644 (file)
index 5236d26..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Tests to verify we're reading in signed integers correctly
- */
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-/*
- * Test 8 bit signed integers
- */
-function test8()
-{
-       var data = new Buffer(4);
-
-       data[0] = 0x23;
-       ASSERT.equal(0x23, mod_ctype.rsint8(data, 'big', 0));
-       ASSERT.equal(0x23, mod_ctype.rsint8(data, 'little', 0));
-
-       data[0] = 0xff;
-       ASSERT.equal(-1, mod_ctype.rsint8(data, 'big', 0));
-       ASSERT.equal(-1, mod_ctype.rsint8(data, 'little', 0));
-
-       data[0] = 0x87;
-       data[1] = 0xab;
-       data[2] = 0x7c;
-       data[3] = 0xef;
-       ASSERT.equal(-121, mod_ctype.rsint8(data, 'big', 0));
-       ASSERT.equal(-85, mod_ctype.rsint8(data, 'big', 1));
-       ASSERT.equal(124, mod_ctype.rsint8(data, 'big', 2));
-       ASSERT.equal(-17, mod_ctype.rsint8(data, 'big', 3));
-       ASSERT.equal(-121, mod_ctype.rsint8(data, 'little', 0));
-       ASSERT.equal(-85, mod_ctype.rsint8(data, 'little', 1));
-       ASSERT.equal(124, mod_ctype.rsint8(data, 'little', 2));
-       ASSERT.equal(-17, mod_ctype.rsint8(data, 'little', 3));
-}
-
-function test16()
-{
-       var buffer = new Buffer(6);
-       buffer[0] = 0x16;
-       buffer[1] = 0x79;
-       ASSERT.equal(0x1679, mod_ctype.rsint16(buffer, 'big', 0));
-       ASSERT.equal(0x7916, mod_ctype.rsint16(buffer, 'little', 0));
-
-       buffer[0] = 0xff;
-       buffer[1] = 0x80;
-       ASSERT.equal(-128, mod_ctype.rsint16(buffer, 'big', 0));
-       ASSERT.equal(-32513, mod_ctype.rsint16(buffer, 'little', 0));
-
-       /* test offset with weenix */
-       buffer[0] = 0x77;
-       buffer[1] = 0x65;
-       buffer[2] = 0x65;
-       buffer[3] = 0x6e;
-       buffer[4] = 0x69;
-       buffer[5] = 0x78;
-       ASSERT.equal(0x7765, mod_ctype.rsint16(buffer, 'big', 0));
-       ASSERT.equal(0x6565, mod_ctype.rsint16(buffer, 'big', 1));
-       ASSERT.equal(0x656e, mod_ctype.rsint16(buffer, 'big', 2));
-       ASSERT.equal(0x6e69, mod_ctype.rsint16(buffer, 'big', 3));
-       ASSERT.equal(0x6978, mod_ctype.rsint16(buffer, 'big', 4));
-       ASSERT.equal(0x6577, mod_ctype.rsint16(buffer, 'little', 0));
-       ASSERT.equal(0x6565, mod_ctype.rsint16(buffer, 'little', 1));
-       ASSERT.equal(0x6e65, mod_ctype.rsint16(buffer, 'little', 2));
-       ASSERT.equal(0x696e, mod_ctype.rsint16(buffer, 'little', 3));
-       ASSERT.equal(0x7869, mod_ctype.rsint16(buffer, 'little', 4));
-}
-
-function test32()
-{
-       var buffer = new Buffer(6);
-       buffer[0] = 0x43;
-       buffer[1] = 0x53;
-       buffer[2] = 0x16;
-       buffer[3] = 0x79;
-       ASSERT.equal(0x43531679, mod_ctype.rsint32(buffer, 'big', 0));
-       ASSERT.equal(0x79165343, mod_ctype.rsint32(buffer, 'little', 0));
-
-       buffer[0] = 0xff;
-       buffer[1] = 0xfe;
-       buffer[2] = 0xef;
-       buffer[3] = 0xfa;
-       ASSERT.equal(-69638, mod_ctype.rsint32(buffer, 'big', 0));
-       ASSERT.equal(-84934913, mod_ctype.rsint32(buffer, 'little', 0));
-
-       buffer[0] = 0x42;
-       buffer[1] = 0xc3;
-       buffer[2] = 0x95;
-       buffer[3] = 0xa9;
-       buffer[4] = 0x36;
-       buffer[5] = 0x17;
-       ASSERT.equal(0x42c395a9, mod_ctype.rsint32(buffer, 'big', 0));
-       ASSERT.equal(-1013601994, mod_ctype.rsint32(buffer, 'big', 1));
-       ASSERT.equal(-1784072681, mod_ctype.rsint32(buffer, 'big', 2));
-       ASSERT.equal(-1449802942, mod_ctype.rsint32(buffer, 'little', 0));
-       ASSERT.equal(917083587, mod_ctype.rsint32(buffer, 'little', 1));
-       ASSERT.equal(389458325, mod_ctype.rsint32(buffer, 'little', 2));
-}
-
-test8();
-test16();
-test32();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js
deleted file mode 100644 (file)
index 5488177..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Test to make sure that we properly are erroring whenever we try to write
- * beyond the size of the integer.
- */
-
-var mod_ctio = require('../../../ctio.js');
-var mod_assert = require('assert');
-var tb = new Buffer(16); /* Largest buffer we'll need */
-
-var cases = [
-       { func:
-       function () {
-               mod_ctio.wsint8(0x80, 'big', tb, 0);
-       }, test: '+int8_t' },
-       { func:
-       function () {
-               mod_ctio.wsint8(-0x81, 'big', tb, 0);
-       }, test: '-int8_t' },
-
-       { func:
-       function () {
-               mod_ctio.wsint16(0x8000, 'big', tb, 0);
-       }, test: '+int16_t' },
-       { func:
-       function () {
-               mod_ctio.wsint16(-0x8001, 'big', tb, 0);
-       }, test: '-int16_t' },
-       { func:
-       function () {
-               mod_ctio.wsint32(0x80000000, 'big', tb, 0);
-       }, test: '+int32_t' },
-       { func:
-       function () {
-               mod_ctio.wsint32(-0x80000001, 'big', tb, 0);
-       }, test: '-int32_t' },
-       { func:
-       function () {
-               mod_ctio.wsint64([ 0x80000000, 0 ], 'big', tb, 0);
-       }, test: '+int64_t' },
-       { func:
-       function () {
-               mod_ctio.wsint64([ -0x80000000, -1 ], 'big', tb, 0);
-       }, test: '-int64_t' }
-];
-
-function test()
-{
-       var ii;
-       for (ii = 0; ii < cases.length; ii++)
-               mod_assert.throws(cases[ii]['func'], Error, cases[ii]['test']);
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js
deleted file mode 100644 (file)
index 98b6a32..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Tests to verify we're writing signed integers correctly
- */
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-function test8()
-{
-       var buffer = new Buffer(4);
-       mod_ctype.wsint8(0x23, 'big', buffer, 0);
-       mod_ctype.wsint8(0x23, 'little', buffer, 1);
-       mod_ctype.wsint8(-5, 'big', buffer, 2);
-       mod_ctype.wsint8(-5, 'little', buffer, 3);
-
-       ASSERT.equal(0x23, buffer[0]);
-       ASSERT.equal(0x23, buffer[1]);
-       ASSERT.equal(0xfb, buffer[2]);
-       ASSERT.equal(0xfb, buffer[3]);
-
-       /* Make sure we handle truncation correctly */
-       ASSERT.throws(function () {
-            mod_ctype.wsint8(0xabc, 'big', buffer, 0);
-       });
-       ASSERT.throws(function () {
-            mod_ctype.wsint8(0xabc, 'little', buffer, 0);
-       });
-}
-
-function test16()
-{
-       var buffer = new Buffer(6);
-       mod_ctype.wsint16(0x0023, 'big', buffer, 0);
-       mod_ctype.wsint16(0x0023, 'little', buffer, 2);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x23, buffer[1]);
-       ASSERT.equal(0x23, buffer[2]);
-       ASSERT.equal(0x00, buffer[3]);
-       mod_ctype.wsint16(-5, 'big', buffer, 0);
-       mod_ctype.wsint16(-5, 'little', buffer, 2);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0xfb, buffer[1]);
-       ASSERT.equal(0xfb, buffer[2]);
-       ASSERT.equal(0xff, buffer[3]);
-
-       mod_ctype.wsint16(-1679, 'big', buffer, 1);
-       mod_ctype.wsint16(-1679, 'little', buffer, 3);
-       ASSERT.equal(0xf9, buffer[1]);
-       ASSERT.equal(0x71, buffer[2]);
-       ASSERT.equal(0x71, buffer[3]);
-       ASSERT.equal(0xf9, buffer[4]);
-}
-
-function test32()
-{
-       var buffer = new Buffer(8);
-       mod_ctype.wsint32(0x23, 'big', buffer, 0);
-       mod_ctype.wsint32(0x23, 'little', buffer, 4);
-       ASSERT.equal(0x00, buffer[0]);
-       ASSERT.equal(0x00, buffer[1]);
-       ASSERT.equal(0x00, buffer[2]);
-       ASSERT.equal(0x23, buffer[3]);
-       ASSERT.equal(0x23, buffer[4]);
-       ASSERT.equal(0x00, buffer[5]);
-       ASSERT.equal(0x00, buffer[6]);
-       ASSERT.equal(0x00, buffer[7]);
-
-       mod_ctype.wsint32(-5, 'big', buffer, 0);
-       mod_ctype.wsint32(-5, 'little', buffer, 4);
-       ASSERT.equal(0xff, buffer[0]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xff, buffer[2]);
-       ASSERT.equal(0xfb, buffer[3]);
-       ASSERT.equal(0xfb, buffer[4]);
-       ASSERT.equal(0xff, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xff, buffer[7]);
-
-       mod_ctype.wsint32(-805306713, 'big', buffer, 0);
-       mod_ctype.wsint32(-805306713, 'litle', buffer, 4);
-       ASSERT.equal(0xcf, buffer[0]);
-       ASSERT.equal(0xff, buffer[1]);
-       ASSERT.equal(0xfe, buffer[2]);
-       ASSERT.equal(0xa7, buffer[3]);
-       ASSERT.equal(0xa7, buffer[4]);
-       ASSERT.equal(0xfe, buffer[5]);
-       ASSERT.equal(0xff, buffer[6]);
-       ASSERT.equal(0xcf, buffer[7]);
-}
-
-test8();
-test16();
-test32();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js
deleted file mode 100644 (file)
index cf66ac7..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Test our ability to read and write unsigned 64-bit integers.
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-function testRead()
-{
-       var res, data;
-       data = new Buffer(10);
-
-       data[0] = 0x32;
-       data[1] = 0x65;
-       data[2] = 0x42;
-       data[3] = 0x56;
-       data[4] = 0x23;
-       data[5] = 0xff;
-       data[6] = 0xff;
-       data[7] = 0xff;
-       data[8] = 0x89;
-       data[9] = 0x11;
-       res = mod_ctype.ruint64(data, 'big', 0);
-       ASSERT.equal(0x32654256, res[0]);
-       ASSERT.equal(0x23ffffff, res[1]);
-       res = mod_ctype.ruint64(data, 'big', 1);
-       ASSERT.equal(0x65425623, res[0]);
-       ASSERT.equal(0xffffff89, res[1]);
-       res = mod_ctype.ruint64(data, 'big', 2);
-       ASSERT.equal(0x425623ff, res[0]);
-       ASSERT.equal(0xffff8911, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 0);
-       ASSERT.equal(0xffffff23, res[0]);
-       ASSERT.equal(0x56426532, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 1);
-       ASSERT.equal(0x89ffffff, res[0]);
-       ASSERT.equal(0x23564265, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 2);
-       ASSERT.equal(0x1189ffff, res[0]);
-       ASSERT.equal(0xff235642, res[1]);
-
-}
-
-function testReadOver()
-{
-       var res, data;
-       data = new Buffer(10);
-
-       data[0] = 0x80;
-       data[1] = 0xff;
-       data[2] = 0x80;
-       data[3] = 0xff;
-       data[4] = 0x80;
-       data[5] = 0xff;
-       data[6] = 0x80;
-       data[7] = 0xff;
-       data[8] = 0x80;
-       data[9] = 0xff;
-       res = mod_ctype.ruint64(data, 'big', 0);
-       ASSERT.equal(0x80ff80ff, res[0]);
-       ASSERT.equal(0x80ff80ff, res[1]);
-       res = mod_ctype.ruint64(data, 'big', 1);
-       ASSERT.equal(0xff80ff80, res[0]);
-       ASSERT.equal(0xff80ff80, res[1]);
-       res = mod_ctype.ruint64(data, 'big', 2);
-       ASSERT.equal(0x80ff80ff, res[0]);
-       ASSERT.equal(0x80ff80ff, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 0);
-       ASSERT.equal(0xff80ff80, res[0]);
-       ASSERT.equal(0xff80ff80, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 1);
-       ASSERT.equal(0x80ff80ff, res[0]);
-       ASSERT.equal(0x80ff80ff, res[1]);
-       res = mod_ctype.ruint64(data, 'little', 2);
-       ASSERT.equal(0xff80ff80, res[0]);
-       ASSERT.equal(0xff80ff80, res[1]);
-}
-
-function testWriteZero()
-{
-       var data, buf;
-       buf = new Buffer(10);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'big', buf, 0);
-       ASSERT.equal(0, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0, buf[9]);
-
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'little', buf, 0);
-       ASSERT.equal(0, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       data = [0, 0];
-       mod_ctype.wuint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0, buf[2]);
-       ASSERT.equal(0, buf[3]);
-       ASSERT.equal(0, buf[4]);
-       ASSERT.equal(0, buf[5]);
-       ASSERT.equal(0, buf[6]);
-       ASSERT.equal(0, buf[7]);
-       ASSERT.equal(0, buf[8]);
-       ASSERT.equal(0, buf[9]);
-}
-
-/*
- * Also include tests that are going to force us to go into a negative value and
- * insure that it's written correctly.
- */
-function testWrite()
-{
-       var data, buf;
-
-       buf = new Buffer(10);
-       data = [ 0x234456, 0x87 ];
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 0);
-       ASSERT.equal(0x00, buf[0]);
-       ASSERT.equal(0x23, buf[1]);
-       ASSERT.equal(0x44, buf[2]);
-       ASSERT.equal(0x56, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x87, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x23, buf[2]);
-       ASSERT.equal(0x44, buf[3]);
-       ASSERT.equal(0x56, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x87, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x23, buf[3]);
-       ASSERT.equal(0x44, buf[4]);
-       ASSERT.equal(0x56, buf[5]);
-       ASSERT.equal(0x00, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x87, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 0);
-       ASSERT.equal(0x87, buf[0]);
-       ASSERT.equal(0x00, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x56, buf[4]);
-       ASSERT.equal(0x44, buf[5]);
-       ASSERT.equal(0x23, buf[6]);
-       ASSERT.equal(0x00, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x87, buf[1]);
-       ASSERT.equal(0x00, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x56, buf[5]);
-       ASSERT.equal(0x44, buf[6]);
-       ASSERT.equal(0x23, buf[7]);
-       ASSERT.equal(0x00, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0x87, buf[2]);
-       ASSERT.equal(0x00, buf[3]);
-       ASSERT.equal(0x00, buf[4]);
-       ASSERT.equal(0x00, buf[5]);
-       ASSERT.equal(0x56, buf[6]);
-       ASSERT.equal(0x44, buf[7]);
-       ASSERT.equal(0x23, buf[8]);
-       ASSERT.equal(0x00, buf[9]);
-
-       data = [0xffff3421, 0x34abcdba];
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 0);
-       ASSERT.equal(0xff, buf[0]);
-       ASSERT.equal(0xff, buf[1]);
-       ASSERT.equal(0x34, buf[2]);
-       ASSERT.equal(0x21, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0xab, buf[5]);
-       ASSERT.equal(0xcd, buf[6]);
-       ASSERT.equal(0xba, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0xff, buf[1]);
-       ASSERT.equal(0xff, buf[2]);
-       ASSERT.equal(0x34, buf[3]);
-       ASSERT.equal(0x21, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0xab, buf[6]);
-       ASSERT.equal(0xcd, buf[7]);
-       ASSERT.equal(0xba, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'big', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0xff, buf[2]);
-       ASSERT.equal(0xff, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0x21, buf[5]);
-       ASSERT.equal(0x34, buf[6]);
-       ASSERT.equal(0xab, buf[7]);
-       ASSERT.equal(0xcd, buf[8]);
-       ASSERT.equal(0xba, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 0);
-       ASSERT.equal(0xba, buf[0]);
-       ASSERT.equal(0xcd, buf[1]);
-       ASSERT.equal(0xab, buf[2]);
-       ASSERT.equal(0x34, buf[3]);
-       ASSERT.equal(0x21, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0xff, buf[6]);
-       ASSERT.equal(0xff, buf[7]);
-       ASSERT.equal(0x66, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 1);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0xba, buf[1]);
-       ASSERT.equal(0xcd, buf[2]);
-       ASSERT.equal(0xab, buf[3]);
-       ASSERT.equal(0x34, buf[4]);
-       ASSERT.equal(0x21, buf[5]);
-       ASSERT.equal(0x34, buf[6]);
-       ASSERT.equal(0xff, buf[7]);
-       ASSERT.equal(0xff, buf[8]);
-       ASSERT.equal(0x66, buf[9]);
-
-       buf.fill(0x66);
-       mod_ctype.wuint64(data, 'little', buf, 2);
-       ASSERT.equal(0x66, buf[0]);
-       ASSERT.equal(0x66, buf[1]);
-       ASSERT.equal(0xba, buf[2]);
-       ASSERT.equal(0xcd, buf[3]);
-       ASSERT.equal(0xab, buf[4]);
-       ASSERT.equal(0x34, buf[5]);
-       ASSERT.equal(0x21, buf[6]);
-       ASSERT.equal(0x34, buf[7]);
-       ASSERT.equal(0xff, buf[8]);
-       ASSERT.equal(0xff, buf[9]);
-}
-
-/*
- * Make sure we catch invalid writes.
- */
-function testWriteInvalid()
-{
-       var data, buf;
-
-       /* Buffer too small */
-       buf = new Buffer(4);
-       data = [ 0, 0];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 0);
-       }, Error, 'buffer too small');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 0);
-       }, Error, 'buffer too small');
-
-       /* Beyond the end of the buffer */
-       buf = new Buffer(12);
-       data = [ 0, 0];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 11);
-       }, Error, 'write beyond end of buffer');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 11);
-       }, Error, 'write beyond end of buffer');
-
-       /* Write negative values */
-       buf = new Buffer(12);
-       data = [ -3, 0 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write negative number');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write negative number');
-
-       data = [ 0, -3 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write negative number');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write negative number');
-
-       data = [ -3, -3 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write negative number');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write negative number');
-
-
-       /* Write fractional values */
-       buf = new Buffer(12);
-       data = [ 3.33, 0 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 0, 3.3 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       data = [ 3.33, 2.42 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write fractions');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write fractions');
-
-       /* Write values that are too large */
-       buf = new Buffer(12);
-       data = [ 0xffffffffff, 23 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0xffffffffff, 0xffffff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-
-       data = [ 0x23, 0xffffff238 ];
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'big', buf, 1);
-       }, Error, 'write too large');
-       ASSERT.throws(function () {
-           mod_ctype.wuint64(data, 'little', buf, 1);
-       }, Error, 'write too large');
-}
-
-
-testRead();
-testReadOver();
-testWriteZero();
-testWrite();
-testWriteInvalid();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js
deleted file mode 100644 (file)
index 87ae59b..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * A battery of tests for sucessful round-trip between writes and reads
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-
-/*
- * What the heck, let's just test every value for 8-bits.
- */
-
-function test8() {
-       var data = new Buffer(1);
-       var i;
-       for (i = 0; i < 256; i++) {
-               mod_ctype.wuint8(i, 'big', data, 0);
-               ASSERT.equal(i, mod_ctype.ruint8(data, 'big', 0));
-               mod_ctype.wuint8(i, 'little', data, 0);
-               ASSERT.equal(i, mod_ctype.ruint8(data, 'little', 0));
-       }
-       ASSERT.ok(true);
-}
-
-/*
- * Test a random sample of 256 values in the 16-bit unsigned range
- */
-
-function test16() {
-       var data = new Buffer(2);
-       var i = 0;
-       for (i = 0; i < 256; i++) {
-               var value = Math.round(Math.random() * Math.pow(2, 16));
-               mod_ctype.wuint16(value, 'big', data, 0);
-               ASSERT.equal(value, mod_ctype.ruint16(data, 'big', 0));
-               mod_ctype.wuint16(value, 'little', data, 0);
-               ASSERT.equal(value, mod_ctype.ruint16(data, 'little', 0));
-       }
-}
-
-/*
- * Test a random sample of 256 values in the 32-bit unsigned range
- */
-
-function test32() {
-       var data = new Buffer(4);
-       var i = 0;
-       for (i = 0; i < 256; i++) {
-               var value = Math.round(Math.random() * Math.pow(2, 32));
-               mod_ctype.wuint32(value, 'big', data, 0);
-               ASSERT.equal(value, mod_ctype.ruint32(data, 'big', 0));
-               mod_ctype.wuint32(value, 'little', data, 0);
-               ASSERT.equal(value, mod_ctype.ruint32(data, 'little', 0));
-       }
-}
-
-/*
- * Test a random sample of 256 values in the 64-bit unsigned range
- */
-
-function test64() {
-       var data = new Buffer(8);
-       var i = 0;
-       for (i = 0; i < 256; i++) {
-               var low = Math.round(Math.random() * Math.pow(2, 32));
-               var high = Math.round(Math.random() * Math.pow(2, 32));
-               mod_ctype.wuint64([high, low], 'big', data, 0);
-               var result = mod_ctype.ruint64(data, 'big', 0);
-               ASSERT.equal(high, result[0]);
-               ASSERT.equal(low, result[1]);
-               mod_ctype.wuint64([high, low], 'little', data, 0);
-               result = mod_ctype.ruint64(data, 'little', 0);
-               ASSERT.equal(high, result[0]);
-               ASSERT.equal(low, result[1]);
-       }
-}
-
-exports.test8 = test8;
-exports.test16 = test16;
-exports.test32 = test32;
-exports.test64 = test64;
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js
deleted file mode 100644 (file)
index b67c077..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * A battery of tests to help us read a series of uints
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-/*
- * We need to check the following things:
- *  - We are correctly resolving big endian (doesn't mean anything for 8 bit)
- *  - Correctly resolving little endian (doesn't mean anything for 8 bit)
- *  - Correctly using the offsets
- *  - Correctly interpreting values that are beyond the signed range as unsigned
- */
-function test8()
-{
-       var data = new Buffer(4);
-       data[0] = 23;
-       data[1] = 23;
-       data[2] = 23;
-       data[3] = 23;
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'big', 0));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'little', 0));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'big', 1));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'little', 1));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'big', 2));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'little', 2));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'big', 3));
-       ASSERT.equal(23, mod_ctype.ruint8(data, 'little', 3));
-       data[0] = 255; /* If it became a signed int, would be -1 */
-       ASSERT.equal(255, mod_ctype.ruint8(data, 'big', 0));
-       ASSERT.equal(255, mod_ctype.ruint8(data, 'little', 0));
-}
-
-/*
- * Test 16 bit unsigned integers. We need to verify the same set as 8 bit, only
- * now some of the issues actually matter:
- *  - We are correctly resolving big endian
- *  - Correctly resolving little endian
- *  - Correctly using the offsets
- *  - Correctly interpreting values that are beyond the signed range as unsigned
- */
-function test16()
-{
-       var data = new Buffer(4);
-       /* Test signed values first */
-       data[0] = 0;
-       data[1] = 0x23;
-       data[2] = 0x42;
-       data[3] = 0x3f;
-
-       ASSERT.equal(0x23, mod_ctype.ruint16(data, 'big', 0));
-       ASSERT.equal(0x2342, mod_ctype.ruint16(data, 'big', 1));
-       ASSERT.equal(0x423f, mod_ctype.ruint16(data, 'big', 2));
-
-       ASSERT.equal(0x2300, mod_ctype.ruint16(data, 'little', 0));
-       ASSERT.equal(0x4223, mod_ctype.ruint16(data, 'little', 1));
-       ASSERT.equal(0x3f42, mod_ctype.ruint16(data, 'little', 2));
-
-       data[0] = 0xfe;
-       data[1] = 0xfe;
-
-       ASSERT.equal(0xfefe, mod_ctype.ruint16(data, 'big', 0));
-       ASSERT.equal(0xfefe, mod_ctype.ruint16(data, 'little', 0));
-}
-
-/*
- * Test 32 bit unsigned integers. We need to verify the same set as 8 bit, only
- * now some of the issues actually matter:
- *  - We are correctly resolving big endian
- *  - Correctly using the offsets
- *  - Correctly interpreting values that are beyond the signed range as unsigned
- */
-function test32()
-{
-       var data = new Buffer(8);
-       data[0] = 0x32;
-       data[1] = 0x65;
-       data[2] = 0x42;
-       data[3] = 0x56;
-       data[4] = 0x23;
-       data[5] = 0xff;
-
-       ASSERT.equal(0x32654256, mod_ctype.ruint32(data, 'big', 0));
-       ASSERT.equal(0x65425623, mod_ctype.ruint32(data, 'big', 1));
-       ASSERT.equal(0x425623ff, mod_ctype.ruint32(data, 'big', 2));
-
-       ASSERT.equal(0x56426532, mod_ctype.ruint32(data, 'little', 0));
-       ASSERT.equal(0x23564265, mod_ctype.ruint32(data, 'little', 1));
-       ASSERT.equal(0xff235642, mod_ctype.ruint32(data, 'little', 2));
-}
-
-test8();
-test16();
-test32();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js
deleted file mode 100644 (file)
index d6c4230..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * A battery of tests to help us read a series of uints
- */
-
-var mod_ctype = require('../../../ctio.js');
-var ASSERT = require('assert');
-
-/*
- * We need to check the following things:
- *  - We are correctly resolving big endian (doesn't mean anything for 8 bit)
- *  - Correctly resolving little endian (doesn't mean anything for 8 bit)
- *  - Correctly using the offsets
- *  - Correctly interpreting values that are beyond the signed range as unsigned
- */
-function test8()
-{
-       var data = new Buffer(4);
-       mod_ctype.wuint8(23, 'big', data, 0);
-       mod_ctype.wuint8(23, 'big', data, 1);
-       mod_ctype.wuint8(23, 'big', data, 2);
-       mod_ctype.wuint8(23, 'big', data, 3);
-       ASSERT.equal(23, data[0]);
-       ASSERT.equal(23, data[1]);
-       ASSERT.equal(23, data[2]);
-       ASSERT.equal(23, data[3]);
-       mod_ctype.wuint8(23, 'little', data, 0);
-       mod_ctype.wuint8(23, 'little', data, 1);
-       mod_ctype.wuint8(23, 'little', data, 2);
-       mod_ctype.wuint8(23, 'little', data, 3);
-       ASSERT.equal(23, data[0]);
-       ASSERT.equal(23, data[1]);
-       ASSERT.equal(23, data[2]);
-       ASSERT.equal(23, data[3]);
-       mod_ctype.wuint8(255, 'big', data, 0);
-       ASSERT.equal(255, data[0]);
-       mod_ctype.wuint8(255, 'little', data, 0);
-       ASSERT.equal(255, data[0]);
-}
-
-function test16()
-{
-       var value = 0x2343;
-       var data = new Buffer(4);
-       mod_ctype.wuint16(value, 'big', data, 0);
-       ASSERT.equal(0x23, data[0]);
-       ASSERT.equal(0x43, data[1]);
-       mod_ctype.wuint16(value, 'big', data, 1);
-       ASSERT.equal(0x23, data[1]);
-       ASSERT.equal(0x43, data[2]);
-       mod_ctype.wuint16(value, 'big', data, 2);
-       ASSERT.equal(0x23, data[2]);
-       ASSERT.equal(0x43, data[3]);
-
-       mod_ctype.wuint16(value, 'little', data, 0);
-       ASSERT.equal(0x23, data[1]);
-       ASSERT.equal(0x43, data[0]);
-
-       mod_ctype.wuint16(value, 'little', data, 1);
-       ASSERT.equal(0x23, data[2]);
-       ASSERT.equal(0x43, data[1]);
-
-       mod_ctype.wuint16(value, 'little', data, 2);
-       ASSERT.equal(0x23, data[3]);
-       ASSERT.equal(0x43, data[2]);
-
-       value = 0xff80;
-       mod_ctype.wuint16(value, 'little', data, 0);
-       ASSERT.equal(0xff, data[1]);
-       ASSERT.equal(0x80, data[0]);
-
-       mod_ctype.wuint16(value, 'big', data, 0);
-       ASSERT.equal(0xff, data[0]);
-       ASSERT.equal(0x80, data[1]);
-}
-
-function test32()
-{
-       var data = new Buffer(6);
-       var value = 0xe7f90a6d;
-
-       mod_ctype.wuint32(value, 'big', data, 0);
-       ASSERT.equal(0xe7, data[0]);
-       ASSERT.equal(0xf9, data[1]);
-       ASSERT.equal(0x0a, data[2]);
-       ASSERT.equal(0x6d, data[3]);
-
-       mod_ctype.wuint32(value, 'big', data, 1);
-       ASSERT.equal(0xe7, data[1]);
-       ASSERT.equal(0xf9, data[2]);
-       ASSERT.equal(0x0a, data[3]);
-       ASSERT.equal(0x6d, data[4]);
-
-       mod_ctype.wuint32(value, 'big', data, 2);
-       ASSERT.equal(0xe7, data[2]);
-       ASSERT.equal(0xf9, data[3]);
-       ASSERT.equal(0x0a, data[4]);
-       ASSERT.equal(0x6d, data[5]);
-
-       mod_ctype.wuint32(value, 'little', data, 0);
-       ASSERT.equal(0xe7, data[3]);
-       ASSERT.equal(0xf9, data[2]);
-       ASSERT.equal(0x0a, data[1]);
-       ASSERT.equal(0x6d, data[0]);
-
-       mod_ctype.wuint32(value, 'little', data, 1);
-       ASSERT.equal(0xe7, data[4]);
-       ASSERT.equal(0xf9, data[3]);
-       ASSERT.equal(0x0a, data[2]);
-       ASSERT.equal(0x6d, data[1]);
-
-       mod_ctype.wuint32(value, 'little', data, 2);
-       ASSERT.equal(0xe7, data[5]);
-       ASSERT.equal(0xf9, data[4]);
-       ASSERT.equal(0x0a, data[3]);
-       ASSERT.equal(0x6d, data[2]);
-}
-
-function test64()
-{
-       var data = new Buffer(10);
-       var value = 0x0007cda8e7f90a6d;
-       var high = Math.floor(value / Math.pow(2, 32));
-       var low = value - (high * Math.pow(2, 32));
-       ASSERT.equal(0x0007cda8, high);
-       ASSERT.equal(0xe7f90a6d, low);
-
-       mod_ctype.wuint64([high, low], 'big', data, 0);
-       ASSERT.equal(0x00, data[0]);
-       ASSERT.equal(0x07, data[1]);
-       ASSERT.equal(0xcd, data[2]);
-       ASSERT.equal(0xa8, data[3]);
-       ASSERT.equal(0xe7, data[4]);
-       ASSERT.equal(0xf9, data[5]);
-       ASSERT.equal(0x0a, data[6]);
-       ASSERT.equal(0x6d, data[7]);
-
-       mod_ctype.wuint64([high, low], 'little', data, 0);
-       ASSERT.equal(0x6d, data[0]);
-       ASSERT.equal(0x0a, data[1]);
-       ASSERT.equal(0xf9, data[2]);
-       ASSERT.equal(0xe7, data[3]);
-       ASSERT.equal(0xa8, data[4]);
-       ASSERT.equal(0xcd, data[5]);
-       ASSERT.equal(0x07, data[6]);
-       ASSERT.equal(0x00, data[7]);
-}
-
-test8();
-test16();
-test32();
-test64();
-
-exports.test8 = test8;
-exports.test16 = test16;
-exports.test32 = test32;
-exports.test64 = test64;
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js
deleted file mode 100644 (file)
index e989515..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Simple does to see if it works at all
- */
-var mod_ctype = require('../../ctype');
-var ASSERT = require('assert');
-var mod_sys = require('sys');
-
-function test()
-{
-       var ii, p, result, buffer;
-
-       p = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer(4);
-       buffer[0] = 23;
-       buffer[3] = 42;
-       result = p.readData([ { x: { type: 'uint8_t' }},
-           { y: { type: 'uint8_t', offset: 3 }}
-       ], buffer, 0);
-       ASSERT.equal(23, result['x']);
-       ASSERT.equal(42, result['y']);
-
-       buffer = new Buffer(23);
-       for (ii = 0; ii < 23; ii++)
-               buffer[ii] = 0;
-
-       buffer.write('Hello, world!');
-       result = p.readData([ { x: { type: 'char[20]' }} ], buffer, 0);
-
-       /*
-        * This is currently broken behvaior, need to redesign check
-        * ASSERT.equal('Hello, world!', result['x'].toString('utf-8', 0,
-        *  result['x'].length));
-        */
-
-       buffer = new Buffer(4);
-       buffer[0] = 0x03;
-       buffer[1] = 0x24;
-       buffer[2] = 0x25;
-       buffer[3] = 0x26;
-       result = p.readData([ { y: { type: 'uint8_t' }},
-           { x: { type: 'uint8_t[y]' }}], buffer, 0);
-       console.log(mod_sys.inspect(result, true));
-
-       p.typedef('ssize_t', 'int32_t');
-       ASSERT.deepEqual({ 'ssize_t': 'int32_t' }, p.lstypes());
-       result = p.readData([ { x: { type: 'ssize_t' } } ], buffer, 0);
-       ASSERT.equal(0x26252403, result['x']);
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js
deleted file mode 100644 (file)
index 89d446f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Simple does it fucking work at all test
- */
-
-var mod_ctype = require('../../ctype');
-var ASSERT = require('assert');
-var mod_sys = require('sys');
-
-function test()
-{
-       var ii, p, buffer, buf2;
-
-       p = new mod_ctype.Parser({ endian: 'big' });
-       buffer = new Buffer(4);
-       p.writeData([ { x: { type: 'uint8_t', value: 23 }},
-           { y: { type: 'uint8_t', offset: 3, value: 42 }}
-       ], buffer, 0);
-       ASSERT.equal(23, buffer[0]);
-       ASSERT.equal(42, buffer[3]);
-
-       buffer = new Buffer(20);
-       for (ii = 0; ii < 20; ii++)
-               buffer[ii] = 0;
-
-       buffer.write('Hello, world!');
-       buf2 = new Buffer(22);
-       p.writeData([ { x: { type: 'char[20]', value: buffer }} ], buf2, 0);
-       for (ii = 0; ii < 20; ii++)
-               ASSERT.equal(buffer[ii], buf2[ii]);
-       /*
-        * This is currently broken behvaior, need to redesign check
-        * ASSERT.equal('Hello, world!', result['x'].toString('utf-8', 0,
-        *   result['x'].length));
-        */
-
-       buffer = new Buffer(4);
-       p.writeData([ { y: { type: 'uint8_t', value: 3 }},
-           { x: { type: 'uint8_t[y]', value: [ 0x24, 0x25, 0x26] }}],
-           buffer, 0);
-       console.log(mod_sys.inspect(buffer));
-
-       p.typedef('ssize_t', 'int32_t');
-       ASSERT.deepEqual({ 'ssize_t': 'int32_t' }, p.lstypes());
-}
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js
deleted file mode 100644 (file)
index 14d9529..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Test the different forms of reading characters:
- *
- *  - the default, a single element buffer
- *  - uint8, values are uint8_ts
- *  - int8, values are int8_ts
- */
-var mod_ctype = require('../../ctype');
-var mod_assert = require('assert');
-
-function test()
-{
-       var p, buf, res;
-
-       buf = new Buffer(1);
-       buf[0] = 255;
-
-       p = new mod_ctype.Parser({ endian: 'little'});
-       res = p.readData([ { c: { type: 'char' }} ], buf, 0);
-       res = res['c'];
-       mod_assert.ok(res instanceof Buffer);
-       mod_assert.equal(255, res[0]);
-
-       p = new mod_ctype.Parser({ endian: 'little',
-           'char-type': 'int8' });
-       res = p.readData([ { c: { type: 'char' }} ], buf, 0);
-       res = res['c'];
-       mod_assert.ok(typeof (res) == 'number', 'got typeof (res): ' +
-           typeof (res));
-       mod_assert.equal(-1, res);
-
-       p = new mod_ctype.Parser({ endian: 'little',
-           'char-type': 'uint8' });
-       res = p.readData([ { c: { type: 'char' }} ], buf, 0);
-       res = res['c'];
-       mod_assert.ok(typeof (res) == 'number', 'got typeof (res): ' +
-           typeof (res));
-       mod_assert.equal(255, res);
-
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js
deleted file mode 100644 (file)
index 11fc2d2..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Simple test to make sure that the endian setting works.
- */
-
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var parser, buf;
-
-       parser = new mod_ctype.Parser({
-           endian: 'little'
-       });
-
-       buf = new Buffer(2);
-       parser.writeData([ { key: { type: 'uint16_t' } } ], buf, 0, [ 0x1234 ]);
-       mod_assert.equal(buf[0], 0x34);
-       mod_assert.equal(buf[1], 0x12);
-       parser.setEndian('big');
-
-       parser.writeData([ { key: { type: 'uint16_t' } } ], buf, 0, [ 0x1234 ]);
-       mod_assert.equal(buf[0], 0x12);
-       mod_assert.equal(buf[1], 0x34);
-
-       parser.setEndian('little');
-       parser.writeData([ { key: { type: 'uint16_t' } } ], buf, 0, [ 0x1234 ]);
-       mod_assert.equal(buf[0], 0x34);
-       mod_assert.equal(buf[1], 0x12);
-}
-
-function fail()
-{
-       var parser;
-
-       parser = new mod_ctype.Parser({
-           endian: 'little'
-       });
-       mod_assert.throws(function () {
-               parser.setEndian('littlebigwrong');
-       });
-}
-
-test();
-fail();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js
deleted file mode 100644 (file)
index 9491cf6..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * A long overdue test to go through and verify that we can read and write
- * structures as well as nested structures.
- */
-
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var parser, buf, data;
-       parser = new mod_ctype.Parser({
-           endian: 'little'
-       });
-       parser.typedef('point_t', [
-           { x: { type: 'uint8_t' } },
-           { y: { type: 'uint8_t' } }
-       ]);
-       buf = new Buffer(2);
-       data = [
-           { point: { type: 'point_t', value: [ 23, 42 ] } }
-       ];
-       parser.writeData(data, buf, 0);
-       mod_assert.ok(buf[0] == 23);
-       mod_assert.ok(buf[1] == 42);
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js
deleted file mode 100644 (file)
index 6c490a2..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Testing to ensure we're reading the expected number bytes
- */
-var mod_ctype = require('../../ctype');
-var ASSERT = require('assert');
-
-function testUint8()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('80', 'hex');
-       result = parser.readStruct([ { item: { type: 'uint8_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 1);
-}
-
-function testSint8()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('80', 'hex');
-       result = parser.readStruct([ { item: { type: 'int8_t' } } ], buffer, 0);
-       ASSERT.equal(result['size'], 1);
-}
-
-function testUint16()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('8000', 'hex');
-       result = parser.readStruct([ { item: { type: 'uint16_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 2);
-}
-
-function testSint16()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('8000', 'hex');
-       result = parser.readStruct([ { item: { type: 'int16_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 2);
-}
-
-function testUint32()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('80000000', 'hex');
-       result = parser.readStruct([ { item: { type: 'uint32_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 4);
-}
-
-function testSint32()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('80000000', 'hex');
-       result = parser.readStruct([ { item: { type: 'int32_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 4);
-}
-
-function testUint64()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('8000000000000000', 'hex');
-       result = parser.readStruct([ { item: { type: 'uint64_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 8);
-}
-
-function testSint64()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('8000000000000000', 'hex');
-       result = parser.readStruct([ { item: { type: 'int64_t' } } ], buffer,
-           0);
-       ASSERT.equal(result['size'], 8);
-}
-
-function testFloat()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('ABAAAA3E', 'hex');
-       result = parser.readStruct([ { item: { type: 'float' } } ], buffer, 0);
-       ASSERT.equal(result['size'], 4);
-}
-
-function testDouble()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('000000000000F03F', 'hex');
-       result = parser.readStruct([ { item: { type: 'double' } } ], buffer, 0);
-       ASSERT.equal(result['size'], 8);
-}
-
-function testChar()
-{
-       var parser, result, buffer;
-       parser = new mod_ctype.Parser({ endian: 'little' });
-       buffer = new Buffer('t');
-       result = parser.readStruct([ { item: { type: 'char' } } ], buffer, 0);
-       ASSERT.equal(result['size'], 1);
-}
-
-function test()
-{
-       testSint8();
-       testUint8();
-       testSint16();
-       testUint16();
-       testSint32();
-       testUint32();
-       testSint64();
-       testUint64();
-       testFloat();
-       testDouble();
-       testChar();
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js
deleted file mode 100644 (file)
index 09c1a5b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * A long overdue test to go through and verify that we can read and write
- * structures as well as nested structures.
- */
-
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var parser, buf, data;
-       parser = new mod_ctype.Parser({
-           endian: 'little'
-       });
-       parser.typedef('point_t', [
-           { x: { type: 'uint8_t' } },
-           { y: { type: 'uint8_t' } }
-       ]);
-       buf = new Buffer(2);
-       data = [
-           { point: { type: 'point_t' } }
-       ];
-       parser.writeData(data, buf, 0, [ [ 23, 42 ] ]);
-       mod_assert.ok(buf[0] == 23);
-       mod_assert.ok(buf[1] == 42);
-}
-
-test();
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js
deleted file mode 100644 (file)
index 4855666..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Test to verify that the offset is incremented when structures are written to.
- * Hopefully we will not regress issue #41
- */
-
-var mod_ctype = require('../../ctype.js');
-var mod_assert = require('assert');
-
-function test()
-{
-       var parser, buf, data;
-       parser = new mod_ctype.Parser({
-           endian: 'little'
-       });
-       parser.typedef('point_t', [
-           { x: { type: 'uint8_t' } },
-           { y: { type: 'uint8_t' } }
-       ]);
-       buf = new Buffer(4);
-       data = [
-           { point1: { type: 'point_t' } },
-           { point2: { type: 'point_t' } }
-       ];
-       parser.writeData(data, buf, 0, [ [ 23, 42 ], [ 91, 18 ] ]);
-       mod_assert.ok(buf[0] == 23);
-       mod_assert.ok(buf[1] == 42);
-       mod_assert.ok(buf[2] == 91);
-       mod_assert.ok(buf[3] == 18);
-}
-
-test();
index c6bfef9750f1291971590589356b886bbb2a561f..2dd58f537fb1611932f2b50b4f5e851b2f7e68f1 100644 (file)
@@ -1,54 +1,72 @@
 {
+  "name": "http-signature",
+  "description": "Reference implementation of Joyent's HTTP Signature scheme.",
+  "version": "0.10.1",
+  "license": "MIT",
   "author": {
     "name": "Joyent, Inc"
   },
-  "name": "http-signature",
-  "description": "Reference implementation of Joyent's HTTP Signature Scheme",
-  "version": "0.10.0",
+  "contributors": [
+    {
+      "name": "Mark Cavage",
+      "email": "mcavage@gmail.com"
+    },
+    {
+      "name": "David I. Lehn",
+      "email": "dil@lehn.org"
+    }
+  ],
   "repository": {
     "type": "git",
     "url": "git://github.com/joyent/node-http-signature.git"
   },
+  "homepage": "https://github.com/joyent/node-http-signature/",
+  "bugs": {
+    "url": "https://github.com/joyent/node-http-signature/issues"
+  },
+  "keywords": [
+    "https",
+    "request"
+  ],
   "engines": {
     "node": ">=0.8"
   },
   "main": "lib/index.js",
   "scripts": {
-    "test": "tap tst/*.js"
+    "test": "tap test/*.js"
   },
   "dependencies": {
-    "assert-plus": "0.1.2",
+    "assert-plus": "^0.1.5",
     "asn1": "0.1.11",
-    "ctype": "0.5.2"
+    "ctype": "0.5.3"
   },
   "devDependencies": {
-    "node-uuid": "1.4.0",
+    "node-uuid": "^1.4.1",
     "tap": "0.4.2"
   },
-  "readme": "# node-http-signature\n\nnode-http-signature is a node.js library that has client and server components\nfor Joyent's [HTTP Signature Scheme](http_signing.md).\n\n## Usage\n\nNote the example below signs a request with the same key/cert used to start an\nHTTP server. This is almost certainly not what you actaully want, but is just\nused to illustrate the API calls; you will need to provide your own key\nmanagement in addition to this library.\n\n### Client\n\n    var fs = require('fs');\n    var https = require('https');\n    var httpSignature = require('http-signature');\n\n    var key = fs.readFileSync('./key.pem', 'ascii');\n\n    var options = {\n      host: 'localhost',\n      port: 8443,\n      path: '/',\n      method: 'GET',\n      headers: {}\n    };\n\n    // Adds a 'Date' header in, signs it, and adds the\n    // 'Authorization' header in.\n    var req = https.request(options, function(res) {\n      console.log(res.statusCode);\n    });\n\n\n    httpSignature.sign(req, {\n      key: key,\n      keyId: './cert.pem'\n    });\n\n    req.end();\n\n### Server\n\n    var fs = require('fs');\n    var https = require('https');\n    var httpSignature = require('http-signature');\n\n    var options = {\n      key: fs.readFileSync('./key.pem'),\n      cert: fs.readFileSync('./cert.pem')\n    };\n\n    https.createServer(options, function (req, res) {\n      var rc = 200;\n      var parsed = httpSignature.parseRequest(req);\n      var pub = fs.readFileSync(parsed.keyId, 'ascii');\n      if (!httpSignature.verifySignature(parsed, pub))\n        rc = 401;\n\n      res.writeHead(rc);\n      res.end();\n    }).listen(8443);\n\n## Installation\n\n    npm install http-signature\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/joyent/node-http-signature/issues>.\n",
-  "readmeFilename": "README.md",
-  "_id": "http-signature@0.10.0",
-  "dist": {
-    "shasum": "1494e4f5000a83c0f11bcc12d6007c530cb99582",
-    "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz"
-  },
+  "_id": "http-signature@0.10.1",
+  "_shasum": "4fbdac132559aa8323121e540779c0a012b27e66",
+  "_resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
   "_from": "http-signature@>=0.10.0 <0.11.0",
-  "_npmVersion": "1.2.18",
+  "_npmVersion": "1.4.28",
   "_npmUser": {
-    "name": "mcavage",
-    "email": "mcavage@gmail.com"
+    "name": "pfmooney",
+    "email": "patrick.f.mooney@gmail.com"
   },
   "maintainers": [
     {
       "name": "mcavage",
       "email": "mcavage@gmail.com"
+    },
+    {
+      "name": "pfmooney",
+      "email": "patrick.f.mooney@gmail.com"
     }
   ],
-  "directories": {},
-  "_shasum": "1494e4f5000a83c0f11bcc12d6007c530cb99582",
-  "_resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.0.tgz",
-  "bugs": {
-    "url": "https://github.com/joyent/node-http-signature/issues"
+  "dist": {
+    "shasum": "4fbdac132559aa8323121e540779c0a012b27e66",
+    "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz"
   },
-  "homepage": "https://github.com/joyent/node-http-signature"
+  "directories": {},
+  "readme": "ERROR: No README data found!"
 }
diff --git a/deps/npm/node_modules/request/node_modules/isstream/.jshintrc b/deps/npm/node_modules/request/node_modules/isstream/.jshintrc
new file mode 100644 (file)
index 0000000..c8ef3ca
--- /dev/null
@@ -0,0 +1,59 @@
+{
+    "predef": [ ]
+  , "bitwise": false
+  , "camelcase": false
+  , "curly": false
+  , "eqeqeq": false
+  , "forin": false
+  , "immed": false
+  , "latedef": false
+  , "noarg": true
+  , "noempty": true
+  , "nonew": true
+  , "plusplus": false
+  , "quotmark": true
+  , "regexp": false
+  , "undef": true
+  , "unused": true
+  , "strict": false
+  , "trailing": true
+  , "maxlen": 120
+  , "asi": true
+  , "boss": true
+  , "debug": true
+  , "eqnull": true
+  , "esnext": true
+  , "evil": true
+  , "expr": true
+  , "funcscope": false
+  , "globalstrict": false
+  , "iterator": false
+  , "lastsemic": true
+  , "laxbreak": true
+  , "laxcomma": true
+  , "loopfunc": true
+  , "multistr": false
+  , "onecase": false
+  , "proto": false
+  , "regexdash": false
+  , "scripturl": true
+  , "smarttabs": false
+  , "shadow": false
+  , "sub": true
+  , "supernew": false
+  , "validthis": true
+  , "browser": true
+  , "couch": false
+  , "devel": false
+  , "dojo": false
+  , "mootools": false
+  , "node": true
+  , "nonstandard": true
+  , "prototypejs": false
+  , "rhino": false
+  , "worker": true
+  , "wsh": false
+  , "nomen": false
+  , "onevar": false
+  , "passfail": false
+}
\ No newline at end of file
diff --git a/deps/npm/node_modules/request/node_modules/isstream/.npmignore b/deps/npm/node_modules/request/node_modules/isstream/.npmignore
new file mode 100644 (file)
index 0000000..aa1ec1e
--- /dev/null
@@ -0,0 +1 @@
+*.tgz
diff --git a/deps/npm/node_modules/request/node_modules/isstream/.travis.yml b/deps/npm/node_modules/request/node_modules/isstream/.travis.yml
new file mode 100644 (file)
index 0000000..1fec2ab
--- /dev/null
@@ -0,0 +1,12 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.11"
+branches:
+  only:
+    - master
+notifications:
+  email:
+    - rod@vagg.org
+script: npm test
diff --git a/deps/npm/node_modules/request/node_modules/isstream/LICENSE b/deps/npm/node_modules/request/node_modules/isstream/LICENSE
new file mode 100644 (file)
index 0000000..e7554b5
--- /dev/null
@@ -0,0 +1,39 @@
+Copyright 2014, Rod Vagg (the "Original Author")
+All rights reserved.
+
+MIT +no-false-attribs License
+
+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.
+
+Distributions of all or part of the Software intended to be used
+by the recipients as they would use the unmodified Software,
+containing modifications that substantially alter, remove, or
+disable functionality of the Software, outside of the documented
+configuration mechanisms provided by the Software, shall be
+modified such that the Original Author's bug reporting email
+addresses and urls are either replaced with the contact information
+of the parties responsible for the changes, or removed entirely.
+
+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.
+
+
+Except where noted, this license applies to any and all software
+programs and associated documentation files created by the
+Original Author, when distributed with the Software.
diff --git a/deps/npm/node_modules/request/node_modules/isstream/README.md b/deps/npm/node_modules/request/node_modules/isstream/README.md
new file mode 100644 (file)
index 0000000..e60fc8a
--- /dev/null
@@ -0,0 +1,66 @@
+# isStream
+
+[![Build Status](https://secure.travis-ci.org/rvagg/isstream.png)](http://travis-ci.org/rvagg/isstream)
+
+**Test if an object is a `Stream`**
+
+[![NPM](https://nodei.co/npm/isstream.svg)](https://nodei.co/npm/isstream/)
+
+The missing `Stream.isStream(obj)`: determine if an object is standard Node.js `Stream`. Works for Node-core `Stream` objects (for 0.8, 0.10, 0.11, and in theory, older and newer versions) and all versions of **[readable-stream](https://github.com/isaacs/readable-stream)**.
+
+## Usage:
+
+```js
+var isStream = require('isstream')
+var Stream = require('stream')
+
+isStream(new Stream()) // true
+
+isStream({}) // false
+
+isStream(new Stream.Readable())    // true
+isStream(new Stream.Writable())    // true
+isStream(new Stream.Duplex())      // true
+isStream(new Stream.Transform())   // true
+isStream(new Stream.PassThrough()) // true
+```
+
+## But wait! There's more!
+
+You can also test for `isReadable(obj)`, `isWritable(obj)` and `isDuplex(obj)` to test for implementations of Streams2 (and Streams3) base classes.
+
+```js
+var isReadable = require('isstream').isReadable
+var isWritable = require('isstream').isWritable
+var isDuplex = require('isstream').isDuplex
+var Stream = require('stream')
+
+isReadable(new Stream()) // false
+isWritable(new Stream()) // false
+isDuplex(new Stream())   // false
+
+isReadable(new Stream.Readable())    // true
+isReadable(new Stream.Writable())    // false
+isReadable(new Stream.Duplex())      // true
+isReadable(new Stream.Transform())   // true
+isReadable(new Stream.PassThrough()) // true
+
+isWritable(new Stream.Readable())    // false
+isWritable(new Stream.Writable())    // true
+isWritable(new Stream.Duplex())      // true
+isWritable(new Stream.Transform())   // true
+isWritable(new Stream.PassThrough()) // true
+
+isDuplex(new Stream.Readable())    // false
+isDuplex(new Stream.Writable())    // false
+isDuplex(new Stream.Duplex())      // true
+isDuplex(new Stream.Transform())   // true
+isDuplex(new Stream.PassThrough()) // true
+```
+
+*Reminder: when implementing your own streams, please [use **readable-stream** rather than core streams](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).*
+
+
+## License
+
+**isStream** is Copyright (c) 2014 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licenced under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.
diff --git a/deps/npm/node_modules/request/node_modules/isstream/isstream.js b/deps/npm/node_modules/request/node_modules/isstream/isstream.js
new file mode 100644 (file)
index 0000000..a1d104a
--- /dev/null
@@ -0,0 +1,27 @@
+var stream = require('stream')
+
+
+function isStream (obj) {
+  return obj instanceof stream.Stream
+}
+
+
+function isReadable (obj) {
+  return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object'
+}
+
+
+function isWritable (obj) {
+  return isStream(obj) && typeof obj._write == 'function' && typeof obj._writableState == 'object'
+}
+
+
+function isDuplex (obj) {
+  return isReadable(obj) && isWritable(obj)
+}
+
+
+module.exports            = isStream
+module.exports.isReadable = isReadable
+module.exports.isWritable = isWritable
+module.exports.isDuplex   = isDuplex
diff --git a/deps/npm/node_modules/request/node_modules/isstream/package.json b/deps/npm/node_modules/request/node_modules/isstream/package.json
new file mode 100644 (file)
index 0000000..c3c796d
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  "name": "isstream",
+  "version": "0.1.1",
+  "description": "Determine if an object is a Stream",
+  "main": "isstream.js",
+  "scripts": {
+    "test": "tar --xform 's/^package/readable-stream-1.0/' -zxf readable-stream-1.0.*.tgz && tar --xform 's/^package/readable-stream-1.1/' -zxf readable-stream-1.1.*.tgz && node test.js; rm -rf readable-stream-1.?/"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/rvagg/isstream.git"
+  },
+  "keywords": [
+    "stream",
+    "type",
+    "streams",
+    "readable-stream",
+    "hippo"
+  ],
+  "devDependencies": {
+    "tape": "~2.12.3",
+    "core-util-is": "~1.0.0",
+    "isarray": "0.0.1",
+    "string_decoder": "~0.10.x",
+    "inherits": "~2.0.1"
+  },
+  "author": {
+    "name": "Rod Vagg",
+    "email": "rod@vagg.org"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/rvagg/isstream/issues"
+  },
+  "homepage": "https://github.com/rvagg/isstream",
+  "gitHead": "0406cfe2677231b7b23a229a61b15999bf60ce67",
+  "_id": "isstream@0.1.1",
+  "_shasum": "48332c5999893996ba253c81c7bd6e7ae0905c4f",
+  "_from": "isstream@>=0.1.1 <0.2.0",
+  "_npmVersion": "1.4.28",
+  "_npmUser": {
+    "name": "rvagg",
+    "email": "rod@vagg.org"
+  },
+  "maintainers": [
+    {
+      "name": "rvagg",
+      "email": "rod@vagg.org"
+    }
+  ],
+  "dist": {
+    "shasum": "48332c5999893996ba253c81c7bd6e7ae0905c4f",
+    "tarball": "http://registry.npmjs.org/isstream/-/isstream-0.1.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.1.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/deps/npm/node_modules/request/node_modules/isstream/test.js b/deps/npm/node_modules/request/node_modules/isstream/test.js
new file mode 100644 (file)
index 0000000..881e70b
--- /dev/null
@@ -0,0 +1,165 @@
+var tape             = require('tape')
+  , EE               = require('events').EventEmitter
+  , util             = require('util')
+
+
+  , isStream         = require('./')
+  , isReadable       = require('./').isReadable
+  , isWritable       = require('./').isWritable
+  , isDuplex         = require('./').isDuplex
+
+  , CoreStreams      = require('stream')
+  , ReadableStream10 = require('./readable-stream-1.0/')
+  , ReadableStream11 = require('./readable-stream-1.1/')
+
+
+function test (pass, type, stream) {
+  tape('isStream('  + type + ')', function (t) {
+    t.plan(1)
+    t.ok(pass === isStream(stream), type)
+  })
+}
+
+
+function testReadable (pass, type, stream) {
+  tape('isReadable('  + type + ')', function (t) {
+    t.plan(1)
+    t.ok(pass === isReadable(stream), type)
+  })
+}
+
+
+function testWritable (pass, type, stream) {
+  tape('isWritable('  + type + ')', function (t) {
+    t.plan(1)
+    t.ok(pass === isWritable(stream), type)
+  })
+}
+
+
+function testDuplex (pass, type, stream) {
+  tape('isDuplex('  + type + ')', function (t) {
+    t.plan(1)
+    t.ok(pass === isDuplex(stream), type)
+  })
+}
+
+
+[ undefined, null, '', true, false, 0, 1, 1.0, 'string', {}, function foo () {} ].forEach(function (o) {
+  test(false, 'non-stream / primitive: ' + (JSON.stringify(o) || (o && o.toString()) || o), o)
+})
+
+
+test(false, 'fake stream obj', { pipe: function () {} })
+
+
+;(function () {
+
+  // looks like a stream!
+
+  function Stream () {
+    EE.call(this)
+  }
+  util.inherits(Stream, EE)
+  Stream.prototype.pipe = function () {}
+  Stream.Stream = Stream
+
+  test(false, 'fake stream "new Stream()"', new Stream())
+
+}())
+
+
+test(true, 'CoreStreams.Stream', new (CoreStreams.Stream)())
+test(true, 'CoreStreams.Readable', new (CoreStreams.Readable)())
+test(true, 'CoreStreams.Writable', new (CoreStreams.Writable)())
+test(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
+test(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
+test(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
+
+test(true, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
+test(true, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
+test(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
+test(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
+test(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
+
+test(true, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
+test(true, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
+test(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
+test(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
+test(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
+
+
+testReadable(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
+testReadable(true, 'CoreStreams.Readable', new (CoreStreams.Readable)())
+testReadable(false, 'CoreStreams.Writable', new (CoreStreams.Writable)())
+testReadable(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
+testReadable(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
+testReadable(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
+
+testReadable(true, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
+testReadable(false, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
+testReadable(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
+testReadable(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
+testReadable(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
+
+testReadable(true, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
+testReadable(false, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
+testReadable(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
+testReadable(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
+testReadable(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
+
+
+testWritable(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
+testWritable(false, 'CoreStreams.Readable', new (CoreStreams.Readable)())
+testWritable(true, 'CoreStreams.Writable', new (CoreStreams.Writable)())
+testWritable(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
+testWritable(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
+testWritable(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
+
+testWritable(false, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
+testWritable(true, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
+testWritable(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
+testWritable(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
+testWritable(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
+
+testWritable(false, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
+testWritable(true, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
+testWritable(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
+testWritable(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
+testWritable(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
+
+
+testDuplex(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
+testDuplex(false, 'CoreStreams.Readable', new (CoreStreams.Readable)())
+testDuplex(false, 'CoreStreams.Writable', new (CoreStreams.Writable)())
+testDuplex(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
+testDuplex(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
+testDuplex(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
+
+testDuplex(false, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
+testDuplex(false, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
+testDuplex(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
+testDuplex(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
+testDuplex(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
+
+testDuplex(false, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
+testDuplex(false, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
+testDuplex(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
+testDuplex(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
+testDuplex(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
+
+
+;[ CoreStreams, ReadableStream10, ReadableStream11 ].forEach(function (p) {
+  [ 'Stream', 'Readable', 'Writable', 'Duplex', 'Transform', 'PassThrough' ].forEach(function (k) {
+    if (!p[k])
+      return
+
+    function SubStream () {
+      p[k].call(this)
+    }
+    util.inherits(SubStream, p[k])
+
+    test(true, 'Stream subclass: ' + p.name + '.' + k, new SubStream())
+
+  })
+})
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/.npmignore b/deps/npm/node_modules/request/node_modules/mime-types/.npmignore
deleted file mode 100644 (file)
index 919d51b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-test
-build.js
-
-# OS generated files #
-######################
-.DS_Store*
-# Icon?
-ehthumbs.db
-Thumbs.db
-
-# Node.js #
-###########
-node_modules
-npm-debug.log
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/.travis.yml b/deps/npm/node_modules/request/node_modules/mime-types/.travis.yml
deleted file mode 100644 (file)
index 73c85c6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
-matrix:
-  allow_failures:
-    - node_js: "0.11"
-  fast_finish: true
-before_install:
-  # remove build script deps before install
-  - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))'
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md b/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md
new file mode 100644 (file)
index 0000000..5487d0d
--- /dev/null
@@ -0,0 +1,78 @@
+2.0.8 / 2015-01-29
+==================
+
+  * deps: mime-db@~1.6.0
+    - Add new mime types
+
+2.0.7 / 2014-12-30
+==================
+
+  * deps: mime-db@~1.5.0
+    - Add new mime types
+    - Fix various invalid MIME type entries
+
+2.0.6 / 2014-12-30
+==================
+
+  * deps: mime-db@~1.4.0
+    - Add new mime types
+    - Fix various invalid MIME type entries
+    - Remove example template MIME types
+
+2.0.5 / 2014-12-29
+==================
+
+  * deps: mime-db@~1.3.1
+    - Fix missing extensions
+
+2.0.4 / 2014-12-10
+==================
+
+  * deps: mime-db@~1.3.0
+    - Add new mime types
+
+2.0.3 / 2014-11-09
+==================
+
+  * deps: mime-db@~1.2.0
+    - Add new mime types
+
+2.0.2 / 2014-09-28
+==================
+
+  * deps: mime-db@~1.1.0
+    - Add new mime types
+    - Add additional compressible
+    - Update charsets
+
+2.0.1 / 2014-09-07
+==================
+
+  * Support Node.js 0.6
+
+2.0.0 / 2014-09-02
+==================
+
+  * Use `mime-db`
+  * Remove `.define()`
+
+1.0.2 / 2014-08-04
+==================
+
+  * Set charset=utf-8 for `text/javascript`
+
+1.0.1 / 2014-06-24
+==================
+
+  * Add `text/jsx` type
+
+1.0.0 / 2014-05-12
+==================
+
+  * Return `false` for unknown types
+  * Set charset=utf-8 for `application/json`
+
+0.1.0 / 2014-05-02
+==================
+
+  * Initial release
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/Makefile b/deps/npm/node_modules/request/node_modules/mime-types/Makefile
deleted file mode 100644 (file)
index ceaf011..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
-build:
-       node --harmony-generators build.js
-
-test:
-       node test/mime.js
-       mocha --require should --reporter spec test/test.js
-
-.PHONY: build test
index 8e21ee1041ce58ec9c26a9a2c35d8ac51cddca7c..99d658b8b3fa25263269a0c022f0aa0a8b1531b4 100644 (file)
@@ -1,32 +1,33 @@
 # mime-types
-[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types)
 
-The ultimate javascript content-type utility.
-
-### Install
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
 
-```sh
-$ npm install mime-types
-```
+The ultimate javascript content-type utility.
 
-#### Similar to [node-mime](https://github.com/broofa/node-mime), except:
+Similar to [node-mime](https://github.com/broofa/node-mime), except:
 
-- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
+- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`,
+  so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
 - No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`.
-- Additional mime types are added such as jade and stylus. Feel free to add more!
-- Browser support via Browserify and Component by converting lists to JSON files.
+- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db)
+- No `.define()` functionality
 
 Otherwise, the API is compatible.
 
-### Adding Types
+## Install
 
-If you'd like to add additional types,
-simply create a PR adding the type to `custom.json` and
-a reference link to the [sources](SOURCES.md).
+```sh
+$ npm install mime-types
+```
 
-Do __NOT__ edit `mime.json` or `node.json`.
-Those are pulled using `build.js`.
-You should only touch `custom.json`.
+## Adding Types
+
+All mime types are based on [mime-db](https://github.com/jshttp/mime-db),
+so open a PR there if you'd like to add mime types.
 
 ## API
 
@@ -74,28 +75,25 @@ Lookup the implied default charset of a content-type.
 mime.charset('text/x-markdown') // 'UTF-8'
 ```
 
-### mime.types[extension] = type
+### var type = mime.types[extension]
 
 A map of content-types by extension.
 
-### mime.extensions[type] = [extensions]
+### [extensions...] = mime.extensions[type]
 
 A map of extensions by content-type.
 
-### mime.define(types)
-
-Globally add definitions.
-`types` must be an object of the form:
-
-```js
-{
-  "<content-type>": [extensions...],
-  "<content-type>": [extensions...]
-}
-```
-
-See the `.json` files in `lib/` for examples.
-
 ## License
 
 [MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/mime-types.svg?style=flat
+[npm-url]: https://npmjs.org/package/mime-types
+[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/jshttp/mime-types.svg?style=flat
+[travis-url]: https://travis-ci.org/jshttp/mime-types
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types.svg?style=flat
+[coveralls-url]: https://coveralls.io/r/jshttp/mime-types
+[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg?style=flat
+[downloads-url]: https://npmjs.org/package/mime-types
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/SOURCES.md b/deps/npm/node_modules/request/node_modules/mime-types/SOURCES.md
deleted file mode 100644 (file)
index 1d65012..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-
-### Sources for custom types
-
-This is a list of sources for any custom mime types.
-When adding custom mime types, please link to where you found the mime type,
-even if it's from an unofficial source.
-
-- `text/coffeescript` - http://coffeescript.org/#scripts
-- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started
-- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml
-- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210)
-
-[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types)
-
-### Notes on weird types
-
-- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts)
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/component.json b/deps/npm/node_modules/request/node_modules/mime-types/component.json
deleted file mode 100644 (file)
index fa67a6d..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "name": "mime-types",
-  "description": "The ultimate javascript content-type utility.",
-  "version": "0.1.0",
-  "author": {
-    "name": "Jonathan Ong",
-    "email": "me@jongleberry.com",
-    "url": "http://jongleberry.com",
-    "twitter": "https://twitter.com/jongleberry"
-  },
-  "repository": "expressjs/mime-types",
-  "license": "MIT",
-  "main": "lib/index.js",
-  "scripts": ["lib/index.js"],
-  "json": ["mime.json", "node.json", "custom.json"]
-}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/index.js b/deps/npm/node_modules/request/node_modules/mime-types/index.js
new file mode 100644 (file)
index 0000000..b46a202
--- /dev/null
@@ -0,0 +1,63 @@
+
+var db = require('mime-db')
+
+// types[extension] = type
+exports.types = Object.create(null)
+// extensions[type] = [extensions]
+exports.extensions = Object.create(null)
+
+Object.keys(db).forEach(function (name) {
+  var mime = db[name]
+  var exts = mime.extensions
+  if (!exts || !exts.length) return
+  exports.extensions[name] = exts
+  exts.forEach(function (ext) {
+    exports.types[ext] = name
+  })
+})
+
+exports.lookup = function (string) {
+  if (!string || typeof string !== "string") return false
+  // remove any leading paths, though we should just use path.basename
+  string = string.replace(/.*[\.\/\\]/, '').toLowerCase()
+  if (!string) return false
+  return exports.types[string] || false
+}
+
+exports.extension = function (type) {
+  if (!type || typeof type !== "string") return false
+  // to do: use media-typer
+  type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/)
+  if (!type) return false
+  var exts = exports.extensions[type[1].toLowerCase()]
+  if (!exts || !exts.length) return false
+  return exts[0]
+}
+
+// type has to be an exact mime type
+exports.charset = function (type) {
+  var mime = db[type]
+  if (mime && mime.charset) return mime.charset
+
+  // default text/* to utf-8
+  if (/^text\//.test(type)) return 'UTF-8'
+
+  return false
+}
+
+// backwards compatibility
+exports.charsets = {
+  lookup: exports.charset
+}
+
+// to do: maybe use set-type module or something
+exports.contentType = function (type) {
+  if (!type || typeof type !== "string") return false
+  if (!~type.indexOf('/')) type = exports.lookup(type)
+  if (!type) return false
+  if (!~type.indexOf('charset')) {
+    var charset = exports.charset(type)
+    if (charset) type += '; charset=' + charset.toLowerCase()
+  }
+  return type
+}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/lib/custom.json b/deps/npm/node_modules/request/node_modules/mime-types/lib/custom.json
deleted file mode 100644 (file)
index 6137da3..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "text/jade": [
-    "jade"
-  ],
-  "text/stylus": [
-    "stylus",
-    "styl"
-  ],
-  "text/less": [
-    "less"
-  ],
-  "text/x-sass": [
-    "sass"
-  ],
-  "text/x-scss": [
-    "scss"
-  ],
-  "text/coffeescript": [
-    "coffee"
-  ],
-  "text/x-handlebars-template": [
-    "hbs"
-  ],
-  "text/jsx": [
-    "jsx"
-  ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/lib/index.js b/deps/npm/node_modules/request/node_modules/mime-types/lib/index.js
deleted file mode 100644 (file)
index cc2d155..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-
-// types[extension] = type
-exports.types = Object.create(null)
-// extensions[type] = [extensions]
-exports.extensions = Object.create(null)
-// define more mime types
-exports.define = define
-
-// store the json files
-exports.json = {
-  mime: require('./mime.json'),
-  node: require('./node.json'),
-  custom: require('./custom.json'),
-}
-
-exports.lookup = function (string) {
-  if (!string || typeof string !== "string") return false
-  string = string.replace(/.*[\.\/\\]/, '').toLowerCase()
-  if (!string) return false
-  return exports.types[string] || false
-}
-
-exports.extension = function (type) {
-  if (!type || typeof type !== "string") return false
-  type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/)
-  if (!type) return false
-  var exts = exports.extensions[type[1].toLowerCase()]
-  if (!exts || !exts.length) return false
-  return exts[0]
-}
-
-// type has to be an exact mime type
-exports.charset = function (type) {
-  // special cases
-  switch (type) {
-    case 'application/json': return 'UTF-8'
-    case 'application/javascript': return 'UTF-8'
-  }
-
-  // default text/* to utf-8
-  if (/^text\//.test(type)) return 'UTF-8'
-
-  return false
-}
-
-// backwards compatibility
-exports.charsets = {
-  lookup: exports.charset
-}
-
-exports.contentType = function (type) {
-  if (!type || typeof type !== "string") return false
-  if (!~type.indexOf('/')) type = exports.lookup(type)
-  if (!type) return false
-  if (!~type.indexOf('charset')) {
-    var charset = exports.charset(type)
-    if (charset) type += '; charset=' + charset.toLowerCase()
-  }
-  return type
-}
-
-define(exports.json.mime)
-define(exports.json.node)
-define(exports.json.custom)
-
-function define(json) {
-  Object.keys(json).forEach(function (type) {
-    var exts = json[type] || []
-    exports.extensions[type] = exports.extensions[type] || []
-    exts.forEach(function (ext) {
-      if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext)
-      exports.types[ext] = type
-    })
-  })
-}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/lib/mime.json b/deps/npm/node_modules/request/node_modules/mime-types/lib/mime.json
deleted file mode 100644 (file)
index f445a86..0000000
+++ /dev/null
@@ -1,3317 +0,0 @@
-{
-  "application/1d-interleaved-parityfec": [],
-  "application/3gpp-ims+xml": [],
-  "application/activemessage": [],
-  "application/andrew-inset": [
-    "ez"
-  ],
-  "application/applefile": [],
-  "application/applixware": [
-    "aw"
-  ],
-  "application/atom+xml": [
-    "atom"
-  ],
-  "application/atomcat+xml": [
-    "atomcat"
-  ],
-  "application/atomicmail": [],
-  "application/atomsvc+xml": [
-    "atomsvc"
-  ],
-  "application/auth-policy+xml": [],
-  "application/batch-smtp": [],
-  "application/beep+xml": [],
-  "application/calendar+xml": [],
-  "application/cals-1840": [],
-  "application/ccmp+xml": [],
-  "application/ccxml+xml": [
-    "ccxml"
-  ],
-  "application/cdmi-capability": [
-    "cdmia"
-  ],
-  "application/cdmi-container": [
-    "cdmic"
-  ],
-  "application/cdmi-domain": [
-    "cdmid"
-  ],
-  "application/cdmi-object": [
-    "cdmio"
-  ],
-  "application/cdmi-queue": [
-    "cdmiq"
-  ],
-  "application/cea-2018+xml": [],
-  "application/cellml+xml": [],
-  "application/cfw": [],
-  "application/cnrp+xml": [],
-  "application/commonground": [],
-  "application/conference-info+xml": [],
-  "application/cpl+xml": [],
-  "application/csta+xml": [],
-  "application/cstadata+xml": [],
-  "application/cu-seeme": [
-    "cu"
-  ],
-  "application/cybercash": [],
-  "application/davmount+xml": [
-    "davmount"
-  ],
-  "application/dca-rft": [],
-  "application/dec-dx": [],
-  "application/dialog-info+xml": [],
-  "application/dicom": [],
-  "application/dns": [],
-  "application/docbook+xml": [
-    "dbk"
-  ],
-  "application/dskpp+xml": [],
-  "application/dssc+der": [
-    "dssc"
-  ],
-  "application/dssc+xml": [
-    "xdssc"
-  ],
-  "application/dvcs": [],
-  "application/ecmascript": [
-    "ecma"
-  ],
-  "application/edi-consent": [],
-  "application/edi-x12": [],
-  "application/edifact": [],
-  "application/emma+xml": [
-    "emma"
-  ],
-  "application/epp+xml": [],
-  "application/epub+zip": [
-    "epub"
-  ],
-  "application/eshop": [],
-  "application/example": [],
-  "application/exi": [
-    "exi"
-  ],
-  "application/fastinfoset": [],
-  "application/fastsoap": [],
-  "application/fits": [],
-  "application/font-tdpfr": [
-    "pfr"
-  ],
-  "application/framework-attributes+xml": [],
-  "application/gml+xml": [
-    "gml"
-  ],
-  "application/gpx+xml": [
-    "gpx"
-  ],
-  "application/gxf": [
-    "gxf"
-  ],
-  "application/h224": [],
-  "application/held+xml": [],
-  "application/http": [],
-  "application/hyperstudio": [
-    "stk"
-  ],
-  "application/ibe-key-request+xml": [],
-  "application/ibe-pkg-reply+xml": [],
-  "application/ibe-pp-data": [],
-  "application/iges": [],
-  "application/im-iscomposing+xml": [],
-  "application/index": [],
-  "application/index.cmd": [],
-  "application/index.obj": [],
-  "application/index.response": [],
-  "application/index.vnd": [],
-  "application/inkml+xml": [
-    "ink",
-    "inkml"
-  ],
-  "application/iotp": [],
-  "application/ipfix": [
-    "ipfix"
-  ],
-  "application/ipp": [],
-  "application/isup": [],
-  "application/java-archive": [
-    "jar"
-  ],
-  "application/java-serialized-object": [
-    "ser"
-  ],
-  "application/java-vm": [
-    "class"
-  ],
-  "application/javascript": [
-    "js"
-  ],
-  "application/json": [
-    "json"
-  ],
-  "application/jsonml+json": [
-    "jsonml"
-  ],
-  "application/kpml-request+xml": [],
-  "application/kpml-response+xml": [],
-  "application/lost+xml": [
-    "lostxml"
-  ],
-  "application/mac-binhex40": [
-    "hqx"
-  ],
-  "application/mac-compactpro": [
-    "cpt"
-  ],
-  "application/macwriteii": [],
-  "application/mads+xml": [
-    "mads"
-  ],
-  "application/marc": [
-    "mrc"
-  ],
-  "application/marcxml+xml": [
-    "mrcx"
-  ],
-  "application/mathematica": [
-    "ma",
-    "nb",
-    "mb"
-  ],
-  "application/mathml-content+xml": [],
-  "application/mathml-presentation+xml": [],
-  "application/mathml+xml": [
-    "mathml"
-  ],
-  "application/mbms-associated-procedure-description+xml": [],
-  "application/mbms-deregister+xml": [],
-  "application/mbms-envelope+xml": [],
-  "application/mbms-msk+xml": [],
-  "application/mbms-msk-response+xml": [],
-  "application/mbms-protection-description+xml": [],
-  "application/mbms-reception-report+xml": [],
-  "application/mbms-register+xml": [],
-  "application/mbms-register-response+xml": [],
-  "application/mbms-user-service-description+xml": [],
-  "application/mbox": [
-    "mbox"
-  ],
-  "application/media_control+xml": [],
-  "application/mediaservercontrol+xml": [
-    "mscml"
-  ],
-  "application/metalink+xml": [
-    "metalink"
-  ],
-  "application/metalink4+xml": [
-    "meta4"
-  ],
-  "application/mets+xml": [
-    "mets"
-  ],
-  "application/mikey": [],
-  "application/mods+xml": [
-    "mods"
-  ],
-  "application/moss-keys": [],
-  "application/moss-signature": [],
-  "application/mosskey-data": [],
-  "application/mosskey-request": [],
-  "application/mp21": [
-    "m21",
-    "mp21"
-  ],
-  "application/mp4": [
-    "mp4s"
-  ],
-  "application/mpeg4-generic": [],
-  "application/mpeg4-iod": [],
-  "application/mpeg4-iod-xmt": [],
-  "application/msc-ivr+xml": [],
-  "application/msc-mixer+xml": [],
-  "application/msword": [
-    "doc",
-    "dot"
-  ],
-  "application/mxf": [
-    "mxf"
-  ],
-  "application/nasdata": [],
-  "application/news-checkgroups": [],
-  "application/news-groupinfo": [],
-  "application/news-transmission": [],
-  "application/nss": [],
-  "application/ocsp-request": [],
-  "application/ocsp-response": [],
-  "application/octet-stream": [
-    "bin",
-    "dms",
-    "lrf",
-    "mar",
-    "so",
-    "dist",
-    "distz",
-    "pkg",
-    "bpk",
-    "dump",
-    "elc",
-    "deploy"
-  ],
-  "application/oda": [
-    "oda"
-  ],
-  "application/oebps-package+xml": [
-    "opf"
-  ],
-  "application/ogg": [
-    "ogx"
-  ],
-  "application/omdoc+xml": [
-    "omdoc"
-  ],
-  "application/onenote": [
-    "onetoc",
-    "onetoc2",
-    "onetmp",
-    "onepkg"
-  ],
-  "application/oxps": [
-    "oxps"
-  ],
-  "application/parityfec": [],
-  "application/patch-ops-error+xml": [
-    "xer"
-  ],
-  "application/pdf": [
-    "pdf"
-  ],
-  "application/pgp-encrypted": [
-    "pgp"
-  ],
-  "application/pgp-keys": [],
-  "application/pgp-signature": [
-    "asc",
-    "sig"
-  ],
-  "application/pics-rules": [
-    "prf"
-  ],
-  "application/pidf+xml": [],
-  "application/pidf-diff+xml": [],
-  "application/pkcs10": [
-    "p10"
-  ],
-  "application/pkcs7-mime": [
-    "p7m",
-    "p7c"
-  ],
-  "application/pkcs7-signature": [
-    "p7s"
-  ],
-  "application/pkcs8": [
-    "p8"
-  ],
-  "application/pkix-attr-cert": [
-    "ac"
-  ],
-  "application/pkix-cert": [
-    "cer"
-  ],
-  "application/pkix-crl": [
-    "crl"
-  ],
-  "application/pkix-pkipath": [
-    "pkipath"
-  ],
-  "application/pkixcmp": [
-    "pki"
-  ],
-  "application/pls+xml": [
-    "pls"
-  ],
-  "application/poc-settings+xml": [],
-  "application/postscript": [
-    "ai",
-    "eps",
-    "ps"
-  ],
-  "application/prs.alvestrand.titrax-sheet": [],
-  "application/prs.cww": [
-    "cww"
-  ],
-  "application/prs.nprend": [],
-  "application/prs.plucker": [],
-  "application/prs.rdf-xml-crypt": [],
-  "application/prs.xsf+xml": [],
-  "application/pskc+xml": [
-    "pskcxml"
-  ],
-  "application/qsig": [],
-  "application/rdf+xml": [
-    "rdf"
-  ],
-  "application/reginfo+xml": [
-    "rif"
-  ],
-  "application/relax-ng-compact-syntax": [
-    "rnc"
-  ],
-  "application/remote-printing": [],
-  "application/resource-lists+xml": [
-    "rl"
-  ],
-  "application/resource-lists-diff+xml": [
-    "rld"
-  ],
-  "application/riscos": [],
-  "application/rlmi+xml": [],
-  "application/rls-services+xml": [
-    "rs"
-  ],
-  "application/rpki-ghostbusters": [
-    "gbr"
-  ],
-  "application/rpki-manifest": [
-    "mft"
-  ],
-  "application/rpki-roa": [
-    "roa"
-  ],
-  "application/rpki-updown": [],
-  "application/rsd+xml": [
-    "rsd"
-  ],
-  "application/rss+xml": [
-    "rss"
-  ],
-  "application/rtf": [
-    "rtf"
-  ],
-  "application/rtx": [],
-  "application/samlassertion+xml": [],
-  "application/samlmetadata+xml": [],
-  "application/sbml+xml": [
-    "sbml"
-  ],
-  "application/scvp-cv-request": [
-    "scq"
-  ],
-  "application/scvp-cv-response": [
-    "scs"
-  ],
-  "application/scvp-vp-request": [
-    "spq"
-  ],
-  "application/scvp-vp-response": [
-    "spp"
-  ],
-  "application/sdp": [
-    "sdp"
-  ],
-  "application/set-payment": [],
-  "application/set-payment-initiation": [
-    "setpay"
-  ],
-  "application/set-registration": [],
-  "application/set-registration-initiation": [
-    "setreg"
-  ],
-  "application/sgml": [],
-  "application/sgml-open-catalog": [],
-  "application/shf+xml": [
-    "shf"
-  ],
-  "application/sieve": [],
-  "application/simple-filter+xml": [],
-  "application/simple-message-summary": [],
-  "application/simplesymbolcontainer": [],
-  "application/slate": [],
-  "application/smil": [],
-  "application/smil+xml": [
-    "smi",
-    "smil"
-  ],
-  "application/soap+fastinfoset": [],
-  "application/soap+xml": [],
-  "application/sparql-query": [
-    "rq"
-  ],
-  "application/sparql-results+xml": [
-    "srx"
-  ],
-  "application/spirits-event+xml": [],
-  "application/srgs": [
-    "gram"
-  ],
-  "application/srgs+xml": [
-    "grxml"
-  ],
-  "application/sru+xml": [
-    "sru"
-  ],
-  "application/ssdl+xml": [
-    "ssdl"
-  ],
-  "application/ssml+xml": [
-    "ssml"
-  ],
-  "application/tamp-apex-update": [],
-  "application/tamp-apex-update-confirm": [],
-  "application/tamp-community-update": [],
-  "application/tamp-community-update-confirm": [],
-  "application/tamp-error": [],
-  "application/tamp-sequence-adjust": [],
-  "application/tamp-sequence-adjust-confirm": [],
-  "application/tamp-status-query": [],
-  "application/tamp-status-response": [],
-  "application/tamp-update": [],
-  "application/tamp-update-confirm": [],
-  "application/tei+xml": [
-    "tei",
-    "teicorpus"
-  ],
-  "application/thraud+xml": [
-    "tfi"
-  ],
-  "application/timestamp-query": [],
-  "application/timestamp-reply": [],
-  "application/timestamped-data": [
-    "tsd"
-  ],
-  "application/tve-trigger": [],
-  "application/ulpfec": [],
-  "application/vcard+xml": [],
-  "application/vemmi": [],
-  "application/vividence.scriptfile": [],
-  "application/vnd.3gpp.bsf+xml": [],
-  "application/vnd.3gpp.pic-bw-large": [
-    "plb"
-  ],
-  "application/vnd.3gpp.pic-bw-small": [
-    "psb"
-  ],
-  "application/vnd.3gpp.pic-bw-var": [
-    "pvb"
-  ],
-  "application/vnd.3gpp.sms": [],
-  "application/vnd.3gpp2.bcmcsinfo+xml": [],
-  "application/vnd.3gpp2.sms": [],
-  "application/vnd.3gpp2.tcap": [
-    "tcap"
-  ],
-  "application/vnd.3m.post-it-notes": [
-    "pwn"
-  ],
-  "application/vnd.accpac.simply.aso": [
-    "aso"
-  ],
-  "application/vnd.accpac.simply.imp": [
-    "imp"
-  ],
-  "application/vnd.acucobol": [
-    "acu"
-  ],
-  "application/vnd.acucorp": [
-    "atc",
-    "acutc"
-  ],
-  "application/vnd.adobe.air-application-installer-package+zip": [
-    "air"
-  ],
-  "application/vnd.adobe.formscentral.fcdt": [
-    "fcdt"
-  ],
-  "application/vnd.adobe.fxp": [
-    "fxp",
-    "fxpl"
-  ],
-  "application/vnd.adobe.partial-upload": [],
-  "application/vnd.adobe.xdp+xml": [
-    "xdp"
-  ],
-  "application/vnd.adobe.xfdf": [
-    "xfdf"
-  ],
-  "application/vnd.aether.imp": [],
-  "application/vnd.ah-barcode": [],
-  "application/vnd.ahead.space": [
-    "ahead"
-  ],
-  "application/vnd.airzip.filesecure.azf": [
-    "azf"
-  ],
-  "application/vnd.airzip.filesecure.azs": [
-    "azs"
-  ],
-  "application/vnd.amazon.ebook": [
-    "azw"
-  ],
-  "application/vnd.americandynamics.acc": [
-    "acc"
-  ],
-  "application/vnd.amiga.ami": [
-    "ami"
-  ],
-  "application/vnd.amundsen.maze+xml": [],
-  "application/vnd.android.package-archive": [
-    "apk"
-  ],
-  "application/vnd.anser-web-certificate-issue-initiation": [
-    "cii"
-  ],
-  "application/vnd.anser-web-funds-transfer-initiation": [
-    "fti"
-  ],
-  "application/vnd.antix.game-component": [
-    "atx"
-  ],
-  "application/vnd.apple.installer+xml": [
-    "mpkg"
-  ],
-  "application/vnd.apple.mpegurl": [
-    "m3u8"
-  ],
-  "application/vnd.arastra.swi": [],
-  "application/vnd.aristanetworks.swi": [
-    "swi"
-  ],
-  "application/vnd.astraea-software.iota": [
-    "iota"
-  ],
-  "application/vnd.audiograph": [
-    "aep"
-  ],
-  "application/vnd.autopackage": [],
-  "application/vnd.avistar+xml": [],
-  "application/vnd.blueice.multipass": [
-    "mpm"
-  ],
-  "application/vnd.bluetooth.ep.oob": [],
-  "application/vnd.bmi": [
-    "bmi"
-  ],
-  "application/vnd.businessobjects": [
-    "rep"
-  ],
-  "application/vnd.cab-jscript": [],
-  "application/vnd.canon-cpdl": [],
-  "application/vnd.canon-lips": [],
-  "application/vnd.cendio.thinlinc.clientconf": [],
-  "application/vnd.chemdraw+xml": [
-    "cdxml"
-  ],
-  "application/vnd.chipnuts.karaoke-mmd": [
-    "mmd"
-  ],
-  "application/vnd.cinderella": [
-    "cdy"
-  ],
-  "application/vnd.cirpack.isdn-ext": [],
-  "application/vnd.claymore": [
-    "cla"
-  ],
-  "application/vnd.cloanto.rp9": [
-    "rp9"
-  ],
-  "application/vnd.clonk.c4group": [
-    "c4g",
-    "c4d",
-    "c4f",
-    "c4p",
-    "c4u"
-  ],
-  "application/vnd.cluetrust.cartomobile-config": [
-    "c11amc"
-  ],
-  "application/vnd.cluetrust.cartomobile-config-pkg": [
-    "c11amz"
-  ],
-  "application/vnd.collection+json": [],
-  "application/vnd.commerce-battelle": [],
-  "application/vnd.commonspace": [
-    "csp"
-  ],
-  "application/vnd.contact.cmsg": [
-    "cdbcmsg"
-  ],
-  "application/vnd.cosmocaller": [
-    "cmc"
-  ],
-  "application/vnd.crick.clicker": [
-    "clkx"
-  ],
-  "application/vnd.crick.clicker.keyboard": [
-    "clkk"
-  ],
-  "application/vnd.crick.clicker.palette": [
-    "clkp"
-  ],
-  "application/vnd.crick.clicker.template": [
-    "clkt"
-  ],
-  "application/vnd.crick.clicker.wordbank": [
-    "clkw"
-  ],
-  "application/vnd.criticaltools.wbs+xml": [
-    "wbs"
-  ],
-  "application/vnd.ctc-posml": [
-    "pml"
-  ],
-  "application/vnd.ctct.ws+xml": [],
-  "application/vnd.cups-pdf": [],
-  "application/vnd.cups-postscript": [],
-  "application/vnd.cups-ppd": [
-    "ppd"
-  ],
-  "application/vnd.cups-raster": [],
-  "application/vnd.cups-raw": [],
-  "application/vnd.curl": [],
-  "application/vnd.curl.car": [
-    "car"
-  ],
-  "application/vnd.curl.pcurl": [
-    "pcurl"
-  ],
-  "application/vnd.cybank": [],
-  "application/vnd.dart": [
-    "dart"
-  ],
-  "application/vnd.data-vision.rdz": [
-    "rdz"
-  ],
-  "application/vnd.dece.data": [
-    "uvf",
-    "uvvf",
-    "uvd",
-    "uvvd"
-  ],
-  "application/vnd.dece.ttml+xml": [
-    "uvt",
-    "uvvt"
-  ],
-  "application/vnd.dece.unspecified": [
-    "uvx",
-    "uvvx"
-  ],
-  "application/vnd.dece.zip": [
-    "uvz",
-    "uvvz"
-  ],
-  "application/vnd.denovo.fcselayout-link": [
-    "fe_launch"
-  ],
-  "application/vnd.dir-bi.plate-dl-nosuffix": [],
-  "application/vnd.dna": [
-    "dna"
-  ],
-  "application/vnd.dolby.mlp": [
-    "mlp"
-  ],
-  "application/vnd.dolby.mobile.1": [],
-  "application/vnd.dolby.mobile.2": [],
-  "application/vnd.dpgraph": [
-    "dpg"
-  ],
-  "application/vnd.dreamfactory": [
-    "dfac"
-  ],
-  "application/vnd.ds-keypoint": [
-    "kpxx"
-  ],
-  "application/vnd.dvb.ait": [
-    "ait"
-  ],
-  "application/vnd.dvb.dvbj": [],
-  "application/vnd.dvb.esgcontainer": [],
-  "application/vnd.dvb.ipdcdftnotifaccess": [],
-  "application/vnd.dvb.ipdcesgaccess": [],
-  "application/vnd.dvb.ipdcesgaccess2": [],
-  "application/vnd.dvb.ipdcesgpdd": [],
-  "application/vnd.dvb.ipdcroaming": [],
-  "application/vnd.dvb.iptv.alfec-base": [],
-  "application/vnd.dvb.iptv.alfec-enhancement": [],
-  "application/vnd.dvb.notif-aggregate-root+xml": [],
-  "application/vnd.dvb.notif-container+xml": [],
-  "application/vnd.dvb.notif-generic+xml": [],
-  "application/vnd.dvb.notif-ia-msglist+xml": [],
-  "application/vnd.dvb.notif-ia-registration-request+xml": [],
-  "application/vnd.dvb.notif-ia-registration-response+xml": [],
-  "application/vnd.dvb.notif-init+xml": [],
-  "application/vnd.dvb.pfr": [],
-  "application/vnd.dvb.service": [
-    "svc"
-  ],
-  "application/vnd.dxr": [],
-  "application/vnd.dynageo": [
-    "geo"
-  ],
-  "application/vnd.easykaraoke.cdgdownload": [],
-  "application/vnd.ecdis-update": [],
-  "application/vnd.ecowin.chart": [
-    "mag"
-  ],
-  "application/vnd.ecowin.filerequest": [],
-  "application/vnd.ecowin.fileupdate": [],
-  "application/vnd.ecowin.series": [],
-  "application/vnd.ecowin.seriesrequest": [],
-  "application/vnd.ecowin.seriesupdate": [],
-  "application/vnd.emclient.accessrequest+xml": [],
-  "application/vnd.enliven": [
-    "nml"
-  ],
-  "application/vnd.eprints.data+xml": [],
-  "application/vnd.epson.esf": [
-    "esf"
-  ],
-  "application/vnd.epson.msf": [
-    "msf"
-  ],
-  "application/vnd.epson.quickanime": [
-    "qam"
-  ],
-  "application/vnd.epson.salt": [
-    "slt"
-  ],
-  "application/vnd.epson.ssf": [
-    "ssf"
-  ],
-  "application/vnd.ericsson.quickcall": [],
-  "application/vnd.eszigno3+xml": [
-    "es3",
-    "et3"
-  ],
-  "application/vnd.etsi.aoc+xml": [],
-  "application/vnd.etsi.cug+xml": [],
-  "application/vnd.etsi.iptvcommand+xml": [],
-  "application/vnd.etsi.iptvdiscovery+xml": [],
-  "application/vnd.etsi.iptvprofile+xml": [],
-  "application/vnd.etsi.iptvsad-bc+xml": [],
-  "application/vnd.etsi.iptvsad-cod+xml": [],
-  "application/vnd.etsi.iptvsad-npvr+xml": [],
-  "application/vnd.etsi.iptvservice+xml": [],
-  "application/vnd.etsi.iptvsync+xml": [],
-  "application/vnd.etsi.iptvueprofile+xml": [],
-  "application/vnd.etsi.mcid+xml": [],
-  "application/vnd.etsi.overload-control-policy-dataset+xml": [],
-  "application/vnd.etsi.sci+xml": [],
-  "application/vnd.etsi.simservs+xml": [],
-  "application/vnd.etsi.tsl+xml": [],
-  "application/vnd.etsi.tsl.der": [],
-  "application/vnd.eudora.data": [],
-  "application/vnd.ezpix-album": [
-    "ez2"
-  ],
-  "application/vnd.ezpix-package": [
-    "ez3"
-  ],
-  "application/vnd.f-secure.mobile": [],
-  "application/vnd.fdf": [
-    "fdf"
-  ],
-  "application/vnd.fdsn.mseed": [
-    "mseed"
-  ],
-  "application/vnd.fdsn.seed": [
-    "seed",
-    "dataless"
-  ],
-  "application/vnd.ffsns": [],
-  "application/vnd.fints": [],
-  "application/vnd.flographit": [
-    "gph"
-  ],
-  "application/vnd.fluxtime.clip": [
-    "ftc"
-  ],
-  "application/vnd.font-fontforge-sfd": [],
-  "application/vnd.framemaker": [
-    "fm",
-    "frame",
-    "maker",
-    "book"
-  ],
-  "application/vnd.frogans.fnc": [
-    "fnc"
-  ],
-  "application/vnd.frogans.ltf": [
-    "ltf"
-  ],
-  "application/vnd.fsc.weblaunch": [
-    "fsc"
-  ],
-  "application/vnd.fujitsu.oasys": [
-    "oas"
-  ],
-  "application/vnd.fujitsu.oasys2": [
-    "oa2"
-  ],
-  "application/vnd.fujitsu.oasys3": [
-    "oa3"
-  ],
-  "application/vnd.fujitsu.oasysgp": [
-    "fg5"
-  ],
-  "application/vnd.fujitsu.oasysprs": [
-    "bh2"
-  ],
-  "application/vnd.fujixerox.art-ex": [],
-  "application/vnd.fujixerox.art4": [],
-  "application/vnd.fujixerox.hbpl": [],
-  "application/vnd.fujixerox.ddd": [
-    "ddd"
-  ],
-  "application/vnd.fujixerox.docuworks": [
-    "xdw"
-  ],
-  "application/vnd.fujixerox.docuworks.binder": [
-    "xbd"
-  ],
-  "application/vnd.fut-misnet": [],
-  "application/vnd.fuzzysheet": [
-    "fzs"
-  ],
-  "application/vnd.genomatix.tuxedo": [
-    "txd"
-  ],
-  "application/vnd.geocube+xml": [],
-  "application/vnd.geogebra.file": [
-    "ggb"
-  ],
-  "application/vnd.geogebra.tool": [
-    "ggt"
-  ],
-  "application/vnd.geometry-explorer": [
-    "gex",
-    "gre"
-  ],
-  "application/vnd.geonext": [
-    "gxt"
-  ],
-  "application/vnd.geoplan": [
-    "g2w"
-  ],
-  "application/vnd.geospace": [
-    "g3w"
-  ],
-  "application/vnd.globalplatform.card-content-mgt": [],
-  "application/vnd.globalplatform.card-content-mgt-response": [],
-  "application/vnd.gmx": [
-    "gmx"
-  ],
-  "application/vnd.google-earth.kml+xml": [
-    "kml"
-  ],
-  "application/vnd.google-earth.kmz": [
-    "kmz"
-  ],
-  "application/vnd.grafeq": [
-    "gqf",
-    "gqs"
-  ],
-  "application/vnd.gridmp": [],
-  "application/vnd.groove-account": [
-    "gac"
-  ],
-  "application/vnd.groove-help": [
-    "ghf"
-  ],
-  "application/vnd.groove-identity-message": [
-    "gim"
-  ],
-  "application/vnd.groove-injector": [
-    "grv"
-  ],
-  "application/vnd.groove-tool-message": [
-    "gtm"
-  ],
-  "application/vnd.groove-tool-template": [
-    "tpl"
-  ],
-  "application/vnd.groove-vcard": [
-    "vcg"
-  ],
-  "application/vnd.hal+json": [],
-  "application/vnd.hal+xml": [
-    "hal"
-  ],
-  "application/vnd.handheld-entertainment+xml": [
-    "zmm"
-  ],
-  "application/vnd.hbci": [
-    "hbci"
-  ],
-  "application/vnd.hcl-bireports": [],
-  "application/vnd.hhe.lesson-player": [
-    "les"
-  ],
-  "application/vnd.hp-hpgl": [
-    "hpgl"
-  ],
-  "application/vnd.hp-hpid": [
-    "hpid"
-  ],
-  "application/vnd.hp-hps": [
-    "hps"
-  ],
-  "application/vnd.hp-jlyt": [
-    "jlt"
-  ],
-  "application/vnd.hp-pcl": [
-    "pcl"
-  ],
-  "application/vnd.hp-pclxl": [
-    "pclxl"
-  ],
-  "application/vnd.httphone": [],
-  "application/vnd.hzn-3d-crossword": [],
-  "application/vnd.ibm.afplinedata": [],
-  "application/vnd.ibm.electronic-media": [],
-  "application/vnd.ibm.minipay": [
-    "mpy"
-  ],
-  "application/vnd.ibm.modcap": [
-    "afp",
-    "listafp",
-    "list3820"
-  ],
-  "application/vnd.ibm.rights-management": [
-    "irm"
-  ],
-  "application/vnd.ibm.secure-container": [
-    "sc"
-  ],
-  "application/vnd.iccprofile": [
-    "icc",
-    "icm"
-  ],
-  "application/vnd.igloader": [
-    "igl"
-  ],
-  "application/vnd.immervision-ivp": [
-    "ivp"
-  ],
-  "application/vnd.immervision-ivu": [
-    "ivu"
-  ],
-  "application/vnd.informedcontrol.rms+xml": [],
-  "application/vnd.informix-visionary": [],
-  "application/vnd.infotech.project": [],
-  "application/vnd.infotech.project+xml": [],
-  "application/vnd.innopath.wamp.notification": [],
-  "application/vnd.insors.igm": [
-    "igm"
-  ],
-  "application/vnd.intercon.formnet": [
-    "xpw",
-    "xpx"
-  ],
-  "application/vnd.intergeo": [
-    "i2g"
-  ],
-  "application/vnd.intertrust.digibox": [],
-  "application/vnd.intertrust.nncp": [],
-  "application/vnd.intu.qbo": [
-    "qbo"
-  ],
-  "application/vnd.intu.qfx": [
-    "qfx"
-  ],
-  "application/vnd.iptc.g2.conceptitem+xml": [],
-  "application/vnd.iptc.g2.knowledgeitem+xml": [],
-  "application/vnd.iptc.g2.newsitem+xml": [],
-  "application/vnd.iptc.g2.newsmessage+xml": [],
-  "application/vnd.iptc.g2.packageitem+xml": [],
-  "application/vnd.iptc.g2.planningitem+xml": [],
-  "application/vnd.ipunplugged.rcprofile": [
-    "rcprofile"
-  ],
-  "application/vnd.irepository.package+xml": [
-    "irp"
-  ],
-  "application/vnd.is-xpr": [
-    "xpr"
-  ],
-  "application/vnd.isac.fcs": [
-    "fcs"
-  ],
-  "application/vnd.jam": [
-    "jam"
-  ],
-  "application/vnd.japannet-directory-service": [],
-  "application/vnd.japannet-jpnstore-wakeup": [],
-  "application/vnd.japannet-payment-wakeup": [],
-  "application/vnd.japannet-registration": [],
-  "application/vnd.japannet-registration-wakeup": [],
-  "application/vnd.japannet-setstore-wakeup": [],
-  "application/vnd.japannet-verification": [],
-  "application/vnd.japannet-verification-wakeup": [],
-  "application/vnd.jcp.javame.midlet-rms": [
-    "rms"
-  ],
-  "application/vnd.jisp": [
-    "jisp"
-  ],
-  "application/vnd.joost.joda-archive": [
-    "joda"
-  ],
-  "application/vnd.kahootz": [
-    "ktz",
-    "ktr"
-  ],
-  "application/vnd.kde.karbon": [
-    "karbon"
-  ],
-  "application/vnd.kde.kchart": [
-    "chrt"
-  ],
-  "application/vnd.kde.kformula": [
-    "kfo"
-  ],
-  "application/vnd.kde.kivio": [
-    "flw"
-  ],
-  "application/vnd.kde.kontour": [
-    "kon"
-  ],
-  "application/vnd.kde.kpresenter": [
-    "kpr",
-    "kpt"
-  ],
-  "application/vnd.kde.kspread": [
-    "ksp"
-  ],
-  "application/vnd.kde.kword": [
-    "kwd",
-    "kwt"
-  ],
-  "application/vnd.kenameaapp": [
-    "htke"
-  ],
-  "application/vnd.kidspiration": [
-    "kia"
-  ],
-  "application/vnd.kinar": [
-    "kne",
-    "knp"
-  ],
-  "application/vnd.koan": [
-    "skp",
-    "skd",
-    "skt",
-    "skm"
-  ],
-  "application/vnd.kodak-descriptor": [
-    "sse"
-  ],
-  "application/vnd.las.las+xml": [
-    "lasxml"
-  ],
-  "application/vnd.liberty-request+xml": [],
-  "application/vnd.llamagraphics.life-balance.desktop": [
-    "lbd"
-  ],
-  "application/vnd.llamagraphics.life-balance.exchange+xml": [
-    "lbe"
-  ],
-  "application/vnd.lotus-1-2-3": [
-    "123"
-  ],
-  "application/vnd.lotus-approach": [
-    "apr"
-  ],
-  "application/vnd.lotus-freelance": [
-    "pre"
-  ],
-  "application/vnd.lotus-notes": [
-    "nsf"
-  ],
-  "application/vnd.lotus-organizer": [
-    "org"
-  ],
-  "application/vnd.lotus-screencam": [
-    "scm"
-  ],
-  "application/vnd.lotus-wordpro": [
-    "lwp"
-  ],
-  "application/vnd.macports.portpkg": [
-    "portpkg"
-  ],
-  "application/vnd.marlin.drm.actiontoken+xml": [],
-  "application/vnd.marlin.drm.conftoken+xml": [],
-  "application/vnd.marlin.drm.license+xml": [],
-  "application/vnd.marlin.drm.mdcf": [],
-  "application/vnd.mcd": [
-    "mcd"
-  ],
-  "application/vnd.medcalcdata": [
-    "mc1"
-  ],
-  "application/vnd.mediastation.cdkey": [
-    "cdkey"
-  ],
-  "application/vnd.meridian-slingshot": [],
-  "application/vnd.mfer": [
-    "mwf"
-  ],
-  "application/vnd.mfmp": [
-    "mfm"
-  ],
-  "application/vnd.micrografx.flo": [
-    "flo"
-  ],
-  "application/vnd.micrografx.igx": [
-    "igx"
-  ],
-  "application/vnd.mif": [
-    "mif"
-  ],
-  "application/vnd.minisoft-hp3000-save": [],
-  "application/vnd.mitsubishi.misty-guard.trustweb": [],
-  "application/vnd.mobius.daf": [
-    "daf"
-  ],
-  "application/vnd.mobius.dis": [
-    "dis"
-  ],
-  "application/vnd.mobius.mbk": [
-    "mbk"
-  ],
-  "application/vnd.mobius.mqy": [
-    "mqy"
-  ],
-  "application/vnd.mobius.msl": [
-    "msl"
-  ],
-  "application/vnd.mobius.plc": [
-    "plc"
-  ],
-  "application/vnd.mobius.txf": [
-    "txf"
-  ],
-  "application/vnd.mophun.application": [
-    "mpn"
-  ],
-  "application/vnd.mophun.certificate": [
-    "mpc"
-  ],
-  "application/vnd.motorola.flexsuite": [],
-  "application/vnd.motorola.flexsuite.adsi": [],
-  "application/vnd.motorola.flexsuite.fis": [],
-  "application/vnd.motorola.flexsuite.gotap": [],
-  "application/vnd.motorola.flexsuite.kmr": [],
-  "application/vnd.motorola.flexsuite.ttc": [],
-  "application/vnd.motorola.flexsuite.wem": [],
-  "application/vnd.motorola.iprm": [],
-  "application/vnd.mozilla.xul+xml": [
-    "xul"
-  ],
-  "application/vnd.ms-artgalry": [
-    "cil"
-  ],
-  "application/vnd.ms-asf": [],
-  "application/vnd.ms-cab-compressed": [
-    "cab"
-  ],
-  "application/vnd.ms-color.iccprofile": [],
-  "application/vnd.ms-excel": [
-    "xls",
-    "xlm",
-    "xla",
-    "xlc",
-    "xlt",
-    "xlw"
-  ],
-  "application/vnd.ms-excel.addin.macroenabled.12": [
-    "xlam"
-  ],
-  "application/vnd.ms-excel.sheet.binary.macroenabled.12": [
-    "xlsb"
-  ],
-  "application/vnd.ms-excel.sheet.macroenabled.12": [
-    "xlsm"
-  ],
-  "application/vnd.ms-excel.template.macroenabled.12": [
-    "xltm"
-  ],
-  "application/vnd.ms-fontobject": [
-    "eot"
-  ],
-  "application/vnd.ms-htmlhelp": [
-    "chm"
-  ],
-  "application/vnd.ms-ims": [
-    "ims"
-  ],
-  "application/vnd.ms-lrm": [
-    "lrm"
-  ],
-  "application/vnd.ms-office.activex+xml": [],
-  "application/vnd.ms-officetheme": [
-    "thmx"
-  ],
-  "application/vnd.ms-opentype": [],
-  "application/vnd.ms-package.obfuscated-opentype": [],
-  "application/vnd.ms-pki.seccat": [
-    "cat"
-  ],
-  "application/vnd.ms-pki.stl": [
-    "stl"
-  ],
-  "application/vnd.ms-playready.initiator+xml": [],
-  "application/vnd.ms-powerpoint": [
-    "ppt",
-    "pps",
-    "pot"
-  ],
-  "application/vnd.ms-powerpoint.addin.macroenabled.12": [
-    "ppam"
-  ],
-  "application/vnd.ms-powerpoint.presentation.macroenabled.12": [
-    "pptm"
-  ],
-  "application/vnd.ms-powerpoint.slide.macroenabled.12": [
-    "sldm"
-  ],
-  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [
-    "ppsm"
-  ],
-  "application/vnd.ms-powerpoint.template.macroenabled.12": [
-    "potm"
-  ],
-  "application/vnd.ms-printing.printticket+xml": [],
-  "application/vnd.ms-project": [
-    "mpp",
-    "mpt"
-  ],
-  "application/vnd.ms-tnef": [],
-  "application/vnd.ms-wmdrm.lic-chlg-req": [],
-  "application/vnd.ms-wmdrm.lic-resp": [],
-  "application/vnd.ms-wmdrm.meter-chlg-req": [],
-  "application/vnd.ms-wmdrm.meter-resp": [],
-  "application/vnd.ms-word.document.macroenabled.12": [
-    "docm"
-  ],
-  "application/vnd.ms-word.template.macroenabled.12": [
-    "dotm"
-  ],
-  "application/vnd.ms-works": [
-    "wps",
-    "wks",
-    "wcm",
-    "wdb"
-  ],
-  "application/vnd.ms-wpl": [
-    "wpl"
-  ],
-  "application/vnd.ms-xpsdocument": [
-    "xps"
-  ],
-  "application/vnd.mseq": [
-    "mseq"
-  ],
-  "application/vnd.msign": [],
-  "application/vnd.multiad.creator": [],
-  "application/vnd.multiad.creator.cif": [],
-  "application/vnd.music-niff": [],
-  "application/vnd.musician": [
-    "mus"
-  ],
-  "application/vnd.muvee.style": [
-    "msty"
-  ],
-  "application/vnd.mynfc": [
-    "taglet"
-  ],
-  "application/vnd.ncd.control": [],
-  "application/vnd.ncd.reference": [],
-  "application/vnd.nervana": [],
-  "application/vnd.netfpx": [],
-  "application/vnd.neurolanguage.nlu": [
-    "nlu"
-  ],
-  "application/vnd.nitf": [
-    "ntf",
-    "nitf"
-  ],
-  "application/vnd.noblenet-directory": [
-    "nnd"
-  ],
-  "application/vnd.noblenet-sealer": [
-    "nns"
-  ],
-  "application/vnd.noblenet-web": [
-    "nnw"
-  ],
-  "application/vnd.nokia.catalogs": [],
-  "application/vnd.nokia.conml+wbxml": [],
-  "application/vnd.nokia.conml+xml": [],
-  "application/vnd.nokia.isds-radio-presets": [],
-  "application/vnd.nokia.iptv.config+xml": [],
-  "application/vnd.nokia.landmark+wbxml": [],
-  "application/vnd.nokia.landmark+xml": [],
-  "application/vnd.nokia.landmarkcollection+xml": [],
-  "application/vnd.nokia.n-gage.ac+xml": [],
-  "application/vnd.nokia.n-gage.data": [
-    "ngdat"
-  ],
-  "application/vnd.nokia.ncd": [],
-  "application/vnd.nokia.pcd+wbxml": [],
-  "application/vnd.nokia.pcd+xml": [],
-  "application/vnd.nokia.radio-preset": [
-    "rpst"
-  ],
-  "application/vnd.nokia.radio-presets": [
-    "rpss"
-  ],
-  "application/vnd.novadigm.edm": [
-    "edm"
-  ],
-  "application/vnd.novadigm.edx": [
-    "edx"
-  ],
-  "application/vnd.novadigm.ext": [
-    "ext"
-  ],
-  "application/vnd.ntt-local.file-transfer": [],
-  "application/vnd.ntt-local.sip-ta_remote": [],
-  "application/vnd.ntt-local.sip-ta_tcp_stream": [],
-  "application/vnd.oasis.opendocument.chart": [
-    "odc"
-  ],
-  "application/vnd.oasis.opendocument.chart-template": [
-    "otc"
-  ],
-  "application/vnd.oasis.opendocument.database": [
-    "odb"
-  ],
-  "application/vnd.oasis.opendocument.formula": [
-    "odf"
-  ],
-  "application/vnd.oasis.opendocument.formula-template": [
-    "odft"
-  ],
-  "application/vnd.oasis.opendocument.graphics": [
-    "odg"
-  ],
-  "application/vnd.oasis.opendocument.graphics-template": [
-    "otg"
-  ],
-  "application/vnd.oasis.opendocument.image": [
-    "odi"
-  ],
-  "application/vnd.oasis.opendocument.image-template": [
-    "oti"
-  ],
-  "application/vnd.oasis.opendocument.presentation": [
-    "odp"
-  ],
-  "application/vnd.oasis.opendocument.presentation-template": [
-    "otp"
-  ],
-  "application/vnd.oasis.opendocument.spreadsheet": [
-    "ods"
-  ],
-  "application/vnd.oasis.opendocument.spreadsheet-template": [
-    "ots"
-  ],
-  "application/vnd.oasis.opendocument.text": [
-    "odt"
-  ],
-  "application/vnd.oasis.opendocument.text-master": [
-    "odm"
-  ],
-  "application/vnd.oasis.opendocument.text-template": [
-    "ott"
-  ],
-  "application/vnd.oasis.opendocument.text-web": [
-    "oth"
-  ],
-  "application/vnd.obn": [],
-  "application/vnd.oftn.l10n+json": [],
-  "application/vnd.oipf.contentaccessdownload+xml": [],
-  "application/vnd.oipf.contentaccessstreaming+xml": [],
-  "application/vnd.oipf.cspg-hexbinary": [],
-  "application/vnd.oipf.dae.svg+xml": [],
-  "application/vnd.oipf.dae.xhtml+xml": [],
-  "application/vnd.oipf.mippvcontrolmessage+xml": [],
-  "application/vnd.oipf.pae.gem": [],
-  "application/vnd.oipf.spdiscovery+xml": [],
-  "application/vnd.oipf.spdlist+xml": [],
-  "application/vnd.oipf.ueprofile+xml": [],
-  "application/vnd.oipf.userprofile+xml": [],
-  "application/vnd.olpc-sugar": [
-    "xo"
-  ],
-  "application/vnd.oma-scws-config": [],
-  "application/vnd.oma-scws-http-request": [],
-  "application/vnd.oma-scws-http-response": [],
-  "application/vnd.oma.bcast.associated-procedure-parameter+xml": [],
-  "application/vnd.oma.bcast.drm-trigger+xml": [],
-  "application/vnd.oma.bcast.imd+xml": [],
-  "application/vnd.oma.bcast.ltkm": [],
-  "application/vnd.oma.bcast.notification+xml": [],
-  "application/vnd.oma.bcast.provisioningtrigger": [],
-  "application/vnd.oma.bcast.sgboot": [],
-  "application/vnd.oma.bcast.sgdd+xml": [],
-  "application/vnd.oma.bcast.sgdu": [],
-  "application/vnd.oma.bcast.simple-symbol-container": [],
-  "application/vnd.oma.bcast.smartcard-trigger+xml": [],
-  "application/vnd.oma.bcast.sprov+xml": [],
-  "application/vnd.oma.bcast.stkm": [],
-  "application/vnd.oma.cab-address-book+xml": [],
-  "application/vnd.oma.cab-feature-handler+xml": [],
-  "application/vnd.oma.cab-pcc+xml": [],
-  "application/vnd.oma.cab-user-prefs+xml": [],
-  "application/vnd.oma.dcd": [],
-  "application/vnd.oma.dcdc": [],
-  "application/vnd.oma.dd2+xml": [
-    "dd2"
-  ],
-  "application/vnd.oma.drm.risd+xml": [],
-  "application/vnd.oma.group-usage-list+xml": [],
-  "application/vnd.oma.pal+xml": [],
-  "application/vnd.oma.poc.detailed-progress-report+xml": [],
-  "application/vnd.oma.poc.final-report+xml": [],
-  "application/vnd.oma.poc.groups+xml": [],
-  "application/vnd.oma.poc.invocation-descriptor+xml": [],
-  "application/vnd.oma.poc.optimized-progress-report+xml": [],
-  "application/vnd.oma.push": [],
-  "application/vnd.oma.scidm.messages+xml": [],
-  "application/vnd.oma.xcap-directory+xml": [],
-  "application/vnd.omads-email+xml": [],
-  "application/vnd.omads-file+xml": [],
-  "application/vnd.omads-folder+xml": [],
-  "application/vnd.omaloc-supl-init": [],
-  "application/vnd.openofficeorg.extension": [
-    "oxt"
-  ],
-  "application/vnd.openxmlformats-officedocument.custom-properties+xml": [],
-  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawing+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [],
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [],
-  "application/vnd.openxmlformats-officedocument.extended-properties+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation": [
-    "pptx"
-  ],
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.slide": [
-    "sldx"
-  ],
-  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [
-    "ppsx"
-  ],
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.template": [
-    "potx"
-  ],
-  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [
-    "xlsx"
-  ],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [
-    "xltx"
-  ],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [],
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [],
-  "application/vnd.openxmlformats-officedocument.theme+xml": [],
-  "application/vnd.openxmlformats-officedocument.themeoverride+xml": [],
-  "application/vnd.openxmlformats-officedocument.vmldrawing": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
-    "docx"
-  ],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [
-    "dotx"
-  ],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [],
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [],
-  "application/vnd.openxmlformats-package.core-properties+xml": [],
-  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [],
-  "application/vnd.openxmlformats-package.relationships+xml": [],
-  "application/vnd.quobject-quoxdocument": [],
-  "application/vnd.osa.netdeploy": [],
-  "application/vnd.osgeo.mapguide.package": [
-    "mgp"
-  ],
-  "application/vnd.osgi.bundle": [],
-  "application/vnd.osgi.dp": [
-    "dp"
-  ],
-  "application/vnd.osgi.subsystem": [
-    "esa"
-  ],
-  "application/vnd.otps.ct-kip+xml": [],
-  "application/vnd.palm": [
-    "pdb",
-    "pqa",
-    "oprc"
-  ],
-  "application/vnd.paos.xml": [],
-  "application/vnd.pawaafile": [
-    "paw"
-  ],
-  "application/vnd.pg.format": [
-    "str"
-  ],
-  "application/vnd.pg.osasli": [
-    "ei6"
-  ],
-  "application/vnd.piaccess.application-licence": [],
-  "application/vnd.picsel": [
-    "efif"
-  ],
-  "application/vnd.pmi.widget": [
-    "wg"
-  ],
-  "application/vnd.poc.group-advertisement+xml": [],
-  "application/vnd.pocketlearn": [
-    "plf"
-  ],
-  "application/vnd.powerbuilder6": [
-    "pbd"
-  ],
-  "application/vnd.powerbuilder6-s": [],
-  "application/vnd.powerbuilder7": [],
-  "application/vnd.powerbuilder7-s": [],
-  "application/vnd.powerbuilder75": [],
-  "application/vnd.powerbuilder75-s": [],
-  "application/vnd.preminet": [],
-  "application/vnd.previewsystems.box": [
-    "box"
-  ],
-  "application/vnd.proteus.magazine": [
-    "mgz"
-  ],
-  "application/vnd.publishare-delta-tree": [
-    "qps"
-  ],
-  "application/vnd.pvi.ptid1": [
-    "ptid"
-  ],
-  "application/vnd.pwg-multiplexed": [],
-  "application/vnd.pwg-xhtml-print+xml": [],
-  "application/vnd.qualcomm.brew-app-res": [],
-  "application/vnd.quark.quarkxpress": [
-    "qxd",
-    "qxt",
-    "qwd",
-    "qwt",
-    "qxl",
-    "qxb"
-  ],
-  "application/vnd.radisys.moml+xml": [],
-  "application/vnd.radisys.msml+xml": [],
-  "application/vnd.radisys.msml-audit+xml": [],
-  "application/vnd.radisys.msml-audit-conf+xml": [],
-  "application/vnd.radisys.msml-audit-conn+xml": [],
-  "application/vnd.radisys.msml-audit-dialog+xml": [],
-  "application/vnd.radisys.msml-audit-stream+xml": [],
-  "application/vnd.radisys.msml-conf+xml": [],
-  "application/vnd.radisys.msml-dialog+xml": [],
-  "application/vnd.radisys.msml-dialog-base+xml": [],
-  "application/vnd.radisys.msml-dialog-fax-detect+xml": [],
-  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [],
-  "application/vnd.radisys.msml-dialog-group+xml": [],
-  "application/vnd.radisys.msml-dialog-speech+xml": [],
-  "application/vnd.radisys.msml-dialog-transform+xml": [],
-  "application/vnd.rainstor.data": [],
-  "application/vnd.rapid": [],
-  "application/vnd.realvnc.bed": [
-    "bed"
-  ],
-  "application/vnd.recordare.musicxml": [
-    "mxl"
-  ],
-  "application/vnd.recordare.musicxml+xml": [
-    "musicxml"
-  ],
-  "application/vnd.renlearn.rlprint": [],
-  "application/vnd.rig.cryptonote": [
-    "cryptonote"
-  ],
-  "application/vnd.rim.cod": [
-    "cod"
-  ],
-  "application/vnd.rn-realmedia": [
-    "rm"
-  ],
-  "application/vnd.rn-realmedia-vbr": [
-    "rmvb"
-  ],
-  "application/vnd.route66.link66+xml": [
-    "link66"
-  ],
-  "application/vnd.rs-274x": [],
-  "application/vnd.ruckus.download": [],
-  "application/vnd.s3sms": [],
-  "application/vnd.sailingtracker.track": [
-    "st"
-  ],
-  "application/vnd.sbm.cid": [],
-  "application/vnd.sbm.mid2": [],
-  "application/vnd.scribus": [],
-  "application/vnd.sealed.3df": [],
-  "application/vnd.sealed.csf": [],
-  "application/vnd.sealed.doc": [],
-  "application/vnd.sealed.eml": [],
-  "application/vnd.sealed.mht": [],
-  "application/vnd.sealed.net": [],
-  "application/vnd.sealed.ppt": [],
-  "application/vnd.sealed.tiff": [],
-  "application/vnd.sealed.xls": [],
-  "application/vnd.sealedmedia.softseal.html": [],
-  "application/vnd.sealedmedia.softseal.pdf": [],
-  "application/vnd.seemail": [
-    "see"
-  ],
-  "application/vnd.sema": [
-    "sema"
-  ],
-  "application/vnd.semd": [
-    "semd"
-  ],
-  "application/vnd.semf": [
-    "semf"
-  ],
-  "application/vnd.shana.informed.formdata": [
-    "ifm"
-  ],
-  "application/vnd.shana.informed.formtemplate": [
-    "itp"
-  ],
-  "application/vnd.shana.informed.interchange": [
-    "iif"
-  ],
-  "application/vnd.shana.informed.package": [
-    "ipk"
-  ],
-  "application/vnd.simtech-mindmapper": [
-    "twd",
-    "twds"
-  ],
-  "application/vnd.smaf": [
-    "mmf"
-  ],
-  "application/vnd.smart.notebook": [],
-  "application/vnd.smart.teacher": [
-    "teacher"
-  ],
-  "application/vnd.software602.filler.form+xml": [],
-  "application/vnd.software602.filler.form-xml-zip": [],
-  "application/vnd.solent.sdkm+xml": [
-    "sdkm",
-    "sdkd"
-  ],
-  "application/vnd.spotfire.dxp": [
-    "dxp"
-  ],
-  "application/vnd.spotfire.sfs": [
-    "sfs"
-  ],
-  "application/vnd.sss-cod": [],
-  "application/vnd.sss-dtf": [],
-  "application/vnd.sss-ntf": [],
-  "application/vnd.stardivision.calc": [
-    "sdc"
-  ],
-  "application/vnd.stardivision.draw": [
-    "sda"
-  ],
-  "application/vnd.stardivision.impress": [
-    "sdd"
-  ],
-  "application/vnd.stardivision.math": [
-    "smf"
-  ],
-  "application/vnd.stardivision.writer": [
-    "sdw",
-    "vor"
-  ],
-  "application/vnd.stardivision.writer-global": [
-    "sgl"
-  ],
-  "application/vnd.stepmania.package": [
-    "smzip"
-  ],
-  "application/vnd.stepmania.stepchart": [
-    "sm"
-  ],
-  "application/vnd.street-stream": [],
-  "application/vnd.sun.xml.calc": [
-    "sxc"
-  ],
-  "application/vnd.sun.xml.calc.template": [
-    "stc"
-  ],
-  "application/vnd.sun.xml.draw": [
-    "sxd"
-  ],
-  "application/vnd.sun.xml.draw.template": [
-    "std"
-  ],
-  "application/vnd.sun.xml.impress": [
-    "sxi"
-  ],
-  "application/vnd.sun.xml.impress.template": [
-    "sti"
-  ],
-  "application/vnd.sun.xml.math": [
-    "sxm"
-  ],
-  "application/vnd.sun.xml.writer": [
-    "sxw"
-  ],
-  "application/vnd.sun.xml.writer.global": [
-    "sxg"
-  ],
-  "application/vnd.sun.xml.writer.template": [
-    "stw"
-  ],
-  "application/vnd.sun.wadl+xml": [],
-  "application/vnd.sus-calendar": [
-    "sus",
-    "susp"
-  ],
-  "application/vnd.svd": [
-    "svd"
-  ],
-  "application/vnd.swiftview-ics": [],
-  "application/vnd.symbian.install": [
-    "sis",
-    "sisx"
-  ],
-  "application/vnd.syncml+xml": [
-    "xsm"
-  ],
-  "application/vnd.syncml.dm+wbxml": [
-    "bdm"
-  ],
-  "application/vnd.syncml.dm+xml": [
-    "xdm"
-  ],
-  "application/vnd.syncml.dm.notification": [],
-  "application/vnd.syncml.ds.notification": [],
-  "application/vnd.tao.intent-module-archive": [
-    "tao"
-  ],
-  "application/vnd.tcpdump.pcap": [
-    "pcap",
-    "cap",
-    "dmp"
-  ],
-  "application/vnd.tmobile-livetv": [
-    "tmo"
-  ],
-  "application/vnd.trid.tpt": [
-    "tpt"
-  ],
-  "application/vnd.triscape.mxs": [
-    "mxs"
-  ],
-  "application/vnd.trueapp": [
-    "tra"
-  ],
-  "application/vnd.truedoc": [],
-  "application/vnd.ubisoft.webplayer": [],
-  "application/vnd.ufdl": [
-    "ufd",
-    "ufdl"
-  ],
-  "application/vnd.uiq.theme": [
-    "utz"
-  ],
-  "application/vnd.umajin": [
-    "umj"
-  ],
-  "application/vnd.unity": [
-    "unityweb"
-  ],
-  "application/vnd.uoml+xml": [
-    "uoml"
-  ],
-  "application/vnd.uplanet.alert": [],
-  "application/vnd.uplanet.alert-wbxml": [],
-  "application/vnd.uplanet.bearer-choice": [],
-  "application/vnd.uplanet.bearer-choice-wbxml": [],
-  "application/vnd.uplanet.cacheop": [],
-  "application/vnd.uplanet.cacheop-wbxml": [],
-  "application/vnd.uplanet.channel": [],
-  "application/vnd.uplanet.channel-wbxml": [],
-  "application/vnd.uplanet.list": [],
-  "application/vnd.uplanet.list-wbxml": [],
-  "application/vnd.uplanet.listcmd": [],
-  "application/vnd.uplanet.listcmd-wbxml": [],
-  "application/vnd.uplanet.signal": [],
-  "application/vnd.vcx": [
-    "vcx"
-  ],
-  "application/vnd.vd-study": [],
-  "application/vnd.vectorworks": [],
-  "application/vnd.verimatrix.vcas": [],
-  "application/vnd.vidsoft.vidconference": [],
-  "application/vnd.visio": [
-    "vsd",
-    "vst",
-    "vss",
-    "vsw"
-  ],
-  "application/vnd.visionary": [
-    "vis"
-  ],
-  "application/vnd.vividence.scriptfile": [],
-  "application/vnd.vsf": [
-    "vsf"
-  ],
-  "application/vnd.wap.sic": [],
-  "application/vnd.wap.slc": [],
-  "application/vnd.wap.wbxml": [
-    "wbxml"
-  ],
-  "application/vnd.wap.wmlc": [
-    "wmlc"
-  ],
-  "application/vnd.wap.wmlscriptc": [
-    "wmlsc"
-  ],
-  "application/vnd.webturbo": [
-    "wtb"
-  ],
-  "application/vnd.wfa.wsc": [],
-  "application/vnd.wmc": [],
-  "application/vnd.wmf.bootstrap": [],
-  "application/vnd.wolfram.mathematica": [],
-  "application/vnd.wolfram.mathematica.package": [],
-  "application/vnd.wolfram.player": [
-    "nbp"
-  ],
-  "application/vnd.wordperfect": [
-    "wpd"
-  ],
-  "application/vnd.wqd": [
-    "wqd"
-  ],
-  "application/vnd.wrq-hp3000-labelled": [],
-  "application/vnd.wt.stf": [
-    "stf"
-  ],
-  "application/vnd.wv.csp+wbxml": [],
-  "application/vnd.wv.csp+xml": [],
-  "application/vnd.wv.ssp+xml": [],
-  "application/vnd.xara": [
-    "xar"
-  ],
-  "application/vnd.xfdl": [
-    "xfdl"
-  ],
-  "application/vnd.xfdl.webform": [],
-  "application/vnd.xmi+xml": [],
-  "application/vnd.xmpie.cpkg": [],
-  "application/vnd.xmpie.dpkg": [],
-  "application/vnd.xmpie.plan": [],
-  "application/vnd.xmpie.ppkg": [],
-  "application/vnd.xmpie.xlim": [],
-  "application/vnd.yamaha.hv-dic": [
-    "hvd"
-  ],
-  "application/vnd.yamaha.hv-script": [
-    "hvs"
-  ],
-  "application/vnd.yamaha.hv-voice": [
-    "hvp"
-  ],
-  "application/vnd.yamaha.openscoreformat": [
-    "osf"
-  ],
-  "application/vnd.yamaha.openscoreformat.osfpvg+xml": [
-    "osfpvg"
-  ],
-  "application/vnd.yamaha.remote-setup": [],
-  "application/vnd.yamaha.smaf-audio": [
-    "saf"
-  ],
-  "application/vnd.yamaha.smaf-phrase": [
-    "spf"
-  ],
-  "application/vnd.yamaha.through-ngn": [],
-  "application/vnd.yamaha.tunnel-udpencap": [],
-  "application/vnd.yellowriver-custom-menu": [
-    "cmp"
-  ],
-  "application/vnd.zul": [
-    "zir",
-    "zirz"
-  ],
-  "application/vnd.zzazz.deck+xml": [
-    "zaz"
-  ],
-  "application/voicexml+xml": [
-    "vxml"
-  ],
-  "application/vq-rtcpxr": [],
-  "application/watcherinfo+xml": [],
-  "application/whoispp-query": [],
-  "application/whoispp-response": [],
-  "application/widget": [
-    "wgt"
-  ],
-  "application/winhlp": [
-    "hlp"
-  ],
-  "application/wita": [],
-  "application/wordperfect5.1": [],
-  "application/wsdl+xml": [
-    "wsdl"
-  ],
-  "application/wspolicy+xml": [
-    "wspolicy"
-  ],
-  "application/x-7z-compressed": [
-    "7z"
-  ],
-  "application/x-abiword": [
-    "abw"
-  ],
-  "application/x-ace-compressed": [
-    "ace"
-  ],
-  "application/x-amf": [],
-  "application/x-apple-diskimage": [
-    "dmg"
-  ],
-  "application/x-authorware-bin": [
-    "aab",
-    "x32",
-    "u32",
-    "vox"
-  ],
-  "application/x-authorware-map": [
-    "aam"
-  ],
-  "application/x-authorware-seg": [
-    "aas"
-  ],
-  "application/x-bcpio": [
-    "bcpio"
-  ],
-  "application/x-bittorrent": [
-    "torrent"
-  ],
-  "application/x-blorb": [
-    "blb",
-    "blorb"
-  ],
-  "application/x-bzip": [
-    "bz"
-  ],
-  "application/x-bzip2": [
-    "bz2",
-    "boz"
-  ],
-  "application/x-cbr": [
-    "cbr",
-    "cba",
-    "cbt",
-    "cbz",
-    "cb7"
-  ],
-  "application/x-cdlink": [
-    "vcd"
-  ],
-  "application/x-cfs-compressed": [
-    "cfs"
-  ],
-  "application/x-chat": [
-    "chat"
-  ],
-  "application/x-chess-pgn": [
-    "pgn"
-  ],
-  "application/x-conference": [
-    "nsc"
-  ],
-  "application/x-compress": [],
-  "application/x-cpio": [
-    "cpio"
-  ],
-  "application/x-csh": [
-    "csh"
-  ],
-  "application/x-debian-package": [
-    "deb",
-    "udeb"
-  ],
-  "application/x-dgc-compressed": [
-    "dgc"
-  ],
-  "application/x-director": [
-    "dir",
-    "dcr",
-    "dxr",
-    "cst",
-    "cct",
-    "cxt",
-    "w3d",
-    "fgd",
-    "swa"
-  ],
-  "application/x-doom": [
-    "wad"
-  ],
-  "application/x-dtbncx+xml": [
-    "ncx"
-  ],
-  "application/x-dtbook+xml": [
-    "dtb"
-  ],
-  "application/x-dtbresource+xml": [
-    "res"
-  ],
-  "application/x-dvi": [
-    "dvi"
-  ],
-  "application/x-envoy": [
-    "evy"
-  ],
-  "application/x-eva": [
-    "eva"
-  ],
-  "application/x-font-bdf": [
-    "bdf"
-  ],
-  "application/x-font-dos": [],
-  "application/x-font-framemaker": [],
-  "application/x-font-ghostscript": [
-    "gsf"
-  ],
-  "application/x-font-libgrx": [],
-  "application/x-font-linux-psf": [
-    "psf"
-  ],
-  "application/x-font-otf": [
-    "otf"
-  ],
-  "application/x-font-pcf": [
-    "pcf"
-  ],
-  "application/x-font-snf": [
-    "snf"
-  ],
-  "application/x-font-speedo": [],
-  "application/x-font-sunos-news": [],
-  "application/x-font-ttf": [
-    "ttf",
-    "ttc"
-  ],
-  "application/x-font-type1": [
-    "pfa",
-    "pfb",
-    "pfm",
-    "afm"
-  ],
-  "application/font-woff": [
-    "woff"
-  ],
-  "application/x-font-vfont": [],
-  "application/x-freearc": [
-    "arc"
-  ],
-  "application/x-futuresplash": [
-    "spl"
-  ],
-  "application/x-gca-compressed": [
-    "gca"
-  ],
-  "application/x-glulx": [
-    "ulx"
-  ],
-  "application/x-gnumeric": [
-    "gnumeric"
-  ],
-  "application/x-gramps-xml": [
-    "gramps"
-  ],
-  "application/x-gtar": [
-    "gtar"
-  ],
-  "application/x-gzip": [],
-  "application/x-hdf": [
-    "hdf"
-  ],
-  "application/x-install-instructions": [
-    "install"
-  ],
-  "application/x-iso9660-image": [
-    "iso"
-  ],
-  "application/x-java-jnlp-file": [
-    "jnlp"
-  ],
-  "application/x-latex": [
-    "latex"
-  ],
-  "application/x-lzh-compressed": [
-    "lzh",
-    "lha"
-  ],
-  "application/x-mie": [
-    "mie"
-  ],
-  "application/x-mobipocket-ebook": [
-    "prc",
-    "mobi"
-  ],
-  "application/x-ms-application": [
-    "application"
-  ],
-  "application/x-ms-shortcut": [
-    "lnk"
-  ],
-  "application/x-ms-wmd": [
-    "wmd"
-  ],
-  "application/x-ms-wmz": [
-    "wmz"
-  ],
-  "application/x-ms-xbap": [
-    "xbap"
-  ],
-  "application/x-msaccess": [
-    "mdb"
-  ],
-  "application/x-msbinder": [
-    "obd"
-  ],
-  "application/x-mscardfile": [
-    "crd"
-  ],
-  "application/x-msclip": [
-    "clp"
-  ],
-  "application/x-msdownload": [
-    "exe",
-    "dll",
-    "com",
-    "bat",
-    "msi"
-  ],
-  "application/x-msmediaview": [
-    "mvb",
-    "m13",
-    "m14"
-  ],
-  "application/x-msmetafile": [
-    "wmf",
-    "wmz",
-    "emf",
-    "emz"
-  ],
-  "application/x-msmoney": [
-    "mny"
-  ],
-  "application/x-mspublisher": [
-    "pub"
-  ],
-  "application/x-msschedule": [
-    "scd"
-  ],
-  "application/x-msterminal": [
-    "trm"
-  ],
-  "application/x-mswrite": [
-    "wri"
-  ],
-  "application/x-netcdf": [
-    "nc",
-    "cdf"
-  ],
-  "application/x-nzb": [
-    "nzb"
-  ],
-  "application/x-pkcs12": [
-    "p12",
-    "pfx"
-  ],
-  "application/x-pkcs7-certificates": [
-    "p7b",
-    "spc"
-  ],
-  "application/x-pkcs7-certreqresp": [
-    "p7r"
-  ],
-  "application/x-rar-compressed": [
-    "rar"
-  ],
-  "application/x-research-info-systems": [
-    "ris"
-  ],
-  "application/x-sh": [
-    "sh"
-  ],
-  "application/x-shar": [
-    "shar"
-  ],
-  "application/x-shockwave-flash": [
-    "swf"
-  ],
-  "application/x-silverlight-app": [
-    "xap"
-  ],
-  "application/x-sql": [
-    "sql"
-  ],
-  "application/x-stuffit": [
-    "sit"
-  ],
-  "application/x-stuffitx": [
-    "sitx"
-  ],
-  "application/x-subrip": [
-    "srt"
-  ],
-  "application/x-sv4cpio": [
-    "sv4cpio"
-  ],
-  "application/x-sv4crc": [
-    "sv4crc"
-  ],
-  "application/x-t3vm-image": [
-    "t3"
-  ],
-  "application/x-tads": [
-    "gam"
-  ],
-  "application/x-tar": [
-    "tar"
-  ],
-  "application/x-tcl": [
-    "tcl"
-  ],
-  "application/x-tex": [
-    "tex"
-  ],
-  "application/x-tex-tfm": [
-    "tfm"
-  ],
-  "application/x-texinfo": [
-    "texinfo",
-    "texi"
-  ],
-  "application/x-tgif": [
-    "obj"
-  ],
-  "application/x-ustar": [
-    "ustar"
-  ],
-  "application/x-wais-source": [
-    "src"
-  ],
-  "application/x-x509-ca-cert": [
-    "der",
-    "crt"
-  ],
-  "application/x-xfig": [
-    "fig"
-  ],
-  "application/x-xliff+xml": [
-    "xlf"
-  ],
-  "application/x-xpinstall": [
-    "xpi"
-  ],
-  "application/x-xz": [
-    "xz"
-  ],
-  "application/x-zmachine": [
-    "z1",
-    "z2",
-    "z3",
-    "z4",
-    "z5",
-    "z6",
-    "z7",
-    "z8"
-  ],
-  "application/x400-bp": [],
-  "application/xaml+xml": [
-    "xaml"
-  ],
-  "application/xcap-att+xml": [],
-  "application/xcap-caps+xml": [],
-  "application/xcap-diff+xml": [
-    "xdf"
-  ],
-  "application/xcap-el+xml": [],
-  "application/xcap-error+xml": [],
-  "application/xcap-ns+xml": [],
-  "application/xcon-conference-info-diff+xml": [],
-  "application/xcon-conference-info+xml": [],
-  "application/xenc+xml": [
-    "xenc"
-  ],
-  "application/xhtml+xml": [
-    "xhtml",
-    "xht"
-  ],
-  "application/xhtml-voice+xml": [],
-  "application/xml": [
-    "xml",
-    "xsl"
-  ],
-  "application/xml-dtd": [
-    "dtd"
-  ],
-  "application/xml-external-parsed-entity": [],
-  "application/xmpp+xml": [],
-  "application/xop+xml": [
-    "xop"
-  ],
-  "application/xproc+xml": [
-    "xpl"
-  ],
-  "application/xslt+xml": [
-    "xslt"
-  ],
-  "application/xspf+xml": [
-    "xspf"
-  ],
-  "application/xv+xml": [
-    "mxml",
-    "xhvml",
-    "xvml",
-    "xvm"
-  ],
-  "application/yang": [
-    "yang"
-  ],
-  "application/yin+xml": [
-    "yin"
-  ],
-  "application/zip": [
-    "zip"
-  ],
-  "audio/1d-interleaved-parityfec": [],
-  "audio/32kadpcm": [],
-  "audio/3gpp": [],
-  "audio/3gpp2": [],
-  "audio/ac3": [],
-  "audio/adpcm": [
-    "adp"
-  ],
-  "audio/amr": [],
-  "audio/amr-wb": [],
-  "audio/amr-wb+": [],
-  "audio/asc": [],
-  "audio/atrac-advanced-lossless": [],
-  "audio/atrac-x": [],
-  "audio/atrac3": [],
-  "audio/basic": [
-    "au",
-    "snd"
-  ],
-  "audio/bv16": [],
-  "audio/bv32": [],
-  "audio/clearmode": [],
-  "audio/cn": [],
-  "audio/dat12": [],
-  "audio/dls": [],
-  "audio/dsr-es201108": [],
-  "audio/dsr-es202050": [],
-  "audio/dsr-es202211": [],
-  "audio/dsr-es202212": [],
-  "audio/dv": [],
-  "audio/dvi4": [],
-  "audio/eac3": [],
-  "audio/evrc": [],
-  "audio/evrc-qcp": [],
-  "audio/evrc0": [],
-  "audio/evrc1": [],
-  "audio/evrcb": [],
-  "audio/evrcb0": [],
-  "audio/evrcb1": [],
-  "audio/evrcwb": [],
-  "audio/evrcwb0": [],
-  "audio/evrcwb1": [],
-  "audio/example": [],
-  "audio/fwdred": [],
-  "audio/g719": [],
-  "audio/g722": [],
-  "audio/g7221": [],
-  "audio/g723": [],
-  "audio/g726-16": [],
-  "audio/g726-24": [],
-  "audio/g726-32": [],
-  "audio/g726-40": [],
-  "audio/g728": [],
-  "audio/g729": [],
-  "audio/g7291": [],
-  "audio/g729d": [],
-  "audio/g729e": [],
-  "audio/gsm": [],
-  "audio/gsm-efr": [],
-  "audio/gsm-hr-08": [],
-  "audio/ilbc": [],
-  "audio/ip-mr_v2.5": [],
-  "audio/isac": [],
-  "audio/l16": [],
-  "audio/l20": [],
-  "audio/l24": [],
-  "audio/l8": [],
-  "audio/lpc": [],
-  "audio/midi": [
-    "mid",
-    "midi",
-    "kar",
-    "rmi"
-  ],
-  "audio/mobile-xmf": [],
-  "audio/mp4": [
-    "mp4a"
-  ],
-  "audio/mp4a-latm": [],
-  "audio/mpa": [],
-  "audio/mpa-robust": [],
-  "audio/mpeg": [
-    "mpga",
-    "mp2",
-    "mp2a",
-    "mp3",
-    "m2a",
-    "m3a"
-  ],
-  "audio/mpeg4-generic": [],
-  "audio/musepack": [],
-  "audio/ogg": [
-    "oga",
-    "ogg",
-    "spx"
-  ],
-  "audio/opus": [],
-  "audio/parityfec": [],
-  "audio/pcma": [],
-  "audio/pcma-wb": [],
-  "audio/pcmu-wb": [],
-  "audio/pcmu": [],
-  "audio/prs.sid": [],
-  "audio/qcelp": [],
-  "audio/red": [],
-  "audio/rtp-enc-aescm128": [],
-  "audio/rtp-midi": [],
-  "audio/rtx": [],
-  "audio/s3m": [
-    "s3m"
-  ],
-  "audio/silk": [
-    "sil"
-  ],
-  "audio/smv": [],
-  "audio/smv0": [],
-  "audio/smv-qcp": [],
-  "audio/sp-midi": [],
-  "audio/speex": [],
-  "audio/t140c": [],
-  "audio/t38": [],
-  "audio/telephone-event": [],
-  "audio/tone": [],
-  "audio/uemclip": [],
-  "audio/ulpfec": [],
-  "audio/vdvi": [],
-  "audio/vmr-wb": [],
-  "audio/vnd.3gpp.iufp": [],
-  "audio/vnd.4sb": [],
-  "audio/vnd.audiokoz": [],
-  "audio/vnd.celp": [],
-  "audio/vnd.cisco.nse": [],
-  "audio/vnd.cmles.radio-events": [],
-  "audio/vnd.cns.anp1": [],
-  "audio/vnd.cns.inf1": [],
-  "audio/vnd.dece.audio": [
-    "uva",
-    "uvva"
-  ],
-  "audio/vnd.digital-winds": [
-    "eol"
-  ],
-  "audio/vnd.dlna.adts": [],
-  "audio/vnd.dolby.heaac.1": [],
-  "audio/vnd.dolby.heaac.2": [],
-  "audio/vnd.dolby.mlp": [],
-  "audio/vnd.dolby.mps": [],
-  "audio/vnd.dolby.pl2": [],
-  "audio/vnd.dolby.pl2x": [],
-  "audio/vnd.dolby.pl2z": [],
-  "audio/vnd.dolby.pulse.1": [],
-  "audio/vnd.dra": [
-    "dra"
-  ],
-  "audio/vnd.dts": [
-    "dts"
-  ],
-  "audio/vnd.dts.hd": [
-    "dtshd"
-  ],
-  "audio/vnd.dvb.file": [],
-  "audio/vnd.everad.plj": [],
-  "audio/vnd.hns.audio": [],
-  "audio/vnd.lucent.voice": [
-    "lvp"
-  ],
-  "audio/vnd.ms-playready.media.pya": [
-    "pya"
-  ],
-  "audio/vnd.nokia.mobile-xmf": [],
-  "audio/vnd.nortel.vbk": [],
-  "audio/vnd.nuera.ecelp4800": [
-    "ecelp4800"
-  ],
-  "audio/vnd.nuera.ecelp7470": [
-    "ecelp7470"
-  ],
-  "audio/vnd.nuera.ecelp9600": [
-    "ecelp9600"
-  ],
-  "audio/vnd.octel.sbc": [],
-  "audio/vnd.qcelp": [],
-  "audio/vnd.rhetorex.32kadpcm": [],
-  "audio/vnd.rip": [
-    "rip"
-  ],
-  "audio/vnd.sealedmedia.softseal.mpeg": [],
-  "audio/vnd.vmx.cvsd": [],
-  "audio/vorbis": [],
-  "audio/vorbis-config": [],
-  "audio/webm": [
-    "weba"
-  ],
-  "audio/x-aac": [
-    "aac"
-  ],
-  "audio/x-aiff": [
-    "aif",
-    "aiff",
-    "aifc"
-  ],
-  "audio/x-caf": [
-    "caf"
-  ],
-  "audio/x-flac": [
-    "flac"
-  ],
-  "audio/x-matroska": [
-    "mka"
-  ],
-  "audio/x-mpegurl": [
-    "m3u"
-  ],
-  "audio/x-ms-wax": [
-    "wax"
-  ],
-  "audio/x-ms-wma": [
-    "wma"
-  ],
-  "audio/x-pn-realaudio": [
-    "ram",
-    "ra"
-  ],
-  "audio/x-pn-realaudio-plugin": [
-    "rmp"
-  ],
-  "audio/x-tta": [],
-  "audio/x-wav": [
-    "wav"
-  ],
-  "audio/xm": [
-    "xm"
-  ],
-  "chemical/x-cdx": [
-    "cdx"
-  ],
-  "chemical/x-cif": [
-    "cif"
-  ],
-  "chemical/x-cmdf": [
-    "cmdf"
-  ],
-  "chemical/x-cml": [
-    "cml"
-  ],
-  "chemical/x-csml": [
-    "csml"
-  ],
-  "chemical/x-pdb": [],
-  "chemical/x-xyz": [
-    "xyz"
-  ],
-  "image/bmp": [
-    "bmp"
-  ],
-  "image/cgm": [
-    "cgm"
-  ],
-  "image/example": [],
-  "image/fits": [],
-  "image/g3fax": [
-    "g3"
-  ],
-  "image/gif": [
-    "gif"
-  ],
-  "image/ief": [
-    "ief"
-  ],
-  "image/jp2": [],
-  "image/jpeg": [
-    "jpeg",
-    "jpg",
-    "jpe"
-  ],
-  "image/jpm": [],
-  "image/jpx": [],
-  "image/ktx": [
-    "ktx"
-  ],
-  "image/naplps": [],
-  "image/png": [
-    "png"
-  ],
-  "image/prs.btif": [
-    "btif"
-  ],
-  "image/prs.pti": [],
-  "image/sgi": [
-    "sgi"
-  ],
-  "image/svg+xml": [
-    "svg",
-    "svgz"
-  ],
-  "image/t38": [],
-  "image/tiff": [
-    "tiff",
-    "tif"
-  ],
-  "image/tiff-fx": [],
-  "image/vnd.adobe.photoshop": [
-    "psd"
-  ],
-  "image/vnd.cns.inf2": [],
-  "image/vnd.dece.graphic": [
-    "uvi",
-    "uvvi",
-    "uvg",
-    "uvvg"
-  ],
-  "image/vnd.dvb.subtitle": [
-    "sub"
-  ],
-  "image/vnd.djvu": [
-    "djvu",
-    "djv"
-  ],
-  "image/vnd.dwg": [
-    "dwg"
-  ],
-  "image/vnd.dxf": [
-    "dxf"
-  ],
-  "image/vnd.fastbidsheet": [
-    "fbs"
-  ],
-  "image/vnd.fpx": [
-    "fpx"
-  ],
-  "image/vnd.fst": [
-    "fst"
-  ],
-  "image/vnd.fujixerox.edmics-mmr": [
-    "mmr"
-  ],
-  "image/vnd.fujixerox.edmics-rlc": [
-    "rlc"
-  ],
-  "image/vnd.globalgraphics.pgb": [],
-  "image/vnd.microsoft.icon": [],
-  "image/vnd.mix": [],
-  "image/vnd.ms-modi": [
-    "mdi"
-  ],
-  "image/vnd.ms-photo": [
-    "wdp"
-  ],
-  "image/vnd.net-fpx": [
-    "npx"
-  ],
-  "image/vnd.radiance": [],
-  "image/vnd.sealed.png": [],
-  "image/vnd.sealedmedia.softseal.gif": [],
-  "image/vnd.sealedmedia.softseal.jpg": [],
-  "image/vnd.svf": [],
-  "image/vnd.wap.wbmp": [
-    "wbmp"
-  ],
-  "image/vnd.xiff": [
-    "xif"
-  ],
-  "image/webp": [
-    "webp"
-  ],
-  "image/x-3ds": [
-    "3ds"
-  ],
-  "image/x-cmu-raster": [
-    "ras"
-  ],
-  "image/x-cmx": [
-    "cmx"
-  ],
-  "image/x-freehand": [
-    "fh",
-    "fhc",
-    "fh4",
-    "fh5",
-    "fh7"
-  ],
-  "image/x-icon": [
-    "ico"
-  ],
-  "image/x-mrsid-image": [
-    "sid"
-  ],
-  "image/x-pcx": [
-    "pcx"
-  ],
-  "image/x-pict": [
-    "pic",
-    "pct"
-  ],
-  "image/x-portable-anymap": [
-    "pnm"
-  ],
-  "image/x-portable-bitmap": [
-    "pbm"
-  ],
-  "image/x-portable-graymap": [
-    "pgm"
-  ],
-  "image/x-portable-pixmap": [
-    "ppm"
-  ],
-  "image/x-rgb": [
-    "rgb"
-  ],
-  "image/x-tga": [
-    "tga"
-  ],
-  "image/x-xbitmap": [
-    "xbm"
-  ],
-  "image/x-xpixmap": [
-    "xpm"
-  ],
-  "image/x-xwindowdump": [
-    "xwd"
-  ],
-  "message/cpim": [],
-  "message/delivery-status": [],
-  "message/disposition-notification": [],
-  "message/example": [],
-  "message/external-body": [],
-  "message/feedback-report": [],
-  "message/global": [],
-  "message/global-delivery-status": [],
-  "message/global-disposition-notification": [],
-  "message/global-headers": [],
-  "message/http": [],
-  "message/imdn+xml": [],
-  "message/news": [],
-  "message/partial": [],
-  "message/rfc822": [
-    "eml",
-    "mime"
-  ],
-  "message/s-http": [],
-  "message/sip": [],
-  "message/sipfrag": [],
-  "message/tracking-status": [],
-  "message/vnd.si.simp": [],
-  "model/example": [],
-  "model/iges": [
-    "igs",
-    "iges"
-  ],
-  "model/mesh": [
-    "msh",
-    "mesh",
-    "silo"
-  ],
-  "model/vnd.collada+xml": [
-    "dae"
-  ],
-  "model/vnd.dwf": [
-    "dwf"
-  ],
-  "model/vnd.flatland.3dml": [],
-  "model/vnd.gdl": [
-    "gdl"
-  ],
-  "model/vnd.gs-gdl": [],
-  "model/vnd.gs.gdl": [],
-  "model/vnd.gtw": [
-    "gtw"
-  ],
-  "model/vnd.moml+xml": [],
-  "model/vnd.mts": [
-    "mts"
-  ],
-  "model/vnd.parasolid.transmit.binary": [],
-  "model/vnd.parasolid.transmit.text": [],
-  "model/vnd.vtu": [
-    "vtu"
-  ],
-  "model/vrml": [
-    "wrl",
-    "vrml"
-  ],
-  "model/x3d+binary": [
-    "x3db",
-    "x3dbz"
-  ],
-  "model/x3d+vrml": [
-    "x3dv",
-    "x3dvz"
-  ],
-  "model/x3d+xml": [
-    "x3d",
-    "x3dz"
-  ],
-  "multipart/alternative": [],
-  "multipart/appledouble": [],
-  "multipart/byteranges": [],
-  "multipart/digest": [],
-  "multipart/encrypted": [],
-  "multipart/example": [],
-  "multipart/form-data": [],
-  "multipart/header-set": [],
-  "multipart/mixed": [],
-  "multipart/parallel": [],
-  "multipart/related": [],
-  "multipart/report": [],
-  "multipart/signed": [],
-  "multipart/voice-message": [],
-  "text/1d-interleaved-parityfec": [],
-  "text/cache-manifest": [
-    "appcache"
-  ],
-  "text/calendar": [
-    "ics",
-    "ifb"
-  ],
-  "text/css": [
-    "css"
-  ],
-  "text/csv": [
-    "csv"
-  ],
-  "text/directory": [],
-  "text/dns": [],
-  "text/ecmascript": [],
-  "text/enriched": [],
-  "text/example": [],
-  "text/fwdred": [],
-  "text/html": [
-    "html",
-    "htm"
-  ],
-  "text/javascript": [],
-  "text/n3": [
-    "n3"
-  ],
-  "text/parityfec": [],
-  "text/plain": [
-    "txt",
-    "text",
-    "conf",
-    "def",
-    "list",
-    "log",
-    "in"
-  ],
-  "text/prs.fallenstein.rst": [],
-  "text/prs.lines.tag": [
-    "dsc"
-  ],
-  "text/vnd.radisys.msml-basic-layout": [],
-  "text/red": [],
-  "text/rfc822-headers": [],
-  "text/richtext": [
-    "rtx"
-  ],
-  "text/rtf": [],
-  "text/rtp-enc-aescm128": [],
-  "text/rtx": [],
-  "text/sgml": [
-    "sgml",
-    "sgm"
-  ],
-  "text/t140": [],
-  "text/tab-separated-values": [
-    "tsv"
-  ],
-  "text/troff": [
-    "t",
-    "tr",
-    "roff",
-    "man",
-    "me",
-    "ms"
-  ],
-  "text/turtle": [
-    "ttl"
-  ],
-  "text/ulpfec": [],
-  "text/uri-list": [
-    "uri",
-    "uris",
-    "urls"
-  ],
-  "text/vcard": [
-    "vcard"
-  ],
-  "text/vnd.abc": [],
-  "text/vnd.curl": [
-    "curl"
-  ],
-  "text/vnd.curl.dcurl": [
-    "dcurl"
-  ],
-  "text/vnd.curl.scurl": [
-    "scurl"
-  ],
-  "text/vnd.curl.mcurl": [
-    "mcurl"
-  ],
-  "text/vnd.dmclientscript": [],
-  "text/vnd.dvb.subtitle": [
-    "sub"
-  ],
-  "text/vnd.esmertec.theme-descriptor": [],
-  "text/vnd.fly": [
-    "fly"
-  ],
-  "text/vnd.fmi.flexstor": [
-    "flx"
-  ],
-  "text/vnd.graphviz": [
-    "gv"
-  ],
-  "text/vnd.in3d.3dml": [
-    "3dml"
-  ],
-  "text/vnd.in3d.spot": [
-    "spot"
-  ],
-  "text/vnd.iptc.newsml": [],
-  "text/vnd.iptc.nitf": [],
-  "text/vnd.latex-z": [],
-  "text/vnd.motorola.reflex": [],
-  "text/vnd.ms-mediapackage": [],
-  "text/vnd.net2phone.commcenter.command": [],
-  "text/vnd.si.uricatalogue": [],
-  "text/vnd.sun.j2me.app-descriptor": [
-    "jad"
-  ],
-  "text/vnd.trolltech.linguist": [],
-  "text/vnd.wap.si": [],
-  "text/vnd.wap.sl": [],
-  "text/vnd.wap.wml": [
-    "wml"
-  ],
-  "text/vnd.wap.wmlscript": [
-    "wmls"
-  ],
-  "text/x-asm": [
-    "s",
-    "asm"
-  ],
-  "text/x-c": [
-    "c",
-    "cc",
-    "cxx",
-    "cpp",
-    "h",
-    "hh",
-    "dic"
-  ],
-  "text/x-fortran": [
-    "f",
-    "for",
-    "f77",
-    "f90"
-  ],
-  "text/x-java-source": [
-    "java"
-  ],
-  "text/x-opml": [
-    "opml"
-  ],
-  "text/x-pascal": [
-    "p",
-    "pas"
-  ],
-  "text/x-nfo": [
-    "nfo"
-  ],
-  "text/x-setext": [
-    "etx"
-  ],
-  "text/x-sfv": [
-    "sfv"
-  ],
-  "text/x-uuencode": [
-    "uu"
-  ],
-  "text/x-vcalendar": [
-    "vcs"
-  ],
-  "text/x-vcard": [
-    "vcf"
-  ],
-  "text/xml": [],
-  "text/xml-external-parsed-entity": [],
-  "video/1d-interleaved-parityfec": [],
-  "video/3gpp": [
-    "3gp"
-  ],
-  "video/3gpp-tt": [],
-  "video/3gpp2": [
-    "3g2"
-  ],
-  "video/bmpeg": [],
-  "video/bt656": [],
-  "video/celb": [],
-  "video/dv": [],
-  "video/example": [],
-  "video/h261": [
-    "h261"
-  ],
-  "video/h263": [
-    "h263"
-  ],
-  "video/h263-1998": [],
-  "video/h263-2000": [],
-  "video/h264": [
-    "h264"
-  ],
-  "video/h264-rcdo": [],
-  "video/h264-svc": [],
-  "video/jpeg": [
-    "jpgv"
-  ],
-  "video/jpeg2000": [],
-  "video/jpm": [
-    "jpm",
-    "jpgm"
-  ],
-  "video/mj2": [
-    "mj2",
-    "mjp2"
-  ],
-  "video/mp1s": [],
-  "video/mp2p": [],
-  "video/mp2t": [],
-  "video/mp4": [
-    "mp4",
-    "mp4v",
-    "mpg4"
-  ],
-  "video/mp4v-es": [],
-  "video/mpeg": [
-    "mpeg",
-    "mpg",
-    "mpe",
-    "m1v",
-    "m2v"
-  ],
-  "video/mpeg4-generic": [],
-  "video/mpv": [],
-  "video/nv": [],
-  "video/ogg": [
-    "ogv"
-  ],
-  "video/parityfec": [],
-  "video/pointer": [],
-  "video/quicktime": [
-    "qt",
-    "mov"
-  ],
-  "video/raw": [],
-  "video/rtp-enc-aescm128": [],
-  "video/rtx": [],
-  "video/smpte292m": [],
-  "video/ulpfec": [],
-  "video/vc1": [],
-  "video/vnd.cctv": [],
-  "video/vnd.dece.hd": [
-    "uvh",
-    "uvvh"
-  ],
-  "video/vnd.dece.mobile": [
-    "uvm",
-    "uvvm"
-  ],
-  "video/vnd.dece.mp4": [],
-  "video/vnd.dece.pd": [
-    "uvp",
-    "uvvp"
-  ],
-  "video/vnd.dece.sd": [
-    "uvs",
-    "uvvs"
-  ],
-  "video/vnd.dece.video": [
-    "uvv",
-    "uvvv"
-  ],
-  "video/vnd.directv.mpeg": [],
-  "video/vnd.directv.mpeg-tts": [],
-  "video/vnd.dlna.mpeg-tts": [],
-  "video/vnd.dvb.file": [
-    "dvb"
-  ],
-  "video/vnd.fvt": [
-    "fvt"
-  ],
-  "video/vnd.hns.video": [],
-  "video/vnd.iptvforum.1dparityfec-1010": [],
-  "video/vnd.iptvforum.1dparityfec-2005": [],
-  "video/vnd.iptvforum.2dparityfec-1010": [],
-  "video/vnd.iptvforum.2dparityfec-2005": [],
-  "video/vnd.iptvforum.ttsavc": [],
-  "video/vnd.iptvforum.ttsmpeg2": [],
-  "video/vnd.motorola.video": [],
-  "video/vnd.motorola.videop": [],
-  "video/vnd.mpegurl": [
-    "mxu",
-    "m4u"
-  ],
-  "video/vnd.ms-playready.media.pyv": [
-    "pyv"
-  ],
-  "video/vnd.nokia.interleaved-multimedia": [],
-  "video/vnd.nokia.videovoip": [],
-  "video/vnd.objectvideo": [],
-  "video/vnd.sealed.mpeg1": [],
-  "video/vnd.sealed.mpeg4": [],
-  "video/vnd.sealed.swf": [],
-  "video/vnd.sealedmedia.softseal.mov": [],
-  "video/vnd.uvvu.mp4": [
-    "uvu",
-    "uvvu"
-  ],
-  "video/vnd.vivo": [
-    "viv"
-  ],
-  "video/webm": [
-    "webm"
-  ],
-  "video/x-f4v": [
-    "f4v"
-  ],
-  "video/x-fli": [
-    "fli"
-  ],
-  "video/x-flv": [
-    "flv"
-  ],
-  "video/x-m4v": [
-    "m4v"
-  ],
-  "video/x-matroska": [
-    "mkv",
-    "mk3d",
-    "mks"
-  ],
-  "video/x-mng": [
-    "mng"
-  ],
-  "video/x-ms-asf": [
-    "asf",
-    "asx"
-  ],
-  "video/x-ms-vob": [
-    "vob"
-  ],
-  "video/x-ms-wm": [
-    "wm"
-  ],
-  "video/x-ms-wmv": [
-    "wmv"
-  ],
-  "video/x-ms-wmx": [
-    "wmx"
-  ],
-  "video/x-ms-wvx": [
-    "wvx"
-  ],
-  "video/x-msvideo": [
-    "avi"
-  ],
-  "video/x-sgi-movie": [
-    "movie"
-  ],
-  "video/x-smv": [
-    "smv"
-  ],
-  "x-conference/x-cooltalk": [
-    "ice"
-  ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/lib/node.json b/deps/npm/node_modules/request/node_modules/mime-types/lib/node.json
deleted file mode 100644 (file)
index ad50d61..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "text/vtt": [
-    "vtt"
-  ],
-  "application/x-chrome-extension": [
-    "crx"
-  ],
-  "text/x-component": [
-    "htc"
-  ],
-  "text/cache-manifest": [
-    "manifest"
-  ],
-  "application/octet-stream": [
-    "buffer"
-  ],
-  "application/mp4": [
-    "m4p"
-  ],
-  "audio/mp4": [
-    "m4a"
-  ],
-  "video/MP2T": [
-    "ts"
-  ],
-  "application/x-web-app-manifest+json": [
-    "webapp"
-  ],
-  "text/x-lua": [
-    "lua"
-  ],
-  "application/x-lua-bytecode": [
-    "luac"
-  ],
-  "text/x-markdown": [
-    "markdown",
-    "md",
-    "mkd"
-  ],
-  "text/plain": [
-    "ini"
-  ],
-  "application/dash+xml": [
-    "mdp"
-  ],
-  "font/opentype": [
-    "otf"
-  ],
-  "application/json": [
-    "map"
-  ],
-  "application/xml": [
-    "xsd"
-  ]
-}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
new file mode 100644 (file)
index 0000000..bd218eb
--- /dev/null
@@ -0,0 +1,160 @@
+1.6.1 / 2015-02-05
+==================
+
+  * Community extensions ownership transferred from `node-mime`
+
+1.6.0 / 2015-01-29
+==================
+
+  * Add `application/jose`
+  * Add `application/jose+json`
+  * Add `application/json-seq`
+  * Add `application/jwk+json`
+  * Add `application/jwk-set+json`
+  * Add `application/jwt`
+  * Add `application/rdap+json`
+  * Add `application/vnd.gov.sk.e-form+xml`
+  * Add `application/vnd.ims.imsccv1p3`
+
+1.5.0 / 2014-12-30
+==================
+
+  * Add `application/vnd.oracle.resource+json`
+  * Fix various invalid MIME type entries
+    - `application/mbox+xml`
+    - `application/oscp-response`
+    - `application/vwg-multiplexed`
+    - `audio/g721`
+
+1.4.0 / 2014-12-21
+==================
+
+  * Add `application/vnd.ims.imsccv1p2`
+  * Fix various invalid MIME type entries
+    - `application/vnd-acucobol`
+    - `application/vnd-curl`
+    - `application/vnd-dart`
+    - `application/vnd-dxr`
+    - `application/vnd-fdf`
+    - `application/vnd-mif`
+    - `application/vnd-sema`
+    - `application/vnd-wap-wmlc`
+    - `application/vnd.adobe.flash-movie`
+    - `application/vnd.dece-zip`
+    - `application/vnd.dvb_service`
+    - `application/vnd.micrografx-igx`
+    - `application/vnd.sealed-doc`
+    - `application/vnd.sealed-eml`
+    - `application/vnd.sealed-mht`
+    - `application/vnd.sealed-ppt`
+    - `application/vnd.sealed-tiff`
+    - `application/vnd.sealed-xls`
+    - `application/vnd.sealedmedia.softseal-html`
+    - `application/vnd.sealedmedia.softseal-pdf`
+    - `application/vnd.wap-slc`
+    - `application/vnd.wap-wbxml`
+    - `audio/vnd.sealedmedia.softseal-mpeg`
+    - `image/vnd-djvu`
+    - `image/vnd-svf`
+    - `image/vnd-wap-wbmp`
+    - `image/vnd.sealed-png`
+    - `image/vnd.sealedmedia.softseal-gif`
+    - `image/vnd.sealedmedia.softseal-jpg`
+    - `model/vnd-dwf`
+    - `model/vnd.parasolid.transmit-binary`
+    - `model/vnd.parasolid.transmit-text`
+    - `text/vnd-a`
+    - `text/vnd-curl`
+    - `text/vnd.wap-wml`
+  * Remove example template MIME types
+    - `application/example`
+    - `audio/example`
+    - `image/example`
+    - `message/example`
+    - `model/example`
+    - `multipart/example`
+    - `text/example`
+    - `video/example`
+
+1.3.1 / 2014-12-16
+==================
+
+  * Fix missing extensions
+    - `application/json5`
+    - `text/hjson`
+
+1.3.0 / 2014-12-07
+==================
+
+  * Add `application/a2l`
+  * Add `application/aml`
+  * Add `application/atfx`
+  * Add `application/atxml`
+  * Add `application/cdfx+xml`
+  * Add `application/dii`
+  * Add `application/json5`
+  * Add `application/lxf`
+  * Add `application/mf4`
+  * Add `application/vnd.apache.thrift.compact`
+  * Add `application/vnd.apache.thrift.json`
+  * Add `application/vnd.coffeescript`
+  * Add `application/vnd.enphase.envoy`
+  * Add `application/vnd.ims.imsccv1p1`
+  * Add `text/csv-schema`
+  * Add `text/hjson`
+  * Add `text/markdown`
+  * Add `text/yaml`
+
+1.2.0 / 2014-11-09
+==================
+
+  * Add `application/cea`
+  * Add `application/dit`
+  * Add `application/vnd.gov.sk.e-form+zip`
+  * Add `application/vnd.tmd.mediaflex.api+xml`
+  * Type `application/epub+zip` is now IANA-registered
+
+1.1.2 / 2014-10-23
+==================
+
+  * Rebuild database for `application/x-www-form-urlencoded` change
+
+1.1.1 / 2014-10-20
+==================
+
+  * Mark `application/x-www-form-urlencoded` as compressible.
+
+1.1.0 / 2014-09-28
+==================
+
+  * Add `application/font-woff2`
+
+1.0.3 / 2014-09-25
+==================
+
+  * Fix engine requirement in package
+
+1.0.2 / 2014-09-25
+==================
+
+  * Add `application/coap-group+json`
+  * Add `application/dcd`
+  * Add `application/vnd.apache.thrift.binary`
+  * Add `image/vnd.tencent.tap`
+  * Mark all JSON-derived types as compressible
+  * Update `text/vtt` data
+
+1.0.1 / 2014-08-30
+==================
+
+  * Fix extension ordering
+
+1.0.0 / 2014-08-30
+==================
+
+  * Add `application/atf`
+  * Add `application/merge-patch+json`
+  * Add `multipart/x-mixed-replace`
+  * Add `source: 'apache'` metadata
+  * Add `source: 'iana'` metadata
+  * Remove badly-assumed charset data
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE
new file mode 100644 (file)
index 0000000..a7ae8ee
--- /dev/null
@@ -0,0 +1,22 @@
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Jonathan Ong me@jongleberry.com
+
+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.
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
new file mode 100644 (file)
index 0000000..25c2a3a
--- /dev/null
@@ -0,0 +1,81 @@
+# mime-db
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][npm-url]
+[![Node.js Version][node-image]][node-url]
+[![Build Status][travis-image]][travis-url]
+[![Coverage Status][coveralls-image]][coveralls-url]
+
+This is a database of all mime types.
+It consists of a single, public JSON file and does not include any logic,
+allowing it to remain as un-opinionated as possible with an API.
+It aggregates data from the following sources:
+
+- http://www.iana.org/assignments/media-types/media-types.xhtml
+- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+
+## Installation
+
+```bash
+npm install mime-db
+```
+
+If you're crazy enough to use this in the browser,
+you can just grab the JSON file:
+
+```
+https://cdn.rawgit.com/jshttp/mime-db/master/db.json
+```
+
+## Usage
+
+```js
+var db = require('mime-db');
+
+// grab data on .js files
+var data = db['application/javascript'];
+```
+
+## Data Structure
+
+The JSON file is a map lookup for lowercased mime types.
+Each mime type has the following properties:
+
+- `.source` - where the mime type is defined.
+    If not set, it's probably a custom media type.
+    - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
+    - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml)
+- `.extensions[]` - known extensions associated with this mime type.
+- `.compressible` - whether a file of this type is can be gzipped.
+- `.charset` - the default charset associated with this type, if any.
+
+If unknown, every property could be `undefined`.
+
+## Repository Structure
+
+- `scripts` - these are scripts to run to build the database
+- `src/` - this is a folder of files created from remote sources like Apache and IANA
+- `lib/` - this is a folder of our own custom sources and db, which will be merged into `db.json`
+- `db.json` - the final built JSON file for end-user usage
+
+## Contributing
+
+To edit the database, only make PRs against files in the `lib/` folder.
+To update the build, run `npm run update`.
+
+## Adding Custom Media Types
+
+The best way to get new media types included in this library is to register
+them with the IANA. The community registration procedure is outlined in
+[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types
+registered with the IANA are automatically pulled into this library.
+
+[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg?style=flat
+[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg?style=flat
+[npm-url]: https://npmjs.org/package/mime-db
+[travis-image]: https://img.shields.io/travis/jshttp/mime-db.svg?style=flat
+[travis-url]: https://travis-ci.org/jshttp/mime-db
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db.svg?style=flat
+[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master
+[node-image]: https://img.shields.io/node/v/mime-db.svg?style=flat
+[node-url]: http://nodejs.org/download/
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
new file mode 100644 (file)
index 0000000..35682db
--- /dev/null
@@ -0,0 +1,6293 @@
+{
+  "application/1d-interleaved-parityfec": {
+    "source": "iana"
+  },
+  "application/3gpdash-qoe-report+xml": {
+    "source": "iana"
+  },
+  "application/3gpp-ims+xml": {
+    "source": "iana"
+  },
+  "application/a2l": {
+    "source": "iana"
+  },
+  "application/activemessage": {
+    "source": "iana"
+  },
+  "application/alto-costmap+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-costmapfilter+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-directory+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-endpointcost+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-endpointcostparams+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-endpointprop+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-endpointpropparams+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-error+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-networkmap+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/alto-networkmapfilter+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/aml": {
+    "source": "iana"
+  },
+  "application/andrew-inset": {
+    "source": "iana",
+    "extensions": ["ez"]
+  },
+  "application/applefile": {
+    "source": "iana"
+  },
+  "application/applixware": {
+    "source": "apache",
+    "extensions": ["aw"]
+  },
+  "application/atf": {
+    "source": "iana"
+  },
+  "application/atfx": {
+    "source": "iana"
+  },
+  "application/atom+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["atom"]
+  },
+  "application/atomcat+xml": {
+    "source": "iana",
+    "extensions": ["atomcat"]
+  },
+  "application/atomdeleted+xml": {
+    "source": "iana"
+  },
+  "application/atomicmail": {
+    "source": "iana"
+  },
+  "application/atomsvc+xml": {
+    "source": "iana",
+    "extensions": ["atomsvc"]
+  },
+  "application/atxml": {
+    "source": "iana"
+  },
+  "application/auth-policy+xml": {
+    "source": "iana"
+  },
+  "application/bacnet-xdd+zip": {
+    "source": "iana"
+  },
+  "application/batch-smtp": {
+    "source": "iana"
+  },
+  "application/beep+xml": {
+    "source": "iana"
+  },
+  "application/calendar+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/calendar+xml": {
+    "source": "iana"
+  },
+  "application/call-completion": {
+    "source": "iana"
+  },
+  "application/cals-1840": {
+    "source": "iana"
+  },
+  "application/cbor": {
+    "source": "iana"
+  },
+  "application/ccmp+xml": {
+    "source": "iana"
+  },
+  "application/ccxml+xml": {
+    "source": "iana",
+    "extensions": ["ccxml"]
+  },
+  "application/cdfx+xml": {
+    "source": "iana"
+  },
+  "application/cdmi-capability": {
+    "source": "iana",
+    "extensions": ["cdmia"]
+  },
+  "application/cdmi-container": {
+    "source": "iana",
+    "extensions": ["cdmic"]
+  },
+  "application/cdmi-domain": {
+    "source": "iana",
+    "extensions": ["cdmid"]
+  },
+  "application/cdmi-object": {
+    "source": "iana",
+    "extensions": ["cdmio"]
+  },
+  "application/cdmi-queue": {
+    "source": "iana",
+    "extensions": ["cdmiq"]
+  },
+  "application/cea": {
+    "source": "iana"
+  },
+  "application/cea-2018+xml": {
+    "source": "iana"
+  },
+  "application/cellml+xml": {
+    "source": "iana"
+  },
+  "application/cfw": {
+    "source": "iana"
+  },
+  "application/cms": {
+    "source": "iana"
+  },
+  "application/cnrp+xml": {
+    "source": "iana"
+  },
+  "application/coap-group+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/commonground": {
+    "source": "iana"
+  },
+  "application/conference-info+xml": {
+    "source": "iana"
+  },
+  "application/cpl+xml": {
+    "source": "iana"
+  },
+  "application/csrattrs": {
+    "source": "iana"
+  },
+  "application/csta+xml": {
+    "source": "iana"
+  },
+  "application/cstadata+xml": {
+    "source": "iana"
+  },
+  "application/cu-seeme": {
+    "source": "apache",
+    "extensions": ["cu"]
+  },
+  "application/cybercash": {
+    "source": "iana"
+  },
+  "application/dart": {
+    "compressible": true
+  },
+  "application/dash+xml": {
+    "source": "iana",
+    "extensions": ["mdp"]
+  },
+  "application/dashdelta": {
+    "source": "iana"
+  },
+  "application/davmount+xml": {
+    "source": "iana",
+    "extensions": ["davmount"]
+  },
+  "application/dca-rft": {
+    "source": "iana"
+  },
+  "application/dcd": {
+    "source": "iana"
+  },
+  "application/dec-dx": {
+    "source": "iana"
+  },
+  "application/dialog-info+xml": {
+    "source": "iana"
+  },
+  "application/dicom": {
+    "source": "iana"
+  },
+  "application/dii": {
+    "source": "iana"
+  },
+  "application/dit": {
+    "source": "iana"
+  },
+  "application/dns": {
+    "source": "iana"
+  },
+  "application/docbook+xml": {
+    "source": "apache",
+    "extensions": ["dbk"]
+  },
+  "application/dskpp+xml": {
+    "source": "iana"
+  },
+  "application/dssc+der": {
+    "source": "iana",
+    "extensions": ["dssc"]
+  },
+  "application/dssc+xml": {
+    "source": "iana",
+    "extensions": ["xdssc"]
+  },
+  "application/dvcs": {
+    "source": "iana"
+  },
+  "application/ecmascript": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["ecma"]
+  },
+  "application/edi-consent": {
+    "source": "iana"
+  },
+  "application/edi-x12": {
+    "source": "iana",
+    "compressible": false
+  },
+  "application/edifact": {
+    "source": "iana",
+    "compressible": false
+  },
+  "application/emma+xml": {
+    "source": "iana",
+    "extensions": ["emma"]
+  },
+  "application/emotionml+xml": {
+    "source": "iana"
+  },
+  "application/encaprtp": {
+    "source": "iana"
+  },
+  "application/epp+xml": {
+    "source": "iana"
+  },
+  "application/epub+zip": {
+    "source": "iana",
+    "extensions": ["epub"]
+  },
+  "application/eshop": {
+    "source": "iana"
+  },
+  "application/exi": {
+    "source": "iana",
+    "extensions": ["exi"]
+  },
+  "application/fastinfoset": {
+    "source": "iana"
+  },
+  "application/fastsoap": {
+    "source": "iana"
+  },
+  "application/fdt+xml": {
+    "source": "iana"
+  },
+  "application/fits": {
+    "source": "iana"
+  },
+  "application/font-sfnt": {
+    "source": "iana"
+  },
+  "application/font-tdpfr": {
+    "source": "iana",
+    "extensions": ["pfr"]
+  },
+  "application/font-woff": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["woff"]
+  },
+  "application/font-woff2": {
+    "compressible": false,
+    "extensions": ["woff2"]
+  },
+  "application/framework-attributes+xml": {
+    "source": "iana"
+  },
+  "application/gml+xml": {
+    "source": "apache",
+    "extensions": ["gml"]
+  },
+  "application/gpx+xml": {
+    "source": "apache",
+    "extensions": ["gpx"]
+  },
+  "application/gxf": {
+    "source": "apache",
+    "extensions": ["gxf"]
+  },
+  "application/gzip": {
+    "source": "iana",
+    "compressible": false
+  },
+  "application/h224": {
+    "source": "iana"
+  },
+  "application/held+xml": {
+    "source": "iana"
+  },
+  "application/http": {
+    "source": "iana"
+  },
+  "application/hyperstudio": {
+    "source": "iana",
+    "extensions": ["stk"]
+  },
+  "application/ibe-key-request+xml": {
+    "source": "iana"
+  },
+  "application/ibe-pkg-reply+xml": {
+    "source": "iana"
+  },
+  "application/ibe-pp-data": {
+    "source": "iana"
+  },
+  "application/iges": {
+    "source": "iana"
+  },
+  "application/im-iscomposing+xml": {
+    "source": "iana"
+  },
+  "application/index": {
+    "source": "iana"
+  },
+  "application/index.cmd": {
+    "source": "iana"
+  },
+  "application/index.obj": {
+    "source": "iana"
+  },
+  "application/index.response": {
+    "source": "iana"
+  },
+  "application/index.vnd": {
+    "source": "iana"
+  },
+  "application/inkml+xml": {
+    "source": "iana",
+    "extensions": ["ink","inkml"]
+  },
+  "application/iotp": {
+    "source": "iana"
+  },
+  "application/ipfix": {
+    "source": "iana",
+    "extensions": ["ipfix"]
+  },
+  "application/ipp": {
+    "source": "iana"
+  },
+  "application/isup": {
+    "source": "iana"
+  },
+  "application/its+xml": {
+    "source": "iana"
+  },
+  "application/java-archive": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["jar"]
+  },
+  "application/java-serialized-object": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["ser"]
+  },
+  "application/java-vm": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["class"]
+  },
+  "application/javascript": {
+    "source": "iana",
+    "charset": "UTF-8",
+    "compressible": true,
+    "extensions": ["js"]
+  },
+  "application/jose": {
+    "source": "iana"
+  },
+  "application/jose+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/jrd+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/json": {
+    "source": "iana",
+    "charset": "UTF-8",
+    "compressible": true,
+    "extensions": ["json","map"]
+  },
+  "application/json-patch+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/json-seq": {
+    "source": "iana"
+  },
+  "application/json5": {
+    "extensions": ["json5"]
+  },
+  "application/jsonml+json": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["jsonml"]
+  },
+  "application/jwk+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/jwk-set+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/jwt": {
+    "source": "iana"
+  },
+  "application/kpml-request+xml": {
+    "source": "iana"
+  },
+  "application/kpml-response+xml": {
+    "source": "iana"
+  },
+  "application/ld+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/link-format": {
+    "source": "iana"
+  },
+  "application/load-control+xml": {
+    "source": "iana"
+  },
+  "application/lost+xml": {
+    "source": "iana",
+    "extensions": ["lostxml"]
+  },
+  "application/lostsync+xml": {
+    "source": "iana"
+  },
+  "application/lxf": {
+    "source": "iana"
+  },
+  "application/mac-binhex40": {
+    "source": "iana",
+    "extensions": ["hqx"]
+  },
+  "application/mac-compactpro": {
+    "source": "apache",
+    "extensions": ["cpt"]
+  },
+  "application/macwriteii": {
+    "source": "iana"
+  },
+  "application/mads+xml": {
+    "source": "iana",
+    "extensions": ["mads"]
+  },
+  "application/marc": {
+    "source": "iana",
+    "extensions": ["mrc"]
+  },
+  "application/marcxml+xml": {
+    "source": "iana",
+    "extensions": ["mrcx"]
+  },
+  "application/mathematica": {
+    "source": "iana",
+    "extensions": ["ma","nb","mb"]
+  },
+  "application/mathml+xml": {
+    "source": "iana",
+    "extensions": ["mathml"]
+  },
+  "application/mathml-content+xml": {
+    "source": "iana"
+  },
+  "application/mathml-presentation+xml": {
+    "source": "iana"
+  },
+  "application/mbms-associated-procedure-description+xml": {
+    "source": "iana"
+  },
+  "application/mbms-deregister+xml": {
+    "source": "iana"
+  },
+  "application/mbms-envelope+xml": {
+    "source": "iana"
+  },
+  "application/mbms-msk+xml": {
+    "source": "iana"
+  },
+  "application/mbms-msk-response+xml": {
+    "source": "iana"
+  },
+  "application/mbms-protection-description+xml": {
+    "source": "iana"
+  },
+  "application/mbms-reception-report+xml": {
+    "source": "iana"
+  },
+  "application/mbms-register+xml": {
+    "source": "iana"
+  },
+  "application/mbms-register-response+xml": {
+    "source": "iana"
+  },
+  "application/mbms-schedule+xml": {
+    "source": "iana"
+  },
+  "application/mbms-user-service-description+xml": {
+    "source": "iana"
+  },
+  "application/mbox": {
+    "source": "iana",
+    "extensions": ["mbox"]
+  },
+  "application/media-policy-dataset+xml": {
+    "source": "iana"
+  },
+  "application/media_control+xml": {
+    "source": "iana"
+  },
+  "application/mediaservercontrol+xml": {
+    "source": "iana",
+    "extensions": ["mscml"]
+  },
+  "application/merge-patch+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/metalink+xml": {
+    "source": "apache",
+    "extensions": ["metalink"]
+  },
+  "application/metalink4+xml": {
+    "source": "iana",
+    "extensions": ["meta4"]
+  },
+  "application/mets+xml": {
+    "source": "iana",
+    "extensions": ["mets"]
+  },
+  "application/mf4": {
+    "source": "iana"
+  },
+  "application/mikey": {
+    "source": "iana"
+  },
+  "application/mods+xml": {
+    "source": "iana",
+    "extensions": ["mods"]
+  },
+  "application/moss-keys": {
+    "source": "iana"
+  },
+  "application/moss-signature": {
+    "source": "iana"
+  },
+  "application/mosskey-data": {
+    "source": "iana"
+  },
+  "application/mosskey-request": {
+    "source": "iana"
+  },
+  "application/mp21": {
+    "source": "iana",
+    "extensions": ["m21","mp21"]
+  },
+  "application/mp4": {
+    "source": "iana",
+    "extensions": ["mp4s","m4p"]
+  },
+  "application/mpeg4-generic": {
+    "source": "iana"
+  },
+  "application/mpeg4-iod": {
+    "source": "iana"
+  },
+  "application/mpeg4-iod-xmt": {
+    "source": "iana"
+  },
+  "application/mrb-consumer+xml": {
+    "source": "iana"
+  },
+  "application/mrb-publish+xml": {
+    "source": "iana"
+  },
+  "application/msc-ivr+xml": {
+    "source": "iana"
+  },
+  "application/msc-mixer+xml": {
+    "source": "iana"
+  },
+  "application/msword": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["doc","dot"]
+  },
+  "application/mxf": {
+    "source": "iana",
+    "extensions": ["mxf"]
+  },
+  "application/nasdata": {
+    "source": "iana"
+  },
+  "application/news-checkgroups": {
+    "source": "iana"
+  },
+  "application/news-groupinfo": {
+    "source": "iana"
+  },
+  "application/news-transmission": {
+    "source": "iana"
+  },
+  "application/nlsml+xml": {
+    "source": "iana"
+  },
+  "application/nss": {
+    "source": "iana"
+  },
+  "application/ocsp-request": {
+    "source": "iana"
+  },
+  "application/ocsp-response": {
+    "source": "iana"
+  },
+  "application/octet-stream": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","buffer"]
+  },
+  "application/oda": {
+    "source": "iana",
+    "extensions": ["oda"]
+  },
+  "application/odx": {
+    "source": "iana"
+  },
+  "application/oebps-package+xml": {
+    "source": "iana",
+    "extensions": ["opf"]
+  },
+  "application/ogg": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["ogx"]
+  },
+  "application/omdoc+xml": {
+    "source": "apache",
+    "extensions": ["omdoc"]
+  },
+  "application/onenote": {
+    "source": "apache",
+    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
+  },
+  "application/oxps": {
+    "source": "iana",
+    "extensions": ["oxps"]
+  },
+  "application/p2p-overlay+xml": {
+    "source": "iana"
+  },
+  "application/parityfec": {
+    "source": "iana"
+  },
+  "application/patch-ops-error+xml": {
+    "source": "iana",
+    "extensions": ["xer"]
+  },
+  "application/pdf": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["pdf"]
+  },
+  "application/pdx": {
+    "source": "iana"
+  },
+  "application/pgp-encrypted": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["pgp"]
+  },
+  "application/pgp-keys": {
+    "source": "iana"
+  },
+  "application/pgp-signature": {
+    "source": "iana",
+    "extensions": ["asc","sig"]
+  },
+  "application/pics-rules": {
+    "source": "apache",
+    "extensions": ["prf"]
+  },
+  "application/pidf+xml": {
+    "source": "iana"
+  },
+  "application/pidf-diff+xml": {
+    "source": "iana"
+  },
+  "application/pkcs10": {
+    "source": "iana",
+    "extensions": ["p10"]
+  },
+  "application/pkcs7-mime": {
+    "source": "iana",
+    "extensions": ["p7m","p7c"]
+  },
+  "application/pkcs7-signature": {
+    "source": "iana",
+    "extensions": ["p7s"]
+  },
+  "application/pkcs8": {
+    "source": "iana",
+    "extensions": ["p8"]
+  },
+  "application/pkix-attr-cert": {
+    "source": "iana",
+    "extensions": ["ac"]
+  },
+  "application/pkix-cert": {
+    "source": "iana",
+    "extensions": ["cer"]
+  },
+  "application/pkix-crl": {
+    "source": "iana",
+    "extensions": ["crl"]
+  },
+  "application/pkix-pkipath": {
+    "source": "iana",
+    "extensions": ["pkipath"]
+  },
+  "application/pkixcmp": {
+    "source": "iana",
+    "extensions": ["pki"]
+  },
+  "application/pls+xml": {
+    "source": "iana",
+    "extensions": ["pls"]
+  },
+  "application/poc-settings+xml": {
+    "source": "iana"
+  },
+  "application/postscript": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["ai","eps","ps"]
+  },
+  "application/provenance+xml": {
+    "source": "iana"
+  },
+  "application/prs.alvestrand.titrax-sheet": {
+    "source": "iana"
+  },
+  "application/prs.cww": {
+    "source": "iana",
+    "extensions": ["cww"]
+  },
+  "application/prs.hpub+zip": {
+    "source": "iana"
+  },
+  "application/prs.nprend": {
+    "source": "iana"
+  },
+  "application/prs.plucker": {
+    "source": "iana"
+  },
+  "application/prs.rdf-xml-crypt": {
+    "source": "iana"
+  },
+  "application/prs.xsf+xml": {
+    "source": "iana"
+  },
+  "application/pskc+xml": {
+    "source": "iana",
+    "extensions": ["pskcxml"]
+  },
+  "application/qsig": {
+    "source": "iana"
+  },
+  "application/raptorfec": {
+    "source": "iana"
+  },
+  "application/rdap+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/rdf+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["rdf"]
+  },
+  "application/reginfo+xml": {
+    "source": "iana",
+    "extensions": ["rif"]
+  },
+  "application/relax-ng-compact-syntax": {
+    "source": "iana",
+    "extensions": ["rnc"]
+  },
+  "application/remote-printing": {
+    "source": "iana"
+  },
+  "application/reputon+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/resource-lists+xml": {
+    "source": "iana",
+    "extensions": ["rl"]
+  },
+  "application/resource-lists-diff+xml": {
+    "source": "iana",
+    "extensions": ["rld"]
+  },
+  "application/riscos": {
+    "source": "iana"
+  },
+  "application/rlmi+xml": {
+    "source": "iana"
+  },
+  "application/rls-services+xml": {
+    "source": "iana",
+    "extensions": ["rs"]
+  },
+  "application/rpki-ghostbusters": {
+    "source": "iana",
+    "extensions": ["gbr"]
+  },
+  "application/rpki-manifest": {
+    "source": "iana",
+    "extensions": ["mft"]
+  },
+  "application/rpki-roa": {
+    "source": "iana",
+    "extensions": ["roa"]
+  },
+  "application/rpki-updown": {
+    "source": "iana"
+  },
+  "application/rsd+xml": {
+    "source": "apache",
+    "extensions": ["rsd"]
+  },
+  "application/rss+xml": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["rss"]
+  },
+  "application/rtf": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["rtf"]
+  },
+  "application/rtploopback": {
+    "source": "iana"
+  },
+  "application/rtx": {
+    "source": "iana"
+  },
+  "application/samlassertion+xml": {
+    "source": "iana"
+  },
+  "application/samlmetadata+xml": {
+    "source": "iana"
+  },
+  "application/sbml+xml": {
+    "source": "iana",
+    "extensions": ["sbml"]
+  },
+  "application/scaip+xml": {
+    "source": "iana"
+  },
+  "application/scvp-cv-request": {
+    "source": "iana",
+    "extensions": ["scq"]
+  },
+  "application/scvp-cv-response": {
+    "source": "iana",
+    "extensions": ["scs"]
+  },
+  "application/scvp-vp-request": {
+    "source": "iana",
+    "extensions": ["spq"]
+  },
+  "application/scvp-vp-response": {
+    "source": "iana",
+    "extensions": ["spp"]
+  },
+  "application/sdp": {
+    "source": "iana",
+    "extensions": ["sdp"]
+  },
+  "application/sep+xml": {
+    "source": "iana"
+  },
+  "application/sep-exi": {
+    "source": "iana"
+  },
+  "application/session-info": {
+    "source": "iana"
+  },
+  "application/set-payment": {
+    "source": "iana"
+  },
+  "application/set-payment-initiation": {
+    "source": "iana",
+    "extensions": ["setpay"]
+  },
+  "application/set-registration": {
+    "source": "iana"
+  },
+  "application/set-registration-initiation": {
+    "source": "iana",
+    "extensions": ["setreg"]
+  },
+  "application/sgml": {
+    "source": "iana"
+  },
+  "application/sgml-open-catalog": {
+    "source": "iana"
+  },
+  "application/shf+xml": {
+    "source": "iana",
+    "extensions": ["shf"]
+  },
+  "application/sieve": {
+    "source": "iana"
+  },
+  "application/simple-filter+xml": {
+    "source": "iana"
+  },
+  "application/simple-message-summary": {
+    "source": "iana"
+  },
+  "application/simplesymbolcontainer": {
+    "source": "iana"
+  },
+  "application/slate": {
+    "source": "iana"
+  },
+  "application/smil": {
+    "source": "iana"
+  },
+  "application/smil+xml": {
+    "source": "iana",
+    "extensions": ["smi","smil"]
+  },
+  "application/smpte336m": {
+    "source": "iana"
+  },
+  "application/soap+fastinfoset": {
+    "source": "iana"
+  },
+  "application/soap+xml": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/sparql-query": {
+    "source": "iana",
+    "extensions": ["rq"]
+  },
+  "application/sparql-results+xml": {
+    "source": "iana",
+    "extensions": ["srx"]
+  },
+  "application/spirits-event+xml": {
+    "source": "iana"
+  },
+  "application/sql": {
+    "source": "iana"
+  },
+  "application/srgs": {
+    "source": "iana",
+    "extensions": ["gram"]
+  },
+  "application/srgs+xml": {
+    "source": "iana",
+    "extensions": ["grxml"]
+  },
+  "application/sru+xml": {
+    "source": "iana",
+    "extensions": ["sru"]
+  },
+  "application/ssdl+xml": {
+    "source": "apache",
+    "extensions": ["ssdl"]
+  },
+  "application/ssml+xml": {
+    "source": "iana",
+    "extensions": ["ssml"]
+  },
+  "application/tamp-apex-update": {
+    "source": "iana"
+  },
+  "application/tamp-apex-update-confirm": {
+    "source": "iana"
+  },
+  "application/tamp-community-update": {
+    "source": "iana"
+  },
+  "application/tamp-community-update-confirm": {
+    "source": "iana"
+  },
+  "application/tamp-error": {
+    "source": "iana"
+  },
+  "application/tamp-sequence-adjust": {
+    "source": "iana"
+  },
+  "application/tamp-sequence-adjust-confirm": {
+    "source": "iana"
+  },
+  "application/tamp-status-query": {
+    "source": "iana"
+  },
+  "application/tamp-status-response": {
+    "source": "iana"
+  },
+  "application/tamp-update": {
+    "source": "iana"
+  },
+  "application/tamp-update-confirm": {
+    "source": "iana"
+  },
+  "application/tar": {
+    "compressible": true
+  },
+  "application/tei+xml": {
+    "source": "iana",
+    "extensions": ["tei","teicorpus"]
+  },
+  "application/thraud+xml": {
+    "source": "iana",
+    "extensions": ["tfi"]
+  },
+  "application/timestamp-query": {
+    "source": "iana"
+  },
+  "application/timestamp-reply": {
+    "source": "iana"
+  },
+  "application/timestamped-data": {
+    "source": "iana",
+    "extensions": ["tsd"]
+  },
+  "application/ttml+xml": {
+    "source": "iana"
+  },
+  "application/tve-trigger": {
+    "source": "iana"
+  },
+  "application/ulpfec": {
+    "source": "iana"
+  },
+  "application/urc-grpsheet+xml": {
+    "source": "iana"
+  },
+  "application/urc-ressheet+xml": {
+    "source": "iana"
+  },
+  "application/urc-targetdesc+xml": {
+    "source": "iana"
+  },
+  "application/urc-uisocketdesc+xml": {
+    "source": "iana"
+  },
+  "application/vcard+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vcard+xml": {
+    "source": "iana"
+  },
+  "application/vemmi": {
+    "source": "iana"
+  },
+  "application/vividence.scriptfile": {
+    "source": "apache"
+  },
+  "application/vnd.3gpp.bsf+xml": {
+    "source": "iana"
+  },
+  "application/vnd.3gpp.pic-bw-large": {
+    "source": "iana",
+    "extensions": ["plb"]
+  },
+  "application/vnd.3gpp.pic-bw-small": {
+    "source": "iana",
+    "extensions": ["psb"]
+  },
+  "application/vnd.3gpp.pic-bw-var": {
+    "source": "iana",
+    "extensions": ["pvb"]
+  },
+  "application/vnd.3gpp.sms": {
+    "source": "iana"
+  },
+  "application/vnd.3gpp2.bcmcsinfo+xml": {
+    "source": "iana"
+  },
+  "application/vnd.3gpp2.sms": {
+    "source": "iana"
+  },
+  "application/vnd.3gpp2.tcap": {
+    "source": "iana",
+    "extensions": ["tcap"]
+  },
+  "application/vnd.3m.post-it-notes": {
+    "source": "iana",
+    "extensions": ["pwn"]
+  },
+  "application/vnd.accpac.simply.aso": {
+    "source": "iana",
+    "extensions": ["aso"]
+  },
+  "application/vnd.accpac.simply.imp": {
+    "source": "iana",
+    "extensions": ["imp"]
+  },
+  "application/vnd.acucobol": {
+    "source": "iana",
+    "extensions": ["acu"]
+  },
+  "application/vnd.acucorp": {
+    "source": "iana",
+    "extensions": ["atc","acutc"]
+  },
+  "application/vnd.adobe.air-application-installer-package+zip": {
+    "source": "apache",
+    "extensions": ["air"]
+  },
+  "application/vnd.adobe.flash.movie": {
+    "source": "iana"
+  },
+  "application/vnd.adobe.formscentral.fcdt": {
+    "source": "iana",
+    "extensions": ["fcdt"]
+  },
+  "application/vnd.adobe.fxp": {
+    "source": "iana",
+    "extensions": ["fxp","fxpl"]
+  },
+  "application/vnd.adobe.partial-upload": {
+    "source": "iana"
+  },
+  "application/vnd.adobe.xdp+xml": {
+    "source": "iana",
+    "extensions": ["xdp"]
+  },
+  "application/vnd.adobe.xfdf": {
+    "source": "iana",
+    "extensions": ["xfdf"]
+  },
+  "application/vnd.aether.imp": {
+    "source": "iana"
+  },
+  "application/vnd.ah-barcode": {
+    "source": "iana"
+  },
+  "application/vnd.ahead.space": {
+    "source": "iana",
+    "extensions": ["ahead"]
+  },
+  "application/vnd.airzip.filesecure.azf": {
+    "source": "iana",
+    "extensions": ["azf"]
+  },
+  "application/vnd.airzip.filesecure.azs": {
+    "source": "iana",
+    "extensions": ["azs"]
+  },
+  "application/vnd.amazon.ebook": {
+    "source": "apache",
+    "extensions": ["azw"]
+  },
+  "application/vnd.americandynamics.acc": {
+    "source": "iana",
+    "extensions": ["acc"]
+  },
+  "application/vnd.amiga.ami": {
+    "source": "iana",
+    "extensions": ["ami"]
+  },
+  "application/vnd.amundsen.maze+xml": {
+    "source": "iana"
+  },
+  "application/vnd.android.package-archive": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["apk"]
+  },
+  "application/vnd.anser-web-certificate-issue-initiation": {
+    "source": "iana",
+    "extensions": ["cii"]
+  },
+  "application/vnd.anser-web-funds-transfer-initiation": {
+    "source": "apache",
+    "extensions": ["fti"]
+  },
+  "application/vnd.antix.game-component": {
+    "source": "iana",
+    "extensions": ["atx"]
+  },
+  "application/vnd.apache.thrift.binary": {
+    "source": "iana"
+  },
+  "application/vnd.apache.thrift.compact": {
+    "source": "iana"
+  },
+  "application/vnd.apache.thrift.json": {
+    "source": "iana"
+  },
+  "application/vnd.api+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.apple.installer+xml": {
+    "source": "iana",
+    "extensions": ["mpkg"]
+  },
+  "application/vnd.apple.mpegurl": {
+    "source": "iana",
+    "extensions": ["m3u8"]
+  },
+  "application/vnd.arastra.swi": {
+    "source": "iana"
+  },
+  "application/vnd.aristanetworks.swi": {
+    "source": "iana",
+    "extensions": ["swi"]
+  },
+  "application/vnd.artsquare": {
+    "source": "iana"
+  },
+  "application/vnd.astraea-software.iota": {
+    "source": "iana",
+    "extensions": ["iota"]
+  },
+  "application/vnd.audiograph": {
+    "source": "iana",
+    "extensions": ["aep"]
+  },
+  "application/vnd.autopackage": {
+    "source": "iana"
+  },
+  "application/vnd.avistar+xml": {
+    "source": "iana"
+  },
+  "application/vnd.balsamiq.bmml+xml": {
+    "source": "iana"
+  },
+  "application/vnd.bekitzur-stech+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.blueice.multipass": {
+    "source": "iana",
+    "extensions": ["mpm"]
+  },
+  "application/vnd.bluetooth.ep.oob": {
+    "source": "iana"
+  },
+  "application/vnd.bluetooth.le.oob": {
+    "source": "iana"
+  },
+  "application/vnd.bmi": {
+    "source": "iana",
+    "extensions": ["bmi"]
+  },
+  "application/vnd.businessobjects": {
+    "source": "iana",
+    "extensions": ["rep"]
+  },
+  "application/vnd.cab-jscript": {
+    "source": "iana"
+  },
+  "application/vnd.canon-cpdl": {
+    "source": "iana"
+  },
+  "application/vnd.canon-lips": {
+    "source": "iana"
+  },
+  "application/vnd.cendio.thinlinc.clientconf": {
+    "source": "iana"
+  },
+  "application/vnd.century-systems.tcp_stream": {
+    "source": "iana"
+  },
+  "application/vnd.chemdraw+xml": {
+    "source": "iana",
+    "extensions": ["cdxml"]
+  },
+  "application/vnd.chipnuts.karaoke-mmd": {
+    "source": "iana",
+    "extensions": ["mmd"]
+  },
+  "application/vnd.cinderella": {
+    "source": "iana",
+    "extensions": ["cdy"]
+  },
+  "application/vnd.cirpack.isdn-ext": {
+    "source": "iana"
+  },
+  "application/vnd.claymore": {
+    "source": "iana",
+    "extensions": ["cla"]
+  },
+  "application/vnd.cloanto.rp9": {
+    "source": "iana",
+    "extensions": ["rp9"]
+  },
+  "application/vnd.clonk.c4group": {
+    "source": "iana",
+    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
+  },
+  "application/vnd.cluetrust.cartomobile-config": {
+    "source": "iana",
+    "extensions": ["c11amc"]
+  },
+  "application/vnd.cluetrust.cartomobile-config-pkg": {
+    "source": "iana",
+    "extensions": ["c11amz"]
+  },
+  "application/vnd.coffeescript": {
+    "source": "iana"
+  },
+  "application/vnd.collection+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.collection.doc+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.collection.next+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.commerce-battelle": {
+    "source": "iana"
+  },
+  "application/vnd.commonspace": {
+    "source": "iana",
+    "extensions": ["csp"]
+  },
+  "application/vnd.contact.cmsg": {
+    "source": "iana",
+    "extensions": ["cdbcmsg"]
+  },
+  "application/vnd.cosmocaller": {
+    "source": "iana",
+    "extensions": ["cmc"]
+  },
+  "application/vnd.crick.clicker": {
+    "source": "iana",
+    "extensions": ["clkx"]
+  },
+  "application/vnd.crick.clicker.keyboard": {
+    "source": "iana",
+    "extensions": ["clkk"]
+  },
+  "application/vnd.crick.clicker.palette": {
+    "source": "iana",
+    "extensions": ["clkp"]
+  },
+  "application/vnd.crick.clicker.template": {
+    "source": "iana",
+    "extensions": ["clkt"]
+  },
+  "application/vnd.crick.clicker.wordbank": {
+    "source": "iana",
+    "extensions": ["clkw"]
+  },
+  "application/vnd.criticaltools.wbs+xml": {
+    "source": "iana",
+    "extensions": ["wbs"]
+  },
+  "application/vnd.ctc-posml": {
+    "source": "iana",
+    "extensions": ["pml"]
+  },
+  "application/vnd.ctct.ws+xml": {
+    "source": "iana"
+  },
+  "application/vnd.cups-pdf": {
+    "source": "iana"
+  },
+  "application/vnd.cups-postscript": {
+    "source": "iana"
+  },
+  "application/vnd.cups-ppd": {
+    "source": "iana",
+    "extensions": ["ppd"]
+  },
+  "application/vnd.cups-raster": {
+    "source": "iana"
+  },
+  "application/vnd.cups-raw": {
+    "source": "iana"
+  },
+  "application/vnd.curl": {
+    "source": "iana"
+  },
+  "application/vnd.curl.car": {
+    "source": "apache",
+    "extensions": ["car"]
+  },
+  "application/vnd.curl.pcurl": {
+    "source": "apache",
+    "extensions": ["pcurl"]
+  },
+  "application/vnd.cyan.dean.root+xml": {
+    "source": "iana"
+  },
+  "application/vnd.cybank": {
+    "source": "iana"
+  },
+  "application/vnd.dart": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["dart"]
+  },
+  "application/vnd.data-vision.rdz": {
+    "source": "iana",
+    "extensions": ["rdz"]
+  },
+  "application/vnd.debian.binary-package": {
+    "source": "iana"
+  },
+  "application/vnd.dece.data": {
+    "source": "iana",
+    "extensions": ["uvf","uvvf","uvd","uvvd"]
+  },
+  "application/vnd.dece.ttml+xml": {
+    "source": "iana",
+    "extensions": ["uvt","uvvt"]
+  },
+  "application/vnd.dece.unspecified": {
+    "source": "iana",
+    "extensions": ["uvx","uvvx"]
+  },
+  "application/vnd.dece.zip": {
+    "source": "iana",
+    "extensions": ["uvz","uvvz"]
+  },
+  "application/vnd.denovo.fcselayout-link": {
+    "source": "iana",
+    "extensions": ["fe_launch"]
+  },
+  "application/vnd.desmume-movie": {
+    "source": "iana"
+  },
+  "application/vnd.dir-bi.plate-dl-nosuffix": {
+    "source": "iana"
+  },
+  "application/vnd.dm.delegation+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dna": {
+    "source": "iana",
+    "extensions": ["dna"]
+  },
+  "application/vnd.document+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.dolby.mlp": {
+    "source": "apache",
+    "extensions": ["mlp"]
+  },
+  "application/vnd.dolby.mobile.1": {
+    "source": "iana"
+  },
+  "application/vnd.dolby.mobile.2": {
+    "source": "iana"
+  },
+  "application/vnd.doremir.scorecloud-binary-document": {
+    "source": "iana"
+  },
+  "application/vnd.dpgraph": {
+    "source": "iana",
+    "extensions": ["dpg"]
+  },
+  "application/vnd.dreamfactory": {
+    "source": "iana",
+    "extensions": ["dfac"]
+  },
+  "application/vnd.ds-keypoint": {
+    "source": "apache",
+    "extensions": ["kpxx"]
+  },
+  "application/vnd.dtg.local": {
+    "source": "iana"
+  },
+  "application/vnd.dtg.local.flash": {
+    "source": "iana"
+  },
+  "application/vnd.dtg.local.html": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ait": {
+    "source": "iana",
+    "extensions": ["ait"]
+  },
+  "application/vnd.dvb.dvbj": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.esgcontainer": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ipdcdftnotifaccess": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ipdcesgaccess": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ipdcesgaccess2": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ipdcesgpdd": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.ipdcroaming": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.iptv.alfec-base": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.iptv.alfec-enhancement": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-aggregate-root+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-container+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-generic+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-ia-msglist+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-ia-registration-request+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-ia-registration-response+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.notif-init+xml": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.pfr": {
+    "source": "iana"
+  },
+  "application/vnd.dvb.service": {
+    "source": "iana",
+    "extensions": ["svc"]
+  },
+  "application/vnd.dxr": {
+    "source": "iana"
+  },
+  "application/vnd.dynageo": {
+    "source": "iana",
+    "extensions": ["geo"]
+  },
+  "application/vnd.dzr": {
+    "source": "iana"
+  },
+  "application/vnd.easykaraoke.cdgdownload": {
+    "source": "iana"
+  },
+  "application/vnd.ecdis-update": {
+    "source": "iana"
+  },
+  "application/vnd.ecowin.chart": {
+    "source": "iana",
+    "extensions": ["mag"]
+  },
+  "application/vnd.ecowin.filerequest": {
+    "source": "iana"
+  },
+  "application/vnd.ecowin.fileupdate": {
+    "source": "iana"
+  },
+  "application/vnd.ecowin.series": {
+    "source": "iana"
+  },
+  "application/vnd.ecowin.seriesrequest": {
+    "source": "iana"
+  },
+  "application/vnd.ecowin.seriesupdate": {
+    "source": "iana"
+  },
+  "application/vnd.emclient.accessrequest+xml": {
+    "source": "iana"
+  },
+  "application/vnd.enliven": {
+    "source": "iana",
+    "extensions": ["nml"]
+  },
+  "application/vnd.enphase.envoy": {
+    "source": "iana"
+  },
+  "application/vnd.eprints.data+xml": {
+    "source": "iana"
+  },
+  "application/vnd.epson.esf": {
+    "source": "iana",
+    "extensions": ["esf"]
+  },
+  "application/vnd.epson.msf": {
+    "source": "iana",
+    "extensions": ["msf"]
+  },
+  "application/vnd.epson.quickanime": {
+    "source": "iana",
+    "extensions": ["qam"]
+  },
+  "application/vnd.epson.salt": {
+    "source": "iana",
+    "extensions": ["slt"]
+  },
+  "application/vnd.epson.ssf": {
+    "source": "iana",
+    "extensions": ["ssf"]
+  },
+  "application/vnd.ericsson.quickcall": {
+    "source": "iana"
+  },
+  "application/vnd.eszigno3+xml": {
+    "source": "iana",
+    "extensions": ["es3","et3"]
+  },
+  "application/vnd.etsi.aoc+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.asic-e+zip": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.asic-s+zip": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.cug+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvcommand+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvdiscovery+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvprofile+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvsad-bc+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvsad-cod+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvsad-npvr+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvservice+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvsync+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.iptvueprofile+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.mcid+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.mheg5": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.overload-control-policy-dataset+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.pstn+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.sci+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.simservs+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.timestamp-token": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.tsl+xml": {
+    "source": "iana"
+  },
+  "application/vnd.etsi.tsl.der": {
+    "source": "iana"
+  },
+  "application/vnd.eudora.data": {
+    "source": "iana"
+  },
+  "application/vnd.ezpix-album": {
+    "source": "iana",
+    "extensions": ["ez2"]
+  },
+  "application/vnd.ezpix-package": {
+    "source": "iana",
+    "extensions": ["ez3"]
+  },
+  "application/vnd.f-secure.mobile": {
+    "source": "iana"
+  },
+  "application/vnd.fdf": {
+    "source": "iana",
+    "extensions": ["fdf"]
+  },
+  "application/vnd.fdsn.mseed": {
+    "source": "iana",
+    "extensions": ["mseed"]
+  },
+  "application/vnd.fdsn.seed": {
+    "source": "iana",
+    "extensions": ["seed","dataless"]
+  },
+  "application/vnd.ffsns": {
+    "source": "iana"
+  },
+  "application/vnd.fints": {
+    "source": "iana"
+  },
+  "application/vnd.flographit": {
+    "source": "iana",
+    "extensions": ["gph"]
+  },
+  "application/vnd.fluxtime.clip": {
+    "source": "iana",
+    "extensions": ["ftc"]
+  },
+  "application/vnd.font-fontforge-sfd": {
+    "source": "iana"
+  },
+  "application/vnd.framemaker": {
+    "source": "iana",
+    "extensions": ["fm","frame","maker","book"]
+  },
+  "application/vnd.frogans.fnc": {
+    "source": "iana",
+    "extensions": ["fnc"]
+  },
+  "application/vnd.frogans.ltf": {
+    "source": "iana",
+    "extensions": ["ltf"]
+  },
+  "application/vnd.fsc.weblaunch": {
+    "source": "iana",
+    "extensions": ["fsc"]
+  },
+  "application/vnd.fujitsu.oasys": {
+    "source": "iana",
+    "extensions": ["oas"]
+  },
+  "application/vnd.fujitsu.oasys2": {
+    "source": "iana",
+    "extensions": ["oa2"]
+  },
+  "application/vnd.fujitsu.oasys3": {
+    "source": "iana",
+    "extensions": ["oa3"]
+  },
+  "application/vnd.fujitsu.oasysgp": {
+    "source": "iana",
+    "extensions": ["fg5"]
+  },
+  "application/vnd.fujitsu.oasysprs": {
+    "source": "iana",
+    "extensions": ["bh2"]
+  },
+  "application/vnd.fujixerox.art-ex": {
+    "source": "iana"
+  },
+  "application/vnd.fujixerox.art4": {
+    "source": "iana"
+  },
+  "application/vnd.fujixerox.ddd": {
+    "source": "iana",
+    "extensions": ["ddd"]
+  },
+  "application/vnd.fujixerox.docuworks": {
+    "source": "iana",
+    "extensions": ["xdw"]
+  },
+  "application/vnd.fujixerox.docuworks.binder": {
+    "source": "iana",
+    "extensions": ["xbd"]
+  },
+  "application/vnd.fujixerox.docuworks.container": {
+    "source": "iana"
+  },
+  "application/vnd.fujixerox.hbpl": {
+    "source": "iana"
+  },
+  "application/vnd.fut-misnet": {
+    "source": "iana"
+  },
+  "application/vnd.fuzzysheet": {
+    "source": "iana",
+    "extensions": ["fzs"]
+  },
+  "application/vnd.genomatix.tuxedo": {
+    "source": "iana",
+    "extensions": ["txd"]
+  },
+  "application/vnd.geo+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.geocube+xml": {
+    "source": "iana"
+  },
+  "application/vnd.geogebra.file": {
+    "source": "iana",
+    "extensions": ["ggb"]
+  },
+  "application/vnd.geogebra.tool": {
+    "source": "iana",
+    "extensions": ["ggt"]
+  },
+  "application/vnd.geometry-explorer": {
+    "source": "iana",
+    "extensions": ["gex","gre"]
+  },
+  "application/vnd.geonext": {
+    "source": "iana",
+    "extensions": ["gxt"]
+  },
+  "application/vnd.geoplan": {
+    "source": "iana",
+    "extensions": ["g2w"]
+  },
+  "application/vnd.geospace": {
+    "source": "iana",
+    "extensions": ["g3w"]
+  },
+  "application/vnd.globalplatform.card-content-mgt": {
+    "source": "iana"
+  },
+  "application/vnd.globalplatform.card-content-mgt-response": {
+    "source": "iana"
+  },
+  "application/vnd.gmx": {
+    "source": "iana",
+    "extensions": ["gmx"]
+  },
+  "application/vnd.google-earth.kml+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["kml"]
+  },
+  "application/vnd.google-earth.kmz": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["kmz"]
+  },
+  "application/vnd.gov.sk.e-form+xml": {
+    "source": "iana"
+  },
+  "application/vnd.gov.sk.e-form+zip": {
+    "source": "iana"
+  },
+  "application/vnd.grafeq": {
+    "source": "iana",
+    "extensions": ["gqf","gqs"]
+  },
+  "application/vnd.gridmp": {
+    "source": "iana"
+  },
+  "application/vnd.groove-account": {
+    "source": "iana",
+    "extensions": ["gac"]
+  },
+  "application/vnd.groove-help": {
+    "source": "iana",
+    "extensions": ["ghf"]
+  },
+  "application/vnd.groove-identity-message": {
+    "source": "iana",
+    "extensions": ["gim"]
+  },
+  "application/vnd.groove-injector": {
+    "source": "iana",
+    "extensions": ["grv"]
+  },
+  "application/vnd.groove-tool-message": {
+    "source": "iana",
+    "extensions": ["gtm"]
+  },
+  "application/vnd.groove-tool-template": {
+    "source": "iana",
+    "extensions": ["tpl"]
+  },
+  "application/vnd.groove-vcard": {
+    "source": "iana",
+    "extensions": ["vcg"]
+  },
+  "application/vnd.hal+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.hal+xml": {
+    "source": "iana",
+    "extensions": ["hal"]
+  },
+  "application/vnd.handheld-entertainment+xml": {
+    "source": "iana",
+    "extensions": ["zmm"]
+  },
+  "application/vnd.hbci": {
+    "source": "iana",
+    "extensions": ["hbci"]
+  },
+  "application/vnd.hcl-bireports": {
+    "source": "iana"
+  },
+  "application/vnd.heroku+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.hhe.lesson-player": {
+    "source": "iana",
+    "extensions": ["les"]
+  },
+  "application/vnd.hp-hpgl": {
+    "source": "iana",
+    "extensions": ["hpgl"]
+  },
+  "application/vnd.hp-hpid": {
+    "source": "iana",
+    "extensions": ["hpid"]
+  },
+  "application/vnd.hp-hps": {
+    "source": "iana",
+    "extensions": ["hps"]
+  },
+  "application/vnd.hp-jlyt": {
+    "source": "iana",
+    "extensions": ["jlt"]
+  },
+  "application/vnd.hp-pcl": {
+    "source": "iana",
+    "extensions": ["pcl"]
+  },
+  "application/vnd.hp-pclxl": {
+    "source": "iana",
+    "extensions": ["pclxl"]
+  },
+  "application/vnd.httphone": {
+    "source": "iana"
+  },
+  "application/vnd.hydrostatix.sof-data": {
+    "source": "iana"
+  },
+  "application/vnd.hzn-3d-crossword": {
+    "source": "iana"
+  },
+  "application/vnd.ibm.afplinedata": {
+    "source": "iana"
+  },
+  "application/vnd.ibm.electronic-media": {
+    "source": "iana"
+  },
+  "application/vnd.ibm.minipay": {
+    "source": "iana",
+    "extensions": ["mpy"]
+  },
+  "application/vnd.ibm.modcap": {
+    "source": "iana",
+    "extensions": ["afp","listafp","list3820"]
+  },
+  "application/vnd.ibm.rights-management": {
+    "source": "iana",
+    "extensions": ["irm"]
+  },
+  "application/vnd.ibm.secure-container": {
+    "source": "iana",
+    "extensions": ["sc"]
+  },
+  "application/vnd.iccprofile": {
+    "source": "iana",
+    "extensions": ["icc","icm"]
+  },
+  "application/vnd.ieee.1905": {
+    "source": "iana"
+  },
+  "application/vnd.igloader": {
+    "source": "iana",
+    "extensions": ["igl"]
+  },
+  "application/vnd.immervision-ivp": {
+    "source": "iana",
+    "extensions": ["ivp"]
+  },
+  "application/vnd.immervision-ivu": {
+    "source": "iana",
+    "extensions": ["ivu"]
+  },
+  "application/vnd.ims.imsccv1p1": {
+    "source": "iana"
+  },
+  "application/vnd.ims.imsccv1p2": {
+    "source": "iana"
+  },
+  "application/vnd.ims.imsccv1p3": {
+    "source": "iana"
+  },
+  "application/vnd.ims.lis.v2.result+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.ims.lti.v2.toolproxy+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.ims.lti.v2.toolproxy.id+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.ims.lti.v2.toolsettings+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.informedcontrol.rms+xml": {
+    "source": "iana"
+  },
+  "application/vnd.informix-visionary": {
+    "source": "iana"
+  },
+  "application/vnd.infotech.project": {
+    "source": "iana"
+  },
+  "application/vnd.infotech.project+xml": {
+    "source": "iana"
+  },
+  "application/vnd.innopath.wamp.notification": {
+    "source": "iana"
+  },
+  "application/vnd.insors.igm": {
+    "source": "iana",
+    "extensions": ["igm"]
+  },
+  "application/vnd.intercon.formnet": {
+    "source": "iana",
+    "extensions": ["xpw","xpx"]
+  },
+  "application/vnd.intergeo": {
+    "source": "iana",
+    "extensions": ["i2g"]
+  },
+  "application/vnd.intertrust.digibox": {
+    "source": "iana"
+  },
+  "application/vnd.intertrust.nncp": {
+    "source": "iana"
+  },
+  "application/vnd.intu.qbo": {
+    "source": "iana",
+    "extensions": ["qbo"]
+  },
+  "application/vnd.intu.qfx": {
+    "source": "iana",
+    "extensions": ["qfx"]
+  },
+  "application/vnd.iptc.g2.catalogitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.conceptitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.knowledgeitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.newsitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.newsmessage+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.packageitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.iptc.g2.planningitem+xml": {
+    "source": "iana"
+  },
+  "application/vnd.ipunplugged.rcprofile": {
+    "source": "iana",
+    "extensions": ["rcprofile"]
+  },
+  "application/vnd.irepository.package+xml": {
+    "source": "iana",
+    "extensions": ["irp"]
+  },
+  "application/vnd.is-xpr": {
+    "source": "iana",
+    "extensions": ["xpr"]
+  },
+  "application/vnd.isac.fcs": {
+    "source": "iana",
+    "extensions": ["fcs"]
+  },
+  "application/vnd.jam": {
+    "source": "iana",
+    "extensions": ["jam"]
+  },
+  "application/vnd.japannet-directory-service": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-jpnstore-wakeup": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-payment-wakeup": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-registration": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-registration-wakeup": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-setstore-wakeup": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-verification": {
+    "source": "iana"
+  },
+  "application/vnd.japannet-verification-wakeup": {
+    "source": "iana"
+  },
+  "application/vnd.jcp.javame.midlet-rms": {
+    "source": "iana",
+    "extensions": ["rms"]
+  },
+  "application/vnd.jisp": {
+    "source": "iana",
+    "extensions": ["jisp"]
+  },
+  "application/vnd.joost.joda-archive": {
+    "source": "iana",
+    "extensions": ["joda"]
+  },
+  "application/vnd.jsk.isdn-ngn": {
+    "source": "iana"
+  },
+  "application/vnd.kahootz": {
+    "source": "iana",
+    "extensions": ["ktz","ktr"]
+  },
+  "application/vnd.kde.karbon": {
+    "source": "iana",
+    "extensions": ["karbon"]
+  },
+  "application/vnd.kde.kchart": {
+    "source": "iana",
+    "extensions": ["chrt"]
+  },
+  "application/vnd.kde.kformula": {
+    "source": "iana",
+    "extensions": ["kfo"]
+  },
+  "application/vnd.kde.kivio": {
+    "source": "iana",
+    "extensions": ["flw"]
+  },
+  "application/vnd.kde.kontour": {
+    "source": "iana",
+    "extensions": ["kon"]
+  },
+  "application/vnd.kde.kpresenter": {
+    "source": "iana",
+    "extensions": ["kpr","kpt"]
+  },
+  "application/vnd.kde.kspread": {
+    "source": "iana",
+    "extensions": ["ksp"]
+  },
+  "application/vnd.kde.kword": {
+    "source": "iana",
+    "extensions": ["kwd","kwt"]
+  },
+  "application/vnd.kenameaapp": {
+    "source": "iana",
+    "extensions": ["htke"]
+  },
+  "application/vnd.kidspiration": {
+    "source": "iana",
+    "extensions": ["kia"]
+  },
+  "application/vnd.kinar": {
+    "source": "iana",
+    "extensions": ["kne","knp"]
+  },
+  "application/vnd.koan": {
+    "source": "iana",
+    "extensions": ["skp","skd","skt","skm"]
+  },
+  "application/vnd.kodak-descriptor": {
+    "source": "iana",
+    "extensions": ["sse"]
+  },
+  "application/vnd.las.las+xml": {
+    "source": "iana",
+    "extensions": ["lasxml"]
+  },
+  "application/vnd.liberty-request+xml": {
+    "source": "iana"
+  },
+  "application/vnd.llamagraphics.life-balance.desktop": {
+    "source": "iana",
+    "extensions": ["lbd"]
+  },
+  "application/vnd.llamagraphics.life-balance.exchange+xml": {
+    "source": "iana",
+    "extensions": ["lbe"]
+  },
+  "application/vnd.lotus-1-2-3": {
+    "source": "iana",
+    "extensions": ["123"]
+  },
+  "application/vnd.lotus-approach": {
+    "source": "iana",
+    "extensions": ["apr"]
+  },
+  "application/vnd.lotus-freelance": {
+    "source": "iana",
+    "extensions": ["pre"]
+  },
+  "application/vnd.lotus-notes": {
+    "source": "iana",
+    "extensions": ["nsf"]
+  },
+  "application/vnd.lotus-organizer": {
+    "source": "iana",
+    "extensions": ["org"]
+  },
+  "application/vnd.lotus-screencam": {
+    "source": "iana",
+    "extensions": ["scm"]
+  },
+  "application/vnd.lotus-wordpro": {
+    "source": "iana",
+    "extensions": ["lwp"]
+  },
+  "application/vnd.macports.portpkg": {
+    "source": "iana",
+    "extensions": ["portpkg"]
+  },
+  "application/vnd.marlin.drm.actiontoken+xml": {
+    "source": "iana"
+  },
+  "application/vnd.marlin.drm.conftoken+xml": {
+    "source": "iana"
+  },
+  "application/vnd.marlin.drm.license+xml": {
+    "source": "iana"
+  },
+  "application/vnd.marlin.drm.mdcf": {
+    "source": "iana"
+  },
+  "application/vnd.mason+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.maxmind.maxmind-db": {
+    "source": "iana"
+  },
+  "application/vnd.mcd": {
+    "source": "iana",
+    "extensions": ["mcd"]
+  },
+  "application/vnd.medcalcdata": {
+    "source": "iana",
+    "extensions": ["mc1"]
+  },
+  "application/vnd.mediastation.cdkey": {
+    "source": "iana",
+    "extensions": ["cdkey"]
+  },
+  "application/vnd.meridian-slingshot": {
+    "source": "iana"
+  },
+  "application/vnd.mfer": {
+    "source": "iana",
+    "extensions": ["mwf"]
+  },
+  "application/vnd.mfmp": {
+    "source": "iana",
+    "extensions": ["mfm"]
+  },
+  "application/vnd.micrografx.flo": {
+    "source": "iana",
+    "extensions": ["flo"]
+  },
+  "application/vnd.micrografx.igx": {
+    "source": "iana",
+    "extensions": ["igx"]
+  },
+  "application/vnd.miele+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.mif": {
+    "source": "iana",
+    "extensions": ["mif"]
+  },
+  "application/vnd.minisoft-hp3000-save": {
+    "source": "iana"
+  },
+  "application/vnd.mitsubishi.misty-guard.trustweb": {
+    "source": "iana"
+  },
+  "application/vnd.mobius.daf": {
+    "source": "iana",
+    "extensions": ["daf"]
+  },
+  "application/vnd.mobius.dis": {
+    "source": "iana",
+    "extensions": ["dis"]
+  },
+  "application/vnd.mobius.mbk": {
+    "source": "iana",
+    "extensions": ["mbk"]
+  },
+  "application/vnd.mobius.mqy": {
+    "source": "iana",
+    "extensions": ["mqy"]
+  },
+  "application/vnd.mobius.msl": {
+    "source": "iana",
+    "extensions": ["msl"]
+  },
+  "application/vnd.mobius.plc": {
+    "source": "iana",
+    "extensions": ["plc"]
+  },
+  "application/vnd.mobius.txf": {
+    "source": "iana",
+    "extensions": ["txf"]
+  },
+  "application/vnd.mophun.application": {
+    "source": "iana",
+    "extensions": ["mpn"]
+  },
+  "application/vnd.mophun.certificate": {
+    "source": "iana",
+    "extensions": ["mpc"]
+  },
+  "application/vnd.motorola.flexsuite": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.adsi": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.fis": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.gotap": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.kmr": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.ttc": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.flexsuite.wem": {
+    "source": "iana"
+  },
+  "application/vnd.motorola.iprm": {
+    "source": "iana"
+  },
+  "application/vnd.mozilla.xul+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["xul"]
+  },
+  "application/vnd.ms-3mfdocument": {
+    "source": "iana"
+  },
+  "application/vnd.ms-artgalry": {
+    "source": "iana",
+    "extensions": ["cil"]
+  },
+  "application/vnd.ms-asf": {
+    "source": "iana"
+  },
+  "application/vnd.ms-cab-compressed": {
+    "source": "iana",
+    "extensions": ["cab"]
+  },
+  "application/vnd.ms-color.iccprofile": {
+    "source": "apache"
+  },
+  "application/vnd.ms-excel": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
+  },
+  "application/vnd.ms-excel.addin.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["xlam"]
+  },
+  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["xlsb"]
+  },
+  "application/vnd.ms-excel.sheet.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["xlsm"]
+  },
+  "application/vnd.ms-excel.template.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["xltm"]
+  },
+  "application/vnd.ms-fontobject": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["eot"]
+  },
+  "application/vnd.ms-htmlhelp": {
+    "source": "iana",
+    "extensions": ["chm"]
+  },
+  "application/vnd.ms-ims": {
+    "source": "iana",
+    "extensions": ["ims"]
+  },
+  "application/vnd.ms-lrm": {
+    "source": "iana",
+    "extensions": ["lrm"]
+  },
+  "application/vnd.ms-office.activex+xml": {
+    "source": "iana"
+  },
+  "application/vnd.ms-officetheme": {
+    "source": "iana",
+    "extensions": ["thmx"]
+  },
+  "application/vnd.ms-opentype": {
+    "source": "apache",
+    "compressible": true
+  },
+  "application/vnd.ms-package.obfuscated-opentype": {
+    "source": "apache"
+  },
+  "application/vnd.ms-pki.seccat": {
+    "source": "apache",
+    "extensions": ["cat"]
+  },
+  "application/vnd.ms-pki.stl": {
+    "source": "apache",
+    "extensions": ["stl"]
+  },
+  "application/vnd.ms-playready.initiator+xml": {
+    "source": "iana"
+  },
+  "application/vnd.ms-powerpoint": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["ppt","pps","pot"]
+  },
+  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["ppam"]
+  },
+  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["pptm"]
+  },
+  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["sldm"]
+  },
+  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["ppsm"]
+  },
+  "application/vnd.ms-powerpoint.template.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["potm"]
+  },
+  "application/vnd.ms-printing.printticket+xml": {
+    "source": "apache"
+  },
+  "application/vnd.ms-project": {
+    "source": "iana",
+    "extensions": ["mpp","mpt"]
+  },
+  "application/vnd.ms-tnef": {
+    "source": "iana"
+  },
+  "application/vnd.ms-windows.printerpairing": {
+    "source": "iana"
+  },
+  "application/vnd.ms-wmdrm.lic-chlg-req": {
+    "source": "iana"
+  },
+  "application/vnd.ms-wmdrm.lic-resp": {
+    "source": "iana"
+  },
+  "application/vnd.ms-wmdrm.meter-chlg-req": {
+    "source": "iana"
+  },
+  "application/vnd.ms-wmdrm.meter-resp": {
+    "source": "iana"
+  },
+  "application/vnd.ms-word.document.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["docm"]
+  },
+  "application/vnd.ms-word.template.macroenabled.12": {
+    "source": "iana",
+    "extensions": ["dotm"]
+  },
+  "application/vnd.ms-works": {
+    "source": "iana",
+    "extensions": ["wps","wks","wcm","wdb"]
+  },
+  "application/vnd.ms-wpl": {
+    "source": "iana",
+    "extensions": ["wpl"]
+  },
+  "application/vnd.ms-xpsdocument": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["xps"]
+  },
+  "application/vnd.mseq": {
+    "source": "iana",
+    "extensions": ["mseq"]
+  },
+  "application/vnd.msign": {
+    "source": "iana"
+  },
+  "application/vnd.multiad.creator": {
+    "source": "iana"
+  },
+  "application/vnd.multiad.creator.cif": {
+    "source": "iana"
+  },
+  "application/vnd.music-niff": {
+    "source": "iana"
+  },
+  "application/vnd.musician": {
+    "source": "iana",
+    "extensions": ["mus"]
+  },
+  "application/vnd.muvee.style": {
+    "source": "iana",
+    "extensions": ["msty"]
+  },
+  "application/vnd.mynfc": {
+    "source": "iana",
+    "extensions": ["taglet"]
+  },
+  "application/vnd.ncd.control": {
+    "source": "iana"
+  },
+  "application/vnd.ncd.reference": {
+    "source": "iana"
+  },
+  "application/vnd.nervana": {
+    "source": "iana"
+  },
+  "application/vnd.netfpx": {
+    "source": "iana"
+  },
+  "application/vnd.neurolanguage.nlu": {
+    "source": "iana",
+    "extensions": ["nlu"]
+  },
+  "application/vnd.nintendo.nitro.rom": {
+    "source": "iana"
+  },
+  "application/vnd.nintendo.snes.rom": {
+    "source": "iana"
+  },
+  "application/vnd.nitf": {
+    "source": "iana",
+    "extensions": ["ntf","nitf"]
+  },
+  "application/vnd.noblenet-directory": {
+    "source": "iana",
+    "extensions": ["nnd"]
+  },
+  "application/vnd.noblenet-sealer": {
+    "source": "iana",
+    "extensions": ["nns"]
+  },
+  "application/vnd.noblenet-web": {
+    "source": "iana",
+    "extensions": ["nnw"]
+  },
+  "application/vnd.nokia.catalogs": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.conml+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.conml+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.iptv.config+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.isds-radio-presets": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.landmark+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.landmark+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.landmarkcollection+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.n-gage.ac+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.n-gage.data": {
+    "source": "iana",
+    "extensions": ["ngdat"]
+  },
+  "application/vnd.nokia.n-gage.symbian.install": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.ncd": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.pcd+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.pcd+xml": {
+    "source": "iana"
+  },
+  "application/vnd.nokia.radio-preset": {
+    "source": "iana",
+    "extensions": ["rpst"]
+  },
+  "application/vnd.nokia.radio-presets": {
+    "source": "iana",
+    "extensions": ["rpss"]
+  },
+  "application/vnd.novadigm.edm": {
+    "source": "iana",
+    "extensions": ["edm"]
+  },
+  "application/vnd.novadigm.edx": {
+    "source": "iana",
+    "extensions": ["edx"]
+  },
+  "application/vnd.novadigm.ext": {
+    "source": "iana",
+    "extensions": ["ext"]
+  },
+  "application/vnd.ntt-local.content-share": {
+    "source": "iana"
+  },
+  "application/vnd.ntt-local.file-transfer": {
+    "source": "iana"
+  },
+  "application/vnd.ntt-local.ogw_remote-access": {
+    "source": "iana"
+  },
+  "application/vnd.ntt-local.sip-ta_remote": {
+    "source": "iana"
+  },
+  "application/vnd.ntt-local.sip-ta_tcp_stream": {
+    "source": "iana"
+  },
+  "application/vnd.oasis.opendocument.chart": {
+    "source": "iana",
+    "extensions": ["odc"]
+  },
+  "application/vnd.oasis.opendocument.chart-template": {
+    "source": "iana",
+    "extensions": ["otc"]
+  },
+  "application/vnd.oasis.opendocument.database": {
+    "source": "iana",
+    "extensions": ["odb"]
+  },
+  "application/vnd.oasis.opendocument.formula": {
+    "source": "iana",
+    "extensions": ["odf"]
+  },
+  "application/vnd.oasis.opendocument.formula-template": {
+    "source": "iana",
+    "extensions": ["odft"]
+  },
+  "application/vnd.oasis.opendocument.graphics": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["odg"]
+  },
+  "application/vnd.oasis.opendocument.graphics-template": {
+    "source": "iana",
+    "extensions": ["otg"]
+  },
+  "application/vnd.oasis.opendocument.image": {
+    "source": "iana",
+    "extensions": ["odi"]
+  },
+  "application/vnd.oasis.opendocument.image-template": {
+    "source": "iana",
+    "extensions": ["oti"]
+  },
+  "application/vnd.oasis.opendocument.presentation": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["odp"]
+  },
+  "application/vnd.oasis.opendocument.presentation-template": {
+    "source": "iana",
+    "extensions": ["otp"]
+  },
+  "application/vnd.oasis.opendocument.spreadsheet": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["ods"]
+  },
+  "application/vnd.oasis.opendocument.spreadsheet-template": {
+    "source": "iana",
+    "extensions": ["ots"]
+  },
+  "application/vnd.oasis.opendocument.text": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["odt"]
+  },
+  "application/vnd.oasis.opendocument.text-master": {
+    "source": "iana",
+    "extensions": ["odm"]
+  },
+  "application/vnd.oasis.opendocument.text-template": {
+    "source": "iana",
+    "extensions": ["ott"]
+  },
+  "application/vnd.oasis.opendocument.text-web": {
+    "source": "iana",
+    "extensions": ["oth"]
+  },
+  "application/vnd.obn": {
+    "source": "iana"
+  },
+  "application/vnd.oftn.l10n+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.oipf.contentaccessdownload+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.contentaccessstreaming+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.cspg-hexbinary": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.dae.svg+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.dae.xhtml+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.mippvcontrolmessage+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.pae.gem": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.spdiscovery+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.spdlist+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.ueprofile+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oipf.userprofile+xml": {
+    "source": "iana"
+  },
+  "application/vnd.olpc-sugar": {
+    "source": "iana",
+    "extensions": ["xo"]
+  },
+  "application/vnd.oma-scws-config": {
+    "source": "iana"
+  },
+  "application/vnd.oma-scws-http-request": {
+    "source": "iana"
+  },
+  "application/vnd.oma-scws-http-response": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.drm-trigger+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.imd+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.ltkm": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.notification+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.provisioningtrigger": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.sgboot": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.sgdd+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.sgdu": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.simple-symbol-container": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.smartcard-trigger+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.sprov+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.bcast.stkm": {
+    "source": "iana"
+  },
+  "application/vnd.oma.cab-address-book+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.cab-feature-handler+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.cab-pcc+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.cab-subs-invite+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.cab-user-prefs+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.dcd": {
+    "source": "iana"
+  },
+  "application/vnd.oma.dcdc": {
+    "source": "iana"
+  },
+  "application/vnd.oma.dd2+xml": {
+    "source": "iana",
+    "extensions": ["dd2"]
+  },
+  "application/vnd.oma.drm.risd+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.group-usage-list+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.pal+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.poc.detailed-progress-report+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.poc.final-report+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.poc.groups+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.poc.invocation-descriptor+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.poc.optimized-progress-report+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.push": {
+    "source": "iana"
+  },
+  "application/vnd.oma.scidm.messages+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oma.xcap-directory+xml": {
+    "source": "iana"
+  },
+  "application/vnd.omads-email+xml": {
+    "source": "iana"
+  },
+  "application/vnd.omads-file+xml": {
+    "source": "iana"
+  },
+  "application/vnd.omads-folder+xml": {
+    "source": "iana"
+  },
+  "application/vnd.omaloc-supl-init": {
+    "source": "iana"
+  },
+  "application/vnd.openeye.oeb": {
+    "source": "iana"
+  },
+  "application/vnd.openofficeorg.extension": {
+    "source": "apache",
+    "extensions": ["oxt"]
+  },
+  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawing+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml-template": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["pptx"]
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
+    "source": "iana",
+    "extensions": ["sldx"]
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
+    "source": "iana",
+    "extensions": ["ppsx"]
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.template": {
+    "source": "apache",
+    "extensions": ["potx"]
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml-template": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["xlsx"]
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
+    "source": "apache",
+    "extensions": ["xltx"]
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.theme+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.vmldrawing": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml-template": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["docx"]
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
+    "source": "apache",
+    "extensions": ["dotx"]
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-package.core-properties+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
+    "source": "iana"
+  },
+  "application/vnd.openxmlformats-package.relationships+xml": {
+    "source": "iana"
+  },
+  "application/vnd.oracle.resource+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.orange.indata": {
+    "source": "iana"
+  },
+  "application/vnd.osa.netdeploy": {
+    "source": "iana"
+  },
+  "application/vnd.osgeo.mapguide.package": {
+    "source": "iana",
+    "extensions": ["mgp"]
+  },
+  "application/vnd.osgi.bundle": {
+    "source": "iana"
+  },
+  "application/vnd.osgi.dp": {
+    "source": "iana",
+    "extensions": ["dp"]
+  },
+  "application/vnd.osgi.subsystem": {
+    "source": "iana",
+    "extensions": ["esa"]
+  },
+  "application/vnd.otps.ct-kip+xml": {
+    "source": "iana"
+  },
+  "application/vnd.palm": {
+    "source": "iana",
+    "extensions": ["pdb","pqa","oprc"]
+  },
+  "application/vnd.panoply": {
+    "source": "iana"
+  },
+  "application/vnd.paos+xml": {
+    "source": "iana"
+  },
+  "application/vnd.paos.xml": {
+    "source": "apache"
+  },
+  "application/vnd.pawaafile": {
+    "source": "iana",
+    "extensions": ["paw"]
+  },
+  "application/vnd.pcos": {
+    "source": "iana"
+  },
+  "application/vnd.pg.format": {
+    "source": "iana",
+    "extensions": ["str"]
+  },
+  "application/vnd.pg.osasli": {
+    "source": "iana",
+    "extensions": ["ei6"]
+  },
+  "application/vnd.piaccess.application-licence": {
+    "source": "iana"
+  },
+  "application/vnd.picsel": {
+    "source": "iana",
+    "extensions": ["efif"]
+  },
+  "application/vnd.pmi.widget": {
+    "source": "iana",
+    "extensions": ["wg"]
+  },
+  "application/vnd.poc.group-advertisement+xml": {
+    "source": "iana"
+  },
+  "application/vnd.pocketlearn": {
+    "source": "iana",
+    "extensions": ["plf"]
+  },
+  "application/vnd.powerbuilder6": {
+    "source": "iana",
+    "extensions": ["pbd"]
+  },
+  "application/vnd.powerbuilder6-s": {
+    "source": "iana"
+  },
+  "application/vnd.powerbuilder7": {
+    "source": "iana"
+  },
+  "application/vnd.powerbuilder7-s": {
+    "source": "iana"
+  },
+  "application/vnd.powerbuilder75": {
+    "source": "iana"
+  },
+  "application/vnd.powerbuilder75-s": {
+    "source": "iana"
+  },
+  "application/vnd.preminet": {
+    "source": "iana"
+  },
+  "application/vnd.previewsystems.box": {
+    "source": "iana",
+    "extensions": ["box"]
+  },
+  "application/vnd.proteus.magazine": {
+    "source": "iana",
+    "extensions": ["mgz"]
+  },
+  "application/vnd.publishare-delta-tree": {
+    "source": "iana",
+    "extensions": ["qps"]
+  },
+  "application/vnd.pvi.ptid1": {
+    "source": "iana",
+    "extensions": ["ptid"]
+  },
+  "application/vnd.pwg-multiplexed": {
+    "source": "iana"
+  },
+  "application/vnd.pwg-xhtml-print+xml": {
+    "source": "iana"
+  },
+  "application/vnd.qualcomm.brew-app-res": {
+    "source": "iana"
+  },
+  "application/vnd.quark.quarkxpress": {
+    "source": "iana",
+    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
+  },
+  "application/vnd.quobject-quoxdocument": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.moml+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-audit+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-audit-conf+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-audit-conn+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-audit-dialog+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-audit-stream+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-conf+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-base+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-group+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-speech+xml": {
+    "source": "iana"
+  },
+  "application/vnd.radisys.msml-dialog-transform+xml": {
+    "source": "iana"
+  },
+  "application/vnd.rainstor.data": {
+    "source": "iana"
+  },
+  "application/vnd.rapid": {
+    "source": "iana"
+  },
+  "application/vnd.realvnc.bed": {
+    "source": "iana",
+    "extensions": ["bed"]
+  },
+  "application/vnd.recordare.musicxml": {
+    "source": "iana",
+    "extensions": ["mxl"]
+  },
+  "application/vnd.recordare.musicxml+xml": {
+    "source": "iana",
+    "extensions": ["musicxml"]
+  },
+  "application/vnd.renlearn.rlprint": {
+    "source": "iana"
+  },
+  "application/vnd.rig.cryptonote": {
+    "source": "iana",
+    "extensions": ["cryptonote"]
+  },
+  "application/vnd.rim.cod": {
+    "source": "apache",
+    "extensions": ["cod"]
+  },
+  "application/vnd.rn-realmedia": {
+    "source": "apache",
+    "extensions": ["rm"]
+  },
+  "application/vnd.rn-realmedia-vbr": {
+    "source": "apache",
+    "extensions": ["rmvb"]
+  },
+  "application/vnd.route66.link66+xml": {
+    "source": "iana",
+    "extensions": ["link66"]
+  },
+  "application/vnd.rs-274x": {
+    "source": "iana"
+  },
+  "application/vnd.ruckus.download": {
+    "source": "iana"
+  },
+  "application/vnd.s3sms": {
+    "source": "iana"
+  },
+  "application/vnd.sailingtracker.track": {
+    "source": "iana",
+    "extensions": ["st"]
+  },
+  "application/vnd.sbm.cid": {
+    "source": "iana"
+  },
+  "application/vnd.sbm.mid2": {
+    "source": "iana"
+  },
+  "application/vnd.scribus": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.3df": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.csf": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.doc": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.eml": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.mht": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.net": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.ppt": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.tiff": {
+    "source": "iana"
+  },
+  "application/vnd.sealed.xls": {
+    "source": "iana"
+  },
+  "application/vnd.sealedmedia.softseal.html": {
+    "source": "iana"
+  },
+  "application/vnd.sealedmedia.softseal.pdf": {
+    "source": "iana"
+  },
+  "application/vnd.seemail": {
+    "source": "iana",
+    "extensions": ["see"]
+  },
+  "application/vnd.sema": {
+    "source": "iana",
+    "extensions": ["sema"]
+  },
+  "application/vnd.semd": {
+    "source": "iana",
+    "extensions": ["semd"]
+  },
+  "application/vnd.semf": {
+    "source": "iana",
+    "extensions": ["semf"]
+  },
+  "application/vnd.shana.informed.formdata": {
+    "source": "iana",
+    "extensions": ["ifm"]
+  },
+  "application/vnd.shana.informed.formtemplate": {
+    "source": "iana",
+    "extensions": ["itp"]
+  },
+  "application/vnd.shana.informed.interchange": {
+    "source": "iana",
+    "extensions": ["iif"]
+  },
+  "application/vnd.shana.informed.package": {
+    "source": "iana",
+    "extensions": ["ipk"]
+  },
+  "application/vnd.simtech-mindmapper": {
+    "source": "iana",
+    "extensions": ["twd","twds"]
+  },
+  "application/vnd.siren+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.smaf": {
+    "source": "iana",
+    "extensions": ["mmf"]
+  },
+  "application/vnd.smart.notebook": {
+    "source": "iana"
+  },
+  "application/vnd.smart.teacher": {
+    "source": "iana",
+    "extensions": ["teacher"]
+  },
+  "application/vnd.software602.filler.form+xml": {
+    "source": "iana"
+  },
+  "application/vnd.software602.filler.form-xml-zip": {
+    "source": "iana"
+  },
+  "application/vnd.solent.sdkm+xml": {
+    "source": "iana",
+    "extensions": ["sdkm","sdkd"]
+  },
+  "application/vnd.spotfire.dxp": {
+    "source": "iana",
+    "extensions": ["dxp"]
+  },
+  "application/vnd.spotfire.sfs": {
+    "source": "iana",
+    "extensions": ["sfs"]
+  },
+  "application/vnd.sss-cod": {
+    "source": "iana"
+  },
+  "application/vnd.sss-dtf": {
+    "source": "iana"
+  },
+  "application/vnd.sss-ntf": {
+    "source": "iana"
+  },
+  "application/vnd.stardivision.calc": {
+    "source": "apache",
+    "extensions": ["sdc"]
+  },
+  "application/vnd.stardivision.draw": {
+    "source": "apache",
+    "extensions": ["sda"]
+  },
+  "application/vnd.stardivision.impress": {
+    "source": "apache",
+    "extensions": ["sdd"]
+  },
+  "application/vnd.stardivision.math": {
+    "source": "apache",
+    "extensions": ["smf"]
+  },
+  "application/vnd.stardivision.writer": {
+    "source": "apache",
+    "extensions": ["sdw","vor"]
+  },
+  "application/vnd.stardivision.writer-global": {
+    "source": "apache",
+    "extensions": ["sgl"]
+  },
+  "application/vnd.stepmania.package": {
+    "source": "iana",
+    "extensions": ["smzip"]
+  },
+  "application/vnd.stepmania.stepchart": {
+    "source": "iana",
+    "extensions": ["sm"]
+  },
+  "application/vnd.street-stream": {
+    "source": "iana"
+  },
+  "application/vnd.sun.wadl+xml": {
+    "source": "iana"
+  },
+  "application/vnd.sun.xml.calc": {
+    "source": "apache",
+    "extensions": ["sxc"]
+  },
+  "application/vnd.sun.xml.calc.template": {
+    "source": "apache",
+    "extensions": ["stc"]
+  },
+  "application/vnd.sun.xml.draw": {
+    "source": "apache",
+    "extensions": ["sxd"]
+  },
+  "application/vnd.sun.xml.draw.template": {
+    "source": "apache",
+    "extensions": ["std"]
+  },
+  "application/vnd.sun.xml.impress": {
+    "source": "apache",
+    "extensions": ["sxi"]
+  },
+  "application/vnd.sun.xml.impress.template": {
+    "source": "apache",
+    "extensions": ["sti"]
+  },
+  "application/vnd.sun.xml.math": {
+    "source": "apache",
+    "extensions": ["sxm"]
+  },
+  "application/vnd.sun.xml.writer": {
+    "source": "apache",
+    "extensions": ["sxw"]
+  },
+  "application/vnd.sun.xml.writer.global": {
+    "source": "apache",
+    "extensions": ["sxg"]
+  },
+  "application/vnd.sun.xml.writer.template": {
+    "source": "apache",
+    "extensions": ["stw"]
+  },
+  "application/vnd.sus-calendar": {
+    "source": "iana",
+    "extensions": ["sus","susp"]
+  },
+  "application/vnd.svd": {
+    "source": "iana",
+    "extensions": ["svd"]
+  },
+  "application/vnd.swiftview-ics": {
+    "source": "iana"
+  },
+  "application/vnd.symbian.install": {
+    "source": "apache",
+    "extensions": ["sis","sisx"]
+  },
+  "application/vnd.syncml+xml": {
+    "source": "iana",
+    "extensions": ["xsm"]
+  },
+  "application/vnd.syncml.dm+wbxml": {
+    "source": "iana",
+    "extensions": ["bdm"]
+  },
+  "application/vnd.syncml.dm+xml": {
+    "source": "iana",
+    "extensions": ["xdm"]
+  },
+  "application/vnd.syncml.dm.notification": {
+    "source": "iana"
+  },
+  "application/vnd.syncml.dmddf+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.syncml.dmddf+xml": {
+    "source": "iana"
+  },
+  "application/vnd.syncml.dmtnds+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.syncml.dmtnds+xml": {
+    "source": "iana"
+  },
+  "application/vnd.syncml.ds.notification": {
+    "source": "iana"
+  },
+  "application/vnd.tao.intent-module-archive": {
+    "source": "iana",
+    "extensions": ["tao"]
+  },
+  "application/vnd.tcpdump.pcap": {
+    "source": "iana",
+    "extensions": ["pcap","cap","dmp"]
+  },
+  "application/vnd.tmd.mediaflex.api+xml": {
+    "source": "iana"
+  },
+  "application/vnd.tmobile-livetv": {
+    "source": "iana",
+    "extensions": ["tmo"]
+  },
+  "application/vnd.trid.tpt": {
+    "source": "iana",
+    "extensions": ["tpt"]
+  },
+  "application/vnd.triscape.mxs": {
+    "source": "iana",
+    "extensions": ["mxs"]
+  },
+  "application/vnd.trueapp": {
+    "source": "iana",
+    "extensions": ["tra"]
+  },
+  "application/vnd.truedoc": {
+    "source": "iana"
+  },
+  "application/vnd.ubisoft.webplayer": {
+    "source": "iana"
+  },
+  "application/vnd.ufdl": {
+    "source": "iana",
+    "extensions": ["ufd","ufdl"]
+  },
+  "application/vnd.uiq.theme": {
+    "source": "iana",
+    "extensions": ["utz"]
+  },
+  "application/vnd.umajin": {
+    "source": "iana",
+    "extensions": ["umj"]
+  },
+  "application/vnd.unity": {
+    "source": "iana",
+    "extensions": ["unityweb"]
+  },
+  "application/vnd.uoml+xml": {
+    "source": "iana",
+    "extensions": ["uoml"]
+  },
+  "application/vnd.uplanet.alert": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.alert-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.bearer-choice": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.bearer-choice-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.cacheop": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.cacheop-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.channel": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.channel-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.list": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.list-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.listcmd": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.listcmd-wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.uplanet.signal": {
+    "source": "iana"
+  },
+  "application/vnd.valve.source.material": {
+    "source": "iana"
+  },
+  "application/vnd.vcx": {
+    "source": "iana",
+    "extensions": ["vcx"]
+  },
+  "application/vnd.vd-study": {
+    "source": "iana"
+  },
+  "application/vnd.vectorworks": {
+    "source": "iana"
+  },
+  "application/vnd.verimatrix.vcas": {
+    "source": "iana"
+  },
+  "application/vnd.vidsoft.vidconference": {
+    "source": "iana"
+  },
+  "application/vnd.visio": {
+    "source": "iana",
+    "extensions": ["vsd","vst","vss","vsw"]
+  },
+  "application/vnd.visionary": {
+    "source": "iana",
+    "extensions": ["vis"]
+  },
+  "application/vnd.vividence.scriptfile": {
+    "source": "iana"
+  },
+  "application/vnd.vsf": {
+    "source": "iana",
+    "extensions": ["vsf"]
+  },
+  "application/vnd.wap.sic": {
+    "source": "iana"
+  },
+  "application/vnd.wap.slc": {
+    "source": "iana"
+  },
+  "application/vnd.wap.wbxml": {
+    "source": "iana",
+    "extensions": ["wbxml"]
+  },
+  "application/vnd.wap.wmlc": {
+    "source": "iana",
+    "extensions": ["wmlc"]
+  },
+  "application/vnd.wap.wmlscriptc": {
+    "source": "iana",
+    "extensions": ["wmlsc"]
+  },
+  "application/vnd.webturbo": {
+    "source": "iana",
+    "extensions": ["wtb"]
+  },
+  "application/vnd.wfa.p2p": {
+    "source": "iana"
+  },
+  "application/vnd.wfa.wsc": {
+    "source": "iana"
+  },
+  "application/vnd.windows.devicepairing": {
+    "source": "iana"
+  },
+  "application/vnd.wmc": {
+    "source": "iana"
+  },
+  "application/vnd.wmf.bootstrap": {
+    "source": "iana"
+  },
+  "application/vnd.wolfram.mathematica": {
+    "source": "iana"
+  },
+  "application/vnd.wolfram.mathematica.package": {
+    "source": "iana"
+  },
+  "application/vnd.wolfram.player": {
+    "source": "iana",
+    "extensions": ["nbp"]
+  },
+  "application/vnd.wordperfect": {
+    "source": "iana",
+    "extensions": ["wpd"]
+  },
+  "application/vnd.wqd": {
+    "source": "iana",
+    "extensions": ["wqd"]
+  },
+  "application/vnd.wrq-hp3000-labelled": {
+    "source": "iana"
+  },
+  "application/vnd.wt.stf": {
+    "source": "iana",
+    "extensions": ["stf"]
+  },
+  "application/vnd.wv.csp+wbxml": {
+    "source": "iana"
+  },
+  "application/vnd.wv.csp+xml": {
+    "source": "iana"
+  },
+  "application/vnd.wv.ssp+xml": {
+    "source": "iana"
+  },
+  "application/vnd.xacml+json": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/vnd.xara": {
+    "source": "iana",
+    "extensions": ["xar"]
+  },
+  "application/vnd.xfdl": {
+    "source": "iana",
+    "extensions": ["xfdl"]
+  },
+  "application/vnd.xfdl.webform": {
+    "source": "iana"
+  },
+  "application/vnd.xmi+xml": {
+    "source": "iana"
+  },
+  "application/vnd.xmpie.cpkg": {
+    "source": "iana"
+  },
+  "application/vnd.xmpie.dpkg": {
+    "source": "iana"
+  },
+  "application/vnd.xmpie.plan": {
+    "source": "iana"
+  },
+  "application/vnd.xmpie.ppkg": {
+    "source": "iana"
+  },
+  "application/vnd.xmpie.xlim": {
+    "source": "iana"
+  },
+  "application/vnd.yamaha.hv-dic": {
+    "source": "iana",
+    "extensions": ["hvd"]
+  },
+  "application/vnd.yamaha.hv-script": {
+    "source": "iana",
+    "extensions": ["hvs"]
+  },
+  "application/vnd.yamaha.hv-voice": {
+    "source": "iana",
+    "extensions": ["hvp"]
+  },
+  "application/vnd.yamaha.openscoreformat": {
+    "source": "iana",
+    "extensions": ["osf"]
+  },
+  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
+    "source": "iana",
+    "extensions": ["osfpvg"]
+  },
+  "application/vnd.yamaha.remote-setup": {
+    "source": "iana"
+  },
+  "application/vnd.yamaha.smaf-audio": {
+    "source": "iana",
+    "extensions": ["saf"]
+  },
+  "application/vnd.yamaha.smaf-phrase": {
+    "source": "iana",
+    "extensions": ["spf"]
+  },
+  "application/vnd.yamaha.through-ngn": {
+    "source": "iana"
+  },
+  "application/vnd.yamaha.tunnel-udpencap": {
+    "source": "iana"
+  },
+  "application/vnd.yaoweme": {
+    "source": "iana"
+  },
+  "application/vnd.yellowriver-custom-menu": {
+    "source": "iana",
+    "extensions": ["cmp"]
+  },
+  "application/vnd.zul": {
+    "source": "iana",
+    "extensions": ["zir","zirz"]
+  },
+  "application/vnd.zzazz.deck+xml": {
+    "source": "iana",
+    "extensions": ["zaz"]
+  },
+  "application/voicexml+xml": {
+    "source": "iana",
+    "extensions": ["vxml"]
+  },
+  "application/vq-rtcpxr": {
+    "source": "iana"
+  },
+  "application/watcherinfo+xml": {
+    "source": "iana"
+  },
+  "application/whoispp-query": {
+    "source": "iana"
+  },
+  "application/whoispp-response": {
+    "source": "iana"
+  },
+  "application/widget": {
+    "source": "iana",
+    "extensions": ["wgt"]
+  },
+  "application/winhlp": {
+    "source": "apache",
+    "extensions": ["hlp"]
+  },
+  "application/wita": {
+    "source": "iana"
+  },
+  "application/wordperfect5.1": {
+    "source": "iana"
+  },
+  "application/wsdl+xml": {
+    "source": "iana",
+    "extensions": ["wsdl"]
+  },
+  "application/wspolicy+xml": {
+    "source": "iana",
+    "extensions": ["wspolicy"]
+  },
+  "application/x-7z-compressed": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["7z"]
+  },
+  "application/x-abiword": {
+    "source": "apache",
+    "extensions": ["abw"]
+  },
+  "application/x-ace-compressed": {
+    "source": "apache",
+    "extensions": ["ace"]
+  },
+  "application/x-amf": {
+    "source": "apache"
+  },
+  "application/x-apple-diskimage": {
+    "source": "apache",
+    "extensions": ["dmg"]
+  },
+  "application/x-authorware-bin": {
+    "source": "apache",
+    "extensions": ["aab","x32","u32","vox"]
+  },
+  "application/x-authorware-map": {
+    "source": "apache",
+    "extensions": ["aam"]
+  },
+  "application/x-authorware-seg": {
+    "source": "apache",
+    "extensions": ["aas"]
+  },
+  "application/x-bcpio": {
+    "source": "apache",
+    "extensions": ["bcpio"]
+  },
+  "application/x-bittorrent": {
+    "source": "apache",
+    "extensions": ["torrent"]
+  },
+  "application/x-blorb": {
+    "source": "apache",
+    "extensions": ["blb","blorb"]
+  },
+  "application/x-bzip": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["bz"]
+  },
+  "application/x-bzip2": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["bz2","boz"]
+  },
+  "application/x-cbr": {
+    "source": "apache",
+    "extensions": ["cbr","cba","cbt","cbz","cb7"]
+  },
+  "application/x-cdlink": {
+    "source": "apache",
+    "extensions": ["vcd"]
+  },
+  "application/x-cfs-compressed": {
+    "source": "apache",
+    "extensions": ["cfs"]
+  },
+  "application/x-chat": {
+    "source": "apache",
+    "extensions": ["chat"]
+  },
+  "application/x-chess-pgn": {
+    "source": "apache",
+    "extensions": ["pgn"]
+  },
+  "application/x-chrome-extension": {
+    "extensions": ["crx"]
+  },
+  "application/x-compress": {
+    "source": "apache"
+  },
+  "application/x-conference": {
+    "source": "apache",
+    "extensions": ["nsc"]
+  },
+  "application/x-cpio": {
+    "source": "apache",
+    "extensions": ["cpio"]
+  },
+  "application/x-csh": {
+    "source": "apache",
+    "extensions": ["csh"]
+  },
+  "application/x-deb": {
+    "compressible": false
+  },
+  "application/x-debian-package": {
+    "source": "apache",
+    "extensions": ["deb","udeb"]
+  },
+  "application/x-dgc-compressed": {
+    "source": "apache",
+    "extensions": ["dgc"]
+  },
+  "application/x-director": {
+    "source": "apache",
+    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
+  },
+  "application/x-doom": {
+    "source": "apache",
+    "extensions": ["wad"]
+  },
+  "application/x-dtbncx+xml": {
+    "source": "apache",
+    "extensions": ["ncx"]
+  },
+  "application/x-dtbook+xml": {
+    "source": "apache",
+    "extensions": ["dtb"]
+  },
+  "application/x-dtbresource+xml": {
+    "source": "apache",
+    "extensions": ["res"]
+  },
+  "application/x-dvi": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["dvi"]
+  },
+  "application/x-envoy": {
+    "source": "apache",
+    "extensions": ["evy"]
+  },
+  "application/x-eva": {
+    "source": "apache",
+    "extensions": ["eva"]
+  },
+  "application/x-font-bdf": {
+    "source": "apache",
+    "extensions": ["bdf"]
+  },
+  "application/x-font-dos": {
+    "source": "apache"
+  },
+  "application/x-font-framemaker": {
+    "source": "apache"
+  },
+  "application/x-font-ghostscript": {
+    "source": "apache",
+    "extensions": ["gsf"]
+  },
+  "application/x-font-libgrx": {
+    "source": "apache"
+  },
+  "application/x-font-linux-psf": {
+    "source": "apache",
+    "extensions": ["psf"]
+  },
+  "application/x-font-otf": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["otf"]
+  },
+  "application/x-font-pcf": {
+    "source": "apache",
+    "extensions": ["pcf"]
+  },
+  "application/x-font-snf": {
+    "source": "apache",
+    "extensions": ["snf"]
+  },
+  "application/x-font-speedo": {
+    "source": "apache"
+  },
+  "application/x-font-sunos-news": {
+    "source": "apache"
+  },
+  "application/x-font-ttf": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["ttf","ttc"]
+  },
+  "application/x-font-type1": {
+    "source": "apache",
+    "extensions": ["pfa","pfb","pfm","afm"]
+  },
+  "application/x-font-vfont": {
+    "source": "apache"
+  },
+  "application/x-freearc": {
+    "source": "apache",
+    "extensions": ["arc"]
+  },
+  "application/x-futuresplash": {
+    "source": "apache",
+    "extensions": ["spl"]
+  },
+  "application/x-gca-compressed": {
+    "source": "apache",
+    "extensions": ["gca"]
+  },
+  "application/x-glulx": {
+    "source": "apache",
+    "extensions": ["ulx"]
+  },
+  "application/x-gnumeric": {
+    "source": "apache",
+    "extensions": ["gnumeric"]
+  },
+  "application/x-gramps-xml": {
+    "source": "apache",
+    "extensions": ["gramps"]
+  },
+  "application/x-gtar": {
+    "source": "apache",
+    "extensions": ["gtar"]
+  },
+  "application/x-gzip": {
+    "source": "apache"
+  },
+  "application/x-hdf": {
+    "source": "apache",
+    "extensions": ["hdf"]
+  },
+  "application/x-install-instructions": {
+    "source": "apache",
+    "extensions": ["install"]
+  },
+  "application/x-iso9660-image": {
+    "source": "apache",
+    "extensions": ["iso"]
+  },
+  "application/x-java-jnlp-file": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["jnlp"]
+  },
+  "application/x-javascript": {
+    "compressible": true
+  },
+  "application/x-latex": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["latex"]
+  },
+  "application/x-lua-bytecode": {
+    "extensions": ["luac"]
+  },
+  "application/x-lzh-compressed": {
+    "source": "apache",
+    "extensions": ["lzh","lha"]
+  },
+  "application/x-mie": {
+    "source": "apache",
+    "extensions": ["mie"]
+  },
+  "application/x-mobipocket-ebook": {
+    "source": "apache",
+    "extensions": ["prc","mobi"]
+  },
+  "application/x-mpegurl": {
+    "compressible": false
+  },
+  "application/x-ms-application": {
+    "source": "apache",
+    "extensions": ["application"]
+  },
+  "application/x-ms-shortcut": {
+    "source": "apache",
+    "extensions": ["lnk"]
+  },
+  "application/x-ms-wmd": {
+    "source": "apache",
+    "extensions": ["wmd"]
+  },
+  "application/x-ms-wmz": {
+    "source": "apache",
+    "extensions": ["wmz"]
+  },
+  "application/x-ms-xbap": {
+    "source": "apache",
+    "extensions": ["xbap"]
+  },
+  "application/x-msaccess": {
+    "source": "apache",
+    "extensions": ["mdb"]
+  },
+  "application/x-msbinder": {
+    "source": "apache",
+    "extensions": ["obd"]
+  },
+  "application/x-mscardfile": {
+    "source": "apache",
+    "extensions": ["crd"]
+  },
+  "application/x-msclip": {
+    "source": "apache",
+    "extensions": ["clp"]
+  },
+  "application/x-msdownload": {
+    "source": "apache",
+    "extensions": ["exe","dll","com","bat","msi"]
+  },
+  "application/x-msmediaview": {
+    "source": "apache",
+    "extensions": ["mvb","m13","m14"]
+  },
+  "application/x-msmetafile": {
+    "source": "apache",
+    "extensions": ["wmf","wmz","emf","emz"]
+  },
+  "application/x-msmoney": {
+    "source": "apache",
+    "extensions": ["mny"]
+  },
+  "application/x-mspublisher": {
+    "source": "apache",
+    "extensions": ["pub"]
+  },
+  "application/x-msschedule": {
+    "source": "apache",
+    "extensions": ["scd"]
+  },
+  "application/x-msterminal": {
+    "source": "apache",
+    "extensions": ["trm"]
+  },
+  "application/x-mswrite": {
+    "source": "apache",
+    "extensions": ["wri"]
+  },
+  "application/x-netcdf": {
+    "source": "apache",
+    "extensions": ["nc","cdf"]
+  },
+  "application/x-nzb": {
+    "source": "apache",
+    "extensions": ["nzb"]
+  },
+  "application/x-pkcs12": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["p12","pfx"]
+  },
+  "application/x-pkcs7-certificates": {
+    "source": "apache",
+    "extensions": ["p7b","spc"]
+  },
+  "application/x-pkcs7-certreqresp": {
+    "source": "apache",
+    "extensions": ["p7r"]
+  },
+  "application/x-rar-compressed": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["rar"]
+  },
+  "application/x-research-info-systems": {
+    "source": "apache",
+    "extensions": ["ris"]
+  },
+  "application/x-sh": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["sh"]
+  },
+  "application/x-shar": {
+    "source": "apache",
+    "extensions": ["shar"]
+  },
+  "application/x-shockwave-flash": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["swf"]
+  },
+  "application/x-silverlight-app": {
+    "source": "apache",
+    "extensions": ["xap"]
+  },
+  "application/x-sql": {
+    "source": "apache",
+    "extensions": ["sql"]
+  },
+  "application/x-stuffit": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["sit"]
+  },
+  "application/x-stuffitx": {
+    "source": "apache",
+    "extensions": ["sitx"]
+  },
+  "application/x-subrip": {
+    "source": "apache",
+    "extensions": ["srt"]
+  },
+  "application/x-sv4cpio": {
+    "source": "apache",
+    "extensions": ["sv4cpio"]
+  },
+  "application/x-sv4crc": {
+    "source": "apache",
+    "extensions": ["sv4crc"]
+  },
+  "application/x-t3vm-image": {
+    "source": "apache",
+    "extensions": ["t3"]
+  },
+  "application/x-tads": {
+    "source": "apache",
+    "extensions": ["gam"]
+  },
+  "application/x-tar": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["tar"]
+  },
+  "application/x-tcl": {
+    "source": "apache",
+    "extensions": ["tcl"]
+  },
+  "application/x-tex": {
+    "source": "apache",
+    "extensions": ["tex"]
+  },
+  "application/x-tex-tfm": {
+    "source": "apache",
+    "extensions": ["tfm"]
+  },
+  "application/x-texinfo": {
+    "source": "apache",
+    "extensions": ["texinfo","texi"]
+  },
+  "application/x-tgif": {
+    "source": "apache",
+    "extensions": ["obj"]
+  },
+  "application/x-ustar": {
+    "source": "apache",
+    "extensions": ["ustar"]
+  },
+  "application/x-wais-source": {
+    "source": "apache",
+    "extensions": ["src"]
+  },
+  "application/x-web-app-manifest+json": {
+    "compressible": true,
+    "extensions": ["webapp"]
+  },
+  "application/x-www-form-urlencoded": {
+    "source": "iana",
+    "compressible": true
+  },
+  "application/x-x509-ca-cert": {
+    "source": "apache",
+    "extensions": ["der","crt"]
+  },
+  "application/x-xfig": {
+    "source": "apache",
+    "extensions": ["fig"]
+  },
+  "application/x-xliff+xml": {
+    "source": "apache",
+    "extensions": ["xlf"]
+  },
+  "application/x-xpinstall": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["xpi"]
+  },
+  "application/x-xz": {
+    "source": "apache",
+    "extensions": ["xz"]
+  },
+  "application/x-zmachine": {
+    "source": "apache",
+    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
+  },
+  "application/x400-bp": {
+    "source": "iana"
+  },
+  "application/xacml+xml": {
+    "source": "iana"
+  },
+  "application/xaml+xml": {
+    "source": "apache",
+    "extensions": ["xaml"]
+  },
+  "application/xcap-att+xml": {
+    "source": "iana"
+  },
+  "application/xcap-caps+xml": {
+    "source": "iana"
+  },
+  "application/xcap-diff+xml": {
+    "source": "iana",
+    "extensions": ["xdf"]
+  },
+  "application/xcap-el+xml": {
+    "source": "iana"
+  },
+  "application/xcap-error+xml": {
+    "source": "iana"
+  },
+  "application/xcap-ns+xml": {
+    "source": "iana"
+  },
+  "application/xcon-conference-info+xml": {
+    "source": "iana"
+  },
+  "application/xcon-conference-info-diff+xml": {
+    "source": "iana"
+  },
+  "application/xenc+xml": {
+    "source": "iana",
+    "extensions": ["xenc"]
+  },
+  "application/xhtml+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["xhtml","xht"]
+  },
+  "application/xhtml-voice+xml": {
+    "source": "iana"
+  },
+  "application/xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["xml","xsl","xsd"]
+  },
+  "application/xml-dtd": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["dtd"]
+  },
+  "application/xml-external-parsed-entity": {
+    "source": "iana"
+  },
+  "application/xml-patch+xml": {
+    "source": "iana"
+  },
+  "application/xmpp+xml": {
+    "source": "iana"
+  },
+  "application/xop+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["xop"]
+  },
+  "application/xproc+xml": {
+    "source": "apache",
+    "extensions": ["xpl"]
+  },
+  "application/xslt+xml": {
+    "source": "iana",
+    "extensions": ["xslt"]
+  },
+  "application/xspf+xml": {
+    "source": "apache",
+    "extensions": ["xspf"]
+  },
+  "application/xv+xml": {
+    "source": "iana",
+    "extensions": ["mxml","xhvml","xvml","xvm"]
+  },
+  "application/yang": {
+    "source": "iana",
+    "extensions": ["yang"]
+  },
+  "application/yin+xml": {
+    "source": "iana",
+    "extensions": ["yin"]
+  },
+  "application/zip": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["zip"]
+  },
+  "application/zlib": {
+    "source": "iana"
+  },
+  "audio/1d-interleaved-parityfec": {
+    "source": "iana"
+  },
+  "audio/32kadpcm": {
+    "source": "iana"
+  },
+  "audio/3gpp": {
+    "source": "iana"
+  },
+  "audio/3gpp2": {
+    "source": "iana"
+  },
+  "audio/ac3": {
+    "source": "iana"
+  },
+  "audio/adpcm": {
+    "source": "apache",
+    "extensions": ["adp"]
+  },
+  "audio/amr": {
+    "source": "iana"
+  },
+  "audio/amr-wb": {
+    "source": "iana"
+  },
+  "audio/amr-wb+": {
+    "source": "iana"
+  },
+  "audio/aptx": {
+    "source": "iana"
+  },
+  "audio/asc": {
+    "source": "iana"
+  },
+  "audio/atrac-advanced-lossless": {
+    "source": "iana"
+  },
+  "audio/atrac-x": {
+    "source": "iana"
+  },
+  "audio/atrac3": {
+    "source": "iana"
+  },
+  "audio/basic": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["au","snd"]
+  },
+  "audio/bv16": {
+    "source": "iana"
+  },
+  "audio/bv32": {
+    "source": "iana"
+  },
+  "audio/clearmode": {
+    "source": "iana"
+  },
+  "audio/cn": {
+    "source": "iana"
+  },
+  "audio/dat12": {
+    "source": "iana"
+  },
+  "audio/dls": {
+    "source": "iana"
+  },
+  "audio/dsr-es201108": {
+    "source": "iana"
+  },
+  "audio/dsr-es202050": {
+    "source": "iana"
+  },
+  "audio/dsr-es202211": {
+    "source": "iana"
+  },
+  "audio/dsr-es202212": {
+    "source": "iana"
+  },
+  "audio/dv": {
+    "source": "iana"
+  },
+  "audio/dvi4": {
+    "source": "iana"
+  },
+  "audio/eac3": {
+    "source": "iana"
+  },
+  "audio/encaprtp": {
+    "source": "iana"
+  },
+  "audio/evrc": {
+    "source": "iana"
+  },
+  "audio/evrc-qcp": {
+    "source": "iana"
+  },
+  "audio/evrc0": {
+    "source": "iana"
+  },
+  "audio/evrc1": {
+    "source": "iana"
+  },
+  "audio/evrcb": {
+    "source": "iana"
+  },
+  "audio/evrcb0": {
+    "source": "iana"
+  },
+  "audio/evrcb1": {
+    "source": "iana"
+  },
+  "audio/evrcnw": {
+    "source": "iana"
+  },
+  "audio/evrcnw0": {
+    "source": "iana"
+  },
+  "audio/evrcnw1": {
+    "source": "iana"
+  },
+  "audio/evrcwb": {
+    "source": "iana"
+  },
+  "audio/evrcwb0": {
+    "source": "iana"
+  },
+  "audio/evrcwb1": {
+    "source": "iana"
+  },
+  "audio/fwdred": {
+    "source": "iana"
+  },
+  "audio/g719": {
+    "source": "iana"
+  },
+  "audio/g722": {
+    "source": "iana"
+  },
+  "audio/g7221": {
+    "source": "iana"
+  },
+  "audio/g723": {
+    "source": "iana"
+  },
+  "audio/g726-16": {
+    "source": "iana"
+  },
+  "audio/g726-24": {
+    "source": "iana"
+  },
+  "audio/g726-32": {
+    "source": "iana"
+  },
+  "audio/g726-40": {
+    "source": "iana"
+  },
+  "audio/g728": {
+    "source": "iana"
+  },
+  "audio/g729": {
+    "source": "iana"
+  },
+  "audio/g7291": {
+    "source": "iana"
+  },
+  "audio/g729d": {
+    "source": "iana"
+  },
+  "audio/g729e": {
+    "source": "iana"
+  },
+  "audio/gsm": {
+    "source": "iana"
+  },
+  "audio/gsm-efr": {
+    "source": "iana"
+  },
+  "audio/gsm-hr-08": {
+    "source": "iana"
+  },
+  "audio/ilbc": {
+    "source": "iana"
+  },
+  "audio/ip-mr_v2.5": {
+    "source": "iana"
+  },
+  "audio/isac": {
+    "source": "apache"
+  },
+  "audio/l16": {
+    "source": "iana"
+  },
+  "audio/l20": {
+    "source": "iana"
+  },
+  "audio/l24": {
+    "source": "iana",
+    "compressible": false
+  },
+  "audio/l8": {
+    "source": "iana"
+  },
+  "audio/lpc": {
+    "source": "iana"
+  },
+  "audio/midi": {
+    "source": "apache",
+    "extensions": ["mid","midi","kar","rmi"]
+  },
+  "audio/mobile-xmf": {
+    "source": "iana"
+  },
+  "audio/mp4": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["mp4a","m4a"]
+  },
+  "audio/mp4a-latm": {
+    "source": "iana"
+  },
+  "audio/mpa": {
+    "source": "iana"
+  },
+  "audio/mpa-robust": {
+    "source": "iana"
+  },
+  "audio/mpeg": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
+  },
+  "audio/mpeg4-generic": {
+    "source": "iana"
+  },
+  "audio/musepack": {
+    "source": "apache"
+  },
+  "audio/ogg": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["oga","ogg","spx"]
+  },
+  "audio/opus": {
+    "source": "apache"
+  },
+  "audio/parityfec": {
+    "source": "iana"
+  },
+  "audio/pcma": {
+    "source": "iana"
+  },
+  "audio/pcma-wb": {
+    "source": "iana"
+  },
+  "audio/pcmu": {
+    "source": "iana"
+  },
+  "audio/pcmu-wb": {
+    "source": "iana"
+  },
+  "audio/prs.sid": {
+    "source": "iana"
+  },
+  "audio/qcelp": {
+    "source": "iana"
+  },
+  "audio/raptorfec": {
+    "source": "iana"
+  },
+  "audio/red": {
+    "source": "iana"
+  },
+  "audio/rtp-enc-aescm128": {
+    "source": "iana"
+  },
+  "audio/rtp-midi": {
+    "source": "iana"
+  },
+  "audio/rtploopback": {
+    "source": "iana"
+  },
+  "audio/rtx": {
+    "source": "iana"
+  },
+  "audio/s3m": {
+    "source": "apache",
+    "extensions": ["s3m"]
+  },
+  "audio/silk": {
+    "source": "apache",
+    "extensions": ["sil"]
+  },
+  "audio/smv": {
+    "source": "iana"
+  },
+  "audio/smv-qcp": {
+    "source": "iana"
+  },
+  "audio/smv0": {
+    "source": "iana"
+  },
+  "audio/sp-midi": {
+    "source": "iana"
+  },
+  "audio/speex": {
+    "source": "iana"
+  },
+  "audio/t140c": {
+    "source": "iana"
+  },
+  "audio/t38": {
+    "source": "iana"
+  },
+  "audio/telephone-event": {
+    "source": "iana"
+  },
+  "audio/tone": {
+    "source": "iana"
+  },
+  "audio/uemclip": {
+    "source": "iana"
+  },
+  "audio/ulpfec": {
+    "source": "iana"
+  },
+  "audio/vdvi": {
+    "source": "iana"
+  },
+  "audio/vmr-wb": {
+    "source": "iana"
+  },
+  "audio/vnd.3gpp.iufp": {
+    "source": "iana"
+  },
+  "audio/vnd.4sb": {
+    "source": "iana"
+  },
+  "audio/vnd.audiokoz": {
+    "source": "iana"
+  },
+  "audio/vnd.celp": {
+    "source": "iana"
+  },
+  "audio/vnd.cisco.nse": {
+    "source": "iana"
+  },
+  "audio/vnd.cmles.radio-events": {
+    "source": "iana"
+  },
+  "audio/vnd.cns.anp1": {
+    "source": "iana"
+  },
+  "audio/vnd.cns.inf1": {
+    "source": "iana"
+  },
+  "audio/vnd.dece.audio": {
+    "source": "iana",
+    "extensions": ["uva","uvva"]
+  },
+  "audio/vnd.digital-winds": {
+    "source": "iana",
+    "extensions": ["eol"]
+  },
+  "audio/vnd.dlna.adts": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.heaac.1": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.heaac.2": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.mlp": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.mps": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.pl2": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.pl2x": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.pl2z": {
+    "source": "iana"
+  },
+  "audio/vnd.dolby.pulse.1": {
+    "source": "iana"
+  },
+  "audio/vnd.dra": {
+    "source": "iana",
+    "extensions": ["dra"]
+  },
+  "audio/vnd.dts": {
+    "source": "iana",
+    "extensions": ["dts"]
+  },
+  "audio/vnd.dts.hd": {
+    "source": "iana",
+    "extensions": ["dtshd"]
+  },
+  "audio/vnd.dvb.file": {
+    "source": "iana"
+  },
+  "audio/vnd.everad.plj": {
+    "source": "iana"
+  },
+  "audio/vnd.hns.audio": {
+    "source": "iana"
+  },
+  "audio/vnd.lucent.voice": {
+    "source": "iana",
+    "extensions": ["lvp"]
+  },
+  "audio/vnd.ms-playready.media.pya": {
+    "source": "iana",
+    "extensions": ["pya"]
+  },
+  "audio/vnd.nokia.mobile-xmf": {
+    "source": "iana"
+  },
+  "audio/vnd.nortel.vbk": {
+    "source": "iana"
+  },
+  "audio/vnd.nuera.ecelp4800": {
+    "source": "iana",
+    "extensions": ["ecelp4800"]
+  },
+  "audio/vnd.nuera.ecelp7470": {
+    "source": "iana",
+    "extensions": ["ecelp7470"]
+  },
+  "audio/vnd.nuera.ecelp9600": {
+    "source": "iana",
+    "extensions": ["ecelp9600"]
+  },
+  "audio/vnd.octel.sbc": {
+    "source": "iana"
+  },
+  "audio/vnd.qcelp": {
+    "source": "iana"
+  },
+  "audio/vnd.rhetorex.32kadpcm": {
+    "source": "iana"
+  },
+  "audio/vnd.rip": {
+    "source": "iana",
+    "extensions": ["rip"]
+  },
+  "audio/vnd.rn-realaudio": {
+    "compressible": false
+  },
+  "audio/vnd.sealedmedia.softseal.mpeg": {
+    "source": "iana"
+  },
+  "audio/vnd.vmx.cvsd": {
+    "source": "iana"
+  },
+  "audio/vnd.wave": {
+    "compressible": false
+  },
+  "audio/vorbis": {
+    "source": "iana",
+    "compressible": false
+  },
+  "audio/vorbis-config": {
+    "source": "iana"
+  },
+  "audio/webm": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["weba"]
+  },
+  "audio/x-aac": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["aac"]
+  },
+  "audio/x-aiff": {
+    "source": "apache",
+    "extensions": ["aif","aiff","aifc"]
+  },
+  "audio/x-caf": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["caf"]
+  },
+  "audio/x-flac": {
+    "source": "apache",
+    "extensions": ["flac"]
+  },
+  "audio/x-matroska": {
+    "source": "apache",
+    "extensions": ["mka"]
+  },
+  "audio/x-mpegurl": {
+    "source": "apache",
+    "extensions": ["m3u"]
+  },
+  "audio/x-ms-wax": {
+    "source": "apache",
+    "extensions": ["wax"]
+  },
+  "audio/x-ms-wma": {
+    "source": "apache",
+    "extensions": ["wma"]
+  },
+  "audio/x-pn-realaudio": {
+    "source": "apache",
+    "extensions": ["ram","ra"]
+  },
+  "audio/x-pn-realaudio-plugin": {
+    "source": "apache",
+    "extensions": ["rmp"]
+  },
+  "audio/x-tta": {
+    "source": "apache"
+  },
+  "audio/x-wav": {
+    "source": "apache",
+    "extensions": ["wav"]
+  },
+  "audio/xm": {
+    "source": "apache",
+    "extensions": ["xm"]
+  },
+  "chemical/x-cdx": {
+    "source": "apache",
+    "extensions": ["cdx"]
+  },
+  "chemical/x-cif": {
+    "source": "apache",
+    "extensions": ["cif"]
+  },
+  "chemical/x-cmdf": {
+    "source": "apache",
+    "extensions": ["cmdf"]
+  },
+  "chemical/x-cml": {
+    "source": "apache",
+    "extensions": ["cml"]
+  },
+  "chemical/x-csml": {
+    "source": "apache",
+    "extensions": ["csml"]
+  },
+  "chemical/x-pdb": {
+    "source": "apache"
+  },
+  "chemical/x-xyz": {
+    "source": "apache",
+    "extensions": ["xyz"]
+  },
+  "font/opentype": {
+    "compressible": true,
+    "extensions": ["otf"]
+  },
+  "image/bmp": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["bmp"]
+  },
+  "image/cgm": {
+    "source": "iana",
+    "extensions": ["cgm"]
+  },
+  "image/fits": {
+    "source": "iana"
+  },
+  "image/g3fax": {
+    "source": "iana",
+    "extensions": ["g3"]
+  },
+  "image/gif": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["gif"]
+  },
+  "image/ief": {
+    "source": "iana",
+    "extensions": ["ief"]
+  },
+  "image/jp2": {
+    "source": "iana"
+  },
+  "image/jpeg": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["jpeg","jpg","jpe"]
+  },
+  "image/jpm": {
+    "source": "iana"
+  },
+  "image/jpx": {
+    "source": "iana"
+  },
+  "image/ktx": {
+    "source": "iana",
+    "extensions": ["ktx"]
+  },
+  "image/naplps": {
+    "source": "iana"
+  },
+  "image/pjpeg": {
+    "compressible": false
+  },
+  "image/png": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["png"]
+  },
+  "image/prs.btif": {
+    "source": "iana",
+    "extensions": ["btif"]
+  },
+  "image/prs.pti": {
+    "source": "iana"
+  },
+  "image/pwg-raster": {
+    "source": "iana"
+  },
+  "image/sgi": {
+    "source": "apache",
+    "extensions": ["sgi"]
+  },
+  "image/svg+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["svg","svgz"]
+  },
+  "image/t38": {
+    "source": "iana"
+  },
+  "image/tiff": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["tiff","tif"]
+  },
+  "image/tiff-fx": {
+    "source": "iana"
+  },
+  "image/vnd.adobe.photoshop": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["psd"]
+  },
+  "image/vnd.airzip.accelerator.azv": {
+    "source": "iana"
+  },
+  "image/vnd.cns.inf2": {
+    "source": "iana"
+  },
+  "image/vnd.dece.graphic": {
+    "source": "iana",
+    "extensions": ["uvi","uvvi","uvg","uvvg"]
+  },
+  "image/vnd.djvu": {
+    "source": "iana",
+    "extensions": ["djvu","djv"]
+  },
+  "image/vnd.dvb.subtitle": {
+    "source": "iana",
+    "extensions": ["sub"]
+  },
+  "image/vnd.dwg": {
+    "source": "iana",
+    "extensions": ["dwg"]
+  },
+  "image/vnd.dxf": {
+    "source": "iana",
+    "extensions": ["dxf"]
+  },
+  "image/vnd.fastbidsheet": {
+    "source": "iana",
+    "extensions": ["fbs"]
+  },
+  "image/vnd.fpx": {
+    "source": "iana",
+    "extensions": ["fpx"]
+  },
+  "image/vnd.fst": {
+    "source": "iana",
+    "extensions": ["fst"]
+  },
+  "image/vnd.fujixerox.edmics-mmr": {
+    "source": "iana",
+    "extensions": ["mmr"]
+  },
+  "image/vnd.fujixerox.edmics-rlc": {
+    "source": "iana",
+    "extensions": ["rlc"]
+  },
+  "image/vnd.globalgraphics.pgb": {
+    "source": "iana"
+  },
+  "image/vnd.microsoft.icon": {
+    "source": "iana"
+  },
+  "image/vnd.mix": {
+    "source": "iana"
+  },
+  "image/vnd.ms-modi": {
+    "source": "iana",
+    "extensions": ["mdi"]
+  },
+  "image/vnd.ms-photo": {
+    "source": "apache",
+    "extensions": ["wdp"]
+  },
+  "image/vnd.net-fpx": {
+    "source": "iana",
+    "extensions": ["npx"]
+  },
+  "image/vnd.radiance": {
+    "source": "iana"
+  },
+  "image/vnd.sealed.png": {
+    "source": "iana"
+  },
+  "image/vnd.sealedmedia.softseal.gif": {
+    "source": "iana"
+  },
+  "image/vnd.sealedmedia.softseal.jpg": {
+    "source": "iana"
+  },
+  "image/vnd.svf": {
+    "source": "iana"
+  },
+  "image/vnd.tencent.tap": {
+    "source": "iana"
+  },
+  "image/vnd.valve.source.texture": {
+    "source": "iana"
+  },
+  "image/vnd.wap.wbmp": {
+    "source": "iana",
+    "extensions": ["wbmp"]
+  },
+  "image/vnd.xiff": {
+    "source": "iana",
+    "extensions": ["xif"]
+  },
+  "image/webp": {
+    "source": "apache",
+    "extensions": ["webp"]
+  },
+  "image/x-3ds": {
+    "source": "apache",
+    "extensions": ["3ds"]
+  },
+  "image/x-cmu-raster": {
+    "source": "apache",
+    "extensions": ["ras"]
+  },
+  "image/x-cmx": {
+    "source": "apache",
+    "extensions": ["cmx"]
+  },
+  "image/x-freehand": {
+    "source": "apache",
+    "extensions": ["fh","fhc","fh4","fh5","fh7"]
+  },
+  "image/x-icon": {
+    "source": "apache",
+    "compressible": true,
+    "extensions": ["ico"]
+  },
+  "image/x-mrsid-image": {
+    "source": "apache",
+    "extensions": ["sid"]
+  },
+  "image/x-pcx": {
+    "source": "apache",
+    "extensions": ["pcx"]
+  },
+  "image/x-pict": {
+    "source": "apache",
+    "extensions": ["pic","pct"]
+  },
+  "image/x-portable-anymap": {
+    "source": "apache",
+    "extensions": ["pnm"]
+  },
+  "image/x-portable-bitmap": {
+    "source": "apache",
+    "extensions": ["pbm"]
+  },
+  "image/x-portable-graymap": {
+    "source": "apache",
+    "extensions": ["pgm"]
+  },
+  "image/x-portable-pixmap": {
+    "source": "apache",
+    "extensions": ["ppm"]
+  },
+  "image/x-rgb": {
+    "source": "apache",
+    "extensions": ["rgb"]
+  },
+  "image/x-tga": {
+    "source": "apache",
+    "extensions": ["tga"]
+  },
+  "image/x-xbitmap": {
+    "source": "apache",
+    "extensions": ["xbm"]
+  },
+  "image/x-xcf": {
+    "compressible": false
+  },
+  "image/x-xpixmap": {
+    "source": "apache",
+    "extensions": ["xpm"]
+  },
+  "image/x-xwindowdump": {
+    "source": "apache",
+    "extensions": ["xwd"]
+  },
+  "message/cpim": {
+    "source": "iana"
+  },
+  "message/delivery-status": {
+    "source": "iana"
+  },
+  "message/disposition-notification": {
+    "source": "iana"
+  },
+  "message/external-body": {
+    "source": "iana"
+  },
+  "message/feedback-report": {
+    "source": "iana"
+  },
+  "message/global": {
+    "source": "iana"
+  },
+  "message/global-delivery-status": {
+    "source": "iana"
+  },
+  "message/global-disposition-notification": {
+    "source": "iana"
+  },
+  "message/global-headers": {
+    "source": "iana"
+  },
+  "message/http": {
+    "source": "iana",
+    "compressible": false
+  },
+  "message/imdn+xml": {
+    "source": "iana",
+    "compressible": true
+  },
+  "message/news": {
+    "source": "iana"
+  },
+  "message/partial": {
+    "source": "iana",
+    "compressible": false
+  },
+  "message/rfc822": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["eml","mime"]
+  },
+  "message/s-http": {
+    "source": "iana"
+  },
+  "message/sip": {
+    "source": "iana"
+  },
+  "message/sipfrag": {
+    "source": "iana"
+  },
+  "message/tracking-status": {
+    "source": "iana"
+  },
+  "message/vnd.si.simp": {
+    "source": "iana"
+  },
+  "message/vnd.wfa.wsc": {
+    "source": "iana"
+  },
+  "model/iges": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["igs","iges"]
+  },
+  "model/mesh": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["msh","mesh","silo"]
+  },
+  "model/vnd.collada+xml": {
+    "source": "iana",
+    "extensions": ["dae"]
+  },
+  "model/vnd.dwf": {
+    "source": "iana",
+    "extensions": ["dwf"]
+  },
+  "model/vnd.flatland.3dml": {
+    "source": "iana"
+  },
+  "model/vnd.gdl": {
+    "source": "iana",
+    "extensions": ["gdl"]
+  },
+  "model/vnd.gs-gdl": {
+    "source": "apache"
+  },
+  "model/vnd.gs.gdl": {
+    "source": "iana"
+  },
+  "model/vnd.gtw": {
+    "source": "iana",
+    "extensions": ["gtw"]
+  },
+  "model/vnd.moml+xml": {
+    "source": "iana"
+  },
+  "model/vnd.mts": {
+    "source": "iana",
+    "extensions": ["mts"]
+  },
+  "model/vnd.opengex": {
+    "source": "iana"
+  },
+  "model/vnd.parasolid.transmit.binary": {
+    "source": "iana"
+  },
+  "model/vnd.parasolid.transmit.text": {
+    "source": "iana"
+  },
+  "model/vnd.valve.source.compiled-map": {
+    "source": "iana"
+  },
+  "model/vnd.vtu": {
+    "source": "iana",
+    "extensions": ["vtu"]
+  },
+  "model/vrml": {
+    "source": "iana",
+    "compressible": false,
+    "extensions": ["wrl","vrml"]
+  },
+  "model/x3d+binary": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["x3db","x3dbz"]
+  },
+  "model/x3d+fastinfoset": {
+    "source": "iana"
+  },
+  "model/x3d+vrml": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["x3dv","x3dvz"]
+  },
+  "model/x3d+xml": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["x3d","x3dz"]
+  },
+  "model/x3d-vrml": {
+    "source": "iana"
+  },
+  "multipart/alternative": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/appledouble": {
+    "source": "iana"
+  },
+  "multipart/byteranges": {
+    "source": "iana"
+  },
+  "multipart/digest": {
+    "source": "iana"
+  },
+  "multipart/encrypted": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/form-data": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/header-set": {
+    "source": "iana"
+  },
+  "multipart/mixed": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/parallel": {
+    "source": "iana"
+  },
+  "multipart/related": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/report": {
+    "source": "iana"
+  },
+  "multipart/signed": {
+    "source": "iana",
+    "compressible": false
+  },
+  "multipart/voice-message": {
+    "source": "iana"
+  },
+  "multipart/x-mixed-replace": {
+    "source": "iana"
+  },
+  "text/1d-interleaved-parityfec": {
+    "source": "iana"
+  },
+  "text/cache-manifest": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["appcache","manifest"]
+  },
+  "text/calendar": {
+    "source": "iana",
+    "extensions": ["ics","ifb"]
+  },
+  "text/calender": {
+    "compressible": true
+  },
+  "text/cmd": {
+    "compressible": true
+  },
+  "text/coffeescript": {
+    "extensions": ["coffee"]
+  },
+  "text/css": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["css"]
+  },
+  "text/csv": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["csv"]
+  },
+  "text/csv-schema": {
+    "source": "iana"
+  },
+  "text/directory": {
+    "source": "iana"
+  },
+  "text/dns": {
+    "source": "iana"
+  },
+  "text/ecmascript": {
+    "source": "iana"
+  },
+  "text/encaprtp": {
+    "source": "iana"
+  },
+  "text/enriched": {
+    "source": "iana"
+  },
+  "text/fwdred": {
+    "source": "iana"
+  },
+  "text/grammar-ref-list": {
+    "source": "iana"
+  },
+  "text/hjson": {
+    "extensions": ["hjson"]
+  },
+  "text/html": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["html","htm"]
+  },
+  "text/jade": {
+    "extensions": ["jade"]
+  },
+  "text/javascript": {
+    "source": "iana",
+    "compressible": true
+  },
+  "text/jcr-cnd": {
+    "source": "iana"
+  },
+  "text/jsx": {
+    "compressible": true,
+    "extensions": ["jsx"]
+  },
+  "text/less": {
+    "extensions": ["less"]
+  },
+  "text/markdown": {
+    "source": "iana"
+  },
+  "text/mizar": {
+    "source": "iana"
+  },
+  "text/n3": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["n3"]
+  },
+  "text/parameters": {
+    "source": "iana"
+  },
+  "text/parityfec": {
+    "source": "iana"
+  },
+  "text/plain": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["txt","text","conf","def","list","log","in","ini"]
+  },
+  "text/provenance-notation": {
+    "source": "iana"
+  },
+  "text/prs.fallenstein.rst": {
+    "source": "iana"
+  },
+  "text/prs.lines.tag": {
+    "source": "iana",
+    "extensions": ["dsc"]
+  },
+  "text/raptorfec": {
+    "source": "iana"
+  },
+  "text/red": {
+    "source": "iana"
+  },
+  "text/rfc822-headers": {
+    "source": "iana"
+  },
+  "text/richtext": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["rtx"]
+  },
+  "text/rtf": {
+    "source": "iana"
+  },
+  "text/rtp-enc-aescm128": {
+    "source": "iana"
+  },
+  "text/rtploopback": {
+    "source": "iana"
+  },
+  "text/rtx": {
+    "source": "iana"
+  },
+  "text/sgml": {
+    "source": "iana",
+    "extensions": ["sgml","sgm"]
+  },
+  "text/stylus": {
+    "extensions": ["stylus","styl"]
+  },
+  "text/t140": {
+    "source": "iana"
+  },
+  "text/tab-separated-values": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["tsv"]
+  },
+  "text/troff": {
+    "source": "iana",
+    "extensions": ["t","tr","roff","man","me","ms"]
+  },
+  "text/turtle": {
+    "source": "iana",
+    "extensions": ["ttl"]
+  },
+  "text/ulpfec": {
+    "source": "iana"
+  },
+  "text/uri-list": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["uri","uris","urls"]
+  },
+  "text/vcard": {
+    "source": "iana",
+    "compressible": true,
+    "extensions": ["vcard"]
+  },
+  "text/vnd.a": {
+    "source": "iana"
+  },
+  "text/vnd.abc": {
+    "source": "iana"
+  },
+  "text/vnd.curl": {
+    "source": "iana",
+    "extensions": ["curl"]
+  },
+  "text/vnd.curl.dcurl": {
+    "source": "apache",
+    "extensions": ["dcurl"]
+  },
+  "text/vnd.curl.mcurl": {
+    "source": "apache",
+    "extensions": ["mcurl"]
+  },
+  "text/vnd.curl.scurl": {
+    "source": "apache",
+    "extensions": ["scurl"]
+  },
+  "text/vnd.debian.copyright": {
+    "source": "iana"
+  },
+  "text/vnd.dmclientscript": {
+    "source": "iana"
+  },
+  "text/vnd.dvb.subtitle": {
+    "source": "iana",
+    "extensions": ["sub"]
+  },
+  "text/vnd.esmertec.theme-descriptor": {
+    "source": "iana"
+  },
+  "text/vnd.fly": {
+    "source": "iana",
+    "extensions": ["fly"]
+  },
+  "text/vnd.fmi.flexstor": {
+    "source": "iana",
+    "extensions": ["flx"]
+  },
+  "text/vnd.graphviz": {
+    "source": "iana",
+    "extensions": ["gv"]
+  },
+  "text/vnd.in3d.3dml": {
+    "source": "iana",
+    "extensions": ["3dml"]
+  },
+  "text/vnd.in3d.spot": {
+    "source": "iana",
+    "extensions": ["spot"]
+  },
+  "text/vnd.iptc.newsml": {
+    "source": "iana"
+  },
+  "text/vnd.iptc.nitf": {
+    "source": "iana"
+  },
+  "text/vnd.latex-z": {
+    "source": "iana"
+  },
+  "text/vnd.motorola.reflex": {
+    "source": "iana"
+  },
+  "text/vnd.ms-mediapackage": {
+    "source": "iana"
+  },
+  "text/vnd.net2phone.commcenter.command": {
+    "source": "iana"
+  },
+  "text/vnd.radisys.msml-basic-layout": {
+    "source": "iana"
+  },
+  "text/vnd.si.uricatalogue": {
+    "source": "iana"
+  },
+  "text/vnd.sun.j2me.app-descriptor": {
+    "source": "iana",
+    "extensions": ["jad"]
+  },
+  "text/vnd.trolltech.linguist": {
+    "source": "iana"
+  },
+  "text/vnd.wap.si": {
+    "source": "iana"
+  },
+  "text/vnd.wap.sl": {
+    "source": "iana"
+  },
+  "text/vnd.wap.wml": {
+    "source": "iana",
+    "extensions": ["wml"]
+  },
+  "text/vnd.wap.wmlscript": {
+    "source": "iana",
+    "extensions": ["wmls"]
+  },
+  "text/vtt": {
+    "charset": "UTF-8",
+    "compressible": true,
+    "extensions": ["vtt"]
+  },
+  "text/x-asm": {
+    "source": "apache",
+    "extensions": ["s","asm"]
+  },
+  "text/x-c": {
+    "source": "apache",
+    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
+  },
+  "text/x-component": {
+    "extensions": ["htc"]
+  },
+  "text/x-fortran": {
+    "source": "apache",
+    "extensions": ["f","for","f77","f90"]
+  },
+  "text/x-gwt-rpc": {
+    "compressible": true
+  },
+  "text/x-handlebars-template": {
+    "extensions": ["hbs"]
+  },
+  "text/x-java-source": {
+    "source": "apache",
+    "extensions": ["java"]
+  },
+  "text/x-jquery-tmpl": {
+    "compressible": true
+  },
+  "text/x-lua": {
+    "extensions": ["lua"]
+  },
+  "text/x-markdown": {
+    "compressible": true,
+    "extensions": ["markdown","md","mkd"]
+  },
+  "text/x-nfo": {
+    "source": "apache",
+    "extensions": ["nfo"]
+  },
+  "text/x-opml": {
+    "source": "apache",
+    "extensions": ["opml"]
+  },
+  "text/x-pascal": {
+    "source": "apache",
+    "extensions": ["p","pas"]
+  },
+  "text/x-sass": {
+    "extensions": ["sass"]
+  },
+  "text/x-scss": {
+    "extensions": ["scss"]
+  },
+  "text/x-setext": {
+    "source": "apache",
+    "extensions": ["etx"]
+  },
+  "text/x-sfv": {
+    "source": "apache",
+    "extensions": ["sfv"]
+  },
+  "text/x-uuencode": {
+    "source": "apache",
+    "extensions": ["uu"]
+  },
+  "text/x-vcalendar": {
+    "source": "apache",
+    "extensions": ["vcs"]
+  },
+  "text/x-vcard": {
+    "source": "apache",
+    "extensions": ["vcf"]
+  },
+  "text/xml": {
+    "source": "iana",
+    "compressible": true
+  },
+  "text/xml-external-parsed-entity": {
+    "source": "iana"
+  },
+  "text/yaml": {
+    "extensions": ["yaml","yml"]
+  },
+  "video/1d-interleaved-parityfec": {
+    "source": "apache"
+  },
+  "video/3gpp": {
+    "source": "apache",
+    "extensions": ["3gp"]
+  },
+  "video/3gpp-tt": {
+    "source": "apache"
+  },
+  "video/3gpp2": {
+    "source": "apache",
+    "extensions": ["3g2"]
+  },
+  "video/bmpeg": {
+    "source": "apache"
+  },
+  "video/bt656": {
+    "source": "apache"
+  },
+  "video/celb": {
+    "source": "apache"
+  },
+  "video/dv": {
+    "source": "apache"
+  },
+  "video/h261": {
+    "source": "apache",
+    "extensions": ["h261"]
+  },
+  "video/h263": {
+    "source": "apache",
+    "extensions": ["h263"]
+  },
+  "video/h263-1998": {
+    "source": "apache"
+  },
+  "video/h263-2000": {
+    "source": "apache"
+  },
+  "video/h264": {
+    "source": "apache",
+    "extensions": ["h264"]
+  },
+  "video/h264-rcdo": {
+    "source": "apache"
+  },
+  "video/h264-svc": {
+    "source": "apache"
+  },
+  "video/jpeg": {
+    "source": "apache",
+    "extensions": ["jpgv"]
+  },
+  "video/jpeg2000": {
+    "source": "apache"
+  },
+  "video/jpm": {
+    "source": "apache",
+    "extensions": ["jpm","jpgm"]
+  },
+  "video/mj2": {
+    "source": "apache",
+    "extensions": ["mj2","mjp2"]
+  },
+  "video/mp1s": {
+    "source": "apache"
+  },
+  "video/mp2p": {
+    "source": "apache"
+  },
+  "video/mp2t": {
+    "source": "apache",
+    "extensions": ["ts"]
+  },
+  "video/mp4": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["mp4","mp4v","mpg4"]
+  },
+  "video/mp4v-es": {
+    "source": "apache"
+  },
+  "video/mpeg": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
+  },
+  "video/mpeg4-generic": {
+    "source": "apache"
+  },
+  "video/mpv": {
+    "source": "apache"
+  },
+  "video/nv": {
+    "source": "apache"
+  },
+  "video/ogg": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["ogv"]
+  },
+  "video/parityfec": {
+    "source": "apache"
+  },
+  "video/pointer": {
+    "source": "apache"
+  },
+  "video/quicktime": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["qt","mov"]
+  },
+  "video/raw": {
+    "source": "apache"
+  },
+  "video/rtp-enc-aescm128": {
+    "source": "apache"
+  },
+  "video/rtx": {
+    "source": "apache"
+  },
+  "video/smpte292m": {
+    "source": "apache"
+  },
+  "video/ulpfec": {
+    "source": "apache"
+  },
+  "video/vc1": {
+    "source": "apache"
+  },
+  "video/vnd.cctv": {
+    "source": "apache"
+  },
+  "video/vnd.dece.hd": {
+    "source": "apache",
+    "extensions": ["uvh","uvvh"]
+  },
+  "video/vnd.dece.mobile": {
+    "source": "apache",
+    "extensions": ["uvm","uvvm"]
+  },
+  "video/vnd.dece.mp4": {
+    "source": "apache"
+  },
+  "video/vnd.dece.pd": {
+    "source": "apache",
+    "extensions": ["uvp","uvvp"]
+  },
+  "video/vnd.dece.sd": {
+    "source": "apache",
+    "extensions": ["uvs","uvvs"]
+  },
+  "video/vnd.dece.video": {
+    "source": "apache",
+    "extensions": ["uvv","uvvv"]
+  },
+  "video/vnd.directv.mpeg": {
+    "source": "apache"
+  },
+  "video/vnd.directv.mpeg-tts": {
+    "source": "apache"
+  },
+  "video/vnd.dlna.mpeg-tts": {
+    "source": "apache"
+  },
+  "video/vnd.dvb.file": {
+    "source": "apache",
+    "extensions": ["dvb"]
+  },
+  "video/vnd.fvt": {
+    "source": "apache",
+    "extensions": ["fvt"]
+  },
+  "video/vnd.hns.video": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.1dparityfec-1010": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.1dparityfec-2005": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.2dparityfec-1010": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.2dparityfec-2005": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.ttsavc": {
+    "source": "apache"
+  },
+  "video/vnd.iptvforum.ttsmpeg2": {
+    "source": "apache"
+  },
+  "video/vnd.motorola.video": {
+    "source": "apache"
+  },
+  "video/vnd.motorola.videop": {
+    "source": "apache"
+  },
+  "video/vnd.mpegurl": {
+    "source": "apache",
+    "extensions": ["mxu","m4u"]
+  },
+  "video/vnd.ms-playready.media.pyv": {
+    "source": "apache",
+    "extensions": ["pyv"]
+  },
+  "video/vnd.nokia.interleaved-multimedia": {
+    "source": "apache"
+  },
+  "video/vnd.nokia.videovoip": {
+    "source": "apache"
+  },
+  "video/vnd.objectvideo": {
+    "source": "apache"
+  },
+  "video/vnd.sealed.mpeg1": {
+    "source": "apache"
+  },
+  "video/vnd.sealed.mpeg4": {
+    "source": "apache"
+  },
+  "video/vnd.sealed.swf": {
+    "source": "apache"
+  },
+  "video/vnd.sealedmedia.softseal.mov": {
+    "source": "apache"
+  },
+  "video/vnd.uvvu.mp4": {
+    "source": "apache",
+    "extensions": ["uvu","uvvu"]
+  },
+  "video/vnd.vivo": {
+    "source": "apache",
+    "extensions": ["viv"]
+  },
+  "video/webm": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["webm"]
+  },
+  "video/x-f4v": {
+    "source": "apache",
+    "extensions": ["f4v"]
+  },
+  "video/x-fli": {
+    "source": "apache",
+    "extensions": ["fli"]
+  },
+  "video/x-flv": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["flv"]
+  },
+  "video/x-m4v": {
+    "source": "apache",
+    "extensions": ["m4v"]
+  },
+  "video/x-matroska": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["mkv","mk3d","mks"]
+  },
+  "video/x-mng": {
+    "source": "apache",
+    "extensions": ["mng"]
+  },
+  "video/x-ms-asf": {
+    "source": "apache",
+    "extensions": ["asf","asx"]
+  },
+  "video/x-ms-vob": {
+    "source": "apache",
+    "extensions": ["vob"]
+  },
+  "video/x-ms-wm": {
+    "source": "apache",
+    "extensions": ["wm"]
+  },
+  "video/x-ms-wmv": {
+    "source": "apache",
+    "compressible": false,
+    "extensions": ["wmv"]
+  },
+  "video/x-ms-wmx": {
+    "source": "apache",
+    "extensions": ["wmx"]
+  },
+  "video/x-ms-wvx": {
+    "source": "apache",
+    "extensions": ["wvx"]
+  },
+  "video/x-msvideo": {
+    "source": "apache",
+    "extensions": ["avi"]
+  },
+  "video/x-sgi-movie": {
+    "source": "apache",
+    "extensions": ["movie"]
+  },
+  "video/x-smv": {
+    "source": "apache",
+    "extensions": ["smv"]
+  },
+  "x-conference/x-cooltalk": {
+    "source": "apache",
+    "extensions": ["ice"]
+  },
+  "x-shader/x-fragment": {
+    "compressible": true
+  },
+  "x-shader/x-vertex": {
+    "compressible": true
+  }
+}
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
new file mode 100644 (file)
index 0000000..551031f
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * mime-db
+ * Copyright(c) 2014 Jonathan Ong
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = require('./db.json')
diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
new file mode 100644 (file)
index 0000000..9b73a7c
--- /dev/null
@@ -0,0 +1,92 @@
+{
+  "name": "mime-db",
+  "description": "Media Type Database",
+  "version": "1.6.1",
+  "author": {
+    "name": "Jonathan Ong",
+    "email": "me@jongleberry.com",
+    "url": "http://jongleberry.com"
+  },
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "Robert Kieffer",
+      "email": "robert@broofa.com",
+      "url": "http://github.com/broofa"
+    }
+  ],
+  "license": "MIT",
+  "keywords": [
+    "mime",
+    "db",
+    "type",
+    "types",
+    "database",
+    "charset",
+    "charsets"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/jshttp/mime-db"
+  },
+  "devDependencies": {
+    "co": "4",
+    "cogent": "1",
+    "csv-parse": "0",
+    "gnode": "0.1.0",
+    "istanbul": "0.3.5",
+    "mocha": "~1.21.4",
+    "raw-body": "~1.3.2",
+    "stream-to-array": "2"
+  },
+  "files": [
+    "HISTORY.md",
+    "LICENSE",
+    "README.md",
+    "db.json",
+    "index.js"
+  ],
+  "engines": {
+    "node": ">= 0.6"
+  },
+  "scripts": {
+    "update": "gnode scripts/extensions && gnode scripts/types && node scripts/build",
+    "clean": "rm src/*",
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
+  },
+  "gitHead": "7f07ff87267625b73dcf73b97b2530a37a85d079",
+  "bugs": {
+    "url": "https://github.com/jshttp/mime-db/issues"
+  },
+  "homepage": "https://github.com/jshttp/mime-db",
+  "_id": "mime-db@1.6.1",
+  "_shasum": "6e85cd87c961d130d6ebd37efdfc2c0e06fdfcd3",
+  "_from": "mime-db@>=1.6.0 <1.7.0",
+  "_npmVersion": "1.4.28",
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "maintainers": [
+    {
+      "name": "jongleberry",
+      "email": "jonathanrichardong@gmail.com"
+    },
+    {
+      "name": "dougwilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "dist": {
+    "shasum": "6e85cd87c961d130d6ebd37efdfc2c0e06fdfcd3",
+    "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.6.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.6.1.tgz",
+  "readme": "ERROR: No README data found!"
+}
index 67432028b842a73e0607876948c34f4d5dca8adc..060586bd776bfe6589d40948125dfc6634684512 100644 (file)
@@ -1,46 +1,61 @@
 {
   "name": "mime-types",
   "description": "The ultimate javascript content-type utility.",
-  "version": "1.0.2",
-  "author": {
-    "name": "Jonathan Ong",
-    "email": "me@jongleberry.com",
-    "url": "http://jongleberry.com"
-  },
+  "version": "2.0.8",
   "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
     {
       "name": "Jeremiah Senkpiel",
       "email": "fishrock123@rocketmail.com",
       "url": "https://searchbeam.jit.su"
+    },
+    {
+      "name": "Jonathan Ong",
+      "email": "me@jongleberry.com",
+      "url": "http://jongleberry.com"
     }
   ],
+  "license": "MIT",
+  "keywords": [
+    "mime",
+    "types"
+  ],
   "repository": {
     "type": "git",
-    "url": "https://github.com/expressjs/mime-types"
+    "url": "https://github.com/jshttp/mime-types"
+  },
+  "dependencies": {
+    "mime-db": "~1.6.0"
   },
-  "license": "MIT",
-  "main": "lib",
   "devDependencies": {
-    "co": "3",
-    "cogent": "0",
-    "mocha": "1",
-    "should": "3"
+    "istanbul": "0.3.5",
+    "mocha": "~1.21.5"
   },
+  "files": [
+    "HISTORY.md",
+    "LICENSE",
+    "index.js"
+  ],
   "engines": {
-    "node": ">= 0.8.0"
+    "node": ">= 0.6"
   },
   "scripts": {
-    "test": "make test"
+    "test": "mocha --reporter spec test/test.js",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js"
   },
-  "gitHead": "e82b23836eb42003b8346fb31769da2fb7eb54e8",
+  "gitHead": "19e01e8bd630a1719ada4a3e3e9b7192b4ddb034",
   "bugs": {
-    "url": "https://github.com/expressjs/mime-types/issues"
+    "url": "https://github.com/jshttp/mime-types/issues"
   },
-  "homepage": "https://github.com/expressjs/mime-types",
-  "_id": "mime-types@1.0.2",
-  "_shasum": "995ae1392ab8affcbfcb2641dd054e943c0d5dce",
-  "_from": "mime-types@>=1.0.1 <1.1.0",
-  "_npmVersion": "1.4.21",
+  "homepage": "https://github.com/jshttp/mime-types",
+  "_id": "mime-types@2.0.8",
+  "_shasum": "5612bf6b9ec8a1285a81184fa4237fbfdbb89a7e",
+  "_from": "mime-types@>=2.0.1 <2.1.0",
+  "_npmVersion": "1.4.28",
   "_npmUser": {
     "name": "dougwilson",
     "email": "doug@somethingdoug.com"
     }
   ],
   "dist": {
-    "shasum": "995ae1392ab8affcbfcb2641dd054e943c0d5dce",
-    "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz"
+    "shasum": "5612bf6b9ec8a1285a81184fa4237fbfdbb89a7e",
+    "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.0.8.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
+  "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.8.tgz",
   "readme": "ERROR: No README data found!"
 }
index bdfd14e1866e317b6a168ebe1f037b91ec250c7a..63b418c4c4e9cd505fbc642f933f146f495d2c06 100644 (file)
@@ -93,8 +93,18 @@ function rsasign (httpMethod, base_uri, params, private_key, token_secret) {
   return rsa(key, base)
 }
 
+function plaintext (consumer_secret, token_secret) {
+  var key = [
+    consumer_secret || '',
+    token_secret || ''
+  ].map(rfc3986).join('&')
+
+  return key
+}
+
 function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) {
   var method
+  var skipArgs = 1
 
   switch (signMethod) {
     case 'RSA-SHA1':
@@ -103,14 +113,19 @@ function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_
     case 'HMAC-SHA1':
       method = hmacsign
       break
+    case 'PLAINTEXT':
+      method = plaintext
+      skipArgs = 4
+      break
     default:
      throw new Error("Signature method not supported: " + signMethod)
   }
 
-  return method.apply(null, [].slice.call(arguments, 1))
+  return method.apply(null, [].slice.call(arguments, skipArgs))
 }
 
 exports.hmacsign = hmacsign
 exports.rsasign = rsasign
+exports.plaintext = plaintext
 exports.sign = sign
 exports.rfc3986 = rfc3986
index d49bfb746c63563a4f7978f0391163b652b0a6e5..019eff0cd57b745427631ffa8172baa2f2c59c85 100644 (file)
@@ -6,7 +6,7 @@
   },
   "name": "oauth-sign",
   "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.",
-  "version": "0.5.0",
+  "version": "0.6.0",
   "repository": {
     "url": "https://github.com/mikeal/oauth-sign"
   },
   "scripts": {
     "test": "node test.js"
   },
-  "gitHead": "6fea86c2d4a38e1b3780ad0cc56f00196e5213c1",
+  "gitHead": "f1b5d7714712ab7eec485cca9d18ae95db58aa6b",
   "bugs": {
     "url": "https://github.com/mikeal/oauth-sign/issues"
   },
   "homepage": "https://github.com/mikeal/oauth-sign",
-  "_id": "oauth-sign@0.5.0",
-  "_shasum": "d767f5169325620eab2e087ef0c472e773db6461",
-  "_from": "oauth-sign@>=0.5.0 <0.6.0",
-  "_npmVersion": "2.0.0",
+  "_id": "oauth-sign@0.6.0",
+  "_shasum": "7dbeae44f6ca454e1f168451d630746735813ce3",
+  "_from": "oauth-sign@>=0.6.0 <0.7.0",
+  "_npmVersion": "1.4.14",
   "_npmUser": {
-    "name": "mikeal",
-    "email": "mikeal.rogers@gmail.com"
+    "name": "nylen",
+    "email": "jnylen@gmail.com"
   },
   "maintainers": [
     {
       "name": "mikeal",
       "email": "mikeal.rogers@gmail.com"
+    },
+    {
+      "name": "nylen",
+      "email": "jnylen@gmail.com"
     }
   ],
   "dist": {
-    "shasum": "d767f5169325620eab2e087ef0c472e773db6461",
-    "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz"
+    "shasum": "7dbeae44f6ca454e1f168451d630746735813ce3",
+    "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz",
+  "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz",
   "readme": "ERROR: No README data found!"
 }
index b7a4c8022d54ed09e17a2df7dd5ded385cf974d8..aea800b6f0f9daea9cb0ca6a75ea35236ff93bac 100644 (file)
@@ -1,4 +1,5 @@
-var hmacsign = require('./index').hmacsign
+var oauth = require('./index')
+  , hmacsign = oauth.hmacsign
   , assert = require('assert')
   , qs = require('querystring')
   ;
@@ -61,3 +62,13 @@ console.log(rfc5849sign)
 console.log('r6/TJjbCOr97/+UU0NsvSne7s5g=')
 assert.equal(rfc5849sign, 'r6/TJjbCOr97/+UU0NsvSne7s5g=')
 
+
+// PLAINTEXT
+
+var plainSign = oauth.sign('PLAINTEXT', 'GET', 'http://dummy.com', {}, 'consumer_secret', 'token_secret')
+console.log(plainSign)
+assert.equal(plainSign, 'consumer_secret&token_secret')
+
+plainSign = oauth.plaintext('consumer_secret', 'token_secret')
+console.log(plainSign)
+assert.equal(plainSign, 'consumer_secret&token_secret')
index 51cd6947b9e14141fabc2e893a57c50c2dcba24d..0f021a5d13e108eaad1a47cffc31310864d13ead 100644 (file)
@@ -7,7 +7,7 @@
     "util",
     "utility"
   ],
-  "version": "2.51.0",
+  "version": "2.53.0",
   "author": {
     "name": "Mikeal Rogers",
     "email": "mikeal.rogers@gmail.com"
   "main": "index.js",
   "dependencies": {
     "bl": "~0.9.0",
-    "caseless": "~0.8.0",
+    "caseless": "~0.9.0",
     "forever-agent": "~0.5.0",
     "form-data": "~0.2.0",
     "json-stringify-safe": "~5.0.0",
-    "mime-types": "~1.0.1",
+    "mime-types": "~2.0.1",
     "node-uuid": "~1.4.0",
     "qs": "~2.3.1",
     "tunnel-agent": "~0.4.0",
     "tough-cookie": ">=0.12.0",
     "http-signature": "~0.10.0",
-    "oauth-sign": "~0.5.0",
-    "hawk": "1.1.1",
+    "oauth-sign": "~0.6.0",
+    "hawk": "~2.3.0",
     "aws-sign2": "~0.5.0",
     "stringstream": "~0.0.4",
-    "combined-stream": "~0.0.5"
+    "combined-stream": "~0.0.5",
+    "isstream": "~0.1.1"
   },
   "scripts": {
-    "test": "npm run lint && node node_modules/.bin/taper tests/test-*.js && npm run test-browser",
-    "test-browser": "browserify tests/browser/test.js -o tests/browser/test-browser.js && karma start tests/browser/karma.conf.js",
+    "test": "npm run lint && node node_modules/.bin/taper tests/test-*.js && npm run test-browser && npm run clean",
+    "test-browser": "node tests/browser/start.js",
     "lint": "node node_modules/.bin/eslint lib/ *.js tests/ && echo Lint passed."
   },
   "devDependencies": {
     "browserify": "~5.9.1",
+    "browserify-istanbul": "~0.1.3",
     "coveralls": "~2.11.2",
     "eslint": "0.5.1",
     "function-bind": "~1.0.0",
     "istanbul": "~0.3.2",
     "karma": "~0.12.21",
+    "karma-browserify": "~3.0.1",
     "karma-cli": "0.0.4",
+    "karma-coverage": "0.2.6",
     "karma-phantomjs-launcher": "~0.1.4",
     "karma-tap": "~1.0.1",
     "rimraf": "~2.2.8",
+    "server-destroy": "~1.0.0",
     "tape": "~3.0.0",
-    "taper": "~0.3.0"
+    "taper": "~0.4.0"
   },
-  "gitHead": "1c8aca6a9205df58660c676005fb8ec4603d5265",
+  "gitHead": "541ce25648bc2ecab924d7d7197a2685fa16d348",
   "homepage": "https://github.com/request/request",
-  "_id": "request@2.51.0",
-  "_shasum": "35d00bbecc012e55f907b1bd9e0dbd577bfef26e",
-  "_from": "request@>=2.51.0 <2.52.0",
+  "_id": "request@2.53.0",
+  "_shasum": "180a3ae92b7b639802e4f9545dd8fcdeb71d760c",
+  "_from": "request@>=2.53.0 <2.54.0",
   "_npmVersion": "1.4.14",
   "_npmUser": {
     "name": "nylen",
     }
   ],
   "dist": {
-    "shasum": "35d00bbecc012e55f907b1bd9e0dbd577bfef26e",
-    "tarball": "http://registry.npmjs.org/request/-/request-2.51.0.tgz"
+    "shasum": "180a3ae92b7b639802e4f9545dd8fcdeb71d760c",
+    "tarball": "http://registry.npmjs.org/request/-/request-2.53.0.tgz"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz",
+  "_resolved": "https://registry.npmjs.org/request/-/request-2.53.0.tgz",
   "readme": "ERROR: No README data found!"
 }
index 90220d2ba4037aa64f369a34edcb5a4ec7dabba4..00665b918e93a6caa02d8a959efb51013f728174 100644 (file)
@@ -10,7 +10,6 @@ var http = require('http')
   , zlib = require('zlib')
   , helpers = require('./lib/helpers')
   , bl = require('bl')
-  , oauth = require('oauth-sign')
   , hawk = require('hawk')
   , aws = require('aws-sign2')
   , httpSignature = require('http-signature')
@@ -23,9 +22,12 @@ var http = require('http')
   , FormData = require('form-data')
   , cookies = require('./lib/cookies')
   , copy = require('./lib/copy')
-  , debug = require('./lib/debug')
   , net = require('net')
   , CombinedStream = require('combined-stream')
+  , isstream = require('isstream')
+  , getProxyFromURI = require('./lib/getProxyFromURI')
+  , Auth = require('./lib/auth').Auth
+  , oauth = require('./lib/oauth')
 
 var safeStringify = helpers.safeStringify
   , md5 = helpers.md5
@@ -131,21 +133,52 @@ function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) {
     }, {})
 }
 
-function construcTunnelOptions(request) {
+function getTunnelOption(self, options) {
+  // Tunnel HTTPS by default, or if a previous request in the redirect chain
+  // was tunneled.  Allow the user to override this setting.
+
+  // If self.tunnel is already set (because this is a redirect), use the
+  // existing value.
+  if (typeof self.tunnel !== 'undefined') {
+    return self.tunnel
+  }
+
+  // If options.tunnel is set (the user specified a value), use it.
+  if (typeof options.tunnel !== 'undefined') {
+    return options.tunnel
+  }
+
+  // If the destination is HTTPS, tunnel.
+  if (self.uri.protocol === 'https:') {
+    return true
+  }
+
+  // Otherwise, leave tunnel unset, because if a later request in the redirect
+  // chain is HTTPS then that request (and any subsequent ones) should be
+  // tunneled.
+  return undefined
+}
+
+function constructTunnelOptions(request) {
   var proxy = request.proxy
 
   var tunnelOptions = {
-    proxy: {
-      host: proxy.hostname,
-      port: +proxy.port,
-      proxyAuth: proxy.auth,
-      headers: request.proxyHeaders
+    proxy : {
+      host      : proxy.hostname,
+      port      : +proxy.port,
+      proxyAuth : proxy.auth,
+      headers   : request.proxyHeaders
     },
-    rejectUnauthorized: request.rejectUnauthorized,
-    headers: request.headers,
-    ca: request.ca,
-    cert: request.cert,
-    key: request.key
+    headers            : request.headers,
+    ca                 : request.ca,
+    cert               : request.cert,
+    key                : request.key,
+    passphrase         : request.passphrase,
+    pfx                : request.pfx,
+    ciphers            : request.ciphers,
+    rejectUnauthorized : request.rejectUnauthorized,
+    secureOptions      : request.secureOptions,
+    secureProtocol     : request.secureProtocol
   }
 
   return tunnelOptions
@@ -164,60 +197,6 @@ function getTunnelFn(request) {
   return tunnel[tunnelFnName]
 }
 
-// Decide the proper request proxy to use based on the request URI object and the
-// environmental variables (NO_PROXY, HTTP_PROXY, etc.)
-function getProxyFromURI(uri) {
-  // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html)
-  var noProxy = process.env.NO_PROXY || process.env.no_proxy || null
-
-  // easy case first - if NO_PROXY is '*'
-  if (noProxy === '*') {
-    return null
-  }
-
-  // otherwise, parse the noProxy value to see if it applies to the URL
-  if (noProxy !== null) {
-    var noProxyItem, hostname, port, noProxyItemParts, noProxyHost, noProxyPort, noProxyList
-
-    // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'
-    hostname = uri.hostname.replace(/^\.*/, '.').toLowerCase()
-    noProxyList = noProxy.split(',')
-
-    for (var i = 0, len = noProxyList.length; i < len; i++) {
-      noProxyItem = noProxyList[i].trim().toLowerCase()
-
-      // no_proxy can be granular at the port level, which complicates things a bit.
-      if (noProxyItem.indexOf(':') > -1) {
-        noProxyItemParts = noProxyItem.split(':', 2)
-        noProxyHost = noProxyItemParts[0].replace(/^\.*/, '.')
-        noProxyPort = noProxyItemParts[1]
-        port = uri.port || (uri.protocol === 'https:' ? '443' : '80')
-
-        // we've found a match - ports are same and host ends with no_proxy entry.
-        if (port === noProxyPort && hostname.indexOf(noProxyHost) === hostname.length - noProxyHost.length) {
-          return null
-        }
-      } else {
-        noProxyItem = noProxyItem.replace(/^\.*/, '.')
-        var isMatchedAt = hostname.indexOf(noProxyItem)
-        if (isMatchedAt > -1 && isMatchedAt === hostname.length - noProxyItem.length) {
-          return null
-        }
-      }
-    }
-  }
-
-  // check for HTTP(S)_PROXY environment variables
-  if (uri.protocol === 'http:') {
-      return process.env.HTTP_PROXY || process.env.http_proxy || null
-  } else if (uri.protocol === 'https:') {
-      return process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy || null
-  }
-
-  // return null if all else fails (What uri protocol are you using then?)
-  return null
-}
-
 // Function for properly handling a connection error
 function connectionErrorHandler(error) {
   var socket = this
@@ -253,8 +232,14 @@ function responseToJSON() {
   }
 }
 
+// encode rfc3986 characters
+function rfc3986 (str) {
+  return str.replace(/[!'()*]/g, function(c) {
+    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
+  })
+}
+
 function Request (options) {
-  // if tunnel property of options was not given default to false
   // if given the method property in options, set property explicitMethod to true
 
   // extend the Request instance with any non-reserved properties
@@ -273,64 +258,50 @@ function Request (options) {
 
   self.readable = true
   self.writable = true
-  if (typeof options.tunnel === 'undefined') {
-    options.tunnel = false
-  }
   if (options.method) {
     self.explicitMethod = true
   }
-  self.canTunnel = options.tunnel !== false && tunnel
   self.init(options)
 }
 
 util.inherits(Request, stream.Stream)
 
-Request.prototype.setupTunnel = function () {
-  // Set up the tunneling agent if necessary
-  // Only send the proxy whitelisted header names.
-  // Turn on tunneling for the rest of request.
+// Debugging
+Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG)
+function debug() {
+  if (Request.debug) {
+    console.error('REQUEST %s', util.format.apply(util, arguments))
+  }
+}
 
+Request.prototype.setupTunnel = function () {
   var self = this
 
   if (typeof self.proxy === 'string') {
     self.proxy = url.parse(self.proxy)
   }
 
-  if (!self.proxy) {
+  if (!self.proxy || !self.tunnel) {
     return false
   }
 
-  if (!self.tunnel && self.uri.protocol !== 'https:') {
-    return false
-  }
-
-  // Always include `defaultProxyHeaderExclusiveList`
-
-  if (!self.proxyHeaderExclusiveList) {
-    self.proxyHeaderExclusiveList = []
-  }
-
+  // Setup Proxy Header Exclusive List and White List
+  self.proxyHeaderExclusiveList = self.proxyHeaderExclusiveList || []
+  self.proxyHeaderWhiteList = self.proxyHeaderWhiteList || defaultProxyHeaderWhiteList
   var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList)
-
-  // Treat `proxyHeaderExclusiveList` as part of `proxyHeaderWhiteList`
-
-  if (!self.proxyHeaderWhiteList) {
-    self.proxyHeaderWhiteList = defaultProxyHeaderWhiteList
-  }
-
   var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList)
 
-  var proxyHost = constructProxyHost(self.uri)
+  // Setup Proxy Headers and Proxy Headers Host
+  // Only send the Proxy White Listed Header names
   self.proxyHeaders = constructProxyHeaderWhiteList(self.headers, proxyHeaderWhiteList)
-  self.proxyHeaders.host = proxyHost
-
+  self.proxyHeaders.host = constructProxyHost(self.uri)
   proxyHeaderExclusiveList.forEach(self.removeHeader, self)
 
+  // Set Agent from Tunnel Data
   var tunnelFn = getTunnelFn(self)
-  var tunnelOptions = construcTunnelOptions(self)
-
+  var tunnelOptions = constructTunnelOptions(self)
   self.agent = tunnelFn(tunnelOptions)
-  self.tunnel = true
+
   return true
 }
 
@@ -420,8 +391,7 @@ Request.prototype.init = function (options) {
     self.proxy = getProxyFromURI(self.uri)
   }
 
-  // Pass in `tunnel:true` to *always* tunnel through proxies
-  self.tunnel = !!options.tunnel
+  self.tunnel = getTunnelOption(self, options)
   if (self.proxy) {
     self.setupTunnel()
   }
@@ -525,6 +495,8 @@ Request.prototype.init = function (options) {
   }
 
   // Auth must happen last in case signing is dependent on other headers
+  self._auth = new Auth()
+
   if (options.oauth) {
     self.oauth(options.oauth)
   }
@@ -810,6 +782,14 @@ Request.prototype.getNewAgent = function () {
     options.cert = self.cert
   }
 
+  if (self.pfx) {
+    options.pfx = self.pfx
+  }
+
+  if (self.passphrase) {
+    options.passphrase = self.passphrase
+  }
+
   var poolKey = ''
 
   // different types of agents are in different pools
@@ -840,9 +820,19 @@ Request.prototype.getNewAgent = function () {
     }
 
     if (options.cert) {
+      if (poolKey) {
+        poolKey += ':'
+      }
       poolKey += options.cert.toString('ascii') + options.key.toString('ascii')
     }
 
+    if (options.pfx) {
+      if (poolKey) {
+        poolKey += ':'
+      }
+      poolKey += options.pfx.toString('ascii')
+    }
+
     if (options.ciphers) {
       if (poolKey) {
         poolKey += ':'
@@ -1066,80 +1056,11 @@ Request.prototype.onRequestResponse = function (response) {
           break
       }
     }
-  } else if (response.statusCode === 401 && self._hasAuth && !self._sentAuth) {
-    var authHeader = response.caseless.get('www-authenticate')
-    var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
-    debug('reauth', authVerb)
-
-    switch (authVerb) {
-      case 'basic':
-        self.auth(self._user, self._pass, true)
-        redirectTo = self.uri
-        break
-
-      case 'bearer':
-        self.auth(null, null, true, self._bearer)
-        redirectTo = self.uri
-        break
-
-      case 'digest':
-        // TODO: More complete implementation of RFC 2617.
-        //   - check challenge.algorithm
-        //   - support algorithm="MD5-sess"
-        //   - handle challenge.domain
-        //   - support qop="auth-int" only
-        //   - handle Authentication-Info (not necessarily?)
-        //   - check challenge.stale (not necessarily?)
-        //   - increase nc (not necessarily?)
-        // For reference:
-        // http://tools.ietf.org/html/rfc2617#section-3
-        // https://github.com/bagder/curl/blob/master/lib/http_digest.c
-
-        var challenge = {}
-        var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
-        for (;;) {
-          var match = re.exec(authHeader)
-          if (!match) {
-            break
-          }
-          challenge[match[1]] = match[2] || match[3]
-        }
-
-        var ha1 = md5(self._user + ':' + challenge.realm + ':' + self._pass)
-        var ha2 = md5(self.method + ':' + self.uri.path)
-        var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
-        var nc = qop && '00000001'
-        var cnonce = qop && uuid().replace(/-/g, '')
-        var digestResponse = qop ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
-        var authValues = {
-          username: self._user,
-          realm: challenge.realm,
-          nonce: challenge.nonce,
-          uri: self.uri.path,
-          qop: qop,
-          response: digestResponse,
-          nc: nc,
-          cnonce: cnonce,
-          algorithm: challenge.algorithm,
-          opaque: challenge.opaque
-        }
-
-        authHeader = []
-        for (var k in authValues) {
-          if (authValues[k]) {
-            if (k === 'qop' || k === 'nc' || k === 'algorithm') {
-              authHeader.push(k + '=' + authValues[k])
-            } else {
-              authHeader.push(k + '="' + authValues[k] + '"')
-            }
-          }
-        }
-        authHeader = 'Digest ' + authHeader.join(', ')
-        self.setHeader('authorization', authHeader)
-        self._sentAuth = true
-
-        redirectTo = self.uri
-        break
+  } else if (response.statusCode === 401) {
+    var authHeader = self._auth.response(self.method, self.uri.path, response.headers)
+    if (authHeader) {
+      self.setHeader('authorization', authHeader)
+      redirectTo = self.uri
     }
   }
 
@@ -1313,7 +1234,7 @@ Request.prototype.onRequestResponse = function (response) {
         }
         debug('emitting complete', self.uri.href)
         if(typeof response.body === 'undefined' && !self._json) {
-          response.body = ''
+          response.body = self.encoding === null ? new Buffer(0) : ''
         }
         self.emit('complete', response, response.body)
       })
@@ -1402,7 +1323,9 @@ Request.prototype.qs = function (q, clobber) {
     return self
   }
 
-  self.uri = url.parse(self.uri.href.split('?')[0] + '?' + self.qsLib.stringify(base))
+  var qs = self.qsLib.stringify(base)
+
+  self.uri = url.parse(self.uri.href.split('?')[0] + '?' + rfc3986(qs))
   self.url = self.uri
   self.path = self.uri.path
 
@@ -1413,24 +1336,46 @@ Request.prototype.form = function (form) {
   if (form) {
     self.setHeader('content-type', 'application/x-www-form-urlencoded')
     self.body = (typeof form === 'string') ? form.toString('utf8') : self.qsLib.stringify(form).toString('utf8')
+    self.body = rfc3986(self.body)
     return self
   }
   // create form-data object
   self._form = new FormData()
+  self._form.on('error',function(err) {
+    err.message = 'form-data: ' + err.message
+    self.emit('error', err)
+    self.abort()
+  })
   return self._form
 }
 Request.prototype.multipart = function (multipart) {
   var self = this
 
-  var chunked = (multipart instanceof Array) || (multipart.chunked === undefined) || multipart.chunked
-  multipart = multipart.data || multipart
+  var chunked = false
+  var _multipart = multipart.data || multipart
 
-  var items = chunked ? new CombinedStream() : []
-  function add (part) {
-    return chunked ? items.append(part) : items.push(new Buffer(part))
+  if (!_multipart.forEach) {
+    throw new Error('Argument error, options.multipart.')
+  }
+
+  if (self.getHeader('transfer-encoding') === 'chunked') {
+    chunked = true
+  }
+  if (multipart.chunked !== undefined) {
+    chunked = multipart.chunked
+  }
+  if (!chunked) {
+    _multipart.forEach(function (part) {
+      if(typeof part.body === 'undefined') {
+        throw new Error('Body attribute missing in multipart.')
+      }
+      if (isstream(part.body)) {
+        chunked = true
+      }
+    })
   }
 
-  if (chunked) {
+  if (chunked && !self.hasHeader('transfer-encoding')) {
     self.setHeader('transfer-encoding', 'chunked')
   }
 
@@ -1441,19 +1386,17 @@ Request.prototype.multipart = function (multipart) {
     self.setHeader(headerName, self.headers[headerName].split(';')[0] + '; boundary=' + self.boundary)
   }
 
-  if (!multipart.forEach) {
-    throw new Error('Argument error, options.multipart.')
+  var parts = chunked ? new CombinedStream() : []
+  function add (part) {
+    return chunked ? parts.append(part) : parts.push(new Buffer(part))
   }
 
   if (self.preambleCRLF) {
     add('\r\n')
   }
 
-  multipart.forEach(function (part) {
+  _multipart.forEach(function (part) {
     var body = part.body
-    if(typeof body === 'undefined') {
-      throw new Error('Body attribute missing in multipart.')
-    }
     var preamble = '--' + self.boundary + '\r\n'
     Object.keys(part).forEach(function (key) {
       if (key === 'body') { return }
@@ -1470,7 +1413,7 @@ Request.prototype.multipart = function (multipart) {
     add('\r\n')
   }
 
-  self[chunked ? '_multipart' : 'body'] = items
+  self[chunked ? '_multipart' : 'body'] = parts
   return self
 }
 Request.prototype.json = function (val) {
@@ -1482,8 +1425,12 @@ Request.prototype.json = function (val) {
 
   self._json = true
   if (typeof val === 'boolean') {
-    if (self.body !== undefined && self.getHeader('content-type') !== 'application/x-www-form-urlencoded') {
-      self.body = safeStringify(self.body)
+    if (self.body !== undefined) {
+      if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
+        self.body = safeStringify(self.body)
+      } else {
+        self.body = rfc3986(self.body)
+      }
       if (!self.hasHeader('content-type')) {
         self.setHeader('content-type', 'application/json')
       }
@@ -1523,29 +1470,17 @@ var getHeader = Request.prototype.getHeader
 
 Request.prototype.auth = function (user, pass, sendImmediately, bearer) {
   var self = this
+
+  var authHeader
   if (bearer !== undefined) {
-    self._bearer = bearer
-    self._hasAuth = true
-    if (sendImmediately || typeof sendImmediately === 'undefined') {
-      if (typeof bearer === 'function') {
-        bearer = bearer()
-      }
-      self.setHeader('authorization', 'Bearer ' + bearer)
-      self._sentAuth = true
-    }
-    return self
-  }
-  if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
-    throw new Error('auth() received invalid user or password')
+    authHeader = self._auth.bearer(bearer, sendImmediately)
+  } else {
+    authHeader = self._auth.basic(user, pass, sendImmediately)
   }
-  self._user = user
-  self._pass = pass
-  self._hasAuth = true
-  var header = typeof pass !== 'undefined' ? user + ':' + pass : user
-  if (sendImmediately || typeof sendImmediately === 'undefined') {
-    self.setHeader('authorization', 'Basic ' + toBase64(header))
-    self._sentAuth = true
+  if (authHeader) {
+    self.setHeader('authorization', authHeader)
   }
+
   return self
 }
 
@@ -1606,61 +1541,29 @@ Request.prototype.hawk = function (opts) {
 
 Request.prototype.oauth = function (_oauth) {
   var self = this
-  var form, query
-  if (self.hasHeader('content-type') &&
-      self.getHeader('content-type').slice(0, 'application/x-www-form-urlencoded'.length) ===
-        'application/x-www-form-urlencoded'
-     ) {
-    form = self.body
-  }
-  if (self.uri.query) {
-    query = self.uri.query
-  }
 
-  var oa = {}
-  for (var i in _oauth) {
-    oa['oauth_' + i] = _oauth[i]
-  }
-  if ('oauth_realm' in oa) {
-    delete oa.oauth_realm
-  }
-  if (!oa.oauth_version) {
-    oa.oauth_version = '1.0'
-  }
-  if (!oa.oauth_timestamp) {
-    oa.oauth_timestamp = Math.floor( Date.now() / 1000 ).toString()
+  var result = oauth.oauth({
+    uri: self.uri,
+    method: self.method,
+    headers: self.headers,
+    body: self.body,
+    oauth: _oauth,
+    qsLib: self.qsLib
+  })
+
+  if (result.transport === 'header') {
+    self.setHeader('Authorization', result.oauth)
   }
-  if (!oa.oauth_nonce) {
-    oa.oauth_nonce = uuid().replace(/-/g, '')
+  else if (result.transport === 'query') {
+    self.path += result.oauth
   }
-  if (!oa.oauth_signature_method) {
-    oa.oauth_signature_method = 'HMAC-SHA1'
+  else if (result.transport === 'body') {
+    self.body = result.oauth
   }
 
-  var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key
-  delete oa.oauth_consumer_secret
-  delete oa.oauth_private_key
-  var token_secret = oa.oauth_token_secret
-  delete oa.oauth_token_secret
-
-  var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname
-  var params = self.qsLib.parse([].concat(query, form, self.qsLib.stringify(oa)).join('&'))
-
-  var signature = oauth.sign(
-    oa.oauth_signature_method,
-    self.method,
-    baseurl,
-    params,
-    consumer_secret_or_private_key,
-    token_secret)
-
-  var realm = _oauth.realm ? 'realm="' + _oauth.realm + '",' : ''
-  var authHeader = 'OAuth ' + realm +
-    Object.keys(oa).sort().map(function (i) {return i + '="' + oauth.rfc3986(oa[i]) + '"'}).join(',')
-  authHeader += ',oauth_signature="' + oauth.rfc3986(signature) + '"'
-  self.setHeader('Authorization', authHeader)
   return self
 }
+
 Request.prototype.jar = function (jar) {
   var self = this
   var cookies
index d33c16f6c710114134030125ef06810c8637e97b..07b74e0960c8973ab1142b7d82f5d12db767aa91 100644 (file)
@@ -1,7 +1,7 @@
 {
-  "version": "2.4.1",
+  "version": "2.5.1",
   "name": "npm",
-  "description": "A package manager for node",
+  "description": "a package manager for JavaScript",
   "keywords": [
     "package manager",
     "modules",
     "chmodr": "~0.1.0",
     "chownr": "0",
     "cmd-shim": "~2.0.1",
-    "columnify": "~1.3.2",
+    "columnify": "~1.4.1",
     "config-chain": "~1.1.8",
     "dezalgo": "~1.0.1",
     "editor": "~0.1.0",
     "fs-vacuum": "~1.2.5",
     "fs-write-stream-atomic": "~1.0.2",
-    "fstream": "~1.0.3",
+    "fstream": "~1.0.4",
     "fstream-npm": "~1.0.1",
     "github-url-from-git": "~1.4.0",
     "github-url-from-username-repo": "~1.0.2",
@@ -70,7 +70,7 @@
     "npm-cache-filename": "~1.0.1",
     "npm-install-checks": "~1.0.5",
     "npm-package-arg": "~2.1.3",
-    "npm-registry-client": "~6.0.3",
+    "npm-registry-client": "~6.0.7",
     "npm-user-validate": "~0.1.1",
     "npmlog": "~0.1.1",
     "once": "~1.3.1",
@@ -82,7 +82,7 @@
     "read-package-json": "~1.2.7",
     "readable-stream": "~1.0.33",
     "realize-package-specifier": "~1.3.0",
-    "request": "~2.51.0",
+    "request": "~2.53.0",
     "retry": "~0.6.1",
     "rimraf": "~2.2.8",
     "semver": "~4.2.0",
     "write-file-atomic"
   ],
   "devDependencies": {
-    "marked": "~0.3.2",
+    "marked": "~0.3.3",
     "marked-man": "~0.1.4",
-    "nock": "~0.57.0",
+    "nock": "~0.59.0",
     "npm-registry-couchapp": "~2.6.2",
-    "npm-registry-mock": "~0.6.3",
+    "npm-registry-mock": "~1.0.0",
     "require-inject": "~1.1.0",
     "tap": "~0.5.0"
   },
diff --git a/deps/npm/scripts/update-authors.sh b/deps/npm/scripts/update-authors.sh
new file mode 100755 (executable)
index 0000000..8708e24
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+git log --reverse --format='%aN <%aE>' | awk '
+BEGIN {
+  print "# Authors sorted by whether or not they'\''re me";
+}
+
+{
+  if (all[$NF] != 1) {
+    all[$NF] = 1;
+    ordered[length(all)] = $0;
+  }
+}
+
+END {
+  for (i in ordered) {
+    print ordered[i];
+  }
+}
+' > AUTHORS
\ No newline at end of file
index 1c51ed71895ecf2816e5a9d730bbd714f28badd0..7dcfc35cc892936e5895d8bfd2048ad8d880737e 100644 (file)
@@ -7,6 +7,8 @@ process.env.npm_config_loglevel = "error"
 
 var npm_config_cache = path.resolve(__dirname, "npm_cache")
 process.env.npm_config_cache = exports.npm_config_cache = npm_config_cache
+process.env.npm_config_userconfig = exports.npm_config_userconfig = path.join(__dirname, "fixtures", "config", "userconfig")
+process.env.random_env_var = "foo"
 
 var bin = exports.bin = require.resolve("../bin/npm-cli.js")
 var once = require("once")
index 9e4087a4ca9e7160cac93c592415a6e747ebab8c..4cad5e69301b94f6ccf8bad8e17c43c29a8f0fac 100644 (file)
@@ -24,7 +24,7 @@ test('outdated depth integer', function (t) {
 
   process.chdir(pkg)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (s) {
     npm.load({
       cache: pkg + '/cache'
     , loglevel: 'silent'
@@ -49,4 +49,4 @@ test('outdated depth integer', function (t) {
 test("cleanup", function (t) {
   cleanup()
   t.end()
-})
\ No newline at end of file
+})
index 6feba3596a3a6b0ded3a4de22c41dfba40646f28..5b33e68ab47a7750e051df5aca6d4764df292f1b 100644 (file)
@@ -121,9 +121,7 @@ function flatten (arr) {
 function setup (cb) {
   cleanup(function (er) {
     if (er) return cb(er)
-    execChain([ [ "node \""+npmcli+"\" install \""+npmpkg+"\"", root ],
-                [ "npm config set package-config:foo boo",  root ]
-              ], cb)
+    exec("node \""+npmcli+"\" install \""+npmpkg+"\"", root, false, cb)
   })
 }
 
index e40d850de7303db4a3d22a6aa53719f0f9dc4d51..eb8ae9bb150d8bfcbcb9f9e05f8c57cd972cf7a8 100644 (file)
@@ -40,8 +40,13 @@ function setup() {
   process.chdir(pkg)
 }
 
-function performInstall(cb) {
-  mr(common.port, function (s) { // create mock registry.
+function plugin (server) {
+  server.get("/test-npm-404-parent-test")
+    .reply(404, {"error": "version not found"})
+}
+
+function performInstall (cb) {
+  mr({port : common.port, plugin : plugin}, function (er, s) { // create mock registry.
     npm.load({registry: common.registry}, function () {
       npm.commands.install(pkg, [], function (err) {
         cb(err)
index 909fdf01a83a31c6244ddb563320c5db73053712..aa97b1a203f833f8351fefb5ccf1b4a3e6eef77c 100644 (file)
@@ -30,7 +30,7 @@ test("setup", function (t) {
   mkdirp(pkg, function (er) {
     t.ifError(er, pkg + " made successfully")
 
-    mr({port : common.port, mocks : mocks}, function (s) {
+    mr({port : common.port, plugin : mocks}, function (err, s) {
       server = s
 
       fs.writeFile(
index 8311096c2e10eb2cc049bd8299267be33fa69f2f..6a451b451c3c62090eaa5d525e4479581e4c7a2d 100644 (file)
@@ -25,7 +25,7 @@ function mocks(server) {
 }
 
 test("npm login", function (t) {
-  mr({port : common.port, mocks : mocks}, function (s) {
+  mr({port : common.port, plugin : mocks}, function (er, s) {
     var runner = common.npm(
     [
       "login",
@@ -61,7 +61,7 @@ test("npm login", function (t) {
 })
 
 test("npm login --always-auth", function (t) {
-  mr({port : common.port, mocks : mocks}, function (s) {
+  mr({port : common.port, plugin : mocks}, function (er, s) {
     var runner = common.npm(
     [
       "login",
@@ -98,7 +98,7 @@ test("npm login --always-auth", function (t) {
 })
 
 test("npm login --no-always-auth", function (t) {
-  mr({port : common.port, mocks : mocks}, function (s) {
+  mr({port : common.port, plugin : mocks}, function (er, s) {
     var runner = common.npm(
     [
       "login",
index 56303903fffb3192cc8f828e527e6a93fd69eca2..abed8238720194c136f4eccd45469567513caa75 100644 (file)
@@ -47,7 +47,7 @@ test("setup", function (t) {
 })
 
 test("npm login", function (t) {
-  mr({port : common.port, mocks : mocks}, function (s) {
+  mr({port : common.port, plugin : mocks}, function (er, s) {
     var runner = common.npm(
     [
       "login",
index 845a42123e510dc5c7ad57db20dee31e6fa6c38a..51ba5d3fe1efbb3bd9f7837cc2abbc409216e5dd 100644 (file)
@@ -25,7 +25,7 @@ test("setup", function (t) {
 })
 
 test("npm bugs underscore", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "underscore",
       "--registry=" + common.registry,
@@ -45,7 +45,7 @@ test("npm bugs underscore", function (t) {
 })
 
 test("npm bugs optimist - github (https://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "optimist",
       "--registry=" + common.registry,
@@ -65,7 +65,7 @@ test("npm bugs optimist - github (https://)", function (t) {
 })
 
 test("npm bugs npm-test-peer-deps - no repo", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "npm-test-peer-deps",
       "--registry=" + common.registry,
@@ -85,7 +85,7 @@ test("npm bugs npm-test-peer-deps - no repo", function (t) {
 })
 
 test("npm bugs test-repo-url-http - non-github (http://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "test-repo-url-http",
       "--registry=" + common.registry,
@@ -105,7 +105,7 @@ test("npm bugs test-repo-url-http - non-github (http://)", function (t) {
 })
 
 test("npm bugs test-repo-url-https - non-github (https://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "test-repo-url-https",
       "--registry=" + common.registry,
@@ -125,7 +125,7 @@ test("npm bugs test-repo-url-https - non-github (https://)", function (t) {
 })
 
 test("npm bugs test-repo-url-ssh - non-github (ssh://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "bugs", "test-repo-url-ssh",
       "--registry=" + common.registry,
index 383f08c71527489241571632657c00c0ab7706da..77d793807837d53a7ab844d18e71072e79f2983f 100644 (file)
@@ -16,7 +16,7 @@ test("mock reg", function (t) {
   mkdirp.sync(cache)
   rimraf.sync(cwd)
   mkdirp.sync(path.join(cwd, "node_modules"))
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     server = s
     t.pass("ok")
     t.end()
index c7784ecff51ea634a258bffa8b0460773d0e0ab9..f86037cc80cd4b21e7db2e3f02c9e11289994b48 100644 (file)
@@ -13,7 +13,7 @@ var server
 test("mock reg", function (t) {
   rimraf.sync(cache)
   mkdirp.sync(cache)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     server = s
     t.pass("ok")
     t.end()
index 60487dd38165422a342e9326da3092712328fbce..fd5817dbc05fc7bceb5262520732af353b743be6 100644 (file)
@@ -35,7 +35,7 @@ function setup (cb) {
   process.chdir(path.resolve(pkg, "minimist"))
 
   fs.mkdirSync(path.resolve(pkg, "minimist/node_modules"))
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     server = s
     npm.load({
       loglevel: "silent",
index c0a648e738cbba66d9d5cdbbe677f638555add0e..b203e5e393ca717a4054918ab4fc3edb7dd86116 100644 (file)
@@ -33,7 +33,7 @@ test("dedupe finds the common module and moves it up one level", function (t) {
 
 function setup (cb) {
   process.chdir(path.join(__dirname, "dedupe"))
-  mr(common.port, function (s) { // create mock registry.
+  mr({port : common.port}, function (er, s) { // create mock registry.
     rimraf.sync(path.join(__dirname, "dedupe", "node_modules"))
     fs.mkdirSync(path.join(__dirname, "dedupe", "node_modules"))
     cb(s)
index 9686f9d8a56388a77e90e94492d6c3f7bf0a2cc2..08a5ca438c6e402f7430929d30896d3d7f8bfb19 100644 (file)
@@ -49,7 +49,7 @@ test("setup", function (t) {
   mkdirp(pkg, function (er) {
     t.ifError(er, pkg + " made successfully")
 
-    mr({port : common.port, mocks : mocks}, function (s) {
+    mr({port : common.port, plugin : mocks}, function (er, s) {
       server = s
 
       fs.writeFile(
index b02eafec99d3d2d4ed9d5d1bea5d64741a8004c3..26ecb5b84b05d99efea4703217ad01b82ed683bf 100644 (file)
@@ -28,7 +28,7 @@ test("setup", function(t) {
 
 test("not every pkg.name can be required", function (t) {
   t.plan(3)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       "install", ".",
       "--cache", cache,
index fbc88161e64b78388065bbfd5e0533ae7352c4a3..983243025b274dc2254b160415feb29f15af5f0e 100644 (file)
@@ -36,7 +36,7 @@ var server
 
 var mocks = {
   "get": {
-    "/@bigco%2fsample/1.2.3" : [200, JSON.stringify(BIGCO_SAMPLE)]
+    "/@bigco%2fsample/1.2.3" : [200, BIGCO_SAMPLE]
   }
 }
 
@@ -49,9 +49,10 @@ function getCachePath (uri) {
 test("setup", function (t) {
   mkdirp.sync(CACHE_DIR)
 
-  mr({port: common.port, mocks: mocks}, function (s) {
-    npm.load({cache: CACHE_DIR, registry: common.registry}, function (err) {
-      t.ifError(err)
+  mr({port: common.port, mocks: mocks}, function (er, s) {
+    t.ifError(er)
+    npm.load({cache: CACHE_DIR, registry: common.registry}, function (er) {
+      t.ifError(er)
       server = s
       t.end()
     })
@@ -110,7 +111,7 @@ test("basic request", function (t) {
   var scoped = common.registry + "/@bigco%2fsample/1.2.3"
   npm.registry.get(scoped, PARAMS, function (er, data) {
     t.ifError(er, "loaded all metadata")
-    t.deepEqual(data.name, "@bigco/sample")
+    t.equal(data.name, "@bigco/sample")
     fs.stat(getCachePath(scoped), function (er) {
       t.ifError(er, "scoped cache data written")
     })
index 6744a868a20f7333cf192953f75ecb07d8ca6e44..a8efa81917282b31123f9a8f5a6437a255335272 100644 (file)
@@ -16,7 +16,7 @@ var customMocks = {
 }
 
 test("ignore-shrinkwrap: using the option", function (t) {
-  mr({port: common.port, mocks: customMocks}, function (s) {
+  mr({port: common.port, mocks: customMocks}, function (err, s) {
     s._server.on("request", function (req) {
       switch (req.url) {
         case "/shrinkwrap.js":
@@ -35,7 +35,7 @@ test("ignore-shrinkwrap: using the option", function (t) {
 })
 
 test("ignore-shrinkwrap: NOT using the option", function (t) {
-  mr({port: common.port, mocks: customMocks}, function (s) {
+  mr({port: common.port, mocks: customMocks}, function (err, s) {
     s._server.on("request", function (req) {
       switch (req.url) {
         case "/shrinkwrap.js":
index 7318deffca4d1e2932be47ed1ffc6e19db4050ce..004229cf880cae318723de57d0215c0f9ebe2c9f 100644 (file)
@@ -15,7 +15,7 @@ var EXEC_OPTS = {
 
 test("does not use unicode with --unicode false", function (t) {
   t.plan(5)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm(["install", "--unicode", "false", "read"], EXEC_OPTS, function (err, code, stdout) {
       t.ifError(err, "install package read without unicode success")
       t.notOk(code, "npm install exited with code 0")
@@ -28,7 +28,7 @@ test("does not use unicode with --unicode false", function (t) {
 })
 
 test("cleanup", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm(["uninstall", "read"], EXEC_OPTS, function (err, code) {
       t.ifError(err, "uninstall read package success")
       t.notOk(code, "npm uninstall exited with code 0")
index ef785f240e3b30fd9f590192c9d45d2b9bf91870..b2feaa1b4607565b76fe749aceaed5cfa8890a7c 100644 (file)
@@ -17,7 +17,7 @@ test("setup", function (t) {
 
 test("\"npm install --save --save-exact\" should install local pkg", function (t) {
   resetPackageJSON(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
@@ -46,7 +46,7 @@ test("\"npm install --save --save-exact\" should install local pkg", function (t
 test("\"npm install --save-dev --save-exact\" should install local pkg", function (t) {
   resetPackageJSON(pkg)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
index d4efef4b61566dfae232fd84259afb5b4aed4975..1844a2c2946baf4984b513cd833272b14ba7774f 100644 (file)
@@ -17,7 +17,7 @@ test("setup", function (t) {
 
 test("npm install --save with default save-prefix should install local pkg versioned to allow minor updates", function (t) {
   resetPackageJSON(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
@@ -43,7 +43,7 @@ test("npm install --save with default save-prefix should install local pkg versi
 
 test("npm install --save-dev with default save-prefix should install local pkg to dev dependencies versioned to allow minor updates", function (t) {
   resetPackageJSON(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
@@ -69,7 +69,7 @@ test("npm install --save-dev with default save-prefix should install local pkg t
 
 test("npm install --save with \"~\" save-prefix should install local pkg versioned to allow patch updates", function (t) {
   resetPackageJSON(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
@@ -96,7 +96,7 @@ test("npm install --save with \"~\" save-prefix should install local pkg version
 
 test("npm install --save-dev with \"~\" save-prefix should install local pkg to dev dependencies versioned to allow patch updates", function (t) {
   resetPackageJSON(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
index d0f86aa77adcfdce360de4e61ab3d489cc20c6b7..9df8123ed3b027c85af6bd3898d79acf6c905cf5 100644 (file)
@@ -13,7 +13,7 @@ var desiredResultsPath = path.resolve(pkg, "desired-ls-results.json")
 test("prefers version from dependencies over devDependencies", function (t) {
   t.plan(1)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function (err) {
       if (err) return t.fail(err)
 
index 89c4cc35473794c482ddc44762e5dd79d2070ec0..b449804cdffa55e208490e271a8a10bf6d37dcf3 100644 (file)
@@ -20,7 +20,7 @@ test("setup", function (t) {
   cleanup()
   mkdirp.sync(pkg + "/cache")
   mkdirp.sync(pkg + "/tmp")
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     var cmd = ["install", "--registry=" + common.registry]
     common.npm(cmd, opts, function (er, c) {
       if (er) throw er
index 37a0cb5fea7dd806ccc53f98b30d2719426a3431..ddd9f3baf99cf14eefa056284789cccb5b524e6b 100644 (file)
@@ -23,7 +23,7 @@ test("setup", function (t) {
   cleanup()
   mkdirp.sync(cache)
   mkdirp.sync(tmp)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, 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
index c11f4826e4dc84fa9d5050bf285584307413651a..8833c17219183089e3116d733129245a21c6bf3e 100644 (file)
@@ -31,7 +31,7 @@ var EXEC_OPTS = {
 
 test("setup", function (t) {
   setup()
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     server = s
 
     t.end()
index 328da7d17bdf580170d3de8ba73fda58de2bbb53..15613d7a727a9c84dfa773dbbfe669dd1b6a40ac 100644 (file)
@@ -52,7 +52,7 @@ test("does not update the package.json with empty arguments", function (t) {
   writePackageJson()
   t.plan(1)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     var child = createChild([npm, "install"])
     child.on("close", function () {
       var text = JSON.stringify(fs.readFileSync(pkg + "/package.json", "utf8"))
@@ -67,7 +67,7 @@ test("updates the package.json (adds dependencies) with an argument", function (
   writePackageJson()
   t.plan(1)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     var child = createChild([npm, "install", "underscore"])
     child.on("close", function () {
       var text = JSON.stringify(fs.readFileSync(pkg + "/package.json", "utf8"))
index 4e90277fe28fccb11a0c3c6c14f8c2b740260aa2..1a04980a3aced35825eeff120c95717693f6de60 100644 (file)
@@ -28,7 +28,7 @@ function ansiTrim (str) {
 // it"s not running in a tty
 test("does not use ansi styling", function (t) {
   t.plan(4)
-  mr(common.port, function (s) { // create mock registry.
+  mr({port : common.port}, function (er, s) { // create mock registry.
     common.npm(
     [
       "outdated",
index 112f363aa50823145fbf3debf3e386f339c22ff9..213c4d60f4c6b3864a9b31edaf8b8235872301ab 100644 (file)
@@ -25,7 +25,7 @@ test("outdated depth zero", function (t) {
 
   process.chdir(pkg)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: cache
     , loglevel: "silent"
index bdb656ff18d87a535fecd6635b2b4c303169ee89..9425d5b8a0ebdfc85a350487dab76558931749dd 100644 (file)
@@ -13,7 +13,7 @@ mkdirp.sync(cache)
 
 test("includes devDependencies in outdated", function (t) {
   process.chdir(pkg)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({cache: cache, registry: common.registry}, function () {
       npm.outdated(function (er, d) {
         t.equal("1.5.1", d[0][3])
index b874f28e695711cc32580610f95c8a7123ffbf37..e02675afebcd45b19f33ffa4c40dce4cb4ee1ded 100644 (file)
@@ -35,7 +35,7 @@ test("it should log json data", function (t) {
   cleanup()
   process.chdir(pkg)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: pkg + "/cache",
       loglevel: "silent",
diff --git a/deps/npm/test/tap/outdated-long.js b/deps/npm/test/tap/outdated-long.js
new file mode 100644 (file)
index 0000000..db011ab
--- /dev/null
@@ -0,0 +1,70 @@
+var path = require("path")
+
+var mr = require("npm-registry-mock")
+var rimraf = require("rimraf")
+var test = require("tap").test
+
+var common = require("../common-tap.js")
+var npm = require("../../")
+
+// config
+var pkg = path.resolve(__dirname, "outdated")
+var cache = path.resolve(pkg, "cache")
+var nodeModules = path.resolve(pkg, "node_modules")
+
+test("it should not throw", function (t) {
+  cleanup()
+  process.chdir(pkg)
+
+  var originalLog = console.log
+  var output = []
+  var expOut = [ path.resolve(__dirname, "outdated/node_modules/underscore"),
+                 path.resolve(__dirname, "outdated/node_modules/underscore")
+               + ":underscore@1.3.1"
+               + ":underscore@1.3.1"
+               + ":underscore@1.5.1"
+               + ":dependencies" ]
+  var expData = [ [ path.resolve(__dirname, "outdated"),
+                    "underscore",
+                    "1.3.1",
+                    "1.3.1",
+                    "1.5.1",
+                    "1.3.1",
+                    "dependencies" ] ]
+
+  console.log = function () {
+    output.push.apply(output, arguments)
+  }
+  mr({port : common.port}, function (er, s) {
+    npm.load({
+      cache : "cache",
+      loglevel : "silent",
+      parseable : true,
+      registry : common.registry
+    },
+    function () {
+      npm.install(".", function (err) {
+        t.ifError(err, "install success")
+        npm.config.set("long", true)
+        npm.outdated(function (er, d) {
+          t.ifError(er, "outdated success")
+          console.log = originalLog
+          t.same(output, expOut)
+          t.same(d, expData)
+          s.close()
+          t.end()
+        })
+      })
+    })
+  })
+})
+
+test("cleanup", function (t) {
+  cleanup()
+  t.end()
+})
+
+function cleanup () {
+  rimraf.sync(nodeModules)
+  rimraf.sync(cache)
+}
index cb7eaa47334c7102d19c5803964f4d9b4f583833..0608824dcb8cc2883a565476b7a222df3e8e3deb 100644 (file)
@@ -16,7 +16,7 @@ test("dicovers new versions in outdated", function (t) {
   process.chdir(pkg)
   t.plan(2)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({cache: cache, registry: common.registry}, function () {
       npm.outdated(function (er, d) {
         for (var i = 0; i < d.length; i++) {
index f1032eab37ea31d74ab3c5374db88919f0bb2f02..6058ddee422fccabf0e9acde25c95eaff2554bb7 100644 (file)
@@ -14,7 +14,7 @@ var mr = require("npm-registry-mock")
 test("outdated-target: if no viable version is found, show error", function (t) {
   t.plan(1)
   setup()
-  mr({port: common.port}, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({ cache: cache, registry: common.registry}, function () {
       npm.commands.update(function (er) {
         t.equal(er.code, "ETARGET")
index b0f84647f29a60dbf7e0d8125acd20a3d9ccac69..7e43be7a54d47ef7ffdb7c80a755bcf64b22356e 100644 (file)
@@ -21,7 +21,7 @@ test("setup", function (t) {
 test("outdated ignores private modules", function (t) {
   t.plan(3)
   process.chdir(pkg)
-  mr({ port : common.port }, function (s) {
+  mr({ port : common.port }, function (err, s) {
     npm.load(
       {
         loglevel  : "silent",
index 9f4b14d1f3ef055e8b78a276d0cd6f32aca0599d..8e7ebe568737c9abfadc1b4c11ffc9f36e1bd494 100644 (file)
@@ -31,7 +31,7 @@ test("it should not throw", function (t) {
   console.log = function () {
     output.push.apply(output, arguments)
   }
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     npm.load({
       cache: "cache",
       loglevel: "silent",
index f634aaf717e879cd1605506b216a313cf5182874..938c2166572c394ef12ee7fba7e7f02332f38a80 100644 (file)
@@ -73,7 +73,7 @@ test("setup", function (t) {
       t.ifError(err,  "npm cache clean ran without error")
       t.notOk(code,   "npm cache clean exited cleanly")
 
-      mr({ port : common.port, mocks : mocks }, function (s) {
+      mr({ port : common.port, plugin : mocks }, function (err, s) {
         server = s
         t.end()
       })
index 098f3ccb187c87797d33ef5bc0945bf4c9793f96..eb2ce8bb6f76d2bf865c68f56ce3e0a332f06f45 100644 (file)
@@ -1,5 +1,4 @@
 var common = require("../common-tap")
-var fs = require("fs")
 var path = require("path")
 var test = require("tap").test
 var rimraf = require("rimraf")
@@ -9,9 +8,6 @@ var pkg = path.resolve(__dirname, "peer-deps-invalid")
 var cache = path.resolve(pkg, "cache")
 var nodeModules = path.resolve(pkg, "node_modules")
 
-var okFile = fs.readFileSync(path.join(pkg, "file-ok.js"), "utf8")
-var failFile = fs.readFileSync(path.join(pkg, "file-fail.js"), "utf8")
-
 test("installing dependencies that have conflicting peerDependencies", function (t) {
   rimraf.sync(nodeModules)
   rimraf.sync(cache)
@@ -19,11 +15,12 @@ test("installing dependencies that have conflicting peerDependencies", function
 
   var customMocks = {
     "get": {
-      "/ok.js": [200, okFile],
-      "/invalid.js": [200, failFile]
+      "/ok.js": [200, path.join(pkg, "file-ok.js")],
+      "/invalid.js": [200, path.join(pkg, "file-fail.js")]
     }
   }
-  mr({port: common.port, mocks: customMocks}, function (s) { // create mock registry.
+  mr({port: common.port, mocks: customMocks}, function (err, s) { // create mock registry.
+    t.ifError(err, "mock registry started")
     npm.load({
       cache: cache,
       registry: common.registry
index 30ab657dc8f0d13496fb7688c5525fd72630fe57..1cb71bc19b2a1e4987922903fec5b6d25f2c107a 100644 (file)
@@ -11,7 +11,7 @@ var pkg = path.resolve(__dirname, "peer-deps-toplevel")
 var desiredResultsPath = path.resolve(pkg, "desired-ls-results.json")
 
 test("installs the peer dependency directory structure", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function (err) {
       t.ifError(err, "setup ran successfully")
 
index eb000782f95435323605f0f98a84c0c4c13032e2..9c8daf84fbb117ce6f98beebe7633686c6c8f547 100644 (file)
@@ -9,7 +9,6 @@ var pkg = path.resolve(__dirname, "peer-deps-without-package-json")
 var cache = path.resolve(pkg, "cache")
 var nodeModules = path.resolve(pkg, "node_modules")
 
-var js = fs.readFileSync(path.join(pkg, "file-js.js"), "utf8")
 test("installing a peerDependencies-using package without a package.json present (GH-3049)", function (t) {
 
   rimraf.sync(nodeModules)
@@ -20,21 +19,27 @@ test("installing a peerDependencies-using package without a package.json present
 
   var customMocks = {
     "get": {
-      "/ok.js": [200, js]
+      "/ok.js": [200, path.join(pkg, "file-js.js")]
     }
   }
-  mr({port: common.port, mocks: customMocks}, function (s) { // create mock registry.
+  mr({port: common.port, mocks: customMocks}, function (err, s) {
+    t.ifError(err, "mock registry booted")
     npm.load({
       registry: common.registry,
       cache: cache
     }, function () {
       npm.install(common.registry + "/ok.js", function (err) {
-        if (err) {
-          t.fail(err)
-        } else {
-          t.ok(fs.existsSync(path.join(nodeModules, "/npm-test-peer-deps-file")))
-          t.ok(fs.existsSync(path.join(nodeModules, "/underscore")))
-        }
+        t.ifError(err, "installed ok.js")
+
+        t.ok(
+          fs.existsSync(path.join(nodeModules, "/npm-test-peer-deps-file")),
+          "passive peer dep installed"
+        )
+        t.ok(
+          fs.existsSync(path.join(nodeModules, "/underscore")),
+          "underscore installed"
+        )
+
         t.end()
         s.close() // shutdown mock registry.
       })
index 6e60fc10321a0134e9065ab729f3534d836c1ab4..8fa28a54f6158830d2f971b0f2bc75b53c1d7d86 100644 (file)
@@ -11,7 +11,7 @@ var pkg = path.resolve(__dirname, "peer-deps")
 var desiredResultsPath = path.resolve(pkg, "desired-ls-results.json")
 
 test("installs the peer dependency directory structure", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function (err) {
       if (err) return t.fail(err)
 
index 24edf5e6184a7c09fdfeb47d8051dd91e1a01682..f46f6c7eb23bd30ecdde35a82762c343aa20b2e1 100644 (file)
@@ -16,7 +16,7 @@ EXEC_OPTS.env.npm_config_depth = "Infinity"
 var server
 
 test("reg mock", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     server = s
     t.pass("registry mock started")
     t.end()
index d4d59c143d97ec42d5e007daf0102b4e7bd63b41..e734ebfd78319319203511e71b452121ca359225 100644 (file)
@@ -51,11 +51,12 @@ test("setup", function (t) {
   }
 })
 
-test("scoped packages should default to restricted access", function (t) {
+test("scoped packages pass public access if set", function (t) {
   var put = nock(common.registry)
               .put("/@bigco%2fpublish-access")
               .reply(201, verify)
 
+  npm.config.set("access", "public")
   npm.commands.publish([], false, function (er) {
     t.ifError(er, "published without error")
 
@@ -66,7 +67,7 @@ test("scoped packages should default to restricted access", function (t) {
   function verify (_, body) {
     t.doesNotThrow(function () {
       var parsed = JSON.parse(body)
-      t.equal(parsed.access, "restricted", "access level is correct")
+      t.equal(parsed.access, "public", "access level is correct")
     }, "converted body back into object")
 
     return {ok: true}
diff --git a/deps/npm/test/tap/publish-access-unscoped-restricted-fails.js b/deps/npm/test/tap/publish-access-unscoped-restricted-fails.js
new file mode 100644 (file)
index 0000000..4d39b00
--- /dev/null
@@ -0,0 +1,70 @@
+var fs = require("fs")
+var path = require("path")
+
+var test = require("tap").test
+var mkdirp = require("mkdirp")
+var rimraf = require("rimraf")
+
+var npm = require("../../")
+var common = require("../common-tap.js")
+
+var pkg = path.join(__dirname, "publish-access-unscoped")
+
+// TODO: nock uses setImmediate, breaks 0.8: replace with mockRegistry
+if (!global.setImmediate) {
+  global.setImmediate = function () {
+    var args = [arguments[0], 0].concat([].slice.call(arguments, 1))
+    setTimeout.apply(this, args)
+  }
+}
+
+test("setup", function (t) {
+  mkdirp(path.join(pkg, "cache"), function () {
+    var configuration = {
+      cache    : path.join(pkg, "cache"),
+      loglevel : "silent",
+      registry : common.registry
+    }
+
+    npm.load(configuration, next)
+  })
+
+  function next (er) {
+    t.ifError(er, "npm loaded successfully")
+
+    process.chdir(pkg)
+    fs.writeFile(
+      path.join(pkg, "package.json"),
+      JSON.stringify({
+        name: "publish-access",
+        version: "1.2.5"
+      }),
+      "ascii",
+      function (er) {
+        t.ifError(er)
+
+        t.pass("setup done")
+        t.end()
+      }
+    )
+  }
+})
+
+test("unscoped packages cannot be restricted", function (t) {
+  npm.config.set("access", "restricted")
+  npm.commands.publish([], false, function (er) {
+    t.ok(er, "got an error back")
+    t.equal(er.message, "Can't restrict access to unscoped packages.")
+
+    t.end()
+  })
+})
+
+test("cleanup", function (t) {
+  process.chdir(__dirname)
+  rimraf(pkg, function (er) {
+    t.ifError(er)
+
+    t.end()
+  })
+})
index a4cdcc23159138752545e5efa0553d0f401a183d..023bfba5f2dd825df518bc53d6f3cfbfc3b9e618 100644 (file)
@@ -51,11 +51,12 @@ test("setup", function (t) {
   }
 })
 
-test("scoped packages should default to restricted access", function (t) {
+test("unscoped packages can be explicitly set as public", function (t) {
   var put = nock(common.registry)
               .put("/publish-access")
               .reply(201, verify)
 
+  npm.config.set("access", "public")
   npm.commands.publish([], false, function (er) {
     t.ifError(er, "published without error")
 
index caae7d3c3f685b5a2021fa3848547de3d5a373fb..565842b9a61625d7b5e4921beb5f287dfafbb324 100644 (file)
@@ -27,7 +27,7 @@ test("setup", function (t) {
 })
 
 test("npm repo underscore", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'underscore',
       '--registry=' + common.registry,
@@ -46,7 +46,7 @@ test("npm repo underscore", function (t) {
 
 
 test('npm repo optimist - github (https://)', function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'optimist',
       '--registry=' + common.registry,
@@ -64,7 +64,7 @@ test('npm repo optimist - github (https://)', function (t) {
 })
 
 test("npm repo npm-test-peer-deps - no repo", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'npm-test-peer-deps',
       '--registry=' + common.registry,
@@ -79,7 +79,7 @@ test("npm repo npm-test-peer-deps - no repo", function (t) {
 })
 
 test("npm repo test-repo-url-http - non-github (http://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'test-repo-url-http',
       '--registry=' + common.registry,
@@ -97,7 +97,7 @@ test("npm repo test-repo-url-http - non-github (http://)", function (t) {
 })
 
 test("npm repo test-repo-url-https - non-github (https://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'test-repo-url-https',
       '--registry=' + common.registry,
@@ -115,7 +115,7 @@ test("npm repo test-repo-url-https - non-github (https://)", function (t) {
 })
 
 test("npm repo test-repo-url-ssh - non-github (ssh://)", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     common.npm([
       'repo', 'test-repo-url-ssh',
       '--registry=' + common.registry,
index d4c56697330ea0b7449a8859a0a32db36bede159..fc3bd86e08eb455681a2136e89e208e4e3222abe 100644 (file)
@@ -56,7 +56,7 @@ var mocks = {
 test("No previous cache, init cache triggered by first search", function(t) {
   cleanupCache()
 
-  mr({ port: common.port, mocks: mocks.allFutureUpdatedOnly }, function (s) {
+  mr({ port: common.port, plugin: mocks.allFutureUpdatedOnly }, function (err, s) {
     common.npm([
       "search", "do not do extra search work on my behalf",
       "--registry", common.registry,
@@ -88,7 +88,7 @@ test("previous cache, _updated set, should trigger since request", function(t) {
       m(server)
     })
   }
-  mr({ port: common.port, mocks: m }, function (s) {
+  mr({ port: common.port, plugin: m }, function (err, s) {
     common.npm([
       "search", "do not do extra search work on my behalf",
       "--registry", common.registry,
@@ -129,7 +129,7 @@ var searches = [
 searches.forEach(function(search) {
   test(search.description + " search in color", function(t) {
     cleanupCache()
-    mr({ port: common.port, mocks: mocks.all }, function (s) {
+    mr({ port: common.port, plugin: mocks.all }, function (er, s) {
       common.npm([
         "search", search.term,
         "--registry", common.registry,
index fc606cf40b8b0bd1bf29a6bcd6739d277e6de352..379a0d908c3b676145c00a6a89a38d965899e096 100644 (file)
@@ -13,7 +13,7 @@ var desiredResultsPath = path.resolve(pkg, "desired-shrinkwrap-results.json")
 test("shrinkwrap doesn't strip out the dependency", function (t) {
   t.plan(1)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup({ production: true }, function (err) {
       if (err) return t.fail(err)
 
index 6be67af744328c26cf0d0408f471af0309b0f9fa..80ab82098376c72fb4104c0aa35c65624faa3e19 100644 (file)
@@ -14,7 +14,7 @@ test("returns a list of removed items", function (t) {
 
   cleanup()
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function () {
       npm.shrinkwrap([], function (err) {
         if (err) return t.fail(err)
index d6bb6b8d6a064923da275bb65fce23b0e24cc6b5..79414ccd22b93726e218bbdadc6c0d7153cb4cae 100644 (file)
@@ -33,7 +33,7 @@ function mocks (server) {
 }
 
 test("setup", function (t) {
-  mr({ port : common.port, mocks : mocks }, function (s) {
+  mr({ port : common.port, plugin : mocks }, function (err, s) {
     server = s
     t.ok(s, "set up mock registry")
     setup()
index 75f1765fc75af4ac78db37870c19cbad4f652ec9..8a01260725ae58416d30619e1506627e2d6d1f47 100644 (file)
@@ -13,7 +13,7 @@ var desiredResultsPath = path.resolve(pkg, "desired-shrinkwrap-results.json")
 test("shrinkwrap doesn't strip out the shared dependency", function (t) {
   t.plan(1)
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function (err) {
       if (err) return t.fail(err)
 
index 1dec1d2ae128728e5b27465e8ba6afe8ea843bf7..6853cf3020637da90e2366f1cc85f357367fb100 100644 (file)
@@ -24,7 +24,7 @@ test("sorting dependencies", function (t) {
 
   var before = JSON.parse(fs.readFileSync(packageJson).toString())
 
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     // underscore is already in the package.json,
     // but --save will trigger a rewrite with sort
     var child = spawn(node, [npm, "install", "--save", "underscore@1.3.3"], {
index a0ba4c6c1a5f536dc5cb54f24c0469fac12a8b68..f62aa24dfc90b5841471f1a4255d1b2ba013e999 100644 (file)
@@ -8,7 +8,7 @@ var test = require("tap").test
 
 test("returns a list of removed items", function (t) {
   t.plan(1)
-  mr(common.port, function (s) {
+  mr({port : common.port}, function (er, s) {
     setup(function () {
       npm.install(".", function (err) {
         if (err) return t.fail(err)
index f592ecb070bfc89bb3b342bb508e9928d2ecb221..cf305900c770bd9e568b7c870ccf9ac5a2d9a984 100644 (file)
@@ -15,7 +15,7 @@ var server
 
 function setup (t, mock) {
   mkdirp.sync(CACHE_DIR)
-  mr({ port: common.port, mocks: mock }, function (s) {
+  mr({ port: common.port, plugin: mock }, function (er, s) {
     npm.load({ cache: CACHE_DIR, registry: common.registry }, function (err) {
       t.ifError(err, "no error")
       server = s
@@ -25,10 +25,11 @@ function setup (t, mock) {
 }
 
 function cleanup (t) {
-  server.close()
-  rimraf.sync(PKG_DIR)
+  server.close(function () {
+    rimraf.sync(PKG_DIR)
 
-  t.end()
+    t.end()
+  })
 }
 
 test("setup basic", function (t) {
@@ -75,14 +76,14 @@ test("request auth success", function (t) {
 test("cleanup auth", cleanup)
 
 var mocks = {
-  basic: function (server) {
-    server.get("/-/all").reply(200, allMock)
+  basic: function (mock) {
+    mock.get("/-/all").reply(200, allMock)
   },
-  auth: function (server) {
+  auth: function (mock) {
     var littleBobbyTablesAuth = new Buffer("bobby:tables").toString("base64")
     var auth = "Basic " + littleBobbyTablesAuth
-    server.get("/-/all", { authorization: auth }).reply(200, allMock)
-    server.get("/-/all").reply(401, {
+    mock.get("/-/all", { authorization: auth }).reply(200, allMock)
+    mock.get("/-/all").reply(401, {
       error: "unauthorized",
       reason: "You are not authorized to access this db."
     })
index 5f871b26c8a9eb1bc716642c41851a3b76242f3e..d246fa8a459960f4e829b0162440ba6f9c7e57b1 100644 (file)
@@ -17,7 +17,8 @@ var EXEC_OPTS = {
   stdio: "ignore",
   env: {
     "npm_config_registry": common.registry,
-    "npm_config_loglevel": "verbose"
+    "npm_config_loglevel": "verbose",
+    "npm_config_save_prefix": "^"
   }
 }
 
@@ -37,7 +38,7 @@ var s // mock server reference
 test("setup", function (t) {
   resetPackage()
 
-  mr(common.port, function (server) {
+  mr({port : common.port}, function (er, server) {
     npm.load({cache: CACHE_DIR, registry: common.registry}, function (err) {
       t.ifError(err)
       s = server
index a77b3d380dd570b697fa65a30b67ce94f6fb3686..a24e70e9001e93c88fb235821a5a8e3f24a5b278 100644 (file)
@@ -45,7 +45,7 @@ function tarballWasFetched(output){
 }
 
 function performInstall (t, cb) {
-  mr({port: common.port, mocks: mockRoutes}, function (s) {
+  mr({port: common.port, mocks: mockRoutes}, function (er, s) {
     var opts = {
       cwd : pkg,
       env: {
index c36abfe1f6d0921385739a82003f50ac74060feb..5d371d63081eb359439a2f812f10117f13acc684 100644 (file)
@@ -32,6 +32,13 @@ test("setup", function (t) {
   t.end()
 })
 
+function plugin (server) {
+  server
+    .get("/biscuits")
+    .many()
+    .reply(404, {"error": "version not found"})
+}
+
 test("npm view . in global mode", function (t) {
   process.chdir(t1dir)
   common.npm([
@@ -77,7 +84,7 @@ test("npm view . with no package.json", function(t) {
 
 test("npm view . with no published package", function (t) {
   process.chdir(t3dir)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "."
@@ -94,7 +101,7 @@ test("npm view . with no published package", function (t) {
 
 test("npm view .", function (t) {
   process.chdir(t2dir)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "."
@@ -112,7 +119,7 @@ test("npm view .", function (t) {
 
 test("npm view . select fields", function (t) {
   process.chdir(t2dir)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "."
@@ -130,7 +137,7 @@ test("npm view . select fields", function (t) {
 
 test("npm view .@<version>", function (t) {
   process.chdir(t2dir)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , ".@0.0.0"
@@ -148,7 +155,7 @@ test("npm view .@<version>", function (t) {
 
 test("npm view .@<version> --json", function (t) {
   process.chdir(t2dir)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , ".@0.0.0"
@@ -166,7 +173,7 @@ test("npm view .@<version> --json", function (t) {
 })
 
 test("npm view <package name>", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "underscore"
@@ -183,7 +190,7 @@ test("npm view <package name>", function (t) {
 })
 
 test("npm view <package name> --global", function(t) {
-  mr(common.port, function(s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "underscore"
@@ -202,7 +209,7 @@ test("npm view <package name> --global", function(t) {
 
 test("npm view <package name> --json", function(t) {
   t.plan(3)
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "underscore"
@@ -226,7 +233,7 @@ test("npm view <package name> --json", function(t) {
 })
 
 test("npm view <package name> <field>", function (t) {
-  mr(common.port, function (s) {
+  mr({port : common.port, plugin : plugin}, function (er, s) {
     common.npm([
       "view"
     , "underscore"